nilac 0.0.3.1 → 0.0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/nilac +94 -131
- data/lib/nilac/version.rb +1 -1
- metadata +2 -2
data/bin/nilac
CHANGED
@@ -22,42 +22,19 @@ def compile(input_file_path)
|
|
22
22
|
|
23
23
|
end
|
24
24
|
|
25
|
+
def extract_parsable_file(input_file_contents)
|
25
26
|
|
26
|
-
|
27
|
+
reversed_file_contents = input_file_contents.reverse
|
27
28
|
|
28
|
-
|
29
|
+
line_counter = 0
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
end_index = 0
|
33
|
-
|
34
|
-
input_file_contents.each_with_index do |line,index|
|
31
|
+
while !reversed_file_contents[line_counter].strip.include?("__END__")
|
35
32
|
|
36
|
-
|
37
|
-
|
38
|
-
end_index = index
|
39
|
-
|
40
|
-
end
|
33
|
+
line_counter += 1
|
41
34
|
|
42
35
|
end
|
43
36
|
|
44
|
-
|
45
|
-
|
46
|
-
output = modified_file_contents
|
47
|
-
|
48
|
-
else
|
49
|
-
|
50
|
-
output = modified_file_contents[0..end_index-1]
|
51
|
-
|
52
|
-
while output[-1].eql?("\n")
|
53
|
-
|
54
|
-
output.delete_at(-1)
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
return output
|
37
|
+
return_contents = input_file_contents[0...-1*line_counter-1]
|
61
38
|
|
62
39
|
end
|
63
40
|
|
@@ -156,8 +133,12 @@ def compile(input_file_path)
|
|
156
133
|
|
157
134
|
file_id.write(modified_file_contents)
|
158
135
|
|
136
|
+
file_id2.write("//Written in Nila and compiled to Javascript. Have fun!\n\n")
|
137
|
+
|
159
138
|
file_id.close()
|
160
139
|
|
140
|
+
file_id2.close()
|
141
|
+
|
161
142
|
line_by_line_contents = read_file_line_by_line(temporary_nila_file)
|
162
143
|
|
163
144
|
comments = multiline_comments.dup
|
@@ -194,7 +175,7 @@ def compile(input_file_path)
|
|
194
175
|
|
195
176
|
replacement_line = modified_file_contents[index]
|
196
177
|
|
197
|
-
replacement_line = replacement_line.split(";").join("\n\n")
|
178
|
+
replacement_line = replacement_line.split(";").join("\n\n") + "\n"
|
198
179
|
|
199
180
|
modified_file_contents[index] = replacement_line
|
200
181
|
|
@@ -206,83 +187,6 @@ def compile(input_file_path)
|
|
206
187
|
|
207
188
|
end
|
208
189
|
|
209
|
-
def compile_heredoc_strings(input_file_contents,temporary_nila_file)
|
210
|
-
|
211
|
-
#This method will compile all the Heredoc strings in Nila into pure
|
212
|
-
#Javascript strings. Ruby has two types of Heredocs. Currently, Nila doesn't support both of them.
|
213
|
-
#Here is an example of what Nila supports
|
214
|
-
|
215
|
-
#long_passage = <<-ipsumtext
|
216
|
-
#
|
217
|
-
#Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
|
218
|
-
#incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
|
219
|
-
#exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute
|
220
|
-
#irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
|
221
|
-
#pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia
|
222
|
-
#deserunt mollit anim id est laborum.
|
223
|
-
#
|
224
|
-
#ipsumtext
|
225
|
-
|
226
|
-
def find_all_matching_indices(input_string,pattern)
|
227
|
-
|
228
|
-
locations = []
|
229
|
-
|
230
|
-
index = input_string.index(pattern)
|
231
|
-
|
232
|
-
while index != nil
|
233
|
-
|
234
|
-
locations << index
|
235
|
-
|
236
|
-
index = input_string.index(pattern,index+1)
|
237
|
-
|
238
|
-
|
239
|
-
end
|
240
|
-
|
241
|
-
return locations
|
242
|
-
|
243
|
-
|
244
|
-
end
|
245
|
-
|
246
|
-
preserve_formatting = %w{ \n \t }
|
247
|
-
|
248
|
-
joined_file_contents = input_file_contents.join
|
249
|
-
|
250
|
-
modified_file_contents = joined_file_contents.dup
|
251
|
-
|
252
|
-
heredoc_start_locations = find_all_matching_indices(joined_file_contents,"<<-")
|
253
|
-
|
254
|
-
heredoc_start_locations.each do |location|
|
255
|
-
|
256
|
-
string_extract = joined_file_contents[location..-1]
|
257
|
-
|
258
|
-
end_of_first_line = string_extract.index("\n")
|
259
|
-
|
260
|
-
name_of_heredoc = string_extract[3...end_of_first_line].rstrip
|
261
|
-
|
262
|
-
heredoc_start,heredoc_end = find_all_matching_indices(string_extract,name_of_heredoc)
|
263
|
-
|
264
|
-
heredoc = string_extract[heredoc_start..heredoc_end+name_of_heredoc.length-1]
|
265
|
-
|
266
|
-
heredoc_content = heredoc.split(name_of_heredoc)
|
267
|
-
|
268
|
-
heredoc_content = heredoc_content[1].lstrip.rstrip.gsub("\n","\\n").gsub("\t","\\t")
|
269
|
-
|
270
|
-
modified_file_contents = modified_file_contents.sub(string_extract[heredoc_start-3..heredoc_end+name_of_heredoc.length-1],"\""+heredoc_content+"\"")
|
271
|
-
|
272
|
-
end
|
273
|
-
|
274
|
-
file_id = open(temporary_nila_file, 'w')
|
275
|
-
|
276
|
-
file_id.write(modified_file_contents)
|
277
|
-
|
278
|
-
file_id.close()
|
279
|
-
|
280
|
-
line_by_line_contents = read_file_line_by_line(temporary_nila_file)
|
281
|
-
|
282
|
-
return line_by_line_contents
|
283
|
-
|
284
|
-
end
|
285
|
-
|
286
190
|
def compile_interpolated_strings(input_file_contents)
|
287
191
|
|
288
192
|
modified_file_contents = input_file_contents.dup
|
@@ -391,7 +295,7 @@ def compile(input_file_path)
|
|
391
295
|
|
392
296
|
key_word_locations << x
|
393
297
|
|
394
|
-
elsif current_row.include?("end\n")
|
298
|
+
elsif current_row.include?("end\n") || current_row.include?("end")
|
395
299
|
|
396
300
|
end_locations << x
|
397
301
|
|
@@ -919,16 +823,18 @@ def compile(input_file_path)
|
|
919
823
|
line_by_line_contents = read_file_line_by_line(temporary_nila_file)
|
920
824
|
|
921
825
|
return line_by_line_contents,function_names
|
922
|
-
|
826
|
+
|
923
827
|
end
|
924
828
|
|
925
829
|
def compile_custom_function_map(input_file_contents)
|
926
830
|
|
927
|
-
function_map = ["puts"]
|
831
|
+
function_map = ["puts","print"]
|
928
832
|
|
929
833
|
function_map_replacements = {
|
930
834
|
|
931
|
-
"puts" => "console.log"
|
835
|
+
"puts" => "console.log",
|
836
|
+
|
837
|
+
"print" => "console.log"
|
932
838
|
|
933
839
|
}
|
934
840
|
|
@@ -1035,7 +941,53 @@ def compile(input_file_path)
|
|
1035
941
|
|
1036
942
|
#1. If, Elsif, Else Statement
|
1037
943
|
|
944
|
+
def compile_inline_conditionals(input_file_contents,temporary_nila_file)
|
945
|
+
|
946
|
+
conditionals = [/( if )/,/( while )/]
|
947
|
+
|
948
|
+
plain_conditionals = [" if "," while "]
|
949
|
+
|
950
|
+
joined_file_contents = input_file_contents.join
|
951
|
+
|
952
|
+
output_statement = ""
|
953
|
+
|
954
|
+
conditionals.each_with_index do |regex,index|
|
955
|
+
|
956
|
+
matching_lines = input_file_contents.reject {|content| !content.index(regex)}
|
957
|
+
|
958
|
+
matching_lines.each do |line|
|
959
|
+
|
960
|
+
line_split = line.split(plain_conditionals[index])
|
961
|
+
|
962
|
+
if index == 0
|
963
|
+
|
964
|
+
output_statement = "if (#{line_split[1].lstrip.rstrip}) {\n\n#{line_split[0]}\n}\n"
|
965
|
+
|
966
|
+
elsif index == 1
|
967
|
+
|
968
|
+
output_statement = "while (#{line_split[1].lstrip.rstrip}) {\n\n#{line_split[0]}\n}\n"
|
969
|
+
|
970
|
+
end
|
971
|
+
|
972
|
+
joined_file_contents = joined_file_contents.sub(line,output_statement)
|
973
|
+
|
974
|
+
end
|
975
|
+
|
976
|
+
end
|
977
|
+
|
978
|
+
file_id = open(temporary_nila_file, 'w')
|
979
|
+
|
980
|
+
file_id.write(joined_file_contents)
|
981
|
+
|
982
|
+
file_id.close()
|
983
|
+
|
984
|
+
line_by_line_contents = read_file_line_by_line(temporary_nila_file)
|
985
|
+
|
986
|
+
return line_by_line_contents
|
987
|
+
|
988
|
+
end
|
1038
989
|
|
990
|
+
line_by_line_contents = compile_inline_conditionals(input_file_contents,temporary_nila_file)
|
1039
991
|
|
1040
992
|
end
|
1041
993
|
|
@@ -1243,7 +1195,7 @@ def compile(input_file_path)
|
|
1243
1195
|
|
1244
1196
|
end
|
1245
1197
|
|
1246
|
-
javascript_regexp = /(function |function\()/
|
1198
|
+
javascript_regexp = /(if |while |function |function\()/
|
1247
1199
|
|
1248
1200
|
locations = []
|
1249
1201
|
|
@@ -1257,8 +1209,6 @@ def compile(input_file_path)
|
|
1257
1209
|
|
1258
1210
|
combined_location = [code_block_starting_locations,code_block_ending_locations.dup].flatten.sort
|
1259
1211
|
|
1260
|
-
last_matching_location = 0
|
1261
|
-
|
1262
1212
|
self_invoking_function_extract = joined_file_contents[code_block_starting_locations[0]..code_block_ending_locations[-1]]
|
1263
1213
|
|
1264
1214
|
self_invoking_function_array = convert_string_to_array(self_invoking_function_extract,temporary_nila_file)
|
@@ -1275,29 +1225,43 @@ def compile(input_file_path)
|
|
1275
1225
|
|
1276
1226
|
modified_self_invoking_array[-1] = "\n\n" + modified_self_invoking_array[-1]
|
1277
1227
|
|
1228
|
+
nested_elements = []
|
1229
|
+
|
1230
|
+
nested_indices = []
|
1231
|
+
|
1232
|
+
modified_starting_locations = code_block_starting_locations.dup
|
1233
|
+
|
1278
1234
|
while code_block_ending_locations.length > 0
|
1279
1235
|
|
1280
1236
|
matching_location = combined_location[combined_location.index(code_block_ending_locations[0])-1]
|
1281
1237
|
|
1238
|
+
combined_location.delete(matching_location)
|
1239
|
+
|
1282
1240
|
location_among_start_locations = code_block_starting_locations.index(matching_location)
|
1283
1241
|
|
1284
|
-
|
1242
|
+
if location_among_start_locations == 0
|
1285
1243
|
|
1286
|
-
|
1244
|
+
locations << [[matching_location,combined_location[combined_location.index(code_block_ending_locations[0])]]]
|
1287
1245
|
|
1288
|
-
|
1246
|
+
else
|
1289
1247
|
|
1290
|
-
|
1248
|
+
nested_elements << [matching_location,combined_location[combined_location.index(code_block_ending_locations[0])]]
|
1291
1249
|
|
1292
|
-
|
1250
|
+
nested_indices << modified_starting_locations.index(matching_location)
|
1293
1251
|
|
1294
|
-
|
1252
|
+
end
|
1295
1253
|
|
1296
|
-
|
1254
|
+
combined_location.delete(code_block_ending_locations[0])
|
1297
1255
|
|
1298
|
-
|
1256
|
+
code_block_ending_locations.delete_at(0)
|
1299
1257
|
|
1300
|
-
|
1258
|
+
code_block_starting_locations.delete(matching_location)
|
1259
|
+
|
1260
|
+
end
|
1261
|
+
|
1262
|
+
nested_indices.each_with_index do |loc,index|
|
1263
|
+
|
1264
|
+
locations[loc-1] << nested_elements[index]
|
1301
1265
|
|
1302
1266
|
end
|
1303
1267
|
|
@@ -1379,7 +1343,7 @@ def compile(input_file_path)
|
|
1379
1343
|
|
1380
1344
|
def create_self_invoking_function(input_file_contents)
|
1381
1345
|
|
1382
|
-
# A feature imported from Coffeescript
|
1346
|
+
# A feature imported from Coffeescript. This makes all the function private by default
|
1383
1347
|
# and prevents global variables from leaking.
|
1384
1348
|
|
1385
1349
|
modified_file_contents = ["(function() {\n\n",input_file_contents,"\n\n}).call(this);\n"].flatten
|
@@ -1406,14 +1370,12 @@ def compile(input_file_path)
|
|
1406
1370
|
|
1407
1371
|
file_contents = read_file_line_by_line(input_file_path)
|
1408
1372
|
|
1409
|
-
file_contents =
|
1373
|
+
file_contents = extract_parsable_file(file_contents)
|
1410
1374
|
|
1411
1375
|
file_contents,multiline_comments,temp_file,output_js_file = replace_multiline_comments(file_contents,input_file_path)
|
1412
1376
|
|
1413
1377
|
file_contents = split_semicolon_seperated_expressions(file_contents)
|
1414
1378
|
|
1415
|
-
file_contents = compile_heredoc_strings(file_contents,temp_file)
|
1416
|
-
|
1417
1379
|
file_contents = compile_interpolated_strings(file_contents)
|
1418
1380
|
|
1419
1381
|
file_contents,singleline_comments = replace_singleline_comments(file_contents)
|
@@ -1426,6 +1388,8 @@ def compile(input_file_path)
|
|
1426
1388
|
|
1427
1389
|
file_contents = compile_arrays(file_contents)
|
1428
1390
|
|
1391
|
+
file_contents = compile_conditional_structures(file_contents,temp_file)
|
1392
|
+
|
1429
1393
|
file_contents, function_names = compile_named_functions(file_contents,named_functions,nested_functions,temp_file)
|
1430
1394
|
|
1431
1395
|
file_contents, ruby_functions = compile_custom_function_map(file_contents)
|
@@ -1481,7 +1445,7 @@ def create_mac_executable(input_file)
|
|
1481
1445
|
|
1482
1446
|
end
|
1483
1447
|
|
1484
|
-
mac_file_contents = ["#!/usr/bin/env ruby"] + read_file_line_by_line(input_file)
|
1448
|
+
mac_file_contents = ["#!/usr/bin/env ruby\n\n"] + read_file_line_by_line(input_file)
|
1485
1449
|
|
1486
1450
|
mac_file_path = input_file.sub(".rb","")
|
1487
1451
|
|
@@ -1535,7 +1499,7 @@ OptionParser.new do |opts|
|
|
1535
1499
|
|
1536
1500
|
end
|
1537
1501
|
|
1538
|
-
opts.on("-b", "--build", "Builds Itself") do
|
1502
|
+
opts.on("-b", "--build FILE", "Builds Itself") do |file|
|
1539
1503
|
|
1540
1504
|
file_path = Dir.pwd + "/nilac.rb"
|
1541
1505
|
|
@@ -1545,7 +1509,7 @@ OptionParser.new do |opts|
|
|
1545
1509
|
|
1546
1510
|
end
|
1547
1511
|
|
1548
|
-
opts.on("-m", "--buildmac", "Builds Mac Executables") do
|
1512
|
+
opts.on("-m", "--buildmac FILE", "Builds Mac Executables") do |macfile|
|
1549
1513
|
|
1550
1514
|
file_path = Dir.pwd + "/nilac.rb"
|
1551
1515
|
|
@@ -1555,5 +1519,4 @@ OptionParser.new do |opts|
|
|
1555
1519
|
|
1556
1520
|
end
|
1557
1521
|
|
1558
|
-
|
1559
1522
|
end.parse!
|
data/lib/nilac/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nilac
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.3.
|
4
|
+
version: 0.0.3.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-10 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: Nilac is the official compiler of Nila language
|
15
15
|
email:
|