ikra 0.0.1

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 (220) hide show
  1. checksums.yaml +7 -0
  2. data/lib/ast/builder.rb +100 -0
  3. data/lib/ast/lexical_variables_enumerator.rb +34 -0
  4. data/lib/ast/method_definition.rb +37 -0
  5. data/lib/ast/nodes.rb +208 -0
  6. data/lib/ast/printer.rb +99 -0
  7. data/lib/ast/translator.rb +264 -0
  8. data/lib/ast/visitor.rb +173 -0
  9. data/lib/config/configuration.rb +18 -0
  10. data/lib/config/os_configuration.rb +56 -0
  11. data/lib/entity.rb +11 -0
  12. data/lib/ikra.rb +7 -0
  13. data/lib/parsing.rb +32 -0
  14. data/lib/resources/cuda/block_function_head.cpp +1 -0
  15. data/lib/resources/cuda/env_builder_copy_array.cpp +4 -0
  16. data/lib/resources/cuda/header.cpp +46 -0
  17. data/lib/resources/cuda/kernel.cpp +8 -0
  18. data/lib/resources/cuda/kernel_launcher.cpp +28 -0
  19. data/lib/resources/cuda/soa_header.cpp +4 -0
  20. data/lib/scope.rb +166 -0
  21. data/lib/sourcify/Gemfile +10 -0
  22. data/lib/sourcify/HISTORY.txt +88 -0
  23. data/lib/sourcify/LICENSE +20 -0
  24. data/lib/sourcify/README.rdoc +352 -0
  25. data/lib/sourcify/Rakefile +111 -0
  26. data/lib/sourcify/lib/sourcify.rb +44 -0
  27. data/lib/sourcify/lib/sourcify/common/parser/converter.rb +29 -0
  28. data/lib/sourcify/lib/sourcify/common/parser/raw_scanner/comment.rb +23 -0
  29. data/lib/sourcify/lib/sourcify/common/parser/raw_scanner/counter.rb +43 -0
  30. data/lib/sourcify/lib/sourcify/common/parser/raw_scanner/dstring.rb +58 -0
  31. data/lib/sourcify/lib/sourcify/common/parser/raw_scanner/extensions.rb +140 -0
  32. data/lib/sourcify/lib/sourcify/common/parser/raw_scanner/heredoc.rb +26 -0
  33. data/lib/sourcify/lib/sourcify/common/parser/source_code.rb +45 -0
  34. data/lib/sourcify/lib/sourcify/common/ragel/common.rl +5 -0
  35. data/lib/sourcify/lib/sourcify/common/ragel/expressions.rl +38 -0
  36. data/lib/sourcify/lib/sourcify/common/ragel/machines.rl +317 -0
  37. data/lib/sourcify/lib/sourcify/errors.rb +4 -0
  38. data/lib/sourcify/lib/sourcify/method.rb +138 -0
  39. data/lib/sourcify/lib/sourcify/method/methods.rb +3 -0
  40. data/lib/sourcify/lib/sourcify/method/methods/to_raw_source.rb +30 -0
  41. data/lib/sourcify/lib/sourcify/method/methods/to_sexp.rb +30 -0
  42. data/lib/sourcify/lib/sourcify/method/methods/to_source.rb +30 -0
  43. data/lib/sourcify/lib/sourcify/method/parser.rb +110 -0
  44. data/lib/sourcify/lib/sourcify/method/parser/converter.rb +8 -0
  45. data/lib/sourcify/lib/sourcify/method/parser/raw_scanner.rb +2494 -0
  46. data/lib/sourcify/lib/sourcify/method/parser/raw_scanner.rl +144 -0
  47. data/lib/sourcify/lib/sourcify/method/parser/raw_scanner_extensions.rb +68 -0
  48. data/lib/sourcify/lib/sourcify/method/parser/scanner.rb +52 -0
  49. data/lib/sourcify/lib/sourcify/method/parser/source_code.rb +8 -0
  50. data/lib/sourcify/lib/sourcify/patches.rb +63 -0
  51. data/lib/sourcify/lib/sourcify/proc.rb +183 -0
  52. data/lib/sourcify/lib/sourcify/proc/methods.rb +3 -0
  53. data/lib/sourcify/lib/sourcify/proc/methods/source_location.rb +61 -0
  54. data/lib/sourcify/lib/sourcify/proc/methods/to_raw_source.rb +20 -0
  55. data/lib/sourcify/lib/sourcify/proc/methods/to_sexp.rb +40 -0
  56. data/lib/sourcify/lib/sourcify/proc/methods/to_source.rb +48 -0
  57. data/lib/sourcify/lib/sourcify/proc/parser.rb +51 -0
  58. data/lib/sourcify/lib/sourcify/proc/parser/converter.rb +8 -0
  59. data/lib/sourcify/lib/sourcify/proc/parser/normalizer.rb +43 -0
  60. data/lib/sourcify/lib/sourcify/proc/parser/raw_scanner.rb +2498 -0
  61. data/lib/sourcify/lib/sourcify/proc/parser/raw_scanner.rl +149 -0
  62. data/lib/sourcify/lib/sourcify/proc/parser/raw_scanner_extensions.rb +74 -0
  63. data/lib/sourcify/lib/sourcify/proc/parser/scanner.rb +49 -0
  64. data/lib/sourcify/lib/sourcify/proc/parser/source_code.rb +8 -0
  65. data/lib/sourcify/lib/sourcify/version.rb +3 -0
  66. data/lib/sourcify/sourcify.gemspec +31 -0
  67. data/lib/sourcify/spec/dump_object_space_procs.rb +84 -0
  68. data/lib/sourcify/spec/method/encoding_from_def_end_block_spec.rb +33 -0
  69. data/lib/sourcify/spec/method/encoding_from_define_method_spec.rb +37 -0
  70. data/lib/sourcify/spec/method/others_from_def_end_block_spec.rb +49 -0
  71. data/lib/sourcify/spec/method/others_from_define_method_spec.rb +63 -0
  72. data/lib/sourcify/spec/method/raw_scanner/block_comment_spec.rb +8 -0
  73. data/lib/sourcify/spec/method/raw_scanner/double_colons_spec.rb +8 -0
  74. data/lib/sourcify/spec/method/raw_scanner/double_quote_str_w_interpolation_spec.rb +8 -0
  75. data/lib/sourcify/spec/method/raw_scanner/double_quote_str_wo_interpolation_spec.rb +8 -0
  76. data/lib/sourcify/spec/method/raw_scanner/heredoc_w_indent_spec.rb +8 -0
  77. data/lib/sourcify/spec/method/raw_scanner/heredoc_wo_indent_spec.rb +8 -0
  78. data/lib/sourcify/spec/method/raw_scanner/kw_block_start_alias1_spec.rb +20 -0
  79. data/lib/sourcify/spec/method/raw_scanner/kw_block_start_alias2_spec.rb +20 -0
  80. data/lib/sourcify/spec/method/raw_scanner/per_line_comment_spec.rb +8 -0
  81. data/lib/sourcify/spec/method/raw_scanner/single_quote_str_spec.rb +8 -0
  82. data/lib/sourcify/spec/method/raw_scanner/slash_operator_spec.rb +8 -0
  83. data/lib/sourcify/spec/method/raw_scanner/spec_helper.rb +80 -0
  84. data/lib/sourcify/spec/method/spec_helper.rb +1 -0
  85. data/lib/sourcify/spec/method/to_raw_source_spec.rb +31 -0
  86. data/lib/sourcify/spec/method/to_raw_source_w_specified_strip_enclosure_spec.rb +148 -0
  87. data/lib/sourcify/spec/method/to_sexp_from_def_end_block_w_variables_spec.rb +46 -0
  88. data/lib/sourcify/spec/method/to_sexp_from_def_end_block_within_irb_spec.rb +38 -0
  89. data/lib/sourcify/spec/method/to_sexp_from_def_end_block_within_pry_spec.rb +38 -0
  90. data/lib/sourcify/spec/method/to_sexp_from_define_method_w_multi_blocks_and_specified_attached_to_spec.rb +56 -0
  91. data/lib/sourcify/spec/method/to_sexp_from_define_method_w_variables_spec.rb +52 -0
  92. data/lib/sourcify/spec/method/to_sexp_from_define_method_within_irb_spec.rb +42 -0
  93. data/lib/sourcify/spec/method/to_sexp_from_define_method_within_pry_spec.rb +42 -0
  94. data/lib/sourcify/spec/method/to_sexp_w_specified_strip_enclosure_spec.rb +74 -0
  95. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_19_extras_spec.rb +23 -0
  96. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_begin_spec.rb +35 -0
  97. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_case_spec.rb +35 -0
  98. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_class_spec.rb +51 -0
  99. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_do_end_block_spec.rb +33 -0
  100. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_for_spec.rb +126 -0
  101. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_if_spec.rb +83 -0
  102. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_literal_keyword_spec.rb +141 -0
  103. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_method_spec.rb +33 -0
  104. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_module_spec.rb +59 -0
  105. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_unless_spec.rb +83 -0
  106. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_until_spec.rb +179 -0
  107. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_nested_while_spec.rb +179 -0
  108. data/lib/sourcify/spec/method/to_source_from_def_end_block_w_singleton_method_spec.rb +19 -0
  109. data/lib/sourcify/spec/method/to_source_from_def_end_block_within_irb_spec.rb +30 -0
  110. data/lib/sourcify/spec/method/to_source_from_def_end_block_within_pry_spec.rb +45 -0
  111. data/lib/sourcify/spec/method/to_source_from_def_end_w_multi_blocks_and_many_matches_spec.rb +30 -0
  112. data/lib/sourcify/spec/method/to_source_from_def_end_w_multi_blocks_and_single_match_spec.rb +36 -0
  113. data/lib/sourcify/spec/method/to_source_from_define_method_w_braced_block_spec.rb +113 -0
  114. data/lib/sourcify/spec/method/to_source_from_define_method_w_do_end_block_spec.rb +145 -0
  115. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_many_matches_spec.rb +56 -0
  116. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_single_match_spec.rb +73 -0
  117. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_attached_to_and_many_matches_spec.rb +36 -0
  118. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_attached_to_and_no_match_spec.rb +36 -0
  119. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_attached_to_and_single_match_spec.rb +28 -0
  120. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_attached_to_spec.rb +103 -0
  121. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_body_matcher_and_many_matches_spec.rb +36 -0
  122. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_body_matcher_and_no_match_spec.rb +36 -0
  123. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_body_matcher_and_single_match_spec.rb +28 -0
  124. data/lib/sourcify/spec/method/to_source_from_define_method_w_multi_blocks_and_specified_ignore_nested_spec.rb +36 -0
  125. data/lib/sourcify/spec/method/to_source_from_define_method_within_irb_spec.rb +32 -0
  126. data/lib/sourcify/spec/method/to_source_from_define_method_within_pry_spec.rb +49 -0
  127. data/lib/sourcify/spec/method/to_source_magic_file_var_spec.rb +176 -0
  128. data/lib/sourcify/spec/method/to_source_magic_line_var_spec.rb +298 -0
  129. data/lib/sourcify/spec/method/to_source_w_specified_strip_enclosure_spec.rb +39 -0
  130. data/lib/sourcify/spec/no_method/unsupported_platform_spec.rb +26 -0
  131. data/lib/sourcify/spec/proc/19x_extras.rb +27 -0
  132. data/lib/sourcify/spec/proc/created_on_the_fly_proc_spec.rb +80 -0
  133. data/lib/sourcify/spec/proc/encoding_spec.rb +36 -0
  134. data/lib/sourcify/spec/proc/others_spec.rb +40 -0
  135. data/lib/sourcify/spec/proc/raw_scanner/block_comment_spec.rb +8 -0
  136. data/lib/sourcify/spec/proc/raw_scanner/double_colons_spec.rb +8 -0
  137. data/lib/sourcify/spec/proc/raw_scanner/double_quote_str_w_interpolation_spec.rb +8 -0
  138. data/lib/sourcify/spec/proc/raw_scanner/double_quote_str_wo_interpolation_spec.rb +8 -0
  139. data/lib/sourcify/spec/proc/raw_scanner/heredoc_w_indent_spec.rb +8 -0
  140. data/lib/sourcify/spec/proc/raw_scanner/heredoc_wo_indent_spec.rb +8 -0
  141. data/lib/sourcify/spec/proc/raw_scanner/kw_block_start_alias1_spec.rb +20 -0
  142. data/lib/sourcify/spec/proc/raw_scanner/kw_block_start_alias2_spec.rb +20 -0
  143. data/lib/sourcify/spec/proc/raw_scanner/per_line_comment_spec.rb +8 -0
  144. data/lib/sourcify/spec/proc/raw_scanner/single_quote_str_spec.rb +8 -0
  145. data/lib/sourcify/spec/proc/raw_scanner/slash_operator_spec.rb +8 -0
  146. data/lib/sourcify/spec/proc/raw_scanner/spec_helper.rb +63 -0
  147. data/lib/sourcify/spec/proc/readme +5 -0
  148. data/lib/sourcify/spec/proc/spec_helper.rb +1 -0
  149. data/lib/sourcify/spec/proc/to_raw_source_spec.rb +33 -0
  150. data/lib/sourcify/spec/proc/to_raw_source_w_specified_strip_enclosure_spec.rb +69 -0
  151. data/lib/sourcify/spec/proc/to_sexp_from_multi_blocks_w_specified_attached_to_spec.rb +46 -0
  152. data/lib/sourcify/spec/proc/to_sexp_variables_spec.rb +146 -0
  153. data/lib/sourcify/spec/proc/to_sexp_w_specified_strip_enclosure_spec.rb +60 -0
  154. data/lib/sourcify/spec/proc/to_sexp_within_irb_spec.rb +146 -0
  155. data/lib/sourcify/spec/proc/to_sexp_within_pry_spec.rb +149 -0
  156. data/lib/sourcify/spec/proc/to_source_from_braced_block_w_nested_braced_block_spec.rb +33 -0
  157. data/lib/sourcify/spec/proc/to_source_from_braced_block_w_nested_hash_spec.rb +82 -0
  158. data/lib/sourcify/spec/proc/to_source_from_braced_block_wo_nesting_complication_spec.rb +46 -0
  159. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_begin_spec.rb +35 -0
  160. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_case_spec.rb +35 -0
  161. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_class_spec.rb +89 -0
  162. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_do_end_block_spec.rb +33 -0
  163. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_for_spec.rb +132 -0
  164. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_if_spec.rb +87 -0
  165. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_literal_keyword_spec.rb +103 -0
  166. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_method_spec.rb +33 -0
  167. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_module_spec.rb +49 -0
  168. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_unless_spec.rb +87 -0
  169. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_until_spec.rb +189 -0
  170. data/lib/sourcify/spec/proc/to_source_from_do_end_block_w_nested_while_spec.rb +189 -0
  171. data/lib/sourcify/spec/proc/to_source_from_do_end_block_wo_nesting_complication_spec.rb +46 -0
  172. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_many_matches_spec.rb +43 -0
  173. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_single_match_spec.rb +20 -0
  174. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_attached_to_and_many_matches_spec.rb +45 -0
  175. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_attached_to_and_no_match_spec.rb +45 -0
  176. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_attached_to_and_single_match_spec.rb +22 -0
  177. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_attached_to_spec.rb +84 -0
  178. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_body_matcher_and_many_matches_spec.rb +45 -0
  179. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_body_matcher_and_no_match_spec.rb +45 -0
  180. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_body_matcher_and_single_match_spec.rb +22 -0
  181. data/lib/sourcify/spec/proc/to_source_from_multi_blocks_w_specified_ignore_nested_spec.rb +43 -0
  182. data/lib/sourcify/spec/proc/to_source_from_multi_do_end_blocks_w_single_match_spec.rb +31 -0
  183. data/lib/sourcify/spec/proc/to_source_magic_file_var_spec.rb +127 -0
  184. data/lib/sourcify/spec/proc/to_source_magic_line_var_spec.rb +127 -0
  185. data/lib/sourcify/spec/proc/to_source_variables_spec.rb +29 -0
  186. data/lib/sourcify/spec/proc/to_source_w_specified_strip_enclosure_spec.rb +33 -0
  187. data/lib/sourcify/spec/proc/to_source_within_irb_spec.rb +38 -0
  188. data/lib/sourcify/spec/proc/to_source_within_pry_spec.rb +61 -0
  189. data/lib/sourcify/spec/raw_scanner/block_comment_shared_spec.rb +57 -0
  190. data/lib/sourcify/spec/raw_scanner/double_colons_shared_spec.rb +11 -0
  191. data/lib/sourcify/spec/raw_scanner/double_quote_str_w_interpolation_shared_spec.rb +60 -0
  192. data/lib/sourcify/spec/raw_scanner/double_quote_str_wo_interpolation_shared_spec.rb +86 -0
  193. data/lib/sourcify/spec/raw_scanner/heredoc_w_indent_shared_spec.rb +69 -0
  194. data/lib/sourcify/spec/raw_scanner/heredoc_wo_indent_shared_spec.rb +70 -0
  195. data/lib/sourcify/spec/raw_scanner/kw_block_start_alias1_shared_spec.rb +73 -0
  196. data/lib/sourcify/spec/raw_scanner/kw_block_start_alias2_shared_spec.rb +73 -0
  197. data/lib/sourcify/spec/raw_scanner/per_line_comment_shared_spec.rb +32 -0
  198. data/lib/sourcify/spec/raw_scanner/shared_specs.rb +3 -0
  199. data/lib/sourcify/spec/raw_scanner/single_quote_str_shared_spec.rb +79 -0
  200. data/lib/sourcify/spec/raw_scanner/slash_operator_shared_spec.rb +71 -0
  201. data/lib/sourcify/spec/run_build.sh +25 -0
  202. data/lib/sourcify/spec/spec_helper.rb +130 -0
  203. data/lib/symbolic/symbolic.rb +248 -0
  204. data/lib/symbolic/visitor.rb +51 -0
  205. data/lib/translator/block_translator.rb +123 -0
  206. data/lib/translator/command_translator.rb +421 -0
  207. data/lib/translator/last_returns_visitor.rb +57 -0
  208. data/lib/translator/local_variables_enumerator.rb +35 -0
  209. data/lib/translator/method_translator.rb +24 -0
  210. data/lib/translator/translator.rb +49 -0
  211. data/lib/type_aware_array.rb +71 -0
  212. data/lib/types/array_type.rb +51 -0
  213. data/lib/types/class_type.rb +128 -0
  214. data/lib/types/object_tracer.rb +162 -0
  215. data/lib/types/primitive_type.rb +73 -0
  216. data/lib/types/ruby_extension.rb +67 -0
  217. data/lib/types/ruby_type.rb +45 -0
  218. data/lib/types/type_inference.rb +382 -0
  219. data/lib/types/union_type.rb +155 -0
  220. metadata +321 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 86447e8ed8423243fd4a85d47c6f6193d401456d
4
+ data.tar.gz: ead0343c4c707bb0ea133943085e6e5ca24f3372
5
+ SHA512:
6
+ metadata.gz: e9cbfc562bb7529053e755e07763a431b57d802535fa2b5deed201828a07a326bc1ecce7597898d333f1dd9c7a14bbb1eed5bcbf052524f0c6a2bfc8e376fc79
7
+ data.tar.gz: 4c66b35a3ec55cc68e9f22fe1a7db78bd3e209491fb774f47d0dbccf4bada876966d164a47901cb03e0cb9763489399f60600b0a992265f6a080a4e91615be85
@@ -0,0 +1,100 @@
1
+ require_relative "nodes"
2
+
3
+ module Ikra
4
+ module AST
5
+
6
+ # Builds an Ikra AST from a Parser RubyGem AST
7
+ module Builder
8
+ class << self
9
+ def from_parser_ast(node)
10
+ RootNode.new(child: translate_node(node))
11
+ end
12
+
13
+ def translate_node(node)
14
+ if node == nil
15
+ nil
16
+ else
17
+ send("translate_#{node.type.to_s}".to_sym, node)
18
+ end
19
+ end
20
+
21
+ def translate_const(node)
22
+ # TODO: what is the meaning of the first child?
23
+ ConstNode.new(identifier: node.children[1])
24
+ end
25
+
26
+ def translate_int(node)
27
+ IntNode.new(value: node.children[0])
28
+ end
29
+
30
+ def translate_float(node)
31
+ FloatNode.new(value: node.children[0])
32
+ end
33
+
34
+ def translate_bool(node)
35
+ BoolNode.new(value: node.children[0])
36
+ end
37
+
38
+ def translate_lvar(node)
39
+ LVarReadNode.new(identifier: node.children[0])
40
+ end
41
+
42
+ def translate_lvasgn(node)
43
+ LVarWriteNode.new(identifier: node.children[0], value: translate_node(node.children[1]))
44
+ end
45
+
46
+ def translate_ivar(node)
47
+ IVarReadNode.new(identifier: node.children[0])
48
+ end
49
+
50
+ def translate_if(node)
51
+ IfNode.new(condition: translate_node(node.children[0]),
52
+ true_body_stmts: translate_node(node.children[1]),
53
+ false_body_stmts: translate_node(node.children[2]))
54
+ end
55
+
56
+ def extract_begin_single_statement(node, should_return = false)
57
+ next_node = node
58
+ while next_node.type == :begin
59
+ if next_node.children.size != 1
60
+ raise "Begin node contains more than one statement"
61
+ end
62
+
63
+ next_node = next_node.children[0]
64
+ end
65
+
66
+ next_node
67
+ end
68
+
69
+ def translate_for(node)
70
+ if node.children[0].type == :lvasgn and extract_begin_single_statement(node.children[1]).type == :irange
71
+ range = extract_begin_single_statement(node.children[1])
72
+
73
+ ForNode.new(iterator_identifier: node.children[0].children[0],
74
+ range_from: translate_node(range.children[0]),
75
+ range_to: translate_node(range.children[1]),
76
+ body_stmts: translate_node(node.children[2]))
77
+ else
78
+ raise "Can only handle simple For loops at the moment"
79
+ end
80
+ end
81
+
82
+ def translate_break(node)
83
+ BreakNode.new
84
+ end
85
+
86
+ def translate_send(node)
87
+ SendNode.new(receiver: translate_node(node.children[0]),
88
+ selector: node.children[1],
89
+ arguments: node.children[2..-1].map do |arg|
90
+ translate_node(arg) end)
91
+ end
92
+
93
+ def translate_begin(node)
94
+ BeginNode.new(body_stmts: node.children.map do |stmt|
95
+ translate_node(stmt) end)
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,34 @@
1
+ require "set"
2
+ require_relative "nodes"
3
+ require_relative "visitor"
4
+
5
+ module Ikra
6
+ module AST
7
+
8
+ # Visitor for determining the names all lexical variables that are accessed by a block (or method??)
9
+ # TODO: does a method have access to lexical variables?
10
+ class LexicalVariablesEnumerator < Visitor
11
+ attr_reader :lexical_variables
12
+
13
+ def initialize(lexical_var_names)
14
+ @lexical_var_names = lexical_var_names
15
+ @lexical_variables = Set.new
16
+ end
17
+
18
+ def add_lvar_access(identifier)
19
+ if @lexical_var_names.include?(identifier)
20
+ @lexical_variables.add(identifier)
21
+ end
22
+ end
23
+
24
+ def visit_lvar_read_node(node)
25
+ add_lvar_access(node.identifier)
26
+ end
27
+
28
+ def visit_lvar_write_node(node)
29
+ add_lvar_access(node.identifier)
30
+ super(node)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,37 @@
1
+ require "set"
2
+ require_relative "../scope"
3
+
4
+ module Ikra
5
+ module AST
6
+ class MethodDefinition
7
+ attr_accessor :type # receiver type
8
+ attr_accessor :selector
9
+ attr_accessor :ast
10
+ attr_accessor :return_type
11
+ attr_accessor :callers # method definitions calling this method
12
+ attr_accessor :symbol_table
13
+ attr_accessor :binding # needed for resolving constants
14
+ attr_accessor :local_variables # local variables defined in the method (name -> type)
15
+ attr_accessor :lexical_variables # lexical variables (defined outside; name -> type)
16
+ attr_accessor :accessed_lexical_variables # accessed lexical variables, only these variables are transferred to the GPU. TODO: Do we still need this? This is now determined in symbolic.rb
17
+ attr_accessor :parameter_variables # parameters of the method/block (name -> type)
18
+
19
+ def initialize(type:, selector:, parameter_variables:, return_type:, ast:)
20
+ @type = type
21
+ @selector = selector
22
+ @parameter_variables = parameter_variables
23
+ @return_type = return_type
24
+ @ast = ast
25
+ @callers = Set.new
26
+ @symbol_table = Scope.new
27
+ @local_variables = {}
28
+ @lexical_variables = {} # optional
29
+ @accessed_lexical_variables = {} # optional
30
+ end
31
+
32
+ def parameter_names
33
+ type.method_parameters(selector)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,208 @@
1
+ module Ikra
2
+ module AST
3
+ class Node
4
+ attr_accessor :parent
5
+
6
+ def is_begin_node?
7
+ false
8
+ end
9
+
10
+ def replace(another_node)
11
+ parent.replace_child(self, another_node)
12
+ end
13
+
14
+ def replace_child(node, another_node)
15
+ instance_variables.each do |inst_var|
16
+ if instance_variable_get(inst_var) == node
17
+ instance_variable_set(inst_var, another_node)
18
+ another_node.parent = self
19
+ end
20
+ end
21
+ end
22
+
23
+ def class_owner
24
+ @parent.class_owner
25
+ end
26
+ end
27
+
28
+ class RootNode < Node
29
+ attr_reader :child
30
+ attr_accessor :class_owner # @return [Class] The class where this method is defined
31
+
32
+ def initialize(child:)
33
+ @child = child
34
+ child.parent = self
35
+ end
36
+ end
37
+
38
+ class ConstNode < Node
39
+ attr_reader :identifier
40
+
41
+ def initialize(identifier:)
42
+ @identifier = identifier
43
+ end
44
+ end
45
+
46
+ class LVarReadNode < Node
47
+ attr_reader :identifier
48
+
49
+ def initialize(identifier:)
50
+ @identifier = identifier
51
+ end
52
+ end
53
+
54
+ class LVarWriteNode < Node
55
+ attr_reader :identifier
56
+ attr_reader :value
57
+
58
+ def initialize(identifier:, value:)
59
+ @identifier = identifier
60
+ @value = value
61
+
62
+ value.parent = self
63
+ end
64
+ end
65
+
66
+ class IVarReadNode < Node
67
+ attr_reader :identifier
68
+
69
+ def initialize(identifier:)
70
+ @identifier = identifier
71
+ end
72
+ end
73
+
74
+ class IntNode < Node
75
+ attr_reader :value
76
+
77
+ def initialize(value:)
78
+ @value = value
79
+ end
80
+ end
81
+
82
+ class FloatNode < Node
83
+ attr_reader :value
84
+
85
+ def initialize(value:)
86
+ @value = value
87
+ end
88
+ end
89
+
90
+ class BoolNode < Node
91
+ attr_reader :value
92
+
93
+ def initialize(value:)
94
+ @value = value
95
+ end
96
+ end
97
+
98
+ class ForNode < Node
99
+ attr_reader :iterator_identifier
100
+ attr_reader :range_from
101
+ attr_reader :range_to
102
+ attr_reader :body_stmts
103
+
104
+ def initialize(iterator_identifier:, range_from:, range_to:, body_stmts: BeginNode.new)
105
+ @iterator_identifier = iterator_identifier
106
+ @range_from = range_from
107
+ @range_to = range_to
108
+ @body_stmts = body_stmts
109
+
110
+ range_from.parent = self
111
+ range_to.parent = self
112
+ body_stmts.parent = self
113
+ end
114
+ end
115
+
116
+ class BreakNode < Node
117
+
118
+ end
119
+
120
+ class IfNode < Node
121
+ attr_reader :condition
122
+ attr_reader :true_body_stmts
123
+ attr_reader :false_body_stmts
124
+
125
+ def initialize(condition:, true_body_stmts:, false_body_stmts: nil)
126
+ @condition = condition
127
+ @true_body_stmts = true_body_stmts
128
+ @false_body_stmts = false_body_stmts
129
+
130
+ condition.parent = self
131
+ true_body_stmts.parent = self
132
+
133
+ if false_body_stmts != nil
134
+ false_body_stmts.parent = self
135
+ end
136
+ end
137
+ end
138
+
139
+ class BeginNode < Node
140
+ attr_reader :body_stmts
141
+
142
+ def initialize(body_stmts: [])
143
+ @body_stmts = body_stmts
144
+
145
+ body_stmts.each do |stmt|
146
+ stmt.parent = self
147
+ end
148
+ end
149
+
150
+ def replace_child(node, another_node)
151
+ @body_stmts = @body_stmts.map do |stmt|
152
+ if node == stmt
153
+ another_node.parent = self
154
+ another_node
155
+ else
156
+ stmt
157
+ end
158
+ end
159
+ end
160
+
161
+ def is_begin_node?
162
+ true
163
+ end
164
+ end
165
+
166
+ class SendNode < Node
167
+ attr_reader :receiver
168
+ attr_reader :selector
169
+ attr_reader :arguments
170
+
171
+ def initialize(receiver:, selector:, arguments: [])
172
+ @receiver = receiver
173
+ @selector = selector
174
+ @arguments = arguments
175
+
176
+ receiver.parent = self
177
+ arguments.each do |arg|
178
+ arg.parent = self
179
+ end
180
+ end
181
+
182
+ def replace_child(node, another_node)
183
+ if @receiver == node
184
+ @receiver = another_node
185
+ end
186
+
187
+ @arguments = @arguments.map do |arg|
188
+ if node == arg
189
+ another_node.parent = self
190
+ another_node
191
+ else
192
+ arg
193
+ end
194
+ end
195
+ end
196
+ end
197
+
198
+ class ReturnNode < Node
199
+ attr_reader :value
200
+
201
+ def initialize(value:)
202
+ @value = value
203
+
204
+ value.parent = self
205
+ end
206
+ end
207
+ end
208
+ end
@@ -0,0 +1,99 @@
1
+ module Ikra
2
+ module AST
3
+ class Node
4
+ def to_s
5
+ "[Node]"
6
+ end
7
+ end
8
+
9
+ class RootNode
10
+ def to_s
11
+ "[RootNode: #{child.to_s}]"
12
+ end
13
+ end
14
+
15
+ class ConstNode
16
+ def to_s
17
+ "[ConstNode: #{identifier.to_s}]"
18
+ end
19
+ end
20
+
21
+ class LVarReadNode
22
+ def to_s
23
+ "[LVarReadNode: #{identifier.to_s}]"
24
+ end
25
+ end
26
+
27
+ class LVarWriteNode
28
+ def to_s
29
+ "[LVarWriteNode: #{identifier.to_s} := #{value.to_s}]"
30
+ end
31
+ end
32
+
33
+ class IntNode
34
+ def to_s
35
+ "<#{value.to_s}>"
36
+ end
37
+ end
38
+
39
+ class FloatNode
40
+ def to_s
41
+ "<#{value.to_s}>"
42
+ end
43
+ end
44
+
45
+ class BoolNode
46
+ def to_s
47
+ "<#{value.to_s}>"
48
+ end
49
+ end
50
+
51
+ class ForNode
52
+ def to_s
53
+ "[ForNode: #{iterator_identifier.to_s} := #{range_from.to_s}...#{range_to.to_s}, #{body_stmts.to_s}]"
54
+ end
55
+ end
56
+
57
+ class BreakNode
58
+ def to_s
59
+ "[BreakNode]"
60
+ end
61
+ end
62
+
63
+ class IfNode
64
+ def to_s
65
+ if false_body_stmts != nil
66
+ "[IfNode: #{condition.to_s}, #{true_body_stmts.to_s}, #{false_body_stmts.to_s}]"
67
+ else
68
+ "[IfNode: #{condition.to_s}, #{true_body_stmts.to_s}]"
69
+ end
70
+ end
71
+ end
72
+
73
+ class BeginNode
74
+ def to_s
75
+ stmts = body_stmts.map do |stmt|
76
+ stmt.to_s
77
+ end.join(";\n")
78
+
79
+ "[BeginNode: {#{stmts}}]"
80
+ end
81
+ end
82
+
83
+ class SendNode
84
+ def to_s
85
+ args = arguments.map do |arg|
86
+ arg.to_s
87
+ end.join("; ")
88
+
89
+ "[SendNode: #{receiver.to_s}.#{selector.to_s}(#{args})]"
90
+ end
91
+ end
92
+
93
+ class ReturnNode
94
+ def to_s
95
+ "[ReturnNode: #{value.to_s}]"
96
+ end
97
+ end
98
+ end
99
+ end