opal 0.3.11 → 0.3.15

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 (282) hide show
  1. data/.gitignore +13 -0
  2. data/Gemfile +10 -0
  3. data/LICENSE +20 -0
  4. data/README.md +11 -116
  5. data/Rakefile +126 -0
  6. data/bin/opal +1 -2
  7. data/docs/spec_runner.html +16 -0
  8. data/index.html +434 -0
  9. data/lib/opal.rb +14 -15
  10. data/lib/opal/builder.rb +46 -148
  11. data/lib/opal/command.rb +45 -115
  12. data/lib/opal/context.rb +139 -78
  13. data/lib/opal/dependency_builder.rb +34 -0
  14. data/lib/opal/environment.rb +92 -0
  15. data/lib/opal/parser/grammar.rb +4915 -0
  16. data/lib/opal/{parser.y → parser/grammar.y} +430 -284
  17. data/lib/opal/parser/lexer.rb +1329 -0
  18. data/lib/opal/parser/parser.rb +1460 -0
  19. data/lib/opal/parser/scope.rb +140 -0
  20. data/lib/opal/parser/sexp.rb +17 -0
  21. data/lib/opal/version.rb +2 -1
  22. data/opal.gemspec +23 -0
  23. data/opal.js +3149 -4162
  24. data/runtime/README.md +25 -0
  25. data/runtime/corelib/alpha.rb +10 -0
  26. data/runtime/corelib/array.rb +962 -0
  27. data/runtime/corelib/basic_object.rb +66 -0
  28. data/runtime/corelib/boolean.rb +44 -0
  29. data/runtime/corelib/class.rb +43 -0
  30. data/runtime/corelib/comparable.rb +25 -0
  31. data/runtime/corelib/complex.rb +2 -0
  32. data/runtime/corelib/dir.rb +29 -0
  33. data/runtime/corelib/enumerable.rb +316 -0
  34. data/runtime/corelib/enumerator.rb +80 -0
  35. data/runtime/corelib/error.rb +25 -0
  36. data/runtime/corelib/file.rb +80 -0
  37. data/runtime/corelib/hash.rb +503 -0
  38. data/runtime/corelib/io.rb +44 -0
  39. data/runtime/corelib/kernel.rb +237 -0
  40. data/runtime/corelib/load_order +29 -0
  41. data/runtime/corelib/match_data.rb +37 -0
  42. data/runtime/corelib/module.rb +171 -0
  43. data/runtime/corelib/native.rb +50 -0
  44. data/runtime/corelib/nil_class.rb +47 -0
  45. data/runtime/corelib/numeric.rb +219 -0
  46. data/runtime/corelib/object.rb +21 -0
  47. data/runtime/corelib/proc.rb +42 -0
  48. data/runtime/corelib/range.rb +38 -0
  49. data/runtime/corelib/rational.rb +16 -0
  50. data/runtime/corelib/regexp.rb +63 -0
  51. data/runtime/corelib/string.rb +185 -0
  52. data/runtime/corelib/struct.rb +97 -0
  53. data/runtime/corelib/time.rb +196 -0
  54. data/runtime/corelib/top_self.rb +7 -0
  55. data/runtime/gemlib/alpha.rb +5 -0
  56. data/runtime/gemlib/kernel.rb +17 -0
  57. data/runtime/gemlib/load_order +2 -0
  58. data/runtime/kernel/class.js +256 -0
  59. data/runtime/kernel/debug.js +42 -0
  60. data/runtime/kernel/init.js +114 -0
  61. data/runtime/kernel/load_order +5 -0
  62. data/runtime/kernel/loader.js +151 -0
  63. data/runtime/kernel/runtime.js +414 -0
  64. data/runtime/spec/README.md +34 -0
  65. data/runtime/spec/core/array/allocate_spec.rb +15 -0
  66. data/runtime/spec/core/array/append_spec.rb +31 -0
  67. data/runtime/spec/core/array/assoc_spec.rb +29 -0
  68. data/runtime/spec/core/array/at_spec.rb +38 -0
  69. data/runtime/spec/core/array/clear_spec.rb +22 -0
  70. data/runtime/spec/core/array/collect_spec.rb +3 -0
  71. data/runtime/spec/core/array/compact_spec.rb +42 -0
  72. data/runtime/spec/core/array/concat_spec.rb +21 -0
  73. data/runtime/spec/core/array/constructor_spec.rb +24 -0
  74. data/runtime/spec/core/array/count_spec.rb +11 -0
  75. data/runtime/spec/core/array/delete_at_spec.rb +31 -0
  76. data/runtime/spec/core/array/delete_if_spec.rb +24 -0
  77. data/runtime/spec/core/array/delete_spec.rb +26 -0
  78. data/runtime/spec/core/array/each_index_spec.rb +33 -0
  79. data/runtime/spec/core/array/each_spec.rb +11 -0
  80. data/runtime/spec/core/array/element_reference_spec.rb +136 -0
  81. data/runtime/spec/core/array/element_set_spec.rb +7 -0
  82. data/runtime/spec/core/array/empty_spec.rb +10 -0
  83. data/runtime/spec/core/array/eql_spec.rb +3 -0
  84. data/runtime/spec/core/array/equal_value_spec.rb +3 -0
  85. data/runtime/spec/core/array/fetch_spec.rb +26 -0
  86. data/runtime/spec/core/array/first_spec.rb +54 -0
  87. data/runtime/spec/core/array/fixtures/classes.rb +8 -0
  88. data/runtime/spec/core/array/flatten_spec.rb +41 -0
  89. data/runtime/spec/core/array/include_spec.rb +20 -0
  90. data/runtime/spec/core/array/insert_spec.rb +59 -0
  91. data/runtime/spec/core/array/last_spec.rb +57 -0
  92. data/runtime/spec/core/array/length_spec.rb +3 -0
  93. data/runtime/spec/core/array/map_spec.rb +3 -0
  94. data/runtime/spec/core/array/plus_spec.rb +16 -0
  95. data/runtime/spec/core/array/pop_spec.rb +79 -0
  96. data/runtime/spec/core/array/push_spec.rb +19 -0
  97. data/runtime/spec/core/array/rassoc_spec.rb +12 -0
  98. data/runtime/spec/core/array/reject_spec.rb +54 -0
  99. data/runtime/spec/core/array/replace_spec.rb +3 -0
  100. data/runtime/spec/core/array/reverse_each_spec.rb +18 -0
  101. data/runtime/spec/core/array/reverse_spec.rb +9 -0
  102. data/runtime/spec/core/array/shared/collect.rb +53 -0
  103. data/runtime/spec/core/array/shared/eql.rb +19 -0
  104. data/runtime/spec/core/array/shared/length.rb +6 -0
  105. data/runtime/spec/core/array/shared/replace.rb +31 -0
  106. data/runtime/spec/core/class/new_spec.rb +19 -0
  107. data/runtime/spec/core/enumerable/all_spec.rb +102 -0
  108. data/runtime/spec/core/enumerable/any_spec.rb +115 -0
  109. data/runtime/spec/core/enumerable/collect_spec.rb +3 -0
  110. data/runtime/spec/core/enumerable/count_spec.rb +29 -0
  111. data/runtime/spec/core/enumerable/detect_spec.rb +3 -0
  112. data/runtime/spec/core/enumerable/find_spec.rb +3 -0
  113. data/runtime/spec/core/enumerable/fixtures/classes.rb +26 -0
  114. data/runtime/spec/core/enumerable/shared/collect.rb +12 -0
  115. data/runtime/spec/core/enumerable/shared/entries.rb +7 -0
  116. data/runtime/spec/core/enumerable/shared/find.rb +49 -0
  117. data/runtime/spec/core/enumerable/to_a_spec.rb +7 -0
  118. data/runtime/spec/core/false/and_spec.rb +11 -0
  119. data/runtime/spec/core/false/inspect_spec.rb +7 -0
  120. data/runtime/spec/core/false/or_spec.rb +11 -0
  121. data/runtime/spec/core/false/to_s_spec.rb +7 -0
  122. data/runtime/spec/core/false/xor_spec.rb +11 -0
  123. data/runtime/spec/core/hash/allocate_spec.rb +15 -0
  124. data/runtime/spec/core/hash/assoc_spec.rb +29 -0
  125. data/runtime/spec/core/hash/clear_spec.rb +21 -0
  126. data/runtime/spec/core/hash/clone_spec.rb +12 -0
  127. data/runtime/spec/core/hash/default_spec.rb +6 -0
  128. data/runtime/spec/core/hash/delete_if_spec.rb +15 -0
  129. data/runtime/spec/core/hash/element_reference_spec.rb +16 -0
  130. data/runtime/spec/core/hash/element_set_spec.rb +8 -0
  131. data/runtime/spec/core/hash/new_spec.rb +13 -0
  132. data/runtime/spec/core/matchdata/to_a_spec.rb +7 -0
  133. data/runtime/spec/core/nil/and_spec.rb +12 -0
  134. data/runtime/spec/core/nil/inspect_spec.rb +8 -0
  135. data/runtime/spec/core/nil/nil_spec.rb +8 -0
  136. data/runtime/spec/core/nil/or_spec.rb +12 -0
  137. data/runtime/spec/core/nil/to_a_spec.rb +8 -0
  138. data/runtime/spec/core/nil/to_f_spec.rb +12 -0
  139. data/runtime/spec/core/nil/to_i_spec.rb +12 -0
  140. data/runtime/spec/core/nil/to_s_spec.rb +8 -0
  141. data/runtime/spec/core/nil/xor_spec.rb +12 -0
  142. data/runtime/spec/core/numeric/equal_value_spec.rb +11 -0
  143. data/runtime/spec/core/object/is_a_spec.rb +2 -0
  144. data/runtime/spec/core/object/shared/kind_of.rb +0 -0
  145. data/runtime/spec/core/regexp/match_spec.rb +23 -0
  146. data/runtime/spec/core/regexp/shared/match.rb +11 -0
  147. data/runtime/spec/core/symbol/to_proc_spec.rb +8 -0
  148. data/runtime/spec/core/true/and_spec.rb +11 -0
  149. data/runtime/spec/core/true/inspect_spec.rb +7 -0
  150. data/runtime/spec/core/true/or_spec.rb +11 -0
  151. data/runtime/spec/core/true/to_s_spec.rb +7 -0
  152. data/runtime/spec/core/true/xor_spec.rb +11 -0
  153. data/runtime/spec/language/alias_spec.rb +25 -0
  154. data/runtime/spec/language/and_spec.rb +62 -0
  155. data/runtime/spec/language/array_spec.rb +68 -0
  156. data/runtime/spec/language/block_spec.rb +105 -0
  157. data/runtime/spec/language/break_spec.rb +49 -0
  158. data/runtime/spec/language/case_spec.rb +165 -0
  159. data/runtime/spec/language/defined_spec.rb +80 -0
  160. data/runtime/spec/language/ensure_spec.rb +82 -0
  161. data/runtime/spec/language/fixtures/block.rb +19 -0
  162. data/runtime/spec/language/fixtures/break.rb +39 -0
  163. data/runtime/spec/language/fixtures/defined.rb +9 -0
  164. data/runtime/spec/language/fixtures/ensure.rb +37 -0
  165. data/runtime/spec/language/fixtures/next.rb +46 -0
  166. data/runtime/spec/language/fixtures/send.rb +36 -0
  167. data/runtime/spec/language/fixtures/super.rb +43 -0
  168. data/runtime/spec/language/hash_spec.rb +43 -0
  169. data/runtime/spec/language/if_spec.rb +278 -0
  170. data/runtime/spec/language/loop_spec.rb +32 -0
  171. data/runtime/spec/language/next_spec.rb +128 -0
  172. data/runtime/spec/language/or_spec.rb +65 -0
  173. data/runtime/spec/language/predefined_spec.rb +21 -0
  174. data/runtime/spec/language/regexp/interpolation_spec.rb +9 -0
  175. data/runtime/spec/language/regexp_spec.rb +7 -0
  176. data/runtime/spec/language/send_spec.rb +105 -0
  177. data/runtime/spec/language/string_spec.rb +4 -0
  178. data/runtime/spec/language/super_spec.rb +18 -0
  179. data/runtime/spec/language/symbol_spec.rb +41 -0
  180. data/runtime/spec/language/undef_spec.rb +16 -0
  181. data/runtime/spec/language/unless_spec.rb +44 -0
  182. data/runtime/spec/language/until_spec.rb +137 -0
  183. data/runtime/spec/language/variables_spec.rb +28 -0
  184. data/runtime/spec/language/versions/hash_1.9.rb +20 -0
  185. data/runtime/spec/language/while_spec.rb +175 -0
  186. data/runtime/spec/library/stringscanner/scan_spec.rb +36 -0
  187. data/runtime/spec/opal/forwardable/def_instance_delegator_spec.rb +49 -0
  188. data/runtime/spec/opal/opal/defined_spec.rb +15 -0
  189. data/runtime/spec/opal/opal/function_spec.rb +11 -0
  190. data/runtime/spec/opal/opal/native_spec.rb +16 -0
  191. data/runtime/spec/opal/opal/null_spec.rb +10 -0
  192. data/runtime/spec/opal/opal/number_spec.rb +11 -0
  193. data/runtime/spec/opal/opal/object_spec.rb +16 -0
  194. data/runtime/spec/opal/opal/string_spec.rb +11 -0
  195. data/runtime/spec/opal/opal/typeof_spec.rb +9 -0
  196. data/runtime/spec/opal/opal/undefined_spec.rb +10 -0
  197. data/runtime/spec/opal/true/case_compare_spec.rb +12 -0
  198. data/runtime/spec/opal/true/class_spec.rb +10 -0
  199. data/runtime/spec/spec_helper.rb +25 -0
  200. data/runtime/stdlib/base64.rb +91 -0
  201. data/runtime/stdlib/date.rb +4 -0
  202. data/{stdlib → runtime/stdlib}/dev.rb +0 -0
  203. data/runtime/stdlib/forwardable.rb +33 -0
  204. data/runtime/stdlib/optparse.rb +0 -0
  205. data/runtime/stdlib/pp.rb +6 -0
  206. data/{stdlib → runtime/stdlib}/racc/parser.rb +0 -0
  207. data/runtime/stdlib/rbconfig.rb +0 -0
  208. data/runtime/stdlib/si.rb +17 -0
  209. data/runtime/stdlib/strscan.rb +53 -0
  210. data/runtime/stdlib/uri.rb +111 -0
  211. data/runtime/stdlib/uri/common.rb +1014 -0
  212. data/runtime/stdlib/uri/ftp.rb +261 -0
  213. data/runtime/stdlib/uri/generic.rb +1599 -0
  214. data/runtime/stdlib/uri/http.rb +106 -0
  215. data/runtime/stdlib/uri/https.rb +22 -0
  216. data/runtime/stdlib/uri/ldap.rb +260 -0
  217. data/runtime/stdlib/uri/ldaps.rb +20 -0
  218. data/runtime/stdlib/uri/mailto.rb +280 -0
  219. data/spec/builder/build_source_spec.rb +52 -0
  220. data/spec/builder/fixtures/build_source/adam.rb +0 -0
  221. data/spec/builder/fixtures/build_source/bar/a.rb +0 -0
  222. data/spec/builder/fixtures/build_source/bar/wow/b.rb +0 -0
  223. data/spec/builder/fixtures/build_source/bar/wow/cow/c.rb +0 -0
  224. data/spec/builder/fixtures/build_source/beynon.rb +0 -0
  225. data/spec/builder/fixtures/build_source/charles.js +0 -0
  226. data/spec/builder/fixtures/build_source/foo/a.rb +0 -0
  227. data/spec/builder/fixtures/build_source/foo/b.rb +0 -0
  228. data/spec/builder/fixtures/build_source/foo/x.js +0 -0
  229. data/spec/builder/fixtures/build_source/foo/y.js +0 -0
  230. data/spec/builder/output_path_spec.rb +50 -0
  231. data/spec/grammar/alias_spec.rb +26 -0
  232. data/spec/grammar/and_spec.rb +13 -0
  233. data/spec/grammar/array_spec.rb +22 -0
  234. data/spec/grammar/attrasgn_spec.rb +28 -0
  235. data/spec/grammar/begin_spec.rb +38 -0
  236. data/spec/grammar/block_spec.rb +12 -0
  237. data/spec/grammar/break_spec.rb +17 -0
  238. data/spec/grammar/call_spec.rb +58 -0
  239. data/spec/grammar/class_spec.rb +35 -0
  240. data/spec/grammar/const_spec.rb +13 -0
  241. data/spec/grammar/cvar_spec.rb +11 -0
  242. data/spec/grammar/def_spec.rb +60 -0
  243. data/spec/grammar/false_spec.rb +17 -0
  244. data/spec/grammar/file_spec.rb +7 -0
  245. data/spec/grammar/gvar_spec.rb +13 -0
  246. data/spec/grammar/hash_spec.rb +17 -0
  247. data/spec/grammar/iasgn_spec.rb +9 -0
  248. data/spec/grammar/if_spec.rb +26 -0
  249. data/spec/grammar/iter_spec.rb +59 -0
  250. data/spec/grammar/ivar_spec.rb +9 -0
  251. data/spec/grammar/lasgn_spec.rb +8 -0
  252. data/spec/grammar/line_spec.rb +8 -0
  253. data/spec/grammar/lvar_spec.rb +38 -0
  254. data/spec/grammar/module_spec.rb +27 -0
  255. data/spec/grammar/nil_spec.rb +17 -0
  256. data/spec/grammar/not_spec.rb +27 -0
  257. data/spec/grammar/op_asgn1_spec.rb +23 -0
  258. data/spec/grammar/op_asgn2_spec.rb +23 -0
  259. data/spec/grammar/or_spec.rb +13 -0
  260. data/spec/grammar/return_spec.rb +17 -0
  261. data/spec/grammar/sclass_spec.rb +20 -0
  262. data/spec/grammar/self_spec.rb +17 -0
  263. data/spec/grammar/str_spec.rb +96 -0
  264. data/spec/grammar/super_spec.rb +20 -0
  265. data/spec/grammar/true_spec.rb +17 -0
  266. data/spec/grammar/undef_spec.rb +15 -0
  267. data/spec/grammar/unless_spec.rb +13 -0
  268. data/spec/grammar/while_spec.rb +15 -0
  269. data/spec/grammar/xstr_spec.rb +116 -0
  270. data/spec/grammar/yield_spec.rb +20 -0
  271. data/spec/spec_helper.rb +9 -0
  272. metadata +346 -21
  273. data/lib/opal/bundle.rb +0 -34
  274. data/lib/opal/lexer.rb +0 -902
  275. data/lib/opal/nodes.rb +0 -2150
  276. data/lib/opal/parser.rb +0 -4894
  277. data/lib/opal/rake/bundle_task.rb +0 -63
  278. data/opal-parser.js +0 -8343
  279. data/stdlib/strscan.rb +0 -52
  280. data/templates/init/Rakefile +0 -7
  281. data/templates/init/index.html +0 -17
  282. data/templates/init/lib/__NAME__.rb +0 -2
@@ -1,4 +1,4 @@
1
- class Opal::Parser < Racc::Parser
1
+ class Opal::Grammar
2
2
 
3
3
  token CLASS MODULE DEF UNDEF BEGIN RESCUE ENSURE END IF UNLESS
4
4
  THEN ELSIF ELSE CASE WHEN WHILE UNTIL FOR BREAK NEXT
@@ -12,9 +12,9 @@ token CLASS MODULE DEF UNDEF BEGIN RESCUE ENSURE END IF UNLESS
12
12
  '::' '::@' OP_ASGN '=>' PAREN_BEG '(' ')' tLPAREN_ARG
13
13
  ARRAY_BEG ']' tLBRACE tLBRACE_ARG SPLAT '*' '&@' '&'
14
14
  '~' '%' '/' '+' '-' '<' '>' '|' '!' '^'
15
- '{@' '}' BACK_REF2 SYMBOL_BEG STRING_BEG XSTRING_BEG REGEXP_BEG
15
+ LCURLY '}' BACK_REF2 SYMBOL_BEG STRING_BEG XSTRING_BEG REGEXP_BEG
16
16
  WORDS_BEG AWORDS_BEG STRING_DBEG STRING_DVAR STRING_END STRING
17
- SYMBOL '\\n' '?' ':' ',' SPACE ';' LABEL UNDEFINED NULL
17
+ SYMBOL '\\n' '?' ':' ',' SPACE ';' LABEL
18
18
 
19
19
  prechigh
20
20
  right '!' '~' '+@'
@@ -52,23 +52,29 @@ target:
52
52
  bodystmt:
53
53
  compstmt opt_rescue opt_else opt_ensure
54
54
  {
55
- result = BodyStatementsNode.new val[0], val[1], val[2], val[3]
55
+ result = new_body val[0], val[1], val[2], val[3]
56
56
  }
57
57
 
58
58
  compstmt:
59
59
  stmts opt_terms
60
60
  {
61
- result = val[0]
61
+ comp = new_compstmt val[0]
62
+ if comp and comp[0] == :begin and comp.size == 2
63
+ result = comp[1]
64
+ result.line = comp.line
65
+ else
66
+ result = comp
67
+ end
62
68
  }
63
69
 
64
70
  stmts:
65
71
  none
66
72
  {
67
- result = StatementsNode.new []
73
+ result = new_block
68
74
  }
69
75
  | stmt
70
76
  {
71
- result = StatementsNode.new [val[0]]
77
+ result = new_block val[0]
72
78
  }
73
79
  | stmts terms stmt
74
80
  {
@@ -78,35 +84,44 @@ stmts:
78
84
 
79
85
  stmt:
80
86
  ALIAS fitem fitem
87
+ {
88
+ result = s(:alias, val[1], val[2])
89
+ }
81
90
  | ALIAS GVAR GVAR
91
+ {
92
+ result = s(:valias, val[1].intern, val[2].intern)
93
+ }
82
94
  | ALIAS GVAR BACK_REF
83
95
  | ALIAS GVAR NTH_REF
96
+ {
97
+ result = s(:valias, val[1].intern, val[2].intern)
98
+ }
84
99
  | UNDEF undef_list
85
100
  {
86
- result = UndefNode.new val[0], val[1]
101
+ result = val[1]
87
102
  }
88
103
  | stmt IF_MOD expr_value
89
104
  {
90
- result = IfNode.new val[1], val[2], StatementsNode.new([val[0]]), [], val[1]
105
+ result = new_if val[2], val[0], nil
91
106
  }
92
107
  | stmt UNLESS_MOD expr_value
93
108
  {
94
- result = IfModNode.new val[1], val[2], val[0]
109
+ result = new_if val[2], nil, val[0]
95
110
  }
96
111
  | stmt WHILE_MOD expr_value
97
112
  {
98
- result = WhileNode.new val[1], val[2], StatementsNode.new([val[0]]), val[1]
113
+ result = s(:while, val[2], val[0], true)
99
114
  }
100
115
  | stmt UNTIL_MOD expr_value
101
116
  {
102
- result = WhileNode.new val[1], val[2], StatementsNode.new([val[0]]), val[1]
117
+ result = s(:until, val[2], val[0], true)
103
118
  }
104
119
  | stmt RESCUE_MOD stmt
105
- | klBEGIN '{@' compstmt '}'
106
- | klEND '{@' compstmt '}'
120
+ | klBEGIN LCURLY compstmt '}'
121
+ | klEND LCURLY compstmt '}'
107
122
  | lhs '=' command_call
108
123
  {
109
- result = AssignNode.new val[0], val[2], val[1]
124
+ result = new_assign val[0], val[2]
110
125
  }
111
126
  | mlhs '=' command_call
112
127
  {
@@ -114,7 +129,7 @@ stmt:
114
129
  }
115
130
  | var_lhs OP_ASGN command_call
116
131
  {
117
- result = OpAsgnNode.new val[1], val[0], val[2]
132
+ result = new_op_asgn val[1].intern, val[0], val[2]
118
133
  }
119
134
  | primary_value '[@' aref_args ']' OP_ASGN command_call
120
135
  # {
@@ -122,12 +137,15 @@ stmt:
122
137
  # }
123
138
  | primary_value '.' IDENTIFIER OP_ASGN command_call
124
139
  {
125
- result = OpAsgnNode.new(val[3], CallNode.new(val[0], val[2], []), val[4])
140
+ result = s(:op_asgn2, val[0], "#{val[2]}=".intern, val[3].intern, val[4])
126
141
  }
127
142
  | primary_value '.' CONSTANT OP_ASGN command_call
128
143
  | primary_value '::' IDENTIFIER OP_ASGN command_call
129
144
  | backref OP_ASGN command_call
130
145
  | lhs '=' mrhs
146
+ {
147
+ result = new_assign val[0], s(:svalue, val[2])
148
+ }
131
149
  | mlhs '=' arg_value
132
150
  {
133
151
  result = MlhsAssignNode.new val[1], val[0], val[2]
@@ -142,19 +160,22 @@ expr:
142
160
  command_call
143
161
  | expr AND expr
144
162
  {
145
- result = AndNode.new val[1], val[0], val[2]
163
+ result = s(:and, val[0], val[2])
164
+ result.line = val[0].line
146
165
  }
147
166
  | expr OR expr
148
167
  {
149
- result = OrNode.new val[1], val[0], val[2]
168
+ result = s(:or, val[0], val[2])
169
+ result.line = val[0].line
150
170
  }
151
171
  | NOT expr
152
172
  {
153
- result = UnaryNode.new({:line => val[0][:line], :value => '!'} , val[1])
173
+ result = s(:not, val[1])
174
+ result.line = val[1].line
154
175
  }
155
176
  | '!' command_call
156
177
  {
157
- result = UnaryNode.new({:line => val[0][:line], :value => '!'} , val[1])
178
+ result = s(:not, val[1])
158
179
  }
159
180
  | arg
160
181
 
@@ -166,15 +187,21 @@ command_call:
166
187
  | block_command
167
188
  | RETURN call_args
168
189
  {
169
- result = ReturnNode.new val[0], val[1]
190
+ args = val[1]
191
+ args = args[1] if args.size == 2
192
+ result = s(:return, args)
170
193
  }
171
194
  | BREAK call_args
172
195
  {
173
- result = BreakNode.new val[0], val[1]
196
+ args = val[1]
197
+ args = args[1] if args.size == 2
198
+ result = s(:break, args)
174
199
  }
175
200
  | NEXT call_args
176
201
  {
177
- result = NextNode.new val[0], val[1]
202
+ args = val[1]
203
+ args = args[1] if args.size == 2
204
+ result = s(:next, args)
178
205
  }
179
206
 
180
207
  block_command:
@@ -188,12 +215,12 @@ cmd_brace_block:
188
215
  command:
189
216
  operation command_args =LOWEST
190
217
  {
191
- result = CallNode.new nil, val[0], val[1]
218
+ result = new_call nil, val[0].intern, val[1]
192
219
  }
193
220
  | operation command_args cmd_brace_block
194
221
  | primary_value '.' operation2 command_args =LOWEST
195
222
  {
196
- result = CallNode.new val[0], val[2], val[3]
223
+ result = new_call val[0], val[2].intern, val[3]
197
224
  }
198
225
  | primary_value '.' operation2 command_args cmd_brace_block
199
226
  | primary_value '::' operation2 command_args =LOWEST
@@ -203,11 +230,11 @@ command:
203
230
  | primary_value '::' operation2 command_args cmd_brace_block
204
231
  | SUPER command_args
205
232
  {
206
- result = SuperNode.new val[0], val[1]
233
+ result = new_super val[1]
207
234
  }
208
235
  | YIELD command_args
209
236
  {
210
- result = YieldNode.new val[0], val[1]
237
+ result = new_yield val[1]
211
238
  }
212
239
 
213
240
  mlhs:
@@ -276,16 +303,27 @@ mlhs_node:
276
303
 
277
304
  lhs:
278
305
  variable
306
+ {
307
+ result = new_assignable val[0]
308
+ }
279
309
  | primary_value '[@' aref_args ']'
280
310
  {
281
- result = ArefNode.new val[0], val[2]
311
+ args = val[2]
312
+ args[0] = :arglist if args[0] == :array
313
+ result = s(:attrasgn, val[0], :[]=, args)
282
314
  }
283
315
  | primary_value '.' IDENTIFIER
284
316
  {
285
- result = CallNode.new val[0], val[2], [[]]
317
+ result = s(:attrasgn, val[0], "#{val[2]}=".intern, s(:arglist))
286
318
  }
287
319
  | primary_value '::' IDENTIFIER
320
+ {
321
+ result = s(:attrasgn, val[0], "#{val[2]}=".intern, s(:arglist))
322
+ }
288
323
  | primary_value '.' CONSTANT
324
+ {
325
+ result = s(:attrasgn, val[0], "#{val[2]}=".intern, s(:arglist))
326
+ }
289
327
  | primary_value '::' CONSTANT
290
328
  | '::@' CONSTANT
291
329
  | backref
@@ -296,15 +334,15 @@ cname:
296
334
  cpath:
297
335
  '::@' cname
298
336
  {
299
- result = "result = ['::', val[1]];"
337
+ result = s(:colon3, val[1].intern)
300
338
  }
301
339
  | cname
302
340
  {
303
- result = [nil, val[0]]
341
+ result = val[0].intern
304
342
  }
305
343
  | primary_value '::' cname
306
344
  {
307
- result = [val[0], val[2]]
345
+ result = s(:colon2, val[0], val[2].intern)
308
346
  }
309
347
 
310
348
  fname:
@@ -312,16 +350,30 @@ fname:
312
350
  | CONSTANT
313
351
  | FID
314
352
  | op
353
+ {
354
+ @lex_state = :expr_end
355
+ result = val[0]
356
+ }
315
357
  | reswords
358
+ {
359
+ @lex_state = :expr_end
360
+ result = val[0]
361
+ }
316
362
 
317
363
  fitem:
318
364
  fname
365
+ {
366
+ result = s(:lit, val[0].intern)
367
+ }
319
368
  | symbol
369
+ {
370
+ result = s(:lit, val[0])
371
+ }
320
372
 
321
373
  undef_list:
322
374
  fitem
323
375
  {
324
- result = [val[0]]
376
+ result = s(:undef, val[0])
325
377
  }
326
378
  | undef_list ',' fitem
327
379
  {
@@ -347,20 +399,23 @@ reswords:
347
399
  arg:
348
400
  lhs '=' arg
349
401
  {
350
- result = AssignNode.new val[0], val[2], val[1]
402
+ result = new_assign val[0], val[2]
351
403
  }
352
404
  | lhs '=' arg RESCUE_MOD arg
353
405
  | var_lhs OP_ASGN arg
354
406
  {
355
- result = OpAsgnNode.new val[1], val[0], val[2]
407
+ result = new_op_asgn val[1].intern, val[0], val[2]
356
408
  }
357
409
  | primary_value '[@' aref_args ']' OP_ASGN arg
358
410
  {
359
- result = OpAsgnNode.new val[4], ArefNode.new(val[0], val[2]), val[5]
411
+ args = val[2]
412
+ args[0] = :arglist if args[0] == :array
413
+ result = s(:op_asgn1, val[0], val[2], val[4].intern, val[5])
414
+ result.line = val[0].line
360
415
  }
361
416
  | primary_value '.' IDENTIFIER OP_ASGN arg
362
417
  {
363
- result = OpAsgnNode.new(val[3], CallNode.new(val[0], val[2], [[]]), val[4])
418
+ result = s(:op_asgn2, val[0], "#{val[2]}=".intern, val[3].intern, val[4])
364
419
  }
365
420
  | primary_value '.' CONSTANT OP_ASGN arg
366
421
  | primary_value '::' IDENTIFIER OP_ASGN arg
@@ -369,124 +424,136 @@ arg:
369
424
  | backref OP_ASGN arg
370
425
  | arg '..' arg
371
426
  {
372
- result = RangeNode.new val[1], val[0], val[2]
427
+ result = s(:dot2, val[0], val[2])
428
+ result.line = val[0].line
373
429
  }
374
430
  | arg '...' arg
375
431
  {
376
- result = RangeNode.new val[1], val[0], val[2]
432
+ result = s(:dot3, val[0], val[2])
433
+ result.line = val[0].line
377
434
  }
378
435
  | arg '+' arg
379
436
  {
380
- result = ArithmeticNode.new val[0], val[1], val[2]
437
+ result = new_call val[0], :"+", s(:arglist, val[2])
381
438
  }
382
439
  | arg '-' arg
383
440
  {
384
- result = ArithmeticNode.new val[0], val[1], val[2]
441
+ result = new_call val[0], :"-", s(:arglist, val[2])
385
442
  }
386
443
  | arg '*' arg
387
444
  {
388
- result = ArithmeticNode.new val[0], val[1], val[2]
445
+ result = new_call val[0], :"*", s(:arglist, val[2])
389
446
  }
390
447
  | arg '/' arg
391
448
  {
392
- result = ArithmeticNode.new val[0], val[1], val[2]
449
+ result = new_call val[0], :"/", s(:arglist, val[2])
393
450
  }
394
451
  | arg '%' arg
395
452
  {
396
- result = ArithmeticNode.new val[0], val[1], val[2]
453
+ result = new_call val[0], :"%", s(:arglist, val[2])
397
454
  }
398
455
  | arg '**' arg
399
456
  {
400
- result = CallNode.new val[0], val[1], [[val[2]]]
457
+ result = new_call val[0], :"**", s(:arglist, val[2])
401
458
  }
459
+ | '-@NUM' INTEGER '**' arg
460
+ | '-@NUM' FLOAT '**' arg
402
461
  | '+@' arg
403
462
  {
404
- result = UnaryNode.new({:line => val[0][:line], :value => '+'} , val[1])
463
+ result = new_call val[1], :"+@", s(:arglist)
464
+ result = val[1] if val[1][0] == :lit and Numeric === val[1][1]
405
465
  }
406
466
  | '-@' arg
407
467
  {
408
- result = UnaryNode.new({:line => val[0][:line], :value => '-'} , val[1])
468
+ result = new_call val[1], :"-@", s(:arglist)
469
+ if val[1][0] == :lit and Numeric === val[1][1]
470
+ val[1][1] = -val[1][1]
471
+ result = val[1]
472
+ end
409
473
  }
410
474
  | arg '|' arg
411
475
  {
412
- result = CallNode.new val[0], val[1], [[val[2]]]
476
+ result = new_call val[0], :"|", s(:arglist, val[2])
413
477
  }
414
478
  | arg '^' arg
415
479
  {
416
- result = CallNode.new val[0], val[1], [[val[2]]]
480
+ result = new_call val[0], :"^", s(:arglist, val[2])
417
481
  }
418
482
  | arg '&' arg
419
483
  {
420
- result = CallNode.new val[0], val[1], [[val[2]]]
484
+ result = new_call val[0], :"&", s(:arglist, val[2])
421
485
  }
422
486
  | arg '<=>' arg
423
487
  {
424
- result = CallNode.new val[0], val[1], [[val[2]]]
488
+ result = new_call val[0], :"<=>", s(:arglist, val[2])
425
489
  }
426
490
  | arg '>' arg
427
491
  {
428
- result = ComparisonNode.new val[1], val[0], val[2]
492
+ result = new_call val[0], :">", s(:arglist, val[2])
429
493
  }
430
494
  | arg '>=' arg
431
495
  {
432
- result = ComparisonNode.new val[1], val[0], val[2]
496
+ result = new_call val[0], :">=", s(:arglist, val[2])
433
497
  }
434
498
  | arg '<' arg
435
499
  {
436
- result = ComparisonNode.new val[1], val[0], val[2]
500
+ result = new_call val[0], :"<", s(:arglist, val[2])
437
501
  }
438
502
  | arg '<=' arg
439
503
  {
440
- result = ComparisonNode.new val[1], val[0], val[2]
504
+ result = new_call val[0], :"<=", s(:arglist, val[2])
441
505
  }
442
506
  | arg '==' arg
443
507
  {
444
- result = EqualNode.new val[0], val[1], val[2]
508
+ result = new_call val[0], :"==", s(:arglist, val[2])
445
509
  }
446
510
  | arg '===' arg
447
511
  {
448
- result = CallNode.new val[0], val[1], [[val[2]]]
512
+ result = new_call val[0], :"===", s(:arglist, val[2])
449
513
  }
450
514
  | arg '!=' arg
451
515
  {
452
- result = EqualNode.new val[0], val[1], val[2]
516
+ result = s(:not, new_call(val[0], :"==", s(:arglist, val[2])))
453
517
  }
454
518
  | arg '=~' arg
455
519
  {
456
- result = CallNode.new val[0], val[1], [[val[2]]]
520
+ result = new_call val[0], :"=~", s(:arglist, val[2])
457
521
  }
458
522
  | arg '!~' arg
459
523
  {
460
- result = CallNode.new val[0], val[1], [[val[2]]]
524
+ result = s(:not, new_call(val[0], :"=~", s(:arglist, val[2])))
461
525
  }
462
526
  | '!' arg
463
527
  {
464
- result = UnaryNode.new({:line => val[0][:line], :value => '!'} , val[1])
528
+ result = s(:not, val[1])
465
529
  }
466
530
  | '~' arg
467
531
  {
468
- result = CallNode.new val[1], val[0], []
532
+ result = new_call val[1], :"~", s(:arglist)
469
533
  }
470
534
  | arg '<<' arg
471
535
  {
472
- result = CallNode.new val[0], val[1], [[val[2]]]
536
+ result = new_call val[0], :"<<", s(:arglist, val[2])
473
537
  }
474
538
  | arg '>>' arg
475
539
  {
476
- result = CallNode.new val[0], val[1], [[val[2]]]
540
+ result = new_call val[0], :">>", s(:arglist, val[2])
477
541
  }
478
542
  | arg '&&' arg
479
543
  {
480
- result = AndNode.new val[1], val[0], val[2]
544
+ result = s(:and, val[0], val[2])
545
+ result.line = val[0].line
481
546
  }
482
547
  | arg '||' arg
483
548
  {
484
- result = OrNode.new val[1], val[0], val[2]
549
+ result = s(:or, val[0], val[2])
550
+ result.line = val[0].line
485
551
  }
486
552
  | DEFINED opt_nl arg
487
553
  | arg '?' arg ':' arg
488
554
  {
489
- result = TernaryNode.new val[0], val[2], val[4]
555
+ result = s(:if, val[0], val[2], val[4])
556
+ result.line = val[0].line
490
557
  }
491
558
  | primary
492
559
 
@@ -496,30 +563,24 @@ arg_value:
496
563
  aref_args:
497
564
  none
498
565
  {
499
- result = [[], nil]
566
+ result = nil
500
567
  }
501
- | command opt_nl
502
568
  | args trailer
503
569
  {
504
- result = [val[0], nil]
505
- }
506
- | args ',' SPLAT arg opt_nl
507
- {
508
- result = [val[0], val[3]]
570
+ result = val[0]
509
571
  }
510
572
  | assocs trailer
511
573
  {
512
- result = [[HashNode.new(val[0], {}, {})], nil]
513
- }
514
- | SPLAT arg opt_nl
515
- {
516
- result = [[], val[1]]
574
+ result = s(:array, val[0])
575
+ #result.line = val[0].line
576
+ # FIXME:
577
+ result = s(:array)
517
578
  }
518
579
 
519
580
  paren_args:
520
581
  '(' none ')'
521
582
  {
522
- result = [[]]
583
+ result = nil
523
584
  }
524
585
  | '(' call_args opt_nl ')'
525
586
  {
@@ -530,61 +591,36 @@ paren_args:
530
591
 
531
592
  opt_paren_args:
532
593
  none
533
- {
534
- result = []
535
- }
536
594
  | paren_args
537
595
 
538
596
  call_args:
539
597
  command
540
598
  {
541
- result = [[val[0]], nil, nil, nil]
599
+ result = s(:array, val[0])
542
600
  }
543
601
  | args opt_block_arg
544
602
  {
545
- result = [val[0], nil, nil, val[1]]
546
- }
547
- | args ',' SPLAT arg_value opt_block_arg
548
- {
549
- result = [val[0], val[3], nil, val[4]]
603
+ result = val[0]
604
+ add_block_pass val[0], val[1]
550
605
  }
551
606
  | assocs opt_block_arg
552
607
  {
553
- result = [nil, nil, val[0], val[1]]
554
- }
555
- | assocs ',' SPLAT arg_value opt_block_arg
556
- {
557
- result = [nil, val[3], val[0], val[4]]
608
+ result = s(:arglist, s(:hash, *val[0]))
609
+ add_block_pass result, val[1]
558
610
  }
559
611
  | args ',' assocs opt_block_arg
560
612
  {
561
- result = [val[0], nil, val[2], val[3]]
562
- }
563
- | args ',' assocs ',' SPLAT arg opt_block_arg
564
- {
565
- result = [val[0], val[5], val[2], val[6]]
566
- }
567
- | SPLAT arg_value opt_block_arg
568
- {
569
- result = [nil, val[1], nil, val[2]]
613
+ result = val[0]
614
+ result << s(:hash, *val[2])
570
615
  }
571
616
  | block_arg
572
617
  {
573
- result = [nil, nil, nil, val[0]]
618
+ result = s(:arglist)
619
+ add_block_pass result, val[0]
574
620
  }
575
621
 
576
622
  call_args2:
577
623
  arg_value ',' args opt_block_arg
578
- | arg_value ',' block_arg
579
- | arg_value ',' SPLAT arg_value opt_block_arg
580
- | arg_value ',' args ',' SPLAT arg_value opt_block_arg
581
- | assocs opt_block_arg
582
- | assocs ',' SPLAT arg_value opt_block_arg
583
- | arg_value ',' assocs opt_block_arg
584
- | arg_value ',' args ',' assocs opt_block_arg
585
- | arg_value ',' assocs ',' SPLAT arg_value opt_block_arg
586
- | arg_value ',' args ',' assocs ',' SPLAT arg_value opt_block_arg
587
- | SPLAT arg_value opt_block_arg
588
624
  | block_arg
589
625
 
590
626
  command_args:
@@ -601,7 +637,7 @@ open_args:
601
637
  call_args
602
638
  | tLPAREN_ARG ')'
603
639
  {
604
- result = [[]]
640
+ result = nil
605
641
  }
606
642
  | tLPAREN_ARG call_args2 ')'
607
643
  {
@@ -611,7 +647,7 @@ open_args:
611
647
  block_arg:
612
648
  '&@' arg_value
613
649
  {
614
- result = val[1]
650
+ result = s(:block_pass, val[1])
615
651
  }
616
652
 
617
653
  opt_block_arg:
@@ -627,17 +663,32 @@ opt_block_arg:
627
663
  args:
628
664
  arg_value
629
665
  {
630
- result = [val[0]]
666
+ result = s(:array, val[0])
667
+ }
668
+ | SPLAT arg_value
669
+ {
670
+ result = s(:array, s(:splat, val[1]))
631
671
  }
632
672
  | args ',' arg_value
633
673
  {
634
674
  result = val[0] << val[2]
635
675
  }
676
+ | args ',' SPLAT arg_value
677
+ {
678
+ result = val[0] << s(:splat, val[3])
679
+ }
636
680
 
637
681
  mrhs:
638
682
  args ',' arg_value
683
+ {
684
+ val[0] << val[2]
685
+ result = val[0]
686
+ }
639
687
  | args ',' SPLAT arg_value
640
688
  | SPLAT arg_value
689
+ {
690
+ result = s(:splat, val[1])
691
+ }
641
692
 
642
693
  primary:
643
694
  literal
@@ -649,74 +700,83 @@ primary:
649
700
  | var_ref
650
701
  | backref
651
702
  | FID
652
- | BEGIN bodystmt END
703
+ | BEGIN
653
704
  {
654
- result = BeginNode.new val[0], val[1], val[2]
705
+ result = @line
706
+ }
707
+ bodystmt END
708
+ {
709
+ result = s(:begin, val[2])
710
+ result.line = val[1]
655
711
  }
656
712
  | tLPAREN_ARG expr opt_nl ')'
657
713
  | PAREN_BEG compstmt ')'
658
714
  {
659
- result = ParenNode.new val[0], val[1], val[2]
715
+ result = val[1] || s(:nil)
660
716
  }
661
717
  | primary_value '::' CONSTANT
662
718
  {
663
- result = Colon2Node.new val[0], val[2]
719
+ result = s(:colon2, val[0], val[2].intern)
664
720
  }
665
721
  | '::@' CONSTANT
666
722
  {
667
- result = Colon3Node.new val[1]
723
+ result = s(:colon3, val[1])
668
724
  }
669
725
  | primary_value '[@' aref_args ']'
670
726
  {
671
- result = CallNode.new val[0], { :line => val[0].line, :value => '[]' }, val[2]
727
+ result = new_call val[0], :[], val[2]
672
728
  }
673
729
  | '[' aref_args ']'
674
730
  {
675
- result = ArrayNode.new val[1], val[0], val[2]
731
+ result = val[1] || s(:array)
676
732
  }
677
733
  | '{' assoc_list '}'
678
734
  {
679
- result = HashNode.new val[1], val[0], val[2]
735
+ result = s(:hash, *val[1])
680
736
  }
681
737
  | RETURN
682
738
  {
683
- result = ReturnNode.new val[0], [nil]
739
+ result = s(:return)
684
740
  }
685
741
  | YIELD '(' call_args ')'
686
742
  {
687
- result = YieldNode.new val[0], val[2]
743
+ result = new_yield val[2]
688
744
  }
689
745
  | YIELD '(' ')'
690
746
  {
691
- result = YieldNode.new val[0], []
747
+ result = s(:yield)
692
748
  }
693
749
  | YIELD
694
750
  {
695
- result = YieldNode.new val[0], []
751
+ result = s(:yield)
696
752
  }
697
753
  | DEFINED opt_nl '(' expr ')'
754
+ {
755
+ result = s(:defined, val[3])
756
+ }
698
757
  | operation brace_block
699
758
  {
700
- result = CallNode.new nil, val[0], [[]]
701
- result.block = val[1]
759
+ result = val[1]
760
+ result[1] = new_call(nil, val[0].intern, s(:arglist))
702
761
  }
703
762
  | method_call
704
763
  | method_call brace_block
705
764
  {
706
- result = val[0];
707
- result.block = val[1]
765
+ result = val[1]
766
+ result[1] = val[0]
708
767
  }
709
768
  | IF expr_value then compstmt if_tail END
710
769
  {
711
- result = IfNode.new val[0], val[1], val[3], val[4], val[5]
770
+ result = new_if val[1], val[3], val[4]
712
771
  }
713
772
  | UNLESS expr_value then compstmt opt_else END
714
773
  {
715
- result = IfNode.new val[0], val[1], val[3], val[4], val[5]
774
+ result = new_if val[1], val[4], val[3]
716
775
  }
717
776
  | WHILE
718
777
  {
719
778
  cond_push 1
779
+ result = @line
720
780
  }
721
781
  expr_value do
722
782
  {
@@ -724,72 +784,123 @@ primary:
724
784
  }
725
785
  compstmt END
726
786
  {
727
- result = WhileNode.new val[0], val[2], val[5], val[6]
787
+ result = s(:while, val[2], val[5], true)
788
+ result.line = val[1]
728
789
  }
729
790
  | UNTIL
730
791
  {
731
- result = "this.cond_push(1);"
792
+ cond_push 1
793
+ result = @line
732
794
  }
733
795
  expr_value do
734
796
  {
735
- result = "this.cond_pop();"
797
+ cond_pop
736
798
  }
737
799
  compstmt END
738
800
  {
739
- result = "result = ['while', val[0], val[2], val[5]];"
801
+ result = s(:until, val[2], val[5], true)
802
+ result.line = val[1]
740
803
  }
741
804
  | CASE expr_value opt_terms case_body END
742
805
  {
743
- result = CaseNode.new val[0], val[1], val[3], val[4]
806
+ result = s(:case, val[1], *val[3])
807
+ result.line = val[1].line
744
808
  }
745
809
  | CASE opt_terms case_body END
746
810
  {
747
- result = "result = ['case', null, val[2]];"
811
+ result = s(:case, nil, *val[2])
812
+ result.line = val[2].line
748
813
  }
749
814
  | CASE opt_terms ELSE compstmt END
815
+ {
816
+ result = s(:case, nil, val[3])
817
+ result.line = val[3].line
818
+ }
750
819
  | FOR block_var IN
751
820
  {
752
- cond_push 1
821
+ result = "this.cond_push(1);"
753
822
  }
754
823
  expr_value do
755
824
  {
756
- cond_pop
825
+ result = "this.cond_pop();"
757
826
  }
758
827
  compstmt END
828
+ | CLASS
759
829
  {
760
- result = ForNode.new val[0], val[1], val[4], val[7], val[8]
830
+ result = @line
761
831
  }
762
- | CLASS cpath superclass bodystmt END
832
+ cpath superclass
763
833
  {
764
- result = ClassNode.new val[0], val[1], val[2], val[3], val[4]
834
+ # ...
765
835
  }
766
- | CLASS '<<' expr term bodystmt END
836
+ bodystmt END
767
837
  {
768
- result = ClassShiftNode.new val[0], val[2], val[4], val[5]
838
+ result = new_class val[2], val[3], val[5]
839
+ result.line = val[1]
840
+ result.end_line = @line
769
841
  }
770
- | MODULE cpath bodystmt END
842
+ | CLASS '<<'
771
843
  {
772
- result = ModuleNode.new val[0], val[1], val[2], val[3]
844
+ result = @line
773
845
  }
774
- | DEF fname f_arglist bodystmt END
846
+ expr term
775
847
  {
776
- result = DefNode.new val[0], nil, val[1], val[2], val[3], val[4]
848
+ # ...
777
849
  }
778
- | DEF singleton dot_or_colon fname f_arglist bodystmt END
850
+ bodystmt END
779
851
  {
780
- result = DefNode.new val[0], val[1], val[3], val[4], val[5], val[6]
852
+ result = new_sclass val[3], val[6]
853
+ result.line = val[2]
854
+ }
855
+ | MODULE
856
+ {
857
+ result = @line
858
+ }
859
+ cpath
860
+ {
861
+ # ...
862
+ }
863
+ bodystmt END
864
+ {
865
+ result = new_module val[2], val[4]
866
+ result.line = val[1]
867
+ result.end_line = @line
868
+ }
869
+ | DEF fname
870
+ {
871
+ result = @scope_line
872
+ push_scope
873
+ }
874
+ f_arglist bodystmt END
875
+ {
876
+ result = new_defn val[2], val[1], val[3], val[4]
877
+ pop_scope
878
+ }
879
+ | DEF singleton dot_or_colon
880
+ {
881
+ # ..
882
+ }
883
+ fname
884
+ {
885
+ result = @scope_line
886
+ push_scope
887
+ }
888
+ f_arglist bodystmt END
889
+ {
890
+ result = new_defs val[5], val[1], val[4], val[6], val[7]
891
+ pop_scope
781
892
  }
782
893
  | BREAK
783
894
  {
784
- result = BreakNode.new val[0], []
895
+ result = s(:break)
785
896
  }
786
897
  | NEXT
787
898
  {
788
- result = NextNode.new val[0], []
899
+ result = s(:next)
789
900
  }
790
901
  | REDO
791
902
  {
792
- result = RedoNode.new val[0]
903
+ result = s(:redo)
793
904
  }
794
905
  | RETRY
795
906
 
@@ -812,65 +923,67 @@ if_tail:
812
923
  {
813
924
  result = val[0]
814
925
  }
815
- | ELSIF expr_value then compstmt if_tail
926
+ | ELSIF
816
927
  {
817
- result = [[val[0], val[1], val[3]]].concat val[4]
928
+ result = @line
929
+ }
930
+ expr_value then compstmt if_tail
931
+ {
932
+ result = s(:if, val[2], val[4], val[5])
933
+ result.line = val[1]
818
934
  }
819
935
 
820
936
  opt_else:
821
937
  none
822
- {
823
- result = []
824
- }
825
938
  | ELSE compstmt
826
939
  {
827
- result = [[val[0], val[1]]]
940
+ result = val[1]
828
941
  }
829
942
 
830
943
  block_var:
831
944
  block_var_args
832
945
  {
833
- result = [val[0], nil]
946
+ result = val[0]
834
947
  }
835
948
 
836
949
  block_var_args:
837
950
  f_arg ',' f_block_optarg ',' f_rest_arg opt_f_block_arg
838
951
  {
839
- result = [val[0], val[2], val[4], val[5]]
952
+ result = new_block_args val[0], val[2], val[4], val[5]
840
953
  }
841
954
  | f_arg ',' f_block_optarg opt_f_block_arg
842
955
  {
843
- result = [val[0], val[2], nil, val[3]]
956
+ result = new_block_args val[0], val[2], nil, val[3]
844
957
  }
845
958
  | f_arg ',' f_rest_arg opt_f_block_arg
846
959
  {
847
- result = [val[0], nil, val[2], val[3]]
960
+ result = new_block_args val[0], nil, val[2], val[3]
848
961
  }
849
962
  | f_arg opt_f_block_arg
850
963
  {
851
- result = [val[0], nil, nil, val[1]]
964
+ result = new_block_args val[0], nil, nil, val[1]
852
965
  }
853
966
  | f_block_optarg ',' f_rest_arg opt_f_block_arg
854
967
  {
855
- result = [nil, val[0], val[2], val[3]]
968
+ result = new_block_args nil, val[0], val[2], val[3]
856
969
  }
857
970
  | f_block_optarg opt_f_block_arg
858
971
  {
859
- result = [nil, val[0], nil, val[1]]
972
+ result = new_block_args nil, val[0], nil, val[1]
860
973
  }
861
974
  | f_rest_arg opt_f_block_arg
862
975
  {
863
- result = [nil, nil, val[0], val[1]]
976
+ result = new_block_args nil, nil, val[0], val[1]
864
977
  }
865
978
  | f_block_arg
866
979
  {
867
- result = [nil, nil, nil, val[0]]
980
+ result = new_block_args nil, nil, nil, val[0]
868
981
  }
869
982
 
870
983
  f_block_optarg:
871
984
  f_block_opt
872
985
  {
873
- result = [val[0]]
986
+ result = s(:block, val[0])
874
987
  }
875
988
  | f_block_optarg ',' f_block_opt
876
989
  {
@@ -881,21 +994,18 @@ f_block_optarg:
881
994
  f_block_opt:
882
995
  IDENTIFIER '=' primary_value
883
996
  {
884
- result = [val[0], val[2]]
997
+ result = new_assign new_assignable(s(:identifier, val[0].intern)), val[2]
885
998
  }
886
999
 
887
1000
  opt_block_var:
888
1001
  none
889
- {
890
- result = [nil]
891
- }
892
1002
  | '|' '|'
893
1003
  {
894
- result = [nil]
1004
+ result = 0
895
1005
  }
896
1006
  | '||'
897
1007
  {
898
- result = [nil]
1008
+ result = 0
899
1009
  }
900
1010
  | '|' block_var '|'
901
1011
  {
@@ -905,18 +1015,21 @@ opt_block_var:
905
1015
  do_block:
906
1016
  DO_BLOCK
907
1017
  {
908
- # result = "print('doing half command');"
1018
+ push_scope :block
1019
+ result = @line
909
1020
  }
910
1021
  opt_block_var compstmt END
911
1022
  {
912
- result = BlockNode.new val[0], val[2], val[3], val[4]
1023
+ result = new_iter nil, val[2], val[3]
1024
+ result.line = val[1]
1025
+ pop_scope
913
1026
  }
914
1027
 
915
1028
  block_call:
916
1029
  command do_block
917
1030
  {
918
- result = val[0]
919
- val[0].block = val[1]
1031
+ result = val[1]
1032
+ result[1] = val[0]
920
1033
  }
921
1034
  | block_call '.' operation2 opt_paren_args
922
1035
  | block_call '::' operation2 opt_paren_args
@@ -924,71 +1037,85 @@ block_call:
924
1037
  method_call:
925
1038
  operation paren_args
926
1039
  {
927
- result = CallNode.new nil, val[0], val[1]
1040
+ result = new_call nil, val[0].intern, val[1]
928
1041
  }
929
1042
  | primary_value '.' operation2 opt_paren_args
930
1043
  {
931
- result = CallNode.new val[0], val[2], val[3]
1044
+ result = new_call val[0], val[2].intern, val[3]
932
1045
  }
933
1046
  | primary_value '::' operation2 paren_args
934
1047
  | primary_value '::' operation3
935
1048
  | SUPER paren_args
936
1049
  {
937
- result = SuperNode.new val[0], val[1]
1050
+ result = new_super val[1]
938
1051
  }
939
1052
  | SUPER
940
1053
  {
941
- result = SuperNode.new val[0], []
1054
+ result = s(:zsuper)
942
1055
  }
943
1056
 
944
1057
  brace_block:
945
- '{@' opt_block_var compstmt '}'
1058
+ LCURLY
946
1059
  {
947
- result = BlockNode.new val[0], val[1], val[2], val[3]
1060
+ push_scope :block
1061
+ result = @line
948
1062
  }
949
- | DO opt_block_var compstmt END
1063
+ opt_block_var compstmt '}'
950
1064
  {
951
- result = BlockNode.new val[0], val[1], val[2], val[3]
1065
+ result = new_iter nil, val[2], val[3]
1066
+ result.line = val[1]
1067
+ pop_scope
952
1068
  }
953
-
954
- case_body:
955
- WHEN when_args then compstmt cases
1069
+ | DO
956
1070
  {
957
- # result = "result = [['when', val[1], val[3]]].concat(val[4]);"
958
- result = [[val[0], val[1], val[3]]] + val[4]
1071
+ push_scope :block
1072
+ result = @line
959
1073
  }
960
-
961
- when_args:
962
- args
1074
+ opt_block_var compstmt END
963
1075
  {
964
- result = val[0]
1076
+ result = new_iter nil, val[2], val[3]
1077
+ result.line = val[1]
1078
+ pop_scope
965
1079
  }
966
- | args ',' SPLAT arg_value
1080
+
1081
+ case_body:
1082
+ WHEN
967
1083
  {
968
- result = val[0]
1084
+ result = @line
969
1085
  }
970
- | SPLAT arg_value
1086
+ args then compstmt cases
971
1087
  {
972
- result = []
1088
+ part = s(:when, val[2], val[4])
1089
+ part.line = val[2].line
1090
+ result = [part]
1091
+ result.push *val[5] if val[5]
973
1092
  }
974
1093
 
975
1094
  cases:
976
1095
  opt_else
1096
+ {
1097
+ result = [val[0]]
1098
+ }
977
1099
  | case_body
978
1100
 
979
1101
  opt_rescue:
980
1102
  RESCUE exc_list exc_var then compstmt opt_rescue
981
1103
  {
982
- result = [[val[0], val[1], val[2], val[4]]]
983
- result.concat val[5]
1104
+ exc = val[1] || s(:array)
1105
+ exc << new_assign(val[2], s(:gvar, '$!'.intern)) if val[2]
1106
+ result = [s(:resbody, exc, val[4])]
1107
+ result.push val[5].first if val[5]
984
1108
  }
985
1109
  |
986
1110
  {
987
- result = []
1111
+ result = nil
988
1112
  }
989
1113
 
990
1114
  exc_list:
991
1115
  arg_value
1116
+ {
1117
+ result = s(:array, val[0])
1118
+ }
992
1119
  | mrhs
993
1120
  | none
994
1121
 
@@ -1005,20 +1132,26 @@ exc_var:
1005
1132
  opt_ensure:
1006
1133
  ENSURE compstmt
1007
1134
  {
1008
- result = val[1]
1135
+ result = val[1].nil? ? s(:nil) : val[1]
1009
1136
  }
1010
1137
  | none
1011
- {
1012
- result = nil
1013
- }
1014
1138
 
1015
1139
  literal:
1016
1140
  numeric
1141
+ {
1142
+ result = s(:lit, val[0])
1143
+ }
1017
1144
  | symbol
1145
+ {
1146
+ result = s(:lit, val[0])
1147
+ }
1018
1148
  | dsym
1019
1149
 
1020
1150
  strings:
1021
1151
  string
1152
+ {
1153
+ result = new_str val[0]
1154
+ }
1022
1155
 
1023
1156
  string:
1024
1157
  string1
@@ -1027,40 +1160,42 @@ string:
1027
1160
  string1:
1028
1161
  STRING_BEG string_contents STRING_END
1029
1162
  {
1030
- result = StringNode.new val[1], val[2]
1163
+ result = val[1]
1031
1164
  }
1032
1165
  | STRING
1033
1166
 
1034
1167
  xstring:
1035
1168
  XSTRING_BEG xstring_contents STRING_END
1036
1169
  {
1037
- result = XStringNode.new val[0], val[1], val[2]
1170
+ result = new_xstr val[1]
1038
1171
  }
1039
1172
 
1040
1173
  regexp:
1041
1174
  REGEXP_BEG xstring_contents REGEXP_END
1042
1175
  {
1043
- result = RegexpNode.new val[0], val[1]
1176
+ result = new_regexp val[1]
1044
1177
  }
1045
1178
 
1046
1179
  words:
1047
1180
  WORDS_BEG SPACE STRING_END
1048
1181
  {
1049
- result = WordsNode.new val[0], [], val[2]
1182
+ result = s(:array)
1050
1183
  }
1051
1184
  | WORDS_BEG word_list STRING_END
1052
1185
  {
1053
- result = WordsNode.new val[0], val[1], val[2]
1186
+ result = val[1]
1054
1187
  }
1055
1188
 
1056
1189
  word_list:
1057
1190
  none
1058
1191
  {
1059
- result = []
1192
+ result = s(:array)
1060
1193
  }
1061
1194
  | word_list word SPACE
1062
1195
  {
1063
- result = val[0].concat([val[1]])
1196
+ part = val[1]
1197
+ part = s(:dstr, "", val[1]) if part[0] == :evstr
1198
+ result = val[0] << part
1064
1199
  }
1065
1200
 
1066
1201
  word:
@@ -1076,75 +1211,95 @@ word:
1076
1211
  awords:
1077
1212
  AWORDS_BEG SPACE STRING_END
1078
1213
  {
1079
- result = WordsNode.new val[0], [], val[2]
1214
+ result = s(:array)
1080
1215
  }
1081
1216
  | AWORDS_BEG qword_list STRING_END
1082
1217
  {
1083
- result = WordsNode.new val[0], val[1], val[2]
1218
+ result = val[1]
1084
1219
  }
1085
1220
 
1086
1221
  qword_list:
1087
1222
  none
1088
1223
  {
1089
- result = []
1224
+ result = s(:array)
1090
1225
  }
1091
1226
  | qword_list STRING_CONTENT SPACE
1092
1227
  {
1093
- result = val[0].concat([['string_content', val[1]]])
1228
+ result = val[0] << s(:str, val[1])
1094
1229
  }
1095
1230
 
1096
1231
  string_contents:
1097
1232
  none
1098
1233
  {
1099
- result = []
1234
+ result = nil
1100
1235
  }
1101
1236
  | string_contents string_content
1102
1237
  {
1103
- result = val[0] << val[1]
1238
+ result = str_append val[0], val[1]
1104
1239
  }
1105
1240
 
1106
1241
  xstring_contents:
1107
1242
  none
1108
1243
  {
1109
- result = []
1244
+ result = nil
1110
1245
  }
1111
1246
  | xstring_contents string_content
1112
1247
  {
1113
- result = val[0].concat [val[1]]
1248
+ result = str_append val[0], val[1]
1114
1249
  }
1115
1250
 
1116
1251
  string_content:
1117
1252
  STRING_CONTENT
1118
1253
  {
1119
- result = ['string_content', val[0]]
1254
+ result = s(:str, val[0])
1255
+ }
1256
+ | STRING_DVAR
1257
+ {
1258
+ result = @string_parse
1259
+ @string_parse = nil
1120
1260
  }
1121
- | STRING_DVAR string_dvar
1261
+ string_dvar
1122
1262
  {
1123
- result = ['string_dvar', val[1]]
1263
+ @string_parse = val[1]
1264
+ result = s(:evstr, val[2])
1124
1265
  }
1125
1266
  | STRING_DBEG
1126
1267
  {
1127
1268
  cond_push 0
1128
1269
  cmdarg_push 0
1270
+ result = @string_parse
1271
+ @string_parse = nil
1272
+ @lex_state = :expr_beg
1129
1273
  }
1130
1274
  compstmt '}'
1131
1275
  {
1276
+ @string_parse = val[1]
1132
1277
  cond_lexpop
1133
1278
  cmdarg_lexpop
1134
- result = ['string_dbegin', val[2]]
1279
+ result = s(:evstr, val[2])
1135
1280
  }
1136
1281
 
1137
1282
  string_dvar:
1138
1283
  GVAR
1284
+ {
1285
+ result = s(:gvar, val[0].intern)
1286
+ }
1139
1287
  | IVAR
1288
+ {
1289
+ result = s(:ivar, val[0].intern)
1290
+ }
1140
1291
  | CVAR
1292
+ {
1293
+ result = s(:cvar, val[0].intern)
1294
+ }
1141
1295
  | backref
1142
1296
 
1143
1297
 
1144
1298
  symbol:
1145
1299
  SYMBOL_BEG sym
1146
1300
  {
1147
- result = SymbolNode.new val[1]
1301
+ result = val[1].intern
1302
+ @lex_state = :expr_end
1148
1303
  }
1149
1304
  | SYMBOL
1150
1305
 
@@ -1156,80 +1311,72 @@ sym: fname
1156
1311
  dsym:
1157
1312
  SYMBOL_BEG xstring_contents STRING_END
1158
1313
  {
1159
- result = "result = ['dsym', val[1]];"
1314
+ result = new_dsym val[1]
1160
1315
  }
1161
1316
 
1162
1317
  numeric:
1163
1318
  INTEGER
1164
- {
1165
- result = NumericNode.new val[0]
1166
- }
1167
1319
  | FLOAT
1168
- {
1169
- result = NumericNode.new val[0]
1170
- }
1171
1320
  | '-@NUM' INTEGER =LOWEST
1172
1321
  | '-@NUM' FLOAT =LOWEST
1173
1322
 
1174
1323
  variable:
1175
1324
  IDENTIFIER
1176
1325
  {
1177
- result = IdentifierNode.new val[0]
1326
+ result = s(:identifier, val[0].intern)
1178
1327
  }
1179
1328
  | IVAR
1180
1329
  {
1181
- result = IvarNode.new val[0]
1330
+ result = s(:ivar, val[0].intern)
1182
1331
  }
1183
1332
  | GVAR
1184
1333
  {
1185
- result = GvarNode.new val[0];
1334
+ result = s(:gvar, val[0].intern)
1186
1335
  }
1187
1336
  | CONSTANT
1188
1337
  {
1189
- result = ConstantNode.new val[0]
1338
+ result = s(:const, val[0].intern)
1190
1339
  }
1191
1340
  | CVAR
1192
1341
  {
1193
- result = CvarNode.new val[0]
1342
+ result = s(:cvar, val[0].intern)
1194
1343
  }
1195
1344
  | NIL
1196
1345
  {
1197
- result = NilNode.new val[0]
1198
- }
1199
- | UNDEFINED
1200
- {
1201
- result = UndefinedNode.new val[0]
1202
- }
1203
- | NULL
1204
- {
1205
- result = NullNode.new val[0]
1346
+ result = s(:nil)
1206
1347
  }
1207
1348
  | SELF
1208
1349
  {
1209
- result = SelfNode.new val[0]
1350
+ result = s(:self)
1210
1351
  }
1211
1352
  | TRUE
1212
1353
  {
1213
- result = TrueNode.new val[0]
1354
+ result = s(:true)
1214
1355
  }
1215
1356
  | FALSE
1216
1357
  {
1217
- result = FalseNode.new val[0]
1358
+ result = s(:false)
1218
1359
  }
1219
1360
  | FILE
1220
1361
  {
1221
- result = FileNode.new val[0]
1362
+ result = s(:str, @file)
1222
1363
  }
1223
1364
  | LINE
1224
1365
  {
1225
- result = LineNode.new val[0]
1366
+ result = s(:lit, @line)
1226
1367
  }
1227
1368
 
1228
1369
  var_ref:
1229
1370
  variable
1371
+ {
1372
+ result = new_var_ref val[0]
1373
+ }
1230
1374
 
1231
1375
  var_lhs:
1232
1376
  variable
1377
+ {
1378
+ result = new_assignable val[0]
1379
+ }
1233
1380
 
1234
1381
  backref:
1235
1382
  NTH_REF
@@ -1262,59 +1409,63 @@ f_arglist:
1262
1409
  f_args:
1263
1410
  f_arg ',' f_optarg ',' f_rest_arg opt_f_block_arg
1264
1411
  {
1265
- result = [val[0], val[2], val[4], val[5]]
1412
+ result = new_args val[0], val[2], val[4], val[5]
1266
1413
  }
1267
1414
  | f_arg ',' f_optarg opt_f_block_arg
1268
1415
  {
1269
- result = [val[0], val[2], nil, val[3]]
1416
+ result = new_args val[0], val[2], nil, val[3]
1270
1417
  }
1271
1418
  | f_arg ',' f_rest_arg opt_f_block_arg
1272
1419
  {
1273
- result = [val[0], nil, val[2], val[3]]
1420
+ result = new_args val[0], nil, val[2], val[3]
1274
1421
  }
1275
1422
  | f_arg opt_f_block_arg
1276
1423
  {
1277
- result = [val[0], nil, nil, val[1]]
1424
+ result = new_args val[0], nil, nil, val[1]
1278
1425
  }
1279
1426
  | f_optarg ',' f_rest_arg opt_f_block_arg
1280
1427
  {
1281
- rsult = [nil, val[0], val[2], val[3]]
1428
+ result = new_args nil, val[0], val[2], val[3]
1282
1429
  }
1283
1430
  | f_optarg opt_f_block_arg
1284
1431
  {
1285
- result = [nil, val[0], nil, val[1]]
1432
+ result = new_args nil, val[0], nil, val[1]
1286
1433
  }
1287
1434
  | f_rest_arg opt_f_block_arg
1288
1435
  {
1289
- result = [nil, nil, val[0], val[1]]
1436
+ result = new_args nil, nil, val[0], val[1]
1290
1437
  }
1291
1438
  | f_block_arg
1292
1439
  {
1293
- result = [nil, nil, nil, val[0]]
1440
+ result = new_args nil, nil, nil, val[0]
1294
1441
  }
1295
1442
  |
1296
1443
  {
1297
- result = [nil, nil, nil, nil]
1444
+ result = s(:args)
1298
1445
  }
1299
1446
 
1300
1447
  f_norm_arg:
1301
1448
  CONSTANT
1302
1449
  {
1303
- result = "this.yyerror('formal argument cannot be a constant');"
1450
+ raise 'formal argument cannot be a constant'
1304
1451
  }
1305
1452
  | IVAR
1306
1453
  {
1307
- result = "this.yyerror('formal argument cannot be an instance variable');"
1454
+ raise 'formal argument cannot be an instance variable'
1308
1455
  }
1309
1456
  | CVAR
1310
1457
  {
1311
- result = "this.yyerror('formal argument cannot be a class variable');"
1458
+ raise 'formal argument cannot be a class variable'
1312
1459
  }
1313
1460
  | GVAR
1314
1461
  {
1315
- result = "this.yyerror('formal argument cannot be a global variable');"
1462
+ raise 'formal argument cannot be a global variable'
1316
1463
  }
1317
1464
  | IDENTIFIER
1465
+ {
1466
+ result = val[0].intern
1467
+ @scope.add_local result
1468
+ }
1318
1469
 
1319
1470
  f_arg:
1320
1471
  f_norm_arg
@@ -1330,13 +1481,13 @@ f_arg:
1330
1481
  f_opt:
1331
1482
  IDENTIFIER '=' arg_value
1332
1483
  {
1333
- result = [val[0], val[2]]
1484
+ result = new_assign new_assignable(s(:identifier, val[0].intern)), val[2]
1334
1485
  }
1335
1486
 
1336
1487
  f_optarg:
1337
1488
  f_opt
1338
1489
  {
1339
- result = [val[0]]
1490
+ result = s(:block, val[0])
1340
1491
  }
1341
1492
  | f_optarg ',' f_opt
1342
1493
  {
@@ -1351,11 +1502,11 @@ restarg_mark:
1351
1502
  f_rest_arg:
1352
1503
  restarg_mark IDENTIFIER
1353
1504
  {
1354
- result = val[1]
1505
+ result = "*#{val[1]}".intern
1355
1506
  }
1356
1507
  | restarg_mark
1357
1508
  {
1358
- result = val[0]
1509
+ result = :"*"
1359
1510
  }
1360
1511
 
1361
1512
  blkarg_mark:
@@ -1365,7 +1516,7 @@ blkarg_mark:
1365
1516
  f_block_arg:
1366
1517
  blkarg_mark IDENTIFIER
1367
1518
  {
1368
- result = val[1]
1519
+ result = "&#{val[1]}".intern
1369
1520
  }
1370
1521
 
1371
1522
  opt_f_block_arg:
@@ -1405,11 +1556,11 @@ assoc_list:
1405
1556
  assocs:
1406
1557
  assoc
1407
1558
  {
1408
- result = [val[0]]
1559
+ result = val[0]
1409
1560
  }
1410
1561
  | assocs ',' assoc
1411
1562
  {
1412
- result = val[0] << val[2]
1563
+ result = val[0].push *val[2]
1413
1564
  }
1414
1565
 
1415
1566
  assoc:
@@ -1419,7 +1570,7 @@ assoc:
1419
1570
  }
1420
1571
  | LABEL arg_value
1421
1572
  {
1422
- result = [SymbolNode.new(val[0]), val[1]]
1573
+ result = [s(:lit, val[0].intern), val[1]]
1423
1574
  }
1424
1575
 
1425
1576
  operation:
@@ -1466,9 +1617,4 @@ none_block_pass:
1466
1617
 
1467
1618
  end
1468
1619
 
1469
- ---- header
1470
-
1471
- require 'opal/lexer'
1472
- require 'opal/nodes'
1473
-
1474
1620
  ---- inner