nilac 0.0.4.3.9.2 → 0.0.4.3.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/bin/nilac +9 -5748
  4. data/examples/StringMagic.nila +23 -0
  5. data/examples/countdown.nila +31 -0
  6. data/examples/decBin.nila +3 -3
  7. data/examples/marky.js +30 -0
  8. data/examples/marky.nila +23 -0
  9. data/lib/nilac/ErrorDeclarations.rb +11 -0
  10. data/lib/nilac/add_semicolons.rb +57 -0
  11. data/lib/nilac/compile_arrays.rb +266 -0
  12. data/lib/nilac/compile_blocks.rb +137 -0
  13. data/lib/nilac/compile_case_statement.rb +168 -0
  14. data/lib/nilac/compile_classes.rb +18 -0
  15. data/lib/nilac/compile_comments.rb +79 -0
  16. data/lib/nilac/compile_conditional_structures.rb +1378 -0
  17. data/lib/nilac/compile_custom_function_map.rb +45 -0
  18. data/lib/nilac/compile_default_values.rb +160 -0
  19. data/lib/nilac/compile_hashes.rb +123 -0
  20. data/lib/nilac/compile_heredocs.rb +62 -0
  21. data/lib/nilac/compile_integers.rb +23 -0
  22. data/lib/nilac/compile_interpolated_strings.rb +133 -0
  23. data/lib/nilac/compile_loops.rb +211 -0
  24. data/lib/nilac/compile_named_functions.rb +690 -0
  25. data/lib/nilac/compile_operators.rb +83 -0
  26. data/lib/nilac/compile_parallel_assignment.rb +103 -0
  27. data/lib/nilac/compile_ruby_methods.rb +58 -0
  28. data/lib/nilac/compile_special_keywords.rb +44 -0
  29. data/lib/nilac/compile_strings.rb +145 -0
  30. data/lib/nilac/compile_whitespace_delimited_functions.rb +97 -0
  31. data/lib/nilac/create_mac_executable.rb +25 -0
  32. data/lib/nilac/extract_parsable_file.rb +23 -0
  33. data/lib/nilac/find_all_matching_indices.rb +18 -0
  34. data/lib/nilac/find_file_name.rb +13 -0
  35. data/lib/nilac/find_file_path.rb +13 -0
  36. data/lib/nilac/get_variables.rb +123 -0
  37. data/lib/nilac/output_javascript.rb +13 -0
  38. data/lib/nilac/parse_arguments.rb +41 -0
  39. data/lib/nilac/pretty_print_javascript.rb +457 -0
  40. data/lib/nilac/read_file_line_by_line.rb +11 -0
  41. data/lib/nilac/remove_question_marks.rb +46 -0
  42. data/lib/nilac/replace_multiline_comments.rb +92 -0
  43. data/lib/nilac/replace_named_functions.rb +154 -0
  44. data/lib/nilac/replace_singleline_comments.rb +45 -0
  45. data/lib/nilac/replace_strings.rb +35 -0
  46. data/lib/nilac/split_semicolon_seperated_expressions.rb +39 -0
  47. data/lib/nilac/strToArray.rb +15 -0
  48. data/lib/nilac/version.rb +1 -1
  49. data/lib/nilac.rb +324 -1
  50. data/nilac.gemspec +0 -1
  51. data/shark/features/add_auto_return_statement.feature +1 -1
  52. data/shark/features/array_and_string_indexing.feature +1 -1
  53. data/shark/features/barebones_compilation.feature +1 -1
  54. data/shark/features/case_when.feature +1 -1
  55. data/shark/features/default_method_parameters.feature +1 -1
  56. data/shark/features/fix_newlines.feature +1 -1
  57. data/shark/features/hashes.feature +1 -1
  58. data/shark/features/heredoc.feature +1 -1
  59. data/shark/features/if_then_else.feature +1 -1
  60. data/shark/features/loop.feature +1 -1
  61. data/shark/features/method_multiple_return.feature +1 -1
  62. data/shark/features/multiline_array.feature +1 -1
  63. data/shark/features/multiple_variable_initialization.feature +1 -1
  64. data/shark/features/numbers.feature +1 -1
  65. data/shark/features/regular_for.feature +1 -1
  66. data/shark/features/regular_if.feature +1 -1
  67. data/shark/features/regular_while.feature +1 -1
  68. data/shark/features/ruby_methods.feature +1 -1
  69. data/shark/features/ruby_operators.feature +1 -1
  70. data/shark/features/splats.feature +1 -1
  71. data/shark/features/string_interpolation.feature +1 -1
  72. data/shark/features/strings.feature +1 -1
  73. data/shark/features/times.feature +1 -1
  74. data/shark/features/unless_until.feature +1 -1
  75. data/shark/features/whitespace_delimitation.feature +1 -1
  76. metadata +46 -18
  77. data/src/nilac.rb +0 -5753
@@ -0,0 +1,168 @@
1
+ require_relative 'replace_strings'
2
+
3
+ require_relative 'read_file_line_by_line'
4
+
5
+ def compile_case_statement(input_file_contents,temporary_nila_file)
6
+
7
+ # This method compiles simple Ruby style case statements to Javascript
8
+ # equivalent switch case statements
9
+
10
+ # For an example, look at shark/test_files/case.nila
11
+
12
+ def compile_when_statement(input_block)
13
+
14
+ condition,body = input_block[0],input_block[1..-1]
15
+
16
+ if replace_strings(condition.split("when ")[1]).include?(",")
17
+
18
+ condition_cases = condition.split("when ")[1].split(",").collect {|element| element.strip}
19
+
20
+ case_replacement = []
21
+
22
+ condition_cases.each do |ccase|
23
+
24
+ case_replacement << "case #{ccase}:%$%$ {\n\n"
25
+
26
+ case_replacement << body.collect {|element| " " + element.strip + "\n\n"}
27
+
28
+ case_replacement << " break\n%$%$\n}\n"
29
+
30
+ end
31
+
32
+ else
33
+
34
+ case_replacement = []
35
+
36
+ condition_case = condition.split("when ")[1].strip
37
+
38
+ case_replacement << "case #{condition_case}:%$%$ {\n\n"
39
+
40
+ case_replacement << body.collect {|element| " " + element.strip + "\n\n"}
41
+
42
+ case_replacement << " break\n%$%$\n}\n"
43
+
44
+ end
45
+
46
+ return case_replacement.join
47
+
48
+ end
49
+
50
+ modified_file_contents = input_file_contents.clone
51
+
52
+ possible_case_statements = input_file_contents.reject {|element| !element.include?("case ")}
53
+
54
+ case_statements = []
55
+
56
+ possible_case_statements.each do |statement|
57
+
58
+ starting_index = input_file_contents.index(statement)
59
+
60
+ index = starting_index
61
+
62
+ until input_file_contents[index].strip.eql?("end")
63
+
64
+ index += 1
65
+
66
+ end
67
+
68
+ case_statements << input_file_contents[starting_index..index].collect {|element| element.clone}.clone
69
+
70
+ end
71
+
72
+ legacy = case_statements.collect {|element| element.clone}
73
+
74
+ replacement_strings = []
75
+
76
+ case_statements.each do |statement_block|
77
+
78
+ condition = statement_block[0].split("case")[1].strip
79
+
80
+ statement_block[0] = "switch(#{condition}) {\n\n"
81
+
82
+ when_statements = statement_block.reject {|element| !replace_strings(element).include?("when")}
83
+
84
+ when_statements_index = []
85
+
86
+ when_statements.each do |statement|
87
+
88
+ when_statements_index << statement_block.each_index.select{|index| statement_block[index] == statement}
89
+
90
+ end
91
+
92
+ when_statements_index = when_statements_index.flatten
93
+
94
+ if replace_strings(statement_block.join).include?("else\n")
95
+
96
+ else_statement = statement_block.reject {|element| !replace_strings(element).strip.eql?("else")}
97
+
98
+ else_block = statement_block[statement_block.index(else_statement[0])+1...-1]
99
+
100
+ when_statements_index = when_statements_index + statement_block.each_index.select {|index| statement_block[index] == else_statement[0] }.to_a
101
+
102
+ when_statements_index = when_statements_index.flatten
103
+
104
+ statement_block[statement_block.index(else_statement[0])..-1] = ["default: %$%$ {\n\n",else_block.collect{|element| " " + element.strip + "\n\n"},"%$%$\n}\n\n}\n\n"].flatten
105
+
106
+ when_statement_blocks = []
107
+
108
+ when_statements.each_with_index do |statement,ind|
109
+
110
+ when_block = statement_block[when_statements_index[ind]...when_statements_index[ind+1]]
111
+
112
+ when_statement_blocks << when_block
113
+
114
+ end
115
+
116
+ replacement_blocks = when_statement_blocks.collect {|element| compile_when_statement(element)}
117
+
118
+ else
119
+
120
+ statement_block[-1] = "}\n\n" if statement_block[-1].strip.eql?("end")
121
+
122
+ when_statement_blocks = []
123
+
124
+ when_statements_index << -1
125
+
126
+ when_statements.each_with_index do |statement,ind|
127
+
128
+ when_block = statement_block[when_statements_index[ind]...when_statements_index[ind+1]]
129
+
130
+ when_statement_blocks << when_block
131
+
132
+ end
133
+
134
+ replacement_blocks = when_statement_blocks.collect {|element| compile_when_statement(element)}
135
+
136
+ end
137
+
138
+ statement_block = statement_block.join
139
+
140
+ when_statement_blocks.each_with_index do |blck,index|
141
+
142
+ statement_block = statement_block.sub(blck.join,replacement_blocks[index])
143
+
144
+ end
145
+
146
+ replacement_strings << statement_block
147
+
148
+ end
149
+
150
+ joined_file_contents = modified_file_contents.join
151
+
152
+ legacy.each_with_index do |statement,index|
153
+
154
+ joined_file_contents = joined_file_contents.sub(statement.join,replacement_strings[index])
155
+
156
+ end
157
+
158
+ file_id = open(temporary_nila_file, 'w')
159
+
160
+ file_id.write(joined_file_contents)
161
+
162
+ file_id.close()
163
+
164
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
165
+
166
+ return line_by_line_contents
167
+
168
+ end
@@ -0,0 +1,18 @@
1
+ def compile_classes(input_file_contents)
2
+
3
+ # Nila will have support for classes. But the current implementation is not ready for prime time
4
+ # yet. So it won't be documented.
5
+
6
+ def extract_classes
7
+
8
+ builtin_classes = [
9
+
10
+ "String",
11
+
12
+ ]
13
+
14
+ end
15
+
16
+
17
+
18
+ end
@@ -0,0 +1,79 @@
1
+ require_relative 'read_file_line_by_line'
2
+
3
+ def compile_comments(input_file_contents, comments, temporary_nila_file)
4
+
5
+ #This method converts Nila comments into pure Javascript comments. This method
6
+ #handles both single line and multiline comments.
7
+
8
+ file_contents_as_string = input_file_contents.join
9
+
10
+ single_line_comments = comments[0]
11
+
12
+ multiline_comments = comments[1]
13
+
14
+ single_line_comment_counter = 1
15
+
16
+ multi_line_comment_counter = 1
17
+
18
+ ignorable_keywords = [/if/, /while/, /function/]
19
+
20
+ dummy_replacement_words = ["eeuuff", "whaalesskkey", "conffoolotion"]
21
+
22
+ for x in 0...single_line_comments.length
23
+
24
+ current_singleline_comment = "--single_line_comment[#{single_line_comment_counter}]"
25
+
26
+ replacement_singleline_string = single_line_comments[x].sub("#", "//")
27
+
28
+ ignorable_keywords.each_with_index do |keyword, index|
29
+
30
+ if replacement_singleline_string.index(keyword) != nil
31
+
32
+ replacement_singleline_string = replacement_singleline_string.sub(keyword.inspect[1...-1], dummy_replacement_words[index])
33
+
34
+ end
35
+
36
+ end
37
+
38
+ file_contents_as_string = file_contents_as_string.sub(current_singleline_comment, replacement_singleline_string)
39
+
40
+ single_line_comment_counter += 1
41
+
42
+
43
+ end
44
+
45
+ for y in 0...multiline_comments.length
46
+
47
+ current_multiline_comment = "--multiline_comment[#{multi_line_comment_counter}]"
48
+
49
+ replacement_multiline_string = multiline_comments[y].sub("=begin", "/*\n")
50
+
51
+ replacement_multiline_string = replacement_multiline_string.sub("=end", "\n*/")
52
+
53
+ ignorable_keywords.each_with_index do |keyword, index|
54
+
55
+ if replacement_multiline_string.index(keyword) != nil
56
+
57
+ replacement_multiline_string = replacement_multiline_string.sub(keyword.inspect[1...-1], dummy_replacement_words[index])
58
+
59
+ end
60
+
61
+ end
62
+
63
+ file_contents_as_string = file_contents_as_string.sub(current_multiline_comment, replacement_multiline_string)
64
+
65
+ multi_line_comment_counter += 1
66
+
67
+ end
68
+
69
+ file_id = open(temporary_nila_file, 'w')
70
+
71
+ file_id.write(file_contents_as_string)
72
+
73
+ file_id.close()
74
+
75
+ line_by_line_contents = read_file_line_by_line(temporary_nila_file)
76
+
77
+ line_by_line_contents
78
+
79
+ end