opal 0.3.11 → 0.3.15

Sign up to get free protection for your applications and to get access to all the features.
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