nilac 0.0.3.8 → 0.0.3.9
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/nilac +382 -43
- data/lib/nilac/version.rb +1 -1
- data/shark/features/add_auto_return_statement.feature +1 -1
- data/shark/features/array_and_string_indexing.feature +11 -0
- data/shark/features/barebones_compilation.feature +1 -1
- data/shark/features/fix_newlines.feature +1 -1
- data/shark/features/method_multiple_return.feature +1 -1
- data/shark/features/multiple_variable_initialization.feature +1 -1
- data/shark/test_files/array_string_indexing.nila +21 -0
- data/shark/test_files/correct_indexing.js +27 -0
- data/shark/test_files/correct_initialization.js +1 -1
- data/shark/test_files/perfect.js +1 -1
- data/shark/test_files/regular_if.nila +8 -0
- data/{bin → src}/nilac.rb +176 -41
- metadata +7 -8
- data/examples/sample.js +0 -46
- data/examples/sample.nila +0 -45
- data/shark/test_files/multiple_initialization.js +0 -21
- data/shark/test_files/multiple_return.js +0 -19
data/bin/nilac
CHANGED
@@ -309,7 +309,7 @@ def compile(input_file_path,*output_file_name)
|
|
309
309
|
|
310
310
|
key_word_locations << x
|
311
311
|
|
312
|
-
elsif current_row.include?("end\n") || current_row.include?("end")
|
312
|
+
elsif current_row.lstrip.include?("end\n") || current_row.include?("end")
|
313
313
|
|
314
314
|
end_locations << x
|
315
315
|
|
@@ -414,6 +414,60 @@ def compile(input_file_path,*output_file_name)
|
|
414
414
|
|
415
415
|
end
|
416
416
|
|
417
|
+
def compile_multiple_variable_initialization(input_file_contents,temporary_nila_file)
|
418
|
+
|
419
|
+
possible_variable_lines = input_file_contents.reject {|element| !element.include?"="}
|
420
|
+
|
421
|
+
possible_multiple_initialization = possible_variable_lines.reject {|element| !element.split("=")[0].include?","}
|
422
|
+
|
423
|
+
multiple_initialization_index = []
|
424
|
+
|
425
|
+
possible_multiple_initialization.each do |statement|
|
426
|
+
|
427
|
+
location_array = input_file_contents.each_index.select { |index| input_file_contents[index] == statement}
|
428
|
+
|
429
|
+
multiple_initialization_index << location_array[0]
|
430
|
+
|
431
|
+
end
|
432
|
+
|
433
|
+
modified_file_contents = input_file_contents.dup
|
434
|
+
|
435
|
+
multiple_init_counter = 1
|
436
|
+
|
437
|
+
possible_multiple_initialization.each_with_index do |line,index|
|
438
|
+
|
439
|
+
line_split = line.split(" = ")
|
440
|
+
|
441
|
+
right_side_variables = line_split[0].split(",")
|
442
|
+
|
443
|
+
replacement_string = "multipleinit#{multiple_init_counter} = #{line_split[1]}\n\n"
|
444
|
+
|
445
|
+
variable_string = ""
|
446
|
+
|
447
|
+
right_side_variables.each_with_index do |variable,var_index|
|
448
|
+
|
449
|
+
variable_string = variable_string + variable.rstrip + " = multipleinit#{multiple_init_counter}[#{var_index}]\n\n"
|
450
|
+
|
451
|
+
end
|
452
|
+
|
453
|
+
replacement_string = replacement_string + variable_string
|
454
|
+
|
455
|
+
modified_file_contents[multiple_initialization_index[index]] = replacement_string
|
456
|
+
|
457
|
+
end
|
458
|
+
|
459
|
+
file_id = open(temporary_nila_file, 'w')
|
460
|
+
|
461
|
+
file_id.write(modified_file_contents.join)
|
462
|
+
|
463
|
+
file_id.close()
|
464
|
+
|
465
|
+
line_by_line_contents = read_file_line_by_line(temporary_nila_file)
|
466
|
+
|
467
|
+
return line_by_line_contents
|
468
|
+
|
469
|
+
end
|
470
|
+
|
417
471
|
def get_variables(input_file_contents,temporary_nila_file)
|
418
472
|
|
419
473
|
#This method is solely focused on getting a list of variables to be declared.
|
@@ -464,7 +518,7 @@ def compile(input_file_path,*output_file_name)
|
|
464
518
|
|
465
519
|
if variables.length > 0
|
466
520
|
|
467
|
-
variable_declaration_string = "var " + variables.uniq.join(", ") + "\n\n"
|
521
|
+
variable_declaration_string = "var " + variables.uniq.sort.join(", ") + "\n\n"
|
468
522
|
|
469
523
|
line_by_line_contents = [variable_declaration_string,line_by_line_contents].flatten
|
470
524
|
|
@@ -526,73 +580,203 @@ def compile(input_file_path,*output_file_name)
|
|
526
580
|
# 1. %w{} syntax
|
527
581
|
# 2. Range - Coming soon!
|
528
582
|
|
529
|
-
def
|
583
|
+
def compile_w_arrays(input_file_contents)
|
530
584
|
|
531
|
-
def
|
585
|
+
def extract(input_string,pattern_start,pattern_end)
|
532
586
|
|
533
|
-
|
587
|
+
def find_all_matching_indices(input_string,pattern)
|
534
588
|
|
535
|
-
|
589
|
+
locations = []
|
536
590
|
|
537
|
-
|
591
|
+
index = input_string.index(pattern)
|
538
592
|
|
539
|
-
|
593
|
+
while index != nil
|
540
594
|
|
541
|
-
|
595
|
+
locations << index
|
596
|
+
|
597
|
+
index = input_string.index(pattern,index+1)
|
598
|
+
|
599
|
+
|
600
|
+
end
|
601
|
+
|
602
|
+
return locations
|
542
603
|
|
543
604
|
|
544
605
|
end
|
545
606
|
|
546
|
-
|
607
|
+
all_start_locations = find_all_matching_indices(input_string,pattern_start)
|
608
|
+
|
609
|
+
all_end_locations = find_all_matching_indices(input_string,pattern_end)
|
610
|
+
|
611
|
+
pattern = []
|
612
|
+
|
613
|
+
all_start_locations.each_with_index do |location,index|
|
547
614
|
|
615
|
+
pattern << input_string[location..all_end_locations[index]]
|
616
|
+
|
617
|
+
end
|
618
|
+
|
619
|
+
return pattern
|
548
620
|
|
549
621
|
end
|
550
622
|
|
551
|
-
|
623
|
+
def compile_w_syntax(input_string)
|
552
624
|
|
553
|
-
|
625
|
+
modified_input_string = input_string[3...-1]
|
554
626
|
|
555
|
-
|
627
|
+
string_split = modified_input_string.split(" ")
|
628
|
+
|
629
|
+
return string_split.to_s
|
630
|
+
|
631
|
+
end
|
632
|
+
|
633
|
+
modified_file_contents = input_file_contents.dup
|
634
|
+
|
635
|
+
input_file_contents.each_with_index do |line,index|
|
636
|
+
|
637
|
+
if line.include?("%w{")
|
556
638
|
|
557
|
-
|
639
|
+
string_arrays = extract(line,"%w{","}")
|
558
640
|
|
559
|
-
|
641
|
+
string_arrays.each do |array|
|
642
|
+
|
643
|
+
modified_file_contents[index] = modified_file_contents[index].sub(array,compile_w_syntax(array))
|
644
|
+
|
645
|
+
end
|
646
|
+
|
647
|
+
end
|
560
648
|
|
561
649
|
end
|
562
650
|
|
563
|
-
return
|
651
|
+
return modified_file_contents
|
564
652
|
|
565
653
|
end
|
566
654
|
|
567
|
-
def
|
655
|
+
def compile_array_indexing(input_file_contents)
|
568
656
|
|
569
|
-
|
657
|
+
#Nila allows two different kinds of indexing operations on arrays and strings. They are
|
570
658
|
|
571
|
-
|
659
|
+
#1. Using Ranges => numbers[0...5]
|
660
|
+
#2. Using Start and End Indexes => numbers[0,5]
|
572
661
|
|
573
|
-
|
662
|
+
#This method implements this Nila feature
|
574
663
|
|
575
|
-
|
664
|
+
possible_indexing_operation = input_file_contents.dup.reject {|element| !element.include?"[" and !element.include?"]"}
|
576
665
|
|
577
|
-
|
666
|
+
possible_range_indexing = possible_indexing_operation.reject {|element| !element.include?".."}
|
578
667
|
|
579
|
-
|
668
|
+
triple_range_indexing = possible_range_indexing.reject {|element| !element.include?"..."}
|
669
|
+
|
670
|
+
triple_range_indexes = []
|
671
|
+
|
672
|
+
triple_range_indexing.each do |line|
|
673
|
+
|
674
|
+
triple_range_indexes << input_file_contents.dup.each_index.select {|index| input_file_contents[index] == line}
|
675
|
+
|
676
|
+
end
|
677
|
+
|
678
|
+
triple_range_indexes = triple_range_indexes.flatten
|
679
|
+
|
680
|
+
triple_range_indexing.each_with_index do |line,index|
|
580
681
|
|
581
|
-
|
682
|
+
split1,split2 = line.split("[")
|
582
683
|
|
583
|
-
|
684
|
+
range_index,split3 = split2.split("]")
|
584
685
|
|
585
|
-
|
686
|
+
index_start,index_end = range_index.split "..."
|
586
687
|
|
587
|
-
|
688
|
+
replacement_string = nil
|
689
|
+
|
690
|
+
if index_end.strip == "end"
|
691
|
+
|
692
|
+
replacement_string = split1 + ".slice(#{index_start},#{split}.length)\n"
|
693
|
+
|
694
|
+
else
|
695
|
+
|
696
|
+
replacement_string = split1 + ".slice(#{index_start},#{index_end})\n"
|
588
697
|
|
589
698
|
end
|
590
699
|
|
700
|
+
possible_range_indexing.delete(input_file_contents[triple_range_indexes[index]])
|
701
|
+
|
702
|
+
possible_indexing_operation.delete(input_file_contents[triple_range_indexes[index]])
|
703
|
+
|
704
|
+
input_file_contents[triple_range_indexes[index]] = replacement_string
|
705
|
+
|
591
706
|
end
|
592
707
|
|
708
|
+
double_range_indexing = possible_range_indexing.reject {|element| !element.include?("..")}
|
709
|
+
|
710
|
+
double_range_indexes = []
|
711
|
+
|
712
|
+
double_range_indexing.each do |line|
|
713
|
+
|
714
|
+
double_range_indexes << input_file_contents.dup.each_index.select {|index| input_file_contents[index] == line}
|
715
|
+
|
716
|
+
end
|
717
|
+
|
718
|
+
double_range_indexes = double_range_indexes.flatten
|
719
|
+
|
720
|
+
double_range_indexing.each_with_index do |line,index|
|
721
|
+
|
722
|
+
split1,split2 = line.split("[")
|
723
|
+
|
724
|
+
range_index,split3 = split2.split("]")
|
725
|
+
|
726
|
+
index_start,index_end = range_index.split ".."
|
727
|
+
|
728
|
+
replacement_string = nil
|
729
|
+
|
730
|
+
if index_end.strip == "end"
|
731
|
+
|
732
|
+
replacement_string = split1 + ".slice(#{index_start})\n"
|
733
|
+
|
734
|
+
elsif index_end.strip == "" and index_start.strip == ""
|
735
|
+
|
736
|
+
replacement_string = split1 + ".slice(0)\n"
|
737
|
+
|
738
|
+
else
|
739
|
+
|
740
|
+
replacement_string = split1 + ".slice(#{index_start},#{index_end}+1)\n"
|
741
|
+
|
742
|
+
end
|
743
|
+
|
744
|
+
possible_range_indexing.delete(input_file_contents[double_range_indexes[index]])
|
745
|
+
|
746
|
+
possible_indexing_operation.delete(input_file_contents[double_range_indexes[index]])
|
747
|
+
|
748
|
+
input_file_contents[double_range_indexes[index]] = replacement_string
|
749
|
+
|
750
|
+
end
|
751
|
+
|
752
|
+
duplicating_operations = input_file_contents.dup.reject{|element| !element.include?(".dup")}
|
753
|
+
|
754
|
+
duplicating_operation_indexes = []
|
755
|
+
|
756
|
+
duplicating_operations.each do |line|
|
757
|
+
|
758
|
+
duplicating_operation_indexes << input_file_contents.dup.each_index.select {|index| input_file_contents[index] == line}
|
759
|
+
|
760
|
+
end
|
761
|
+
|
762
|
+
duplicating_operation_indexes = duplicating_operation_indexes.flatten
|
763
|
+
|
764
|
+
duplicating_operation_indexes.each do |index|
|
765
|
+
|
766
|
+
input_file_contents[index] = input_file_contents[index].sub(".dup",".slice(0)")
|
767
|
+
|
768
|
+
end
|
769
|
+
|
770
|
+
return input_file_contents
|
771
|
+
|
593
772
|
end
|
594
773
|
|
595
|
-
|
774
|
+
input_file_contents = compile_w_arrays(input_file_contents)
|
775
|
+
|
776
|
+
input_file_contents = compile_array_indexing(input_file_contents)
|
777
|
+
|
778
|
+
return input_file_contents
|
779
|
+
|
596
780
|
|
597
781
|
end
|
598
782
|
|
@@ -702,6 +886,134 @@ def compile(input_file_path,*output_file_name)
|
|
702
886
|
|
703
887
|
end
|
704
888
|
|
889
|
+
def compile_multiple_return(input_array)
|
890
|
+
|
891
|
+
def find_all_matching_indices(input_string,pattern)
|
892
|
+
|
893
|
+
locations = []
|
894
|
+
|
895
|
+
index = input_string.index(pattern)
|
896
|
+
|
897
|
+
while index != nil
|
898
|
+
|
899
|
+
locations << index
|
900
|
+
|
901
|
+
index = input_string.index(pattern,index+1)
|
902
|
+
|
903
|
+
|
904
|
+
end
|
905
|
+
|
906
|
+
return locations
|
907
|
+
|
908
|
+
|
909
|
+
end
|
910
|
+
|
911
|
+
modified_input_array = input_array.dup
|
912
|
+
|
913
|
+
return_statements = input_array.dup.reject {|element| !element.include?"return"}
|
914
|
+
|
915
|
+
multiple_return_statements = return_statements.dup.reject {|element| !element.include?","}
|
916
|
+
|
917
|
+
modified_multiple_return_statements = multiple_return_statements.dup
|
918
|
+
|
919
|
+
return_statement_index = []
|
920
|
+
|
921
|
+
multiple_return_statements.each do |statement|
|
922
|
+
|
923
|
+
location_array = modified_input_array.each_index.select { |index| modified_input_array[index] == statement}
|
924
|
+
|
925
|
+
return_statement_index << location_array[0]
|
926
|
+
|
927
|
+
end
|
928
|
+
|
929
|
+
multiple_return_statements.each_with_index do |return_statement,index|
|
930
|
+
|
931
|
+
replacement_counter = 0
|
932
|
+
|
933
|
+
if return_statement.include? "\""
|
934
|
+
|
935
|
+
starting_quotes = find_all_matching_indices(return_statement,"\"")
|
936
|
+
|
937
|
+
for x in 0...(starting_quotes.length)/2
|
938
|
+
|
939
|
+
quotes = return_statement[starting_quotes[x]..starting_quotes[x+1]]
|
940
|
+
|
941
|
+
replacement_counter += 1
|
942
|
+
|
943
|
+
modified_multiple_return_statements[index] = modified_multiple_return_statements[index].sub(quotes,"repstring#{1}")
|
944
|
+
|
945
|
+
modified_input_array[return_statement_index[index]] = modified_multiple_return_statements[index].sub(quotes,"repstring#{1}")
|
946
|
+
|
947
|
+
end
|
948
|
+
|
949
|
+
end
|
950
|
+
|
951
|
+
end
|
952
|
+
|
953
|
+
modified_multiple_return_statements = modified_multiple_return_statements.reject {|element| !element.include?","}
|
954
|
+
|
955
|
+
return_statement_index = []
|
956
|
+
|
957
|
+
modified_multiple_return_statements.each do |statement|
|
958
|
+
|
959
|
+
location_array = modified_input_array.each_index.select { |index| modified_input_array[index] == statement}
|
960
|
+
|
961
|
+
return_statement_index << location_array[0]
|
962
|
+
|
963
|
+
end
|
964
|
+
|
965
|
+
modified_multiple_return_statements.each_with_index do |return_statement,index|
|
966
|
+
|
967
|
+
method_call_counter = 0
|
968
|
+
|
969
|
+
if return_statement.include?"("
|
970
|
+
|
971
|
+
open_paran_location = find_all_matching_indices(return_statement,"(")
|
972
|
+
|
973
|
+
open_paran_location.each do |paran_index|
|
974
|
+
|
975
|
+
method_call = return_statement[paran_index..return_statement.index(")",paran_index+1)]
|
976
|
+
|
977
|
+
method_call_counter += 1
|
978
|
+
|
979
|
+
modified_multiple_return_statements[index] = modified_multiple_return_statements[index].sub(method_call,"methodcall#{method_call_counter}")
|
980
|
+
|
981
|
+
modified_input_array[return_statement_index[index]] = modified_multiple_return_statements[index].sub(method_call,"methodcall#{method_call_counter}")
|
982
|
+
|
983
|
+
end
|
984
|
+
|
985
|
+
end
|
986
|
+
|
987
|
+
end
|
988
|
+
|
989
|
+
modified_multiple_return_statements = modified_multiple_return_statements.reject {|element| !element.include?(",")}
|
990
|
+
|
991
|
+
return_statement_index = []
|
992
|
+
|
993
|
+
modified_multiple_return_statements.each do |statement|
|
994
|
+
|
995
|
+
location_array = modified_input_array.each_index.select { |index| modified_input_array[index] == statement}
|
996
|
+
|
997
|
+
return_statement_index << location_array[0]
|
998
|
+
|
999
|
+
end
|
1000
|
+
|
1001
|
+
return_statement_index.each do |index|
|
1002
|
+
|
1003
|
+
original_statement = input_array[index]
|
1004
|
+
|
1005
|
+
statement_split = original_statement.split("return ")
|
1006
|
+
|
1007
|
+
replacement_split = "return [" + statement_split[1].rstrip + "]\n\n"
|
1008
|
+
|
1009
|
+
input_array[index] = replacement_split
|
1010
|
+
|
1011
|
+
end
|
1012
|
+
|
1013
|
+
return input_array
|
1014
|
+
|
1015
|
+
end
|
1016
|
+
|
705
1017
|
def compile_function(input_array,temporary_nila_file)
|
706
1018
|
|
707
1019
|
modified_input_array = input_array.dup
|
@@ -778,6 +1090,8 @@ def compile(input_file_path,*output_file_name)
|
|
778
1090
|
|
779
1091
|
modified_input_array = add_auto_return_statement(modified_input_array)
|
780
1092
|
|
1093
|
+
modified_input_array = compile_multiple_return(modified_input_array)
|
1094
|
+
|
781
1095
|
return modified_input_array
|
782
1096
|
|
783
1097
|
end
|
@@ -1240,6 +1554,8 @@ def compile(input_file_path,*output_file_name)
|
|
1240
1554
|
|
1241
1555
|
starting_index = starting_line_indices[0]
|
1242
1556
|
|
1557
|
+
begin
|
1558
|
+
|
1243
1559
|
for x in 0...initial_starting_lines.length
|
1244
1560
|
|
1245
1561
|
code_blocks << modified_file_contents[starting_index..block_ending_lines[0]]
|
@@ -1266,6 +1582,12 @@ def compile(input_file_path,*output_file_name)
|
|
1266
1582
|
|
1267
1583
|
end
|
1268
1584
|
|
1585
|
+
rescue TypeError
|
1586
|
+
|
1587
|
+
puts "Whitespace was left unfixed!"
|
1588
|
+
|
1589
|
+
end
|
1590
|
+
|
1269
1591
|
return modified_file_contents,code_blocks
|
1270
1592
|
|
1271
1593
|
end
|
@@ -1476,7 +1798,7 @@ def compile(input_file_path,*output_file_name)
|
|
1476
1798
|
|
1477
1799
|
File.delete(temporary_nila_file)
|
1478
1800
|
|
1479
|
-
file_id.write("//Written
|
1801
|
+
file_id.write("//Written using Nila. Visit http://adhithyan15.github.io/nila\n")
|
1480
1802
|
|
1481
1803
|
file_id.write(file_contents.join)
|
1482
1804
|
|
@@ -1492,19 +1814,21 @@ def compile(input_file_path,*output_file_name)
|
|
1492
1814
|
|
1493
1815
|
file_contents,multiline_comments,temp_file,output_js_file = replace_multiline_comments(file_contents,input_file_path,*output_file_name)
|
1494
1816
|
|
1817
|
+
file_contents,singleline_comments = replace_singleline_comments(file_contents)
|
1818
|
+
|
1495
1819
|
file_contents = split_semicolon_seperated_expressions(file_contents)
|
1496
1820
|
|
1497
1821
|
file_contents = compile_interpolated_strings(file_contents)
|
1498
1822
|
|
1499
|
-
file_contents
|
1823
|
+
file_contents = compile_arrays(file_contents)
|
1500
1824
|
|
1501
1825
|
file_contents,named_functions,nested_functions = replace_named_functions(file_contents,temp_file)
|
1502
1826
|
|
1503
1827
|
comments = [singleline_comments,multiline_comments]
|
1504
1828
|
|
1505
|
-
|
1829
|
+
file_contents = compile_multiple_variable_initialization(file_contents,temp_file)
|
1506
1830
|
|
1507
|
-
file_contents =
|
1831
|
+
list_of_variables,file_contents = get_variables(file_contents,temp_file)
|
1508
1832
|
|
1509
1833
|
file_contents = compile_conditional_structures(file_contents,temp_file)
|
1510
1834
|
|
@@ -1578,7 +1902,21 @@ def find_file_name(input_path,file_extension)
|
|
1578
1902
|
|
1579
1903
|
end
|
1580
1904
|
|
1581
|
-
|
1905
|
+
def find_file_path(input_path,file_extension)
|
1906
|
+
|
1907
|
+
extension_remover = input_path.split(file_extension)
|
1908
|
+
|
1909
|
+
remaining_string = extension_remover[0].reverse
|
1910
|
+
|
1911
|
+
path_finder = remaining_string.index("/")
|
1912
|
+
|
1913
|
+
remaining_string = remaining_string.reverse
|
1914
|
+
|
1915
|
+
return remaining_string[0...remaining_string.length-path_finder]
|
1916
|
+
|
1917
|
+
end
|
1918
|
+
|
1919
|
+
nilac_version = "0.0.3.9"
|
1582
1920
|
|
1583
1921
|
opts = Slop.parse do
|
1584
1922
|
on :c, :compile=, 'Compile Nila File', as:Array, delimiter:":"
|
@@ -1617,7 +1955,16 @@ opts = Slop.parse do
|
|
1617
1955
|
|
1618
1956
|
end
|
1619
1957
|
on :r, :run=, 'Run Nila File', as:Array
|
1620
|
-
|
1958
|
+
|
1959
|
+
on :m, :buildmac, 'Build Nilac for Linux/Mac/Rubygems' do
|
1960
|
+
|
1961
|
+
file_path = Dir.pwd + "/src/nilac.rb"
|
1962
|
+
|
1963
|
+
create_mac_executable(file_path)
|
1964
|
+
|
1965
|
+
puts "Build Successful!"
|
1966
|
+
|
1967
|
+
end
|
1621
1968
|
end
|
1622
1969
|
|
1623
1970
|
opts = opts.to_hash
|
@@ -1714,18 +2061,10 @@ elsif opts[:run] != nil
|
|
1714
2061
|
|
1715
2062
|
compile(file_path)
|
1716
2063
|
|
1717
|
-
js_file_name = find_file_name(file_path,".nila") + ".js"
|
2064
|
+
js_file_name = find_file_path(file_path,".nila") + find_file_name(file_path,".nila") + ".js"
|
1718
2065
|
|
1719
2066
|
node_output = `node #{js_file_name}`
|
1720
2067
|
|
1721
2068
|
puts node_output
|
1722
2069
|
|
1723
|
-
elsif opts[:buildmac] != nil
|
1724
|
-
|
1725
|
-
file_path = Dir.pwd + "/bin/nilac.rb"
|
1726
|
-
|
1727
|
-
create_mac_executable(file_path)
|
1728
|
-
|
1729
|
-
puts "Build Successful!"
|
1730
|
-
|
1731
2070
|
end
|
data/lib/nilac/version.rb
CHANGED
@@ -0,0 +1,11 @@
|
|
1
|
+
Feature: This feature bring Ruby's indexing capabililty to Javascript.
|
2
|
+
Scenario: Input file with Ruby style Array and String indexing
|
3
|
+
Given the input file "array_string_indexing.nila"
|
4
|
+
When the ~compiler is run
|
5
|
+
The output file must be "array_string_indexing.js"
|
6
|
+
The output file must equal "correct_indexing.js"
|
7
|
+
|
8
|
+
Configurations:
|
9
|
+
|
10
|
+
~compiler => src/nilac.rb
|
11
|
+
:v $cliusage => ruby :v --compile $file
|
@@ -0,0 +1,21 @@
|
|
1
|
+
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
|
2
|
+
|
3
|
+
start = numbers[0..2]
|
4
|
+
|
5
|
+
middle = numbers[3...6]
|
6
|
+
|
7
|
+
last = numbers[6..end]
|
8
|
+
|
9
|
+
copy = numbers.dup
|
10
|
+
|
11
|
+
copy = numbers[..]
|
12
|
+
|
13
|
+
name = "Adhithya Rajasekaran"
|
14
|
+
|
15
|
+
first_name = name[0..7]
|
16
|
+
|
17
|
+
second_name = name[9..end]
|
18
|
+
|
19
|
+
name_copy = name.dup
|
20
|
+
|
21
|
+
name_copy = name[..]
|
@@ -0,0 +1,27 @@
|
|
1
|
+
//Written using Nila. Visit http://adhithyan15.github.io/nila
|
2
|
+
(function() {
|
3
|
+
var copy, first_name, last, middle, name, name_copy, numbers, second_name, start;
|
4
|
+
|
5
|
+
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
|
6
|
+
|
7
|
+
start = numbers.slice(0,2+1);
|
8
|
+
|
9
|
+
middle = numbers.slice(3,6);
|
10
|
+
|
11
|
+
last = numbers.slice(6);
|
12
|
+
|
13
|
+
copy = numbers.slice(0);
|
14
|
+
|
15
|
+
copy = numbers.slice(0);
|
16
|
+
|
17
|
+
name = "Adhithya Rajasekaran";
|
18
|
+
|
19
|
+
first_name = name.slice(0,7+1);
|
20
|
+
|
21
|
+
second_name = name.slice(9);
|
22
|
+
|
23
|
+
name_copy = name.slice(0);
|
24
|
+
|
25
|
+
name_copy = name.slice(0);
|
26
|
+
|
27
|
+
}).call(this);
|
data/shark/test_files/perfect.js
CHANGED
data/{bin → src}/nilac.rb
RENAMED
@@ -307,7 +307,7 @@ def compile(input_file_path,*output_file_name)
|
|
307
307
|
|
308
308
|
key_word_locations << x
|
309
309
|
|
310
|
-
elsif current_row.include?("end\n") || current_row.include?("end")
|
310
|
+
elsif current_row.lstrip.include?("end\n") || current_row.include?("end")
|
311
311
|
|
312
312
|
end_locations << x
|
313
313
|
|
@@ -516,7 +516,7 @@ def compile(input_file_path,*output_file_name)
|
|
516
516
|
|
517
517
|
if variables.length > 0
|
518
518
|
|
519
|
-
variable_declaration_string = "var " + variables.uniq.join(", ") + "\n\n"
|
519
|
+
variable_declaration_string = "var " + variables.uniq.sort.join(", ") + "\n\n"
|
520
520
|
|
521
521
|
line_by_line_contents = [variable_declaration_string,line_by_line_contents].flatten
|
522
522
|
|
@@ -578,73 +578,207 @@ def compile(input_file_path,*output_file_name)
|
|
578
578
|
# 1. %w{} syntax
|
579
579
|
# 2. Range - Coming soon!
|
580
580
|
|
581
|
-
def
|
581
|
+
def compile_w_arrays(input_file_contents)
|
582
582
|
|
583
|
-
def
|
583
|
+
def extract(input_string,pattern_start,pattern_end)
|
584
584
|
|
585
|
-
|
585
|
+
def find_all_matching_indices(input_string,pattern)
|
586
586
|
|
587
|
-
|
587
|
+
locations = []
|
588
588
|
|
589
|
-
|
589
|
+
index = input_string.index(pattern)
|
590
590
|
|
591
|
-
|
591
|
+
while index != nil
|
592
592
|
|
593
|
-
|
593
|
+
locations << index
|
594
|
+
|
595
|
+
index = input_string.index(pattern,index+1)
|
596
|
+
|
597
|
+
|
598
|
+
end
|
599
|
+
|
600
|
+
return locations
|
594
601
|
|
595
602
|
|
596
603
|
end
|
597
604
|
|
598
|
-
|
605
|
+
all_start_locations = find_all_matching_indices(input_string,pattern_start)
|
606
|
+
|
607
|
+
all_end_locations = find_all_matching_indices(input_string,pattern_end)
|
599
608
|
|
609
|
+
pattern = []
|
610
|
+
|
611
|
+
all_start_locations.each_with_index do |location,index|
|
612
|
+
|
613
|
+
pattern << input_string[location..all_end_locations[index]]
|
614
|
+
|
615
|
+
end
|
616
|
+
|
617
|
+
return pattern
|
600
618
|
|
601
619
|
end
|
602
620
|
|
603
|
-
|
621
|
+
def compile_w_syntax(input_string)
|
604
622
|
|
605
|
-
|
623
|
+
modified_input_string = input_string[3...-1]
|
606
624
|
|
607
|
-
|
625
|
+
string_split = modified_input_string.split(" ")
|
626
|
+
|
627
|
+
return string_split.to_s
|
628
|
+
|
629
|
+
end
|
630
|
+
|
631
|
+
modified_file_contents = input_file_contents.dup
|
632
|
+
|
633
|
+
input_file_contents.each_with_index do |line,index|
|
634
|
+
|
635
|
+
if line.include?("%w{")
|
636
|
+
|
637
|
+
string_arrays = extract(line,"%w{","}")
|
608
638
|
|
609
|
-
|
639
|
+
string_arrays.each do |array|
|
610
640
|
|
611
|
-
|
641
|
+
modified_file_contents[index] = modified_file_contents[index].sub(array,compile_w_syntax(array))
|
642
|
+
|
643
|
+
end
|
644
|
+
|
645
|
+
end
|
612
646
|
|
613
647
|
end
|
614
648
|
|
615
|
-
return
|
649
|
+
return modified_file_contents
|
616
650
|
|
617
651
|
end
|
618
652
|
|
619
|
-
def
|
653
|
+
def compile_array_indexing(input_file_contents)
|
620
654
|
|
621
|
-
|
655
|
+
#Nila allows two different kinds of indexing operations on arrays and strings. They are
|
622
656
|
|
623
|
-
|
657
|
+
#1. Using Ranges => numbers[0...5]
|
658
|
+
#2. Using Start and End Indexes => numbers[0,5]
|
624
659
|
|
625
|
-
|
660
|
+
#This method implements this Nila feature
|
626
661
|
|
627
|
-
|
662
|
+
possible_indexing_operation = input_file_contents.dup.reject {|element| !element.include?"[" and !element.include?"]"}
|
628
663
|
|
629
|
-
|
664
|
+
possible_range_indexing = possible_indexing_operation.reject {|element| !element.include?".."}
|
630
665
|
|
631
|
-
|
666
|
+
triple_range_indexing = possible_range_indexing.reject {|element| !element.include?"..."}
|
667
|
+
|
668
|
+
triple_range_indexes = []
|
669
|
+
|
670
|
+
triple_range_indexing.each do |line|
|
671
|
+
|
672
|
+
triple_range_indexes << input_file_contents.dup.each_index.select {|index| input_file_contents[index] == line}
|
673
|
+
|
674
|
+
end
|
675
|
+
|
676
|
+
triple_range_indexes = triple_range_indexes.flatten
|
677
|
+
|
678
|
+
triple_range_indexing.each_with_index do |line,index|
|
679
|
+
|
680
|
+
split1,split2 = line.split("[")
|
681
|
+
|
682
|
+
range_index,split3 = split2.split("]")
|
683
|
+
|
684
|
+
index_start,index_end = range_index.split "..."
|
685
|
+
|
686
|
+
replacement_string = nil
|
687
|
+
|
688
|
+
if index_end.strip == "end"
|
689
|
+
|
690
|
+
replacement_string = split1 + ".slice(#{index_start},#{split}.length)\n"
|
691
|
+
|
692
|
+
else
|
693
|
+
|
694
|
+
replacement_string = split1 + ".slice(#{index_start},#{index_end})\n"
|
695
|
+
|
696
|
+
end
|
697
|
+
|
698
|
+
possible_range_indexing.delete(input_file_contents[triple_range_indexes[index]])
|
699
|
+
|
700
|
+
possible_indexing_operation.delete(input_file_contents[triple_range_indexes[index]])
|
632
701
|
|
633
|
-
|
702
|
+
input_file_contents[triple_range_indexes[index]] = replacement_string
|
634
703
|
|
635
|
-
|
704
|
+
end
|
705
|
+
|
706
|
+
double_range_indexing = possible_range_indexing.reject {|element| !element.include?("..")}
|
707
|
+
|
708
|
+
double_range_indexes = []
|
709
|
+
|
710
|
+
double_range_indexing.each do |line|
|
711
|
+
|
712
|
+
double_range_indexes << input_file_contents.dup.each_index.select {|index| input_file_contents[index] == line}
|
713
|
+
|
714
|
+
end
|
715
|
+
|
716
|
+
double_range_indexes = double_range_indexes.flatten
|
717
|
+
|
718
|
+
double_range_indexing.each_with_index do |line,index|
|
719
|
+
|
720
|
+
split1,split2 = line.split("[")
|
721
|
+
|
722
|
+
range_index,split3 = split2.split("]")
|
723
|
+
|
724
|
+
index_start,index_end = range_index.split ".."
|
725
|
+
|
726
|
+
index_start = "" if index_start.nil?
|
727
|
+
|
728
|
+
index_end = "" if index_end.nil?
|
636
729
|
|
637
|
-
|
730
|
+
replacement_string = nil
|
638
731
|
|
639
|
-
|
732
|
+
if index_end.strip == "end"
|
733
|
+
|
734
|
+
replacement_string = split1 + ".slice(#{index_start})\n"
|
735
|
+
|
736
|
+
elsif index_end.strip == "" and index_start.strip == ""
|
737
|
+
|
738
|
+
replacement_string = split1 + ".slice(0)\n"
|
739
|
+
|
740
|
+
else
|
741
|
+
|
742
|
+
replacement_string = split1 + ".slice(#{index_start},#{index_end}+1)\n"
|
640
743
|
|
641
744
|
end
|
642
745
|
|
746
|
+
possible_range_indexing.delete(input_file_contents[double_range_indexes[index]])
|
747
|
+
|
748
|
+
possible_indexing_operation.delete(input_file_contents[double_range_indexes[index]])
|
749
|
+
|
750
|
+
input_file_contents[double_range_indexes[index]] = replacement_string
|
751
|
+
|
752
|
+
end
|
753
|
+
|
754
|
+
duplicating_operations = input_file_contents.dup.reject{|element| !element.include?(".dup")}
|
755
|
+
|
756
|
+
duplicating_operation_indexes = []
|
757
|
+
|
758
|
+
duplicating_operations.each do |line|
|
759
|
+
|
760
|
+
duplicating_operation_indexes << input_file_contents.dup.each_index.select {|index| input_file_contents[index] == line}
|
761
|
+
|
643
762
|
end
|
644
763
|
|
764
|
+
duplicating_operation_indexes = duplicating_operation_indexes.flatten
|
765
|
+
|
766
|
+
duplicating_operation_indexes.each do |index|
|
767
|
+
|
768
|
+
input_file_contents[index] = input_file_contents[index].sub(".dup",".slice(0)")
|
769
|
+
|
770
|
+
end
|
771
|
+
|
772
|
+
return input_file_contents
|
773
|
+
|
645
774
|
end
|
646
775
|
|
647
|
-
|
776
|
+
input_file_contents = compile_w_arrays(input_file_contents)
|
777
|
+
|
778
|
+
input_file_contents = compile_array_indexing(input_file_contents)
|
779
|
+
|
780
|
+
return input_file_contents
|
781
|
+
|
648
782
|
|
649
783
|
end
|
650
784
|
|
@@ -1682,11 +1816,13 @@ def compile(input_file_path,*output_file_name)
|
|
1682
1816
|
|
1683
1817
|
file_contents,multiline_comments,temp_file,output_js_file = replace_multiline_comments(file_contents,input_file_path,*output_file_name)
|
1684
1818
|
|
1819
|
+
file_contents,singleline_comments = replace_singleline_comments(file_contents)
|
1820
|
+
|
1685
1821
|
file_contents = split_semicolon_seperated_expressions(file_contents)
|
1686
1822
|
|
1687
1823
|
file_contents = compile_interpolated_strings(file_contents)
|
1688
1824
|
|
1689
|
-
file_contents
|
1825
|
+
file_contents = compile_arrays(file_contents)
|
1690
1826
|
|
1691
1827
|
file_contents,named_functions,nested_functions = replace_named_functions(file_contents,temp_file)
|
1692
1828
|
|
@@ -1696,8 +1832,6 @@ def compile(input_file_path,*output_file_name)
|
|
1696
1832
|
|
1697
1833
|
list_of_variables,file_contents = get_variables(file_contents,temp_file)
|
1698
1834
|
|
1699
|
-
file_contents = compile_arrays(file_contents)
|
1700
|
-
|
1701
1835
|
file_contents = compile_conditional_structures(file_contents,temp_file)
|
1702
1836
|
|
1703
1837
|
file_contents, function_names = compile_named_functions(file_contents,named_functions,nested_functions,temp_file)
|
@@ -1784,7 +1918,7 @@ def find_file_path(input_path,file_extension)
|
|
1784
1918
|
|
1785
1919
|
end
|
1786
1920
|
|
1787
|
-
nilac_version = "0.0.3.
|
1921
|
+
nilac_version = "0.0.3.9"
|
1788
1922
|
|
1789
1923
|
opts = Slop.parse do
|
1790
1924
|
on :c, :compile=, 'Compile Nila File', as:Array, delimiter:":"
|
@@ -1823,7 +1957,16 @@ opts = Slop.parse do
|
|
1823
1957
|
|
1824
1958
|
end
|
1825
1959
|
on :r, :run=, 'Run Nila File', as:Array
|
1826
|
-
|
1960
|
+
|
1961
|
+
on :m, :buildmac, 'Build Nilac for Linux/Mac/Rubygems' do
|
1962
|
+
|
1963
|
+
file_path = Dir.pwd + "/src/nilac.rb"
|
1964
|
+
|
1965
|
+
create_mac_executable(file_path)
|
1966
|
+
|
1967
|
+
puts "Build Successful!"
|
1968
|
+
|
1969
|
+
end
|
1827
1970
|
end
|
1828
1971
|
|
1829
1972
|
opts = opts.to_hash
|
@@ -1926,12 +2069,4 @@ elsif opts[:run] != nil
|
|
1926
2069
|
|
1927
2070
|
puts node_output
|
1928
2071
|
|
1929
|
-
elsif opts[:buildmac] != nil
|
1930
|
-
|
1931
|
-
file_path = Dir.pwd + "/bin/nilac.rb"
|
1932
|
-
|
1933
|
-
create_mac_executable(file_path)
|
1934
|
-
|
1935
|
-
puts "Build Successful!"
|
1936
|
-
|
1937
2072
|
end
|
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.9
|
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-
|
12
|
+
date: 2013-07-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: shark
|
@@ -49,7 +49,6 @@ email:
|
|
49
49
|
executables:
|
50
50
|
- .gitignore
|
51
51
|
- nilac
|
52
|
-
- nilac.rb
|
53
52
|
extensions: []
|
54
53
|
extra_rdoc_files: []
|
55
54
|
files:
|
@@ -60,31 +59,31 @@ files:
|
|
60
59
|
- Rakefile
|
61
60
|
- bin/.gitignore
|
62
61
|
- bin/nilac
|
63
|
-
- bin/nilac.rb
|
64
|
-
- examples/sample.js
|
65
|
-
- examples/sample.nila
|
66
62
|
- lib/nilac.rb
|
67
63
|
- lib/nilac/version.rb
|
68
64
|
- nilac.gemspec
|
69
65
|
- shark/features/add_auto_return_statement.feature
|
66
|
+
- shark/features/array_and_string_indexing.feature
|
70
67
|
- shark/features/barebones_compilation.feature
|
71
68
|
- shark/features/fix_newlines.feature
|
72
69
|
- shark/features/method_multiple_return.feature
|
73
70
|
- shark/features/multiple_variable_initialization.feature
|
71
|
+
- shark/test_files/array_string_indexing.nila
|
74
72
|
- shark/test_files/correct.js
|
73
|
+
- shark/test_files/correct_indexing.js
|
75
74
|
- shark/test_files/correct_initialization.js
|
76
75
|
- shark/test_files/correct_multiple_return.js
|
77
76
|
- shark/test_files/correct_return.js
|
78
77
|
- shark/test_files/correct_single_return.js
|
79
78
|
- shark/test_files/erratic.nila
|
80
|
-
- shark/test_files/multiple_initialization.js
|
81
79
|
- shark/test_files/multiple_initialization.nila
|
82
|
-
- shark/test_files/multiple_return.js
|
83
80
|
- shark/test_files/multiple_return.nila
|
84
81
|
- shark/test_files/no_return.nila
|
85
82
|
- shark/test_files/perfect.js
|
83
|
+
- shark/test_files/regular_if.nila
|
86
84
|
- shark/test_files/simple.nila
|
87
85
|
- shark/test_files/single_return.nila
|
86
|
+
- src/nilac.rb
|
88
87
|
homepage: http://adhithyan15.github.com/nila
|
89
88
|
licenses: []
|
90
89
|
post_install_message:
|
data/examples/sample.js
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
//Written in Nila 0.0.3.2. Visit http://adhithyan15.github.io/nila
|
2
|
-
(function() {
|
3
|
-
var hello, msg, message, goal_reached, isprime, visitor_present, names;
|
4
|
-
|
5
|
-
hello = "world";
|
6
|
-
|
7
|
-
msg = "Nila";
|
8
|
-
|
9
|
-
message = "Welcome to " + msg;
|
10
|
-
|
11
|
-
goal_reached = 72;
|
12
|
-
|
13
|
-
isprime = false;
|
14
|
-
|
15
|
-
visitor_present = true;
|
16
|
-
|
17
|
-
if (visitor_present) {
|
18
|
-
console.log("Hello Visitor!");
|
19
|
-
}
|
20
|
-
|
21
|
-
names = ["adhi", "alex", "john", "bill", "kelly"];
|
22
|
-
|
23
|
-
function printsquare(input_number) {
|
24
|
-
//This is a very simple Nila function
|
25
|
-
var add_number, isvalid;
|
26
|
-
add_number = input_number + 10;
|
27
|
-
isvalid = true;
|
28
|
-
function square(number) {
|
29
|
-
return number*number;
|
30
|
-
}
|
31
|
-
return console.log("Square of " + add_number + " is " + square(add_number));
|
32
|
-
}
|
33
|
-
|
34
|
-
console.log(printsquare(5));
|
35
|
-
|
36
|
-
function test_message() {
|
37
|
-
return console.log("Welcome to Nila!");
|
38
|
-
}
|
39
|
-
|
40
|
-
function welcome_message() {
|
41
|
-
return console.log("Welcome to Nila!");
|
42
|
-
}
|
43
|
-
|
44
|
-
console.log(welcome_message);
|
45
|
-
|
46
|
-
}).call(this);
|
data/examples/sample.nila
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
hello = "world";msg = "Nila"
|
2
|
-
|
3
|
-
message = "Welcome to #{msg}"
|
4
|
-
|
5
|
-
goal_reached = 72
|
6
|
-
|
7
|
-
isprime? = false
|
8
|
-
|
9
|
-
visitor_present? = true
|
10
|
-
|
11
|
-
puts("Hello Visitor!") if visitor_present?
|
12
|
-
|
13
|
-
names = %w{adhi alex john bill kelly}
|
14
|
-
|
15
|
-
def printsquare(input_number) #This is a very simple Nila function
|
16
|
-
|
17
|
-
add_number = input_number + 10
|
18
|
-
|
19
|
-
isvalid? = true
|
20
|
-
|
21
|
-
def square(number)
|
22
|
-
|
23
|
-
number*number
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
puts "Square of #{add_number} is #{square(add_number)}"
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
puts(printsquare(5))
|
32
|
-
|
33
|
-
def test_message
|
34
|
-
|
35
|
-
puts "Welcome to Nila!"
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
def welcome_message
|
40
|
-
|
41
|
-
puts "Welcome to Nila!"
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
puts welcome_message
|
@@ -1,21 +0,0 @@
|
|
1
|
-
//Written using Nila. Visit http://adhithyan15.github.io/nila
|
2
|
-
(function() {
|
3
|
-
var multipleinit1, first_name, last_name;
|
4
|
-
|
5
|
-
// This file demonstrates multiple variable initialization
|
6
|
-
|
7
|
-
function parse_name(input_name) {
|
8
|
-
var name_split;
|
9
|
-
name_split = input_name.split(" ");
|
10
|
-
return [name_split[0],name_split[1]];
|
11
|
-
}
|
12
|
-
|
13
|
-
multipleinit1 = parse_name("Adhithya Rajasekaran");
|
14
|
-
|
15
|
-
first_name = multipleinit1[0];
|
16
|
-
|
17
|
-
last_name = multipleinit1[1];
|
18
|
-
|
19
|
-
console.log(first_name + " " + last_name);
|
20
|
-
|
21
|
-
}).call(this);
|
@@ -1,19 +0,0 @@
|
|
1
|
-
//Written using Nila. Visit http://adhithyan15.github.io/nila
|
2
|
-
(function() {
|
3
|
-
var parsed_name;
|
4
|
-
|
5
|
-
// This method demonstrates multiple return values
|
6
|
-
|
7
|
-
function parse_name(input_name) {
|
8
|
-
var name_split;
|
9
|
-
name_split = input_name.split(" ");
|
10
|
-
return [name_split[0],name_split[1]];
|
11
|
-
}
|
12
|
-
|
13
|
-
function test_method() {
|
14
|
-
return console.log("Hello, Adhithya");
|
15
|
-
}
|
16
|
-
|
17
|
-
parsed_name = parse_name("Adhithya Rajasekaran");
|
18
|
-
|
19
|
-
}).call(this);
|