nilac 0.0.4.3.9.2 → 0.0.4.3.9.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/bin/nilac +9 -5748
- data/examples/StringMagic.nila +23 -0
- data/examples/countdown.nila +31 -0
- data/examples/decBin.nila +3 -3
- data/examples/marky.js +30 -0
- data/examples/marky.nila +23 -0
- data/lib/nilac/ErrorDeclarations.rb +11 -0
- data/lib/nilac/add_semicolons.rb +57 -0
- data/lib/nilac/compile_arrays.rb +266 -0
- data/lib/nilac/compile_blocks.rb +137 -0
- data/lib/nilac/compile_case_statement.rb +168 -0
- data/lib/nilac/compile_classes.rb +18 -0
- data/lib/nilac/compile_comments.rb +79 -0
- data/lib/nilac/compile_conditional_structures.rb +1378 -0
- data/lib/nilac/compile_custom_function_map.rb +45 -0
- data/lib/nilac/compile_default_values.rb +160 -0
- data/lib/nilac/compile_hashes.rb +123 -0
- data/lib/nilac/compile_heredocs.rb +62 -0
- data/lib/nilac/compile_integers.rb +23 -0
- data/lib/nilac/compile_interpolated_strings.rb +133 -0
- data/lib/nilac/compile_loops.rb +211 -0
- data/lib/nilac/compile_named_functions.rb +690 -0
- data/lib/nilac/compile_operators.rb +83 -0
- data/lib/nilac/compile_parallel_assignment.rb +103 -0
- data/lib/nilac/compile_ruby_methods.rb +58 -0
- data/lib/nilac/compile_special_keywords.rb +44 -0
- data/lib/nilac/compile_strings.rb +145 -0
- data/lib/nilac/compile_whitespace_delimited_functions.rb +97 -0
- data/lib/nilac/create_mac_executable.rb +25 -0
- data/lib/nilac/extract_parsable_file.rb +23 -0
- data/lib/nilac/find_all_matching_indices.rb +18 -0
- data/lib/nilac/find_file_name.rb +13 -0
- data/lib/nilac/find_file_path.rb +13 -0
- data/lib/nilac/get_variables.rb +123 -0
- data/lib/nilac/output_javascript.rb +13 -0
- data/lib/nilac/parse_arguments.rb +41 -0
- data/lib/nilac/pretty_print_javascript.rb +457 -0
- data/lib/nilac/read_file_line_by_line.rb +11 -0
- data/lib/nilac/remove_question_marks.rb +46 -0
- data/lib/nilac/replace_multiline_comments.rb +92 -0
- data/lib/nilac/replace_named_functions.rb +154 -0
- data/lib/nilac/replace_singleline_comments.rb +45 -0
- data/lib/nilac/replace_strings.rb +35 -0
- data/lib/nilac/split_semicolon_seperated_expressions.rb +39 -0
- data/lib/nilac/strToArray.rb +15 -0
- data/lib/nilac/version.rb +1 -1
- data/lib/nilac.rb +324 -1
- data/nilac.gemspec +0 -1
- data/shark/features/add_auto_return_statement.feature +1 -1
- data/shark/features/array_and_string_indexing.feature +1 -1
- data/shark/features/barebones_compilation.feature +1 -1
- data/shark/features/case_when.feature +1 -1
- data/shark/features/default_method_parameters.feature +1 -1
- data/shark/features/fix_newlines.feature +1 -1
- data/shark/features/hashes.feature +1 -1
- data/shark/features/heredoc.feature +1 -1
- data/shark/features/if_then_else.feature +1 -1
- data/shark/features/loop.feature +1 -1
- data/shark/features/method_multiple_return.feature +1 -1
- data/shark/features/multiline_array.feature +1 -1
- data/shark/features/multiple_variable_initialization.feature +1 -1
- data/shark/features/numbers.feature +1 -1
- data/shark/features/regular_for.feature +1 -1
- data/shark/features/regular_if.feature +1 -1
- data/shark/features/regular_while.feature +1 -1
- data/shark/features/ruby_methods.feature +1 -1
- data/shark/features/ruby_operators.feature +1 -1
- data/shark/features/splats.feature +1 -1
- data/shark/features/string_interpolation.feature +1 -1
- data/shark/features/strings.feature +1 -1
- data/shark/features/times.feature +1 -1
- data/shark/features/unless_until.feature +1 -1
- data/shark/features/whitespace_delimitation.feature +1 -1
- metadata +46 -18
- data/src/nilac.rb +0 -5753
@@ -0,0 +1,690 @@
|
|
1
|
+
require_relative 'strToArray'
|
2
|
+
|
3
|
+
require_relative 'read_file_line_by_line'
|
4
|
+
|
5
|
+
def compile_named_functions(input_file_contents, named_code_blocks, nested_functions, temporary_nila_file)
|
6
|
+
|
7
|
+
#This method compiles all the named Nila functions. Below is an example of what is meant
|
8
|
+
#by named/explicit function
|
9
|
+
|
10
|
+
#def square(input_number)
|
11
|
+
#
|
12
|
+
# input_number*input_number
|
13
|
+
#
|
14
|
+
#end
|
15
|
+
|
16
|
+
#The above function will compile to
|
17
|
+
|
18
|
+
#square = function(input_number) {
|
19
|
+
#
|
20
|
+
# return input_number*input_number;
|
21
|
+
#
|
22
|
+
#};
|
23
|
+
|
24
|
+
def is_parameterless?(input_function_block)
|
25
|
+
|
26
|
+
if input_function_block[0].include?("(")
|
27
|
+
|
28
|
+
false
|
29
|
+
|
30
|
+
else
|
31
|
+
|
32
|
+
true
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
def lexical_scoped_variables(input_function_block)
|
39
|
+
|
40
|
+
#This method will pickup and declare all the variables inside a function block. In future, this method will be
|
41
|
+
#merged with the get variables method
|
42
|
+
|
43
|
+
def replace_strings(input_string)
|
44
|
+
|
45
|
+
element = input_string.gsub("==", "equalequal")
|
46
|
+
|
47
|
+
element = element.gsub("!=", "notequal")
|
48
|
+
|
49
|
+
element = element.gsub("+=", "plusequal")
|
50
|
+
|
51
|
+
element = element.gsub("-=", "minusequal")
|
52
|
+
|
53
|
+
element = element.gsub("*=", "multiequal")
|
54
|
+
|
55
|
+
element = element.gsub("/=", "divequal")
|
56
|
+
|
57
|
+
element = element.gsub("%=", "modequal")
|
58
|
+
|
59
|
+
element = element.gsub("=~", "matchequal")
|
60
|
+
|
61
|
+
element = element.gsub(">=", "greatequal")
|
62
|
+
|
63
|
+
input_string = element.gsub("<=", "lessyequal")
|
64
|
+
|
65
|
+
string_counter = 0
|
66
|
+
|
67
|
+
while input_string.include?("\"")
|
68
|
+
|
69
|
+
string_extract = input_string[input_string.index("\"")..input_string.index("\"",input_string.index("\"")+1)]
|
70
|
+
|
71
|
+
input_string = input_string.sub(string_extract,"--repstring#{string_counter}")
|
72
|
+
|
73
|
+
string_counter += 1
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
while input_string.include?("'")
|
78
|
+
|
79
|
+
string_extract = input_string[input_string.index("'")..input_string.index("'",input_string.index("'")+1)]
|
80
|
+
|
81
|
+
input_string = input_string.sub(string_extract,"--repstring#{string_counter}")
|
82
|
+
|
83
|
+
string_counter += 1
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
return input_string
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
input_function_block = input_function_block.collect {|element| replace_strings(element)}
|
92
|
+
|
93
|
+
controlregexp = /(if |Euuf |for |while |def |function |function\()/
|
94
|
+
|
95
|
+
variables = []
|
96
|
+
|
97
|
+
function_name, parameters = input_function_block[0].split("(")
|
98
|
+
|
99
|
+
parameters = parameters.split(")")[0].split(",")
|
100
|
+
|
101
|
+
parameters = parameters.collect { |element| element.strip }
|
102
|
+
|
103
|
+
input_function_block.each do |line|
|
104
|
+
|
105
|
+
if line.include? "=" and line.index(controlregexp).nil?
|
106
|
+
|
107
|
+
current_line_split = line.strip.split("=")
|
108
|
+
|
109
|
+
variables << current_line_split[0].rstrip
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
parameters.each do |param|
|
116
|
+
|
117
|
+
if variables.include?(param)
|
118
|
+
|
119
|
+
variables.delete(param)
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
if variables.empty?
|
126
|
+
|
127
|
+
return []
|
128
|
+
|
129
|
+
else
|
130
|
+
|
131
|
+
return variables.uniq.sort
|
132
|
+
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
def remove_question_marks(input_file_contents, input_list, temporary_nila_file)
|
138
|
+
|
139
|
+
joined_file_contents = input_file_contents.join
|
140
|
+
|
141
|
+
input_list.each do |element|
|
142
|
+
|
143
|
+
if element.include? "?"
|
144
|
+
|
145
|
+
joined_file_contents = joined_file_contents.gsub(element, element[0...-1])
|
146
|
+
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
|
151
|
+
file_id = open(temporary_nila_file, 'w')
|
152
|
+
|
153
|
+
file_id.write(joined_file_contents)
|
154
|
+
|
155
|
+
file_id.close()
|
156
|
+
|
157
|
+
line_by_line_contents = read_file_line_by_line(temporary_nila_file)
|
158
|
+
|
159
|
+
return line_by_line_contents
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
def add_auto_return_statement(input_array)
|
164
|
+
|
165
|
+
joined_array = input_array.join
|
166
|
+
|
167
|
+
reversed_input_array = input_array.reverse
|
168
|
+
|
169
|
+
if !joined_array.include?("return ")
|
170
|
+
|
171
|
+
rejected_array = reversed_input_array.reject { |content| content.lstrip.eql?("") }
|
172
|
+
|
173
|
+
rejected_array = rejected_array.reject {|content| content.strip.eql?("")}
|
174
|
+
|
175
|
+
rejected_array = rejected_array[1..-1]
|
176
|
+
|
177
|
+
if !rejected_array[0].strip.eql?("}")
|
178
|
+
|
179
|
+
if !rejected_array[0].strip.eql?("end") and !rejected_array[0].strip.include?("--single_line_comment")
|
180
|
+
|
181
|
+
last_statement = rejected_array[0]
|
182
|
+
|
183
|
+
replacement_string = "return #{last_statement.lstrip}"
|
184
|
+
|
185
|
+
input_array[input_array.index(last_statement)] = replacement_string
|
186
|
+
|
187
|
+
end
|
188
|
+
|
189
|
+
end
|
190
|
+
|
191
|
+
end
|
192
|
+
|
193
|
+
return input_array
|
194
|
+
|
195
|
+
end
|
196
|
+
|
197
|
+
def compile_multiple_return(input_array)
|
198
|
+
|
199
|
+
def find_all_matching_indices(input_string, pattern)
|
200
|
+
|
201
|
+
locations = []
|
202
|
+
|
203
|
+
index = input_string.index(pattern)
|
204
|
+
|
205
|
+
while index != nil
|
206
|
+
|
207
|
+
locations << index
|
208
|
+
|
209
|
+
index = input_string.index(pattern, index+1)
|
210
|
+
|
211
|
+
|
212
|
+
end
|
213
|
+
|
214
|
+
return locations
|
215
|
+
|
216
|
+
|
217
|
+
end
|
218
|
+
|
219
|
+
modified_input_array = input_array.dup
|
220
|
+
|
221
|
+
return_statements = input_array.dup.reject { |element| !element.include? "return" }
|
222
|
+
|
223
|
+
multiple_return_statements = return_statements.dup.reject { |element| !element.include? "," }
|
224
|
+
|
225
|
+
modified_multiple_return_statements = multiple_return_statements.dup
|
226
|
+
|
227
|
+
return_statement_index = []
|
228
|
+
|
229
|
+
multiple_return_statements.each do |statement|
|
230
|
+
|
231
|
+
location_array = modified_input_array.each_index.select { |index| modified_input_array[index] == statement }
|
232
|
+
|
233
|
+
return_statement_index << location_array[0]
|
234
|
+
|
235
|
+
end
|
236
|
+
|
237
|
+
multiple_return_statements.each_with_index do |return_statement, index|
|
238
|
+
|
239
|
+
replacement_counter = 0
|
240
|
+
|
241
|
+
if return_statement.include? "\""
|
242
|
+
|
243
|
+
starting_quotes = find_all_matching_indices(return_statement, "\"")
|
244
|
+
|
245
|
+
for x in 0...(starting_quotes.length)/2
|
246
|
+
|
247
|
+
quotes = return_statement[starting_quotes[x]..starting_quotes[x+1]]
|
248
|
+
|
249
|
+
replacement_counter += 1
|
250
|
+
|
251
|
+
modified_multiple_return_statements[index] = modified_multiple_return_statements[index].sub(quotes, "repstring#{1}")
|
252
|
+
|
253
|
+
modified_input_array[return_statement_index[index]] = modified_multiple_return_statements[index].sub(quotes, "repstring#{1}")
|
254
|
+
|
255
|
+
end
|
256
|
+
|
257
|
+
end
|
258
|
+
|
259
|
+
end
|
260
|
+
|
261
|
+
modified_multiple_return_statements = modified_multiple_return_statements.reject { |element| !element.include? "," }
|
262
|
+
|
263
|
+
return_statement_index = []
|
264
|
+
|
265
|
+
modified_multiple_return_statements.each do |statement|
|
266
|
+
|
267
|
+
location_array = modified_input_array.each_index.select { |index| modified_input_array[index] == statement }
|
268
|
+
|
269
|
+
return_statement_index << location_array[0]
|
270
|
+
|
271
|
+
end
|
272
|
+
|
273
|
+
modified_multiple_return_statements.each_with_index do |return_statement, index|
|
274
|
+
|
275
|
+
method_call_counter = 0
|
276
|
+
|
277
|
+
if return_statement.include? "("
|
278
|
+
|
279
|
+
open_paran_location = find_all_matching_indices(return_statement, "(")
|
280
|
+
|
281
|
+
open_paran_location.each do |paran_index|
|
282
|
+
|
283
|
+
method_call = return_statement[paran_index..return_statement.index(")", paran_index+1)]
|
284
|
+
|
285
|
+
method_call_counter += 1
|
286
|
+
|
287
|
+
modified_multiple_return_statements[index] = modified_multiple_return_statements[index].sub(method_call, "methodcall#{method_call_counter}")
|
288
|
+
|
289
|
+
modified_input_array[return_statement_index[index]] = modified_multiple_return_statements[index].sub(method_call, "methodcall#{method_call_counter}")
|
290
|
+
|
291
|
+
end
|
292
|
+
|
293
|
+
end
|
294
|
+
|
295
|
+
end
|
296
|
+
|
297
|
+
modified_multiple_return_statements = modified_multiple_return_statements.reject { |element| !element.include?(",") }
|
298
|
+
|
299
|
+
return_statement_index = []
|
300
|
+
|
301
|
+
modified_multiple_return_statements.each do |statement|
|
302
|
+
|
303
|
+
location_array = modified_input_array.each_index.select { |index| modified_input_array[index] == statement }
|
304
|
+
|
305
|
+
return_statement_index << location_array[0]
|
306
|
+
|
307
|
+
end
|
308
|
+
|
309
|
+
return_statement_index.each do |index|
|
310
|
+
|
311
|
+
original_statement = input_array[index]
|
312
|
+
|
313
|
+
statement_split = original_statement.split("return ")
|
314
|
+
|
315
|
+
replacement_split = "return [" + statement_split[1].rstrip + "]\n\n"
|
316
|
+
|
317
|
+
input_array[index] = replacement_split
|
318
|
+
|
319
|
+
end
|
320
|
+
|
321
|
+
return input_array
|
322
|
+
|
323
|
+
end
|
324
|
+
|
325
|
+
def coffee_type_function(input_array)
|
326
|
+
|
327
|
+
function_name = input_array[0].split("function ")[1].split("(")[0].lstrip
|
328
|
+
|
329
|
+
input_array[0] = "#{function_name} = function(" + input_array[0].split("function ")[1].split("(")[1].lstrip
|
330
|
+
|
331
|
+
return input_array
|
332
|
+
|
333
|
+
end
|
334
|
+
|
335
|
+
def compile_function(input_array, temporary_nila_file)
|
336
|
+
|
337
|
+
modified_input_array = input_array.dup
|
338
|
+
|
339
|
+
if is_parameterless?(modified_input_array)
|
340
|
+
|
341
|
+
if modified_input_array[0].include?("--single")
|
342
|
+
|
343
|
+
modified_input_array[0] = input_array[0].sub "def", "function"
|
344
|
+
|
345
|
+
interim_string = modified_input_array[0].split("--single")
|
346
|
+
|
347
|
+
modified_input_array[0] = interim_string[0].rstrip + "() {\n--single" + interim_string[1]
|
348
|
+
|
349
|
+
|
350
|
+
elsif modified_input_array[0].include?("--multi")
|
351
|
+
|
352
|
+
modified_input_array[0] = input_array[0].sub "def", "function"
|
353
|
+
|
354
|
+
interim_string = modified_input_array[0].split("--multi")
|
355
|
+
|
356
|
+
modified_input_array[0] = interim_string[0].rstrip + "() {\n--multi" + interim_string[1]
|
357
|
+
|
358
|
+
else
|
359
|
+
|
360
|
+
modified_input_array[0] = input_array[0].sub "def", "function"
|
361
|
+
|
362
|
+
modified_input_array[0] = modified_input_array[0].rstrip + "() {\n"
|
363
|
+
|
364
|
+
end
|
365
|
+
|
366
|
+
else
|
367
|
+
|
368
|
+
if modified_input_array[0].include?("--single")
|
369
|
+
|
370
|
+
modified_input_array[0] = input_array[0].sub "def", "function"
|
371
|
+
|
372
|
+
interim_string = modified_input_array[0].split("--single")
|
373
|
+
|
374
|
+
modified_input_array[0] = interim_string[0].rstrip + " {\n--single" + interim_string[1]
|
375
|
+
|
376
|
+
|
377
|
+
elsif modified_input_array[0].include?("--multi")
|
378
|
+
|
379
|
+
modified_input_array[0] = input_array[0].sub "def", "function"
|
380
|
+
|
381
|
+
interim_string = modified_input_array[0].split("--multi")
|
382
|
+
|
383
|
+
modified_input_array[0] = interim_string[0].rstrip + " {\n--multi" + interim_string[1]
|
384
|
+
|
385
|
+
else
|
386
|
+
|
387
|
+
modified_input_array[0] = input_array[0].sub "def", "function"
|
388
|
+
|
389
|
+
modified_input_array[0] = modified_input_array[0].rstrip + " {\n"
|
390
|
+
|
391
|
+
end
|
392
|
+
|
393
|
+
end
|
394
|
+
|
395
|
+
modified_input_array[-1] = input_array[-1].sub "end", "};\n"
|
396
|
+
|
397
|
+
modified_input_array = compile_parallel_assignment(modified_input_array, temporary_nila_file)
|
398
|
+
|
399
|
+
modified_input_array = compile_multiple_ruby_func_calls(modified_input_array)
|
400
|
+
|
401
|
+
modified_input_array = add_auto_return_statement(modified_input_array)
|
402
|
+
|
403
|
+
modified_input_array = compile_multiple_return(modified_input_array)
|
404
|
+
|
405
|
+
modified_input_array = coffee_type_function(modified_input_array)
|
406
|
+
|
407
|
+
modified_input_array = compile_splats(modified_input_array)
|
408
|
+
|
409
|
+
variables = lexical_scoped_variables(modified_input_array)
|
410
|
+
|
411
|
+
if !variables.empty?
|
412
|
+
|
413
|
+
variable_string = "\nvar " + variables.join(", ") + "\n"
|
414
|
+
|
415
|
+
modified_input_array.insert(1, variable_string)
|
416
|
+
|
417
|
+
end
|
418
|
+
|
419
|
+
modified_input_array = remove_question_marks(modified_input_array, variables, temporary_nila_file)
|
420
|
+
|
421
|
+
return modified_input_array
|
422
|
+
|
423
|
+
end
|
424
|
+
|
425
|
+
def extract_function_name(input_code_block)
|
426
|
+
|
427
|
+
first_line = input_code_block[0]
|
428
|
+
|
429
|
+
first_line_split = first_line.split(" ")
|
430
|
+
|
431
|
+
if first_line_split[1].include?("(")
|
432
|
+
|
433
|
+
function_name, parameters = first_line_split[1].split("(")
|
434
|
+
|
435
|
+
else
|
436
|
+
|
437
|
+
function_name = first_line_split[1]
|
438
|
+
|
439
|
+
end
|
440
|
+
|
441
|
+
return function_name
|
442
|
+
|
443
|
+
end
|
444
|
+
|
445
|
+
def compile_splats(input_function_block)
|
446
|
+
|
447
|
+
def errorFree(function_params,optional_param)
|
448
|
+
|
449
|
+
# This method checks for use cases in complex arguments where a default argument is used
|
450
|
+
# after an optional argument. This will result in erroneous output. So this method will
|
451
|
+
# stop it from happening.
|
452
|
+
|
453
|
+
# Example:
|
454
|
+
# def method_name(a,b,*c,d = 1,c,e)
|
455
|
+
|
456
|
+
after_splat = function_params[function_params.index(optional_param)+1..-1]
|
457
|
+
|
458
|
+
if after_splat.reject {|element| !element.include?("=")}.empty?
|
459
|
+
|
460
|
+
true
|
461
|
+
|
462
|
+
else
|
463
|
+
|
464
|
+
raise "You cannot have a default argument after an optional argument!"
|
465
|
+
|
466
|
+
false
|
467
|
+
|
468
|
+
end
|
469
|
+
|
470
|
+
end
|
471
|
+
|
472
|
+
function_params = input_function_block[0].split("function(")[1].split(")")[0].split(",")
|
473
|
+
|
474
|
+
unless function_params.reject{|element| !replace_strings(element).include?("*")}.empty?
|
475
|
+
|
476
|
+
mod_function_params = function_params.reject {|element| replace_strings(element).include?("*")}
|
477
|
+
|
478
|
+
opt_index = 0
|
479
|
+
|
480
|
+
# If there are multiple optional params declared by mistake, only the first optional param is used.
|
481
|
+
|
482
|
+
optional_param = function_params.reject {|element| !replace_strings(element).include?("*")}[0]
|
483
|
+
|
484
|
+
if function_params.index(optional_param).eql?(function_params.length-1)
|
485
|
+
|
486
|
+
mod_function_params.each_with_index do |param,index|
|
487
|
+
|
488
|
+
input_function_block.insert(index+1,"#{param} = arguments[#{index}]\n\n")
|
489
|
+
|
490
|
+
opt_index = index + 1
|
491
|
+
|
492
|
+
end
|
493
|
+
|
494
|
+
replacement_string = "#{optional_param.gsub("*","")} = []\n\n"
|
495
|
+
|
496
|
+
replacement_string += "for (var i=#{opt_index};i<arguments.length;i++) {\n #{optional_param.gsub("*","")}.push(arguments[i]); \n}\n\n"
|
497
|
+
|
498
|
+
input_function_block.insert(opt_index+1,replacement_string)
|
499
|
+
|
500
|
+
input_function_block[0] = input_function_block[0].sub(function_params.join(","),"")
|
501
|
+
|
502
|
+
else
|
503
|
+
|
504
|
+
before_splat = function_params[0...function_params.index(optional_param)]
|
505
|
+
|
506
|
+
after_splat = function_params[function_params.index(optional_param)+1..-1]
|
507
|
+
|
508
|
+
cont_index = 0
|
509
|
+
|
510
|
+
if errorFree(function_params,optional_param)
|
511
|
+
|
512
|
+
before_splat.each_with_index do |param,index|
|
513
|
+
|
514
|
+
input_function_block.insert(index+1,"#{param} = arguments[#{index}]\n\n")
|
515
|
+
|
516
|
+
cont_index = index + 1
|
517
|
+
|
518
|
+
end
|
519
|
+
|
520
|
+
after_splat.each_with_index do |param,index|
|
521
|
+
|
522
|
+
input_function_block.insert(cont_index+1,"#{param} = arguments[arguments.length-#{after_splat.length - index}]\n\n")
|
523
|
+
|
524
|
+
cont_index = cont_index + 1
|
525
|
+
|
526
|
+
end
|
527
|
+
|
528
|
+
replacement_string = "#{optional_param.gsub("*","")} = []\n\n"
|
529
|
+
|
530
|
+
replacement_string += "for (var i=#{function_params.index(optional_param)};i < arguments.length-#{after_splat.length};i++) {\n #{optional_param.gsub("*","")}.push(arguments[i]); \n}\n\n"
|
531
|
+
|
532
|
+
input_function_block.insert(cont_index+1,replacement_string)
|
533
|
+
|
534
|
+
input_function_block[0] = input_function_block[0].sub(function_params.join(","),"")
|
535
|
+
|
536
|
+
end
|
537
|
+
|
538
|
+
end
|
539
|
+
|
540
|
+
end
|
541
|
+
|
542
|
+
return strToArray(input_function_block.join)
|
543
|
+
|
544
|
+
end
|
545
|
+
|
546
|
+
def compile_multiple_ruby_func_calls(input_file_contents)
|
547
|
+
|
548
|
+
def replace_strings(input_string)
|
549
|
+
|
550
|
+
string_counter = 0
|
551
|
+
|
552
|
+
if input_string.count("\"") % 2 == 0
|
553
|
+
|
554
|
+
while input_string.include?("\"")
|
555
|
+
|
556
|
+
string_extract = input_string[input_string.index("\"")..input_string.index("\"",input_string.index("\"")+1)]
|
557
|
+
|
558
|
+
input_string = input_string.sub(string_extract,"--repstring#{string_counter}")
|
559
|
+
|
560
|
+
string_counter += 1
|
561
|
+
|
562
|
+
end
|
563
|
+
|
564
|
+
end
|
565
|
+
|
566
|
+
if input_string.count("'") % 2 == 0
|
567
|
+
|
568
|
+
while input_string.include?("'")
|
569
|
+
|
570
|
+
string_extract = input_string[input_string.index("'")..input_string.index("'",input_string.index("'")+1)]
|
571
|
+
|
572
|
+
input_string = input_string.sub(string_extract,"--repstring#{string_counter}")
|
573
|
+
|
574
|
+
string_counter += 1
|
575
|
+
|
576
|
+
end
|
577
|
+
|
578
|
+
end
|
579
|
+
|
580
|
+
input_string = input_string.gsub(/\((\w{0,},)*\w{0,}\)/,"--$k$")
|
581
|
+
|
582
|
+
return input_string
|
583
|
+
|
584
|
+
end
|
585
|
+
|
586
|
+
function_calls = []
|
587
|
+
|
588
|
+
replacement_calls = []
|
589
|
+
|
590
|
+
function_map = %w{puts p print}
|
591
|
+
|
592
|
+
javascript_regexp = /(if |for |while |\(function\(|= function\(|((=|:)\s+\{))/
|
593
|
+
|
594
|
+
stringified_input = input_file_contents.collect {|element| replace_strings(element)}
|
595
|
+
|
596
|
+
function_map.each do |func|
|
597
|
+
|
598
|
+
func_calls = input_file_contents.reject {|line| !(line.include?(func+"(") or line.include?(func+" ") and line.index(javascript_regexp) == nil)}
|
599
|
+
|
600
|
+
modified_func_calls = func_calls.collect {|element| replace_strings(element)}
|
601
|
+
|
602
|
+
modified_func_calls = modified_func_calls.reject {|element| !element.include?(",")}
|
603
|
+
|
604
|
+
call_collector = []
|
605
|
+
|
606
|
+
modified_func_calls.each_with_index do |ele|
|
607
|
+
|
608
|
+
call_collector << input_file_contents[stringified_input.index(ele)]
|
609
|
+
|
610
|
+
end
|
611
|
+
|
612
|
+
function_calls << modified_func_calls
|
613
|
+
|
614
|
+
rep_calls = []
|
615
|
+
|
616
|
+
call_collector.each do |fcall|
|
617
|
+
|
618
|
+
multiple_call = fcall.split(func)[1].split(",")
|
619
|
+
|
620
|
+
multiple_call = multiple_call.collect {|element| "\n#{func} " + element.strip + "\n\n"}
|
621
|
+
|
622
|
+
rep_calls << multiple_call.join
|
623
|
+
|
624
|
+
end
|
625
|
+
|
626
|
+
replacement_calls << rep_calls
|
627
|
+
|
628
|
+
end
|
629
|
+
|
630
|
+
replacement_calls = replacement_calls.flatten
|
631
|
+
|
632
|
+
function_calls = function_calls.flatten
|
633
|
+
|
634
|
+
function_calls.each_with_index do |fcall,index|
|
635
|
+
|
636
|
+
input_file_contents[stringified_input.index(fcall)] = replacement_calls[index]
|
637
|
+
|
638
|
+
end
|
639
|
+
|
640
|
+
return strToArray(input_file_contents.join)
|
641
|
+
|
642
|
+
end
|
643
|
+
|
644
|
+
joined_file_contents = input_file_contents.join
|
645
|
+
|
646
|
+
unless named_code_blocks.empty?
|
647
|
+
|
648
|
+
codeblock_counter = 1
|
649
|
+
|
650
|
+
function_names = []
|
651
|
+
|
652
|
+
named_code_blocks.each do |codeblock|
|
653
|
+
|
654
|
+
function_names[codeblock_counter-1] = []
|
655
|
+
|
656
|
+
joined_file_contents = joined_file_contents.sub("--named_function[#{codeblock_counter}]\n", compile_function(codeblock, temporary_nila_file).join)
|
657
|
+
|
658
|
+
codeblock_counter += 1
|
659
|
+
|
660
|
+
current_nested_functions = nested_functions[codeblock_counter-2]
|
661
|
+
|
662
|
+
function_names[codeblock_counter-2] << extract_function_name(codeblock)
|
663
|
+
|
664
|
+
current_nested_functions.each do |nested_function|
|
665
|
+
|
666
|
+
function_names[codeblock_counter-2] << extract_function_name(nested_function)
|
667
|
+
|
668
|
+
joined_file_contents = joined_file_contents.sub(nested_function.join, compile_function(nested_function, temporary_nila_file).join)
|
669
|
+
|
670
|
+
end
|
671
|
+
|
672
|
+
end
|
673
|
+
|
674
|
+
else
|
675
|
+
|
676
|
+
function_names = []
|
677
|
+
|
678
|
+
end
|
679
|
+
|
680
|
+
file_id = open(temporary_nila_file, 'w')
|
681
|
+
|
682
|
+
file_id.write(joined_file_contents)
|
683
|
+
|
684
|
+
file_id.close()
|
685
|
+
|
686
|
+
line_by_line_contents = compile_multiple_ruby_func_calls(read_file_line_by_line(temporary_nila_file))
|
687
|
+
|
688
|
+
return line_by_line_contents, function_names
|
689
|
+
|
690
|
+
end
|