opal 0.3.2 → 0.3.6

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 (203) hide show
  1. data/README.md +85 -127
  2. data/bin/opal +3 -3
  3. data/lib/core.rb +114 -0
  4. data/{gems/core/lib → lib}/core/array.rb +68 -187
  5. data/{gems/core/lib → lib}/core/basic_object.rb +22 -5
  6. data/lib/core/class.rb +38 -0
  7. data/{gems/core/lib → lib}/core/dir.rb +1 -1
  8. data/lib/core/enumerable.rb +33 -0
  9. data/{gems/core/lib → lib}/core/error.rb +1 -4
  10. data/{gems/core/lib → lib}/core/false_class.rb +0 -0
  11. data/{gems/core/lib → lib}/core/file.rb +11 -3
  12. data/{gems/core/lib → lib}/core/hash.rb +12 -0
  13. data/{gems/core/lib → lib}/core/kernel.rb +114 -86
  14. data/lib/core/match_data.rb +33 -0
  15. data/lib/core/module.rb +97 -0
  16. data/{gems/core/lib → lib}/core/nil_class.rb +0 -0
  17. data/{gems/core/lib → lib}/core/numeric.rb +5 -0
  18. data/{gems/core/lib → lib}/core/object.rb +0 -0
  19. data/{gems/core/lib → lib}/core/proc.rb +13 -3
  20. data/{gems/core/lib → lib}/core/range.rb +10 -0
  21. data/{gems/core/lib → lib}/core/regexp.rb +33 -1
  22. data/{gems/core/lib → lib}/core/string.rb +25 -10
  23. data/{gems/core/lib → lib}/core/symbol.rb +3 -3
  24. data/{gems/core/lib → lib}/core/top_self.rb +0 -0
  25. data/{gems/core/lib → lib}/core/true_class.rb +0 -0
  26. data/lib/dev.rb +169 -0
  27. data/{gems/ospec/lib → lib}/ospec.rb +1 -0
  28. data/lib/ospec/autorun.rb +8 -0
  29. data/{gems/ospec/lib → lib}/ospec/dsl.rb +2 -2
  30. data/{gems/ospec/lib → lib}/ospec/example.rb +0 -0
  31. data/{gems/ospec/lib → lib}/ospec/example/before_and_after_hooks.rb +0 -0
  32. data/{gems/ospec/lib → lib}/ospec/example/errors.rb +0 -0
  33. data/{gems/ospec/lib → lib}/ospec/example/example_group.rb +0 -0
  34. data/{gems/ospec/lib → lib}/ospec/example/example_group_factory.rb +0 -3
  35. data/{gems/ospec/lib → lib}/ospec/example/example_group_hierarchy.rb +4 -3
  36. data/{gems/ospec/lib → lib}/ospec/example/example_group_methods.rb +1 -1
  37. data/{gems/ospec/lib → lib}/ospec/example/example_group_proxy.rb +3 -2
  38. data/{gems/ospec/lib → lib}/ospec/example/example_methods.rb +1 -1
  39. data/{gems/ospec/lib → lib}/ospec/example/example_proxy.rb +7 -7
  40. data/{gems/ospec/lib → lib}/ospec/expectations.rb +0 -0
  41. data/{gems/ospec/lib → lib}/ospec/expectations/errors.rb +0 -0
  42. data/{gems/ospec/lib → lib}/ospec/expectations/fail_with.rb +4 -3
  43. data/{gems/ospec/lib → lib}/ospec/expectations/handler.rb +6 -0
  44. data/lib/ospec/helpers/scratch.rb +18 -0
  45. data/{gems/ospec/lib → lib}/ospec/matchers.rb +2 -2
  46. data/{gems/ospec/lib → lib}/ospec/matchers/be.rb +0 -0
  47. data/{gems/ospec/lib → lib}/ospec/matchers/generated_descriptions.rb +0 -0
  48. data/{gems/ospec/lib → lib}/ospec/matchers/operator_matcher.rb +2 -0
  49. data/lib/ospec/matchers/raise_error.rb +38 -0
  50. data/lib/ospec/runner.rb +90 -0
  51. data/{gems/ospec/lib → lib}/ospec/runner/example_group_runner.rb +10 -13
  52. data/lib/ospec/runner/formatter/html_formatter.rb +139 -0
  53. data/{gems/ospec/lib → lib}/ospec/runner/formatter/terminal_formatter.rb +0 -0
  54. data/{gems/ospec/lib → lib}/ospec/runner/options.rb +1 -3
  55. data/{gems/ospec/lib → lib}/ospec/runner/reporter.rb +0 -9
  56. data/lib/racc/parser.rb +165 -0
  57. data/lib/strscan.rb +52 -0
  58. data/{lib → opal_lib}/opal.rb +2 -0
  59. data/opal_lib/opal/build_methods.rb +51 -0
  60. data/opal_lib/opal/builder.rb +164 -0
  61. data/opal_lib/opal/bundle.rb +70 -0
  62. data/opal_lib/opal/command.rb +68 -0
  63. data/{lib → opal_lib}/opal/context.rb +21 -9
  64. data/{lib → opal_lib}/opal/context/console.rb +0 -2
  65. data/opal_lib/opal/context/file_system.rb +34 -0
  66. data/{lib → opal_lib}/opal/context/loader.rb +26 -8
  67. data/opal_lib/opal/gem.rb +84 -0
  68. data/{lib → opal_lib}/opal/rake/builder_task.rb +2 -2
  69. data/opal_lib/opal/rake/spec_task.rb +32 -0
  70. data/{lib → opal_lib}/opal/ruby/nodes.rb +730 -109
  71. data/{lib → opal_lib}/opal/ruby/parser.rb +90 -23
  72. data/opal_lib/opal/ruby/ruby_parser.rb +4862 -0
  73. data/opal_lib/opal/ruby/ruby_parser.y +1454 -0
  74. data/opal_lib/opal/version.rb +4 -0
  75. data/runtime/class.js +359 -0
  76. data/runtime/debug.js +84 -0
  77. data/runtime/fs.js +199 -0
  78. data/runtime/init.js +558 -0
  79. data/runtime/loader.js +351 -0
  80. data/runtime/module.js +109 -0
  81. data/runtime/post.js +10 -0
  82. data/runtime/pre.js +7 -0
  83. data/runtime/runtime.js +351 -0
  84. metadata +88 -175
  85. data/.gitignore +0 -7
  86. data/Changelog +0 -31
  87. data/LICENSE +0 -75
  88. data/Rakefile +0 -86
  89. data/gems/core/README.md +0 -14
  90. data/gems/core/Rakefile +0 -8
  91. data/gems/core/core.gemspec +0 -13
  92. data/gems/core/lib/core.rb +0 -34
  93. data/gems/core/lib/core/class.rb +0 -31
  94. data/gems/core/lib/core/module.rb +0 -100
  95. data/gems/core/lib/core/vm.rb +0 -16
  96. data/gems/core/spec/core/array/append_spec.rb +0 -30
  97. data/gems/core/spec/core/array/assoc_spec.rb +0 -29
  98. data/gems/core/spec/core/array/at_spec.rb +0 -37
  99. data/gems/core/spec/core/array/clear_spec.rb +0 -22
  100. data/gems/core/spec/core/array/collect_bang_spec.rb +0 -27
  101. data/gems/core/spec/core/array/collect_spec.rb +0 -27
  102. data/gems/core/spec/core/array/compact_spec.rb +0 -41
  103. data/gems/core/spec/core/array/concat_spec.rb +0 -15
  104. data/gems/core/spec/core/array/constructor_spec.rb +0 -14
  105. data/gems/core/spec/core/array/each_spec.rb +0 -9
  106. data/gems/core/spec/core/array/element_reference_spec.rb +0 -4
  107. data/gems/core/spec/core/array/first_spec.rb +0 -35
  108. data/gems/core/spec/core/array/include_spec.rb +0 -9
  109. data/gems/core/spec/core/array/join_spec.rb +0 -6
  110. data/gems/core/spec/core/array/last_spec.rb +0 -51
  111. data/gems/core/spec/core/array/length_spec.rb +0 -6
  112. data/gems/core/spec/core/array/map_spec.rb +0 -33
  113. data/gems/core/spec/core/array/reverse_spec.rb +0 -6
  114. data/gems/core/spec/core/builtin_constants/builtin_constants_spec.rb +0 -7
  115. data/gems/core/spec/core/false/and_spec.rb +0 -10
  116. data/gems/core/spec/core/false/inspect_spec.rb +0 -6
  117. data/gems/core/spec/core/false/or_spec.rb +0 -10
  118. data/gems/core/spec/core/false/to_s_spec.rb +0 -6
  119. data/gems/core/spec/core/false/xor_spec.rb +0 -10
  120. data/gems/core/spec/core/file/join_spec.rb +0 -19
  121. data/gems/core/spec/core/hash/assoc_spec.rb +0 -32
  122. data/gems/core/spec/core/kernel/instance_eval_spec.rb +0 -0
  123. data/gems/core/spec/core/kernel/loop_spec.rb +0 -24
  124. data/gems/core/spec/core/kernel/raise_spec.rb +0 -0
  125. data/gems/core/spec/core/module/attr_accessor_spec.rb +0 -28
  126. data/gems/core/spec/core/number/lt_spec.rb +0 -12
  127. data/gems/core/spec/core/string/sub_spec.rb +0 -24
  128. data/gems/core/spec/core/true/and_spec.rb +0 -10
  129. data/gems/core/spec/core/true/inspect_spec.rb +0 -6
  130. data/gems/core/spec/core/true/or_spec.rb +0 -10
  131. data/gems/core/spec/core/true/to_s_spec.rb +0 -6
  132. data/gems/core/spec/core/true/xor_spec.rb +0 -10
  133. data/gems/core/spec/language/and_spec.rb +0 -61
  134. data/gems/core/spec/language/array_spec.rb +0 -68
  135. data/gems/core/spec/language/block_spec.rb +0 -38
  136. data/gems/core/spec/language/break_spec.rb +0 -36
  137. data/gems/core/spec/language/case_spec.rb +0 -103
  138. data/gems/core/spec/language/def_spec.rb +0 -21
  139. data/gems/core/spec/language/eigenclass_spec.rb +0 -60
  140. data/gems/core/spec/language/file_spec.rb +0 -13
  141. data/gems/core/spec/language/fixtures/block.rb +0 -21
  142. data/gems/core/spec/language/fixtures/super.rb +0 -293
  143. data/gems/core/spec/language/hash_spec.rb +0 -29
  144. data/gems/core/spec/language/if_spec.rb +0 -54
  145. data/gems/core/spec/language/loop_spec.rb +0 -11
  146. data/gems/core/spec/language/metaclass_spec.rb +0 -21
  147. data/gems/core/spec/language/method_spec.rb +0 -124
  148. data/gems/core/spec/language/next_spec.rb +0 -25
  149. data/gems/core/spec/language/or_spec.rb +0 -34
  150. data/gems/core/spec/language/redo_spec.rb +0 -24
  151. data/gems/core/spec/language/regexp_spec.rb +0 -26
  152. data/gems/core/spec/language/rescue_spec.rb +0 -20
  153. data/gems/core/spec/language/return_spec.rb +0 -47
  154. data/gems/core/spec/language/string_spec.rb +0 -25
  155. data/gems/core/spec/language/super_spec.rb +0 -32
  156. data/gems/core/spec/language/until_spec.rb +0 -157
  157. data/gems/core/spec/language/variables_spec.rb +0 -155
  158. data/gems/core/spec/language/while_spec.rb +0 -163
  159. data/gems/core/spec/spec_helper.rb +0 -5
  160. data/gems/core_fs/README.md +0 -19
  161. data/gems/dev/Rakefile +0 -5
  162. data/gems/dev/lib/dev.js +0 -99
  163. data/gems/dev/lib/dev/generator.js +0 -1264
  164. data/gems/dev/lib/dev/parser.js +0 -979
  165. data/gems/dev/lib/dev/ruby_parser.js +0 -1088
  166. data/gems/dev/lib/dev/ruby_parser.y +0 -1267
  167. data/gems/dev/lib/dev/string_scanner.js +0 -38
  168. data/gems/dev/tools/racc2js/README.md +0 -39
  169. data/gems/dev/tools/racc2js/math_parser.js +0 -222
  170. data/gems/dev/tools/racc2js/math_parser.rb +0 -133
  171. data/gems/dev/tools/racc2js/math_parser.y +0 -28
  172. data/gems/dev/tools/racc2js/parser.js +0 -218
  173. data/gems/dev/tools/racc2js/racc2js.rb +0 -153
  174. data/gems/json/README.md +0 -4
  175. data/gems/json/json.gemspec +0 -14
  176. data/gems/json/lib/json.rb +0 -64
  177. data/gems/json/lib/json/ext.rb +0 -51
  178. data/gems/json/lib/json/json2.js +0 -481
  179. data/gems/ospec/README.md +0 -0
  180. data/gems/ospec/lib/ospec/autorun.rb +0 -3
  181. data/gems/ospec/lib/ospec/runner.rb +0 -40
  182. data/gems/ospec/lib/ospec/runner/formatter/html_formatter.rb +0 -91
  183. data/gems/ospec/ospec.gemspec +0 -0
  184. data/gems/rquery/README.md +0 -9
  185. data/gems/rquery/lib/rquery.rb +0 -10
  186. data/gems/rquery/lib/rquery/ajax.rb +0 -4
  187. data/gems/rquery/lib/rquery/css.rb +0 -96
  188. data/gems/rquery/lib/rquery/document.rb +0 -25
  189. data/gems/rquery/lib/rquery/element.rb +0 -292
  190. data/gems/rquery/lib/rquery/event.rb +0 -108
  191. data/gems/rquery/lib/rquery/jquery.js +0 -8177
  192. data/gems/rquery/lib/rquery/request.rb +0 -138
  193. data/gems/rquery/lib/rquery/response.rb +0 -49
  194. data/gems/rquery/rquery.gemspec +0 -16
  195. data/lib/opal.js +0 -1597
  196. data/lib/opal/builder.rb +0 -117
  197. data/lib/opal/bundle.rb +0 -131
  198. data/lib/opal/command.rb +0 -11
  199. data/lib/opal/context/file_system.rb +0 -19
  200. data/lib/opal/gem.rb +0 -153
  201. data/lib/opal/ruby/ruby_parser.rb +0 -5170
  202. data/lib/opal/ruby/ruby_parser.y +0 -1298
  203. data/opal.gemspec +0 -15
@@ -0,0 +1,1454 @@
1
+ class Opal::RubyParser
2
+
3
+ token CLASS MODULE DEF UNDEF BEGIN RESCUE ENSURE END IF UNLESS
4
+ THEN ELSIF ELSE CASE WHEN WHILE UNTIL FOR BREAK NEXT
5
+ REDO RETRY IN DO DO_COND DO_BLOCK RETURN YIELD SUPER
6
+ SELF NIL TRUE FALSE AND OR NOT IF_MOD UNLESS_MOD WHILE_MOD
7
+ UNTIL_MOD RESCUE_MOD ALIAS DEFINED klBEGIN klEND LINE
8
+ FILE IDENTIFIER FID GVAR IVAR CONSTANT CVAR NTH_REF
9
+ BACK_REF STRING_CONTENT INTEGER FLOAT REGEXP_END '+@'
10
+ '-@' '-@NUM' '**' '<=>' '==' '===' '!=' '>=' '<=' '&&'
11
+ '||' '=~' '!~' '.' '..' '...' '[]' '[]=' '<<' '>>'
12
+ '::' '::@' OP_ASGN '=>' PAREN_BEG '(' ')' tLPAREN_ARG
13
+ ARRAY_BEG ']' tLBRACE tLBRACE_ARG SPLAT '*' '&@' '&'
14
+ '~' '%' '/' '+' '-' '<' '>' '|' '!' '^'
15
+ '{@' '}' BACK_REF2 SYMBOL_BEG STRING_BEG XSTRING_BEG REGEXP_BEG
16
+ WORDS_BEG AWORDS_BEG STRING_DBEG STRING_DVAR STRING_END STRING
17
+ SYMBOL '\\n' '?' ':' ',' SPACE ';' LABEL
18
+
19
+ prechigh
20
+ right '!' '~' '+@'
21
+ right '**'
22
+ right '-@NUM' '-@'
23
+ left '*' '/' '%'
24
+ left '+' '-'
25
+ left '<<' '>>'
26
+ left '&'
27
+ left '|' '^'
28
+ left '>' '>=' '<' '<='
29
+ nonassoc '<=>' '==' '===' '!=' '=~' '!~'
30
+ left '&&'
31
+ left '||'
32
+ nonassoc '..' '...'
33
+ right '?' ':'
34
+ left RESCUE_MOD
35
+ right '=' OP_ASGN
36
+ nonassoc DEFINED
37
+ right NOT
38
+ left OR AND
39
+ nonassoc IF_MOD UNLESS_MOD WHILE_MOD UNTIL_MOD
40
+ nonassoc tLBRACE_ARG
41
+ nonassoc LOWEST
42
+ preclow
43
+
44
+ rule
45
+
46
+ target:
47
+ compstmt
48
+ {
49
+ result = val[0]
50
+ }
51
+
52
+ bodystmt:
53
+ compstmt opt_rescue opt_else opt_ensure
54
+ {
55
+ result = BodyStatementsNode.new val[0], val[1], val[2], val[3]
56
+ }
57
+
58
+ compstmt:
59
+ stmts opt_terms
60
+ {
61
+ result = val[0]
62
+ }
63
+
64
+ stmts:
65
+ none
66
+ {
67
+ result = StatementsNode.new []
68
+ }
69
+ | stmt
70
+ {
71
+ result = StatementsNode.new [val[0]]
72
+ }
73
+ | stmts terms stmt
74
+ {
75
+ val[0] << val[2]
76
+ result = val[0]
77
+ }
78
+
79
+ stmt:
80
+ ALIAS fitem fitem
81
+ | ALIAS GVAR GVAR
82
+ | ALIAS GVAR BACK_REF
83
+ | ALIAS GVAR NTH_REF
84
+ | UNDEF undef_list
85
+ {
86
+ result = UndefNode.new val[0], val[1]
87
+ }
88
+ | stmt IF_MOD expr_value
89
+ {
90
+ result = IfNode.new val[1], val[2], StatementsNode.new([val[0]]), [], val[1]
91
+ }
92
+ | stmt UNLESS_MOD expr_value
93
+ {
94
+ result = IfModNode.new val[1], val[2], val[0]
95
+ }
96
+ | stmt WHILE_MOD expr_value
97
+ {
98
+ result = WhileNode.new val[1], val[2], StatementsNode.new([val[0]]), val[1]
99
+ }
100
+ | stmt UNTIL_MOD expr_value
101
+ {
102
+ result = WhileNode.new val[1], val[2], StatementsNode.new([val[0]]), val[1]
103
+ }
104
+ | stmt RESCUE_MOD stmt
105
+ | klBEGIN '{@' compstmt '}'
106
+ | klEND '{@' compstmt '}'
107
+ | lhs '=' command_call
108
+ {
109
+ result = AssignNode.new val[0], val[2], val[1]
110
+ }
111
+ | mlhs '=' command_call
112
+ {
113
+ result = MlhsAssignNode.new val[1], val[0], val[2]
114
+ }
115
+ | var_lhs OP_ASGN command_call
116
+ {
117
+ result = OpAsgnNode.new val[1], val[0], val[2]
118
+ }
119
+ | primary_value '[@' aref_args ']' OP_ASGN command_call
120
+ # {
121
+ # result = OpAsgnNode.new(val[4], ArefNode.new(val[0], val[2]), val[5])
122
+ # }
123
+ | primary_value '.' IDENTIFIER OP_ASGN command_call
124
+ {
125
+ result = OpAsgnNode.new(val[3], CallNode.new(val[0], val[2], []), val[4])
126
+ }
127
+ | primary_value '.' CONSTANT OP_ASGN command_call
128
+ | primary_value '::' IDENTIFIER OP_ASGN command_call
129
+ | backref OP_ASGN command_call
130
+ | lhs '=' mrhs
131
+ | mlhs '=' arg_value
132
+ {
133
+ result = MlhsAssignNode.new val[1], val[0], val[2]
134
+ }
135
+ | mlhs '=' mrhs
136
+ {
137
+ result = MlhsAssignNode.new val[1], val[0], val[2]
138
+ }
139
+ | expr
140
+
141
+ expr:
142
+ command_call
143
+ | expr AND expr
144
+ {
145
+ result = AndNode.new val[1], val[0], val[2]
146
+ }
147
+ | expr OR expr
148
+ {
149
+ result = OrNode.new val[1], val[0], val[2]
150
+ }
151
+ | NOT expr
152
+ {
153
+ result = CallNode.new val[1], {:value => '!', :line => 0}, []
154
+ }
155
+ | '!' command_call
156
+ {
157
+ result = CallNode.new val[1], val[0], []
158
+ }
159
+ | arg
160
+
161
+ expr_value:
162
+ expr
163
+
164
+ command_call:
165
+ command
166
+ | block_command
167
+ | RETURN call_args
168
+ {
169
+ result = ReturnNode.new val[0], val[1]
170
+ }
171
+ | BREAK call_args
172
+ {
173
+ result = BreakNode.new val[0], val[1]
174
+ }
175
+ | NEXT call_args
176
+ {
177
+ result = NextNode.new val[0], val[1]
178
+ }
179
+
180
+ block_command:
181
+ block_call
182
+ | block_call '.' operation2 command_args
183
+ | block_call '::' operation2 command_args
184
+
185
+ cmd_brace_block:
186
+ tLBRACE_ARG opt_block_var compstmt '}'
187
+
188
+ command:
189
+ operation command_args =LOWEST
190
+ {
191
+ result = CallNode.new nil, val[0], val[1]
192
+ }
193
+ | operation command_args cmd_brace_block
194
+ | primary_value '.' operation2 command_args =LOWEST
195
+ {
196
+ result = CallNode.new val[0], val[2], val[3]
197
+ }
198
+ | primary_value '.' operation2 command_args cmd_brace_block
199
+ | primary_value '::' operation2 command_args =LOWEST
200
+ {
201
+ result = "result = ['call', val[0], val[2], val[3]];"
202
+ }
203
+ | primary_value '::' operation2 command_args cmd_brace_block
204
+ | SUPER command_args
205
+ {
206
+ result = SuperNode.new val[0], val[1]
207
+ }
208
+ | YIELD command_args
209
+ {
210
+ result = YieldNode.new val[0], val[1]
211
+ }
212
+
213
+ mlhs:
214
+ mlhs_basic
215
+ {
216
+ result = val[0]
217
+ }
218
+ | PAREN_BEG mlhs_entry ')'
219
+ {
220
+ result = val[1]
221
+ }
222
+
223
+ mlhs_entry:
224
+ mlhs_basic
225
+ {
226
+ result = val[0]
227
+ }
228
+ | PAREN_BEG mlhs_entry ')'
229
+ {
230
+ result = val[1]
231
+ }
232
+
233
+ mlhs_basic:
234
+ mlhs_head
235
+ {
236
+ result = [val[0]]
237
+ }
238
+ | mlhs_head mlhs_item
239
+ {
240
+ result = [val[0] << val[1]]
241
+ }
242
+ | mlhs_head SPLAT mlhs_node
243
+ | mlhs_head SPLAT
244
+ | SPLAT mlhs_node
245
+ | SPLAT
246
+
247
+ mlhs_item:
248
+ mlhs_node
249
+ {
250
+ result = val[0]
251
+ }
252
+ | PAREN_BEG mlhs_entry ')'
253
+ {
254
+ result = val[1]
255
+ }
256
+
257
+ mlhs_head:
258
+ mlhs_item ','
259
+ {
260
+ result = [val[0]]
261
+ }
262
+ | mlhs_head mlhs_item ','
263
+ {
264
+ result = val[0] << val[1]
265
+ }
266
+
267
+ mlhs_node:
268
+ variable
269
+ | primary_value '[@' aref_args ']'
270
+ | primary_value '.' IDENTIFIER
271
+ | primary_value '::' IDENTIFIER
272
+ | primary_value '.' CONSTANT
273
+ | primary_value '::' CONSTANT
274
+ | '::@' CONSTANT
275
+ | backref
276
+
277
+ lhs:
278
+ variable
279
+ | primary_value '[@' aref_args ']'
280
+ {
281
+ result = ArefNode.new val[0], val[2]
282
+ }
283
+ | primary_value '.' IDENTIFIER
284
+ {
285
+ result = CallNode.new val[0], val[2], [[]]
286
+ }
287
+ | primary_value '::' IDENTIFIER
288
+ | primary_value '.' CONSTANT
289
+ | primary_value '::' CONSTANT
290
+ | '::@' CONSTANT
291
+ | backref
292
+
293
+ cname:
294
+ CONSTANT
295
+
296
+ cpath:
297
+ '::@' cname
298
+ {
299
+ result = "result = ['::', val[1]];"
300
+ }
301
+ | cname
302
+ {
303
+ result = [nil, val[0]]
304
+ }
305
+ | primary_value '::' cname
306
+ {
307
+ result = [val[0], val[2]]
308
+ }
309
+
310
+ fname:
311
+ IDENTIFIER
312
+ | CONSTANT
313
+ | FID
314
+ | op
315
+ | reswords
316
+
317
+ fitem:
318
+ fname
319
+ | symbol
320
+
321
+ undef_list:
322
+ fitem
323
+ {
324
+ result = [val[0]]
325
+ }
326
+ | undef_list ',' fitem
327
+ {
328
+ result = val[0] << val[2]
329
+ }
330
+
331
+ op:
332
+ '|' | '^' | '&' | '<=>' | '==' | '==='
333
+ | '=~' | '>' | '>=' | '<' | '<=' | '<<'
334
+ | '>>' | '+' | '-' | '*' | SPLAT | '/'
335
+ | '%' | '**' | '~' | '+@' | '-@' | '[]'
336
+ | '[]=' | BACK_REF2 | '!' | '!='
337
+
338
+ reswords:
339
+ LINE | FILE | klBEGIN | klEND | ALIAS | AND
340
+ | BEGIN | BREAK | CASE | CLASS | DEF | DEFINED
341
+ | DO | ELSE | ELSIF | END | ENSURE | FALSE
342
+ | FOR | IN | MODULE | NEXT | NIL | NOT
343
+ | OR | REDO | RESCUE | RETRY | RETURN | SELF
344
+ | SUPER | THEN | TRUE | UNDEF | WHEN | YIELD
345
+ | IF_MOD | UNLESS_MOD | WHILE_MOD | UNTIL_MOD | RESCUE_MOD
346
+
347
+ arg:
348
+ lhs '=' arg
349
+ {
350
+ result = AssignNode.new val[0], val[2], val[1]
351
+ }
352
+ | lhs '=' arg RESCUE_MOD arg
353
+ | var_lhs OP_ASGN arg
354
+ {
355
+ result = OpAsgnNode.new val[1], val[0], val[2]
356
+ }
357
+ | primary_value '[@' aref_args ']' OP_ASGN arg
358
+ {
359
+ result = OpAsgnNode.new val[4], ArefNode.new(val[0], val[2]), val[5]
360
+ }
361
+ | primary_value '.' IDENTIFIER OP_ASGN arg
362
+ {
363
+ result = OpAsgnNode.new(val[3], CallNode.new(val[0], val[2], [[]]), val[4])
364
+ }
365
+ | primary_value '.' CONSTANT OP_ASGN arg
366
+ | primary_value '::' IDENTIFIER OP_ASGN arg
367
+ | primary_value '::' CONSTANT OP_ASGN arg
368
+ | '::@' CONSTANT OP_ASGN arg
369
+ | backref OP_ASGN arg
370
+ | arg '..' arg
371
+ {
372
+ result = RangeNode.new val[1], val[0], val[2]
373
+ }
374
+ | arg '...' arg
375
+ {
376
+ result = RangeNode.new val[1], val[0], val[2]
377
+ }
378
+ | arg '+' arg
379
+ {
380
+ result = CallNode.new val[0], val[1], [[val[2]]]
381
+ }
382
+ | arg '-' arg
383
+ {
384
+ result = CallNode.new val[0], val[1], [[val[2]]]
385
+ }
386
+ | arg '*' arg
387
+ {
388
+ result = CallNode.new val[0], val[1], [[val[2]]]
389
+ }
390
+ | arg '/' arg
391
+ {
392
+ result = CallNode.new val[0], val[1], [[val[2]]]
393
+ }
394
+ | arg '%' arg
395
+ {
396
+ result = CallNode.new val[0], val[1], [[val[2]]]
397
+ }
398
+ | arg '**' arg
399
+ {
400
+ result = CallNode.new val[0], val[1], [[val[2]]]
401
+ }
402
+ | '-@NUM' INTEGER '**' arg
403
+ | '-@NUM' FLOAT '**' arg
404
+ | '+@' arg
405
+ {
406
+ result = CallNode.new val[1], val[0], []
407
+ }
408
+ | '-@' arg
409
+ {
410
+ result = CallNode.new val[1], val[0], []
411
+ }
412
+ | arg '|' arg
413
+ {
414
+ result = CallNode.new val[0], val[1], [[val[2]]]
415
+ }
416
+ | arg '^' arg
417
+ {
418
+ result = CallNode.new val[0], val[1], [[val[2]]]
419
+ }
420
+ | arg '&' arg
421
+ {
422
+ result = CallNode.new val[0], val[1], [[val[2]]]
423
+ }
424
+ | arg '<=>' arg
425
+ {
426
+ result = CallNode.new val[0], val[1], [[val[2]]]
427
+ }
428
+ | arg '>' arg
429
+ {
430
+ result = CallNode.new val[0], val[1], [[val[2]]]
431
+ }
432
+ | arg '>=' arg
433
+ {
434
+ result = CallNode.new val[0], val[1], [[val[2]]]
435
+ }
436
+ | arg '<' arg
437
+ {
438
+ result = CallNode.new val[0], val[1], [[val[2]]]
439
+ }
440
+ | arg '<=' arg
441
+ {
442
+ result = CallNode.new val[0], val[1], [[val[2]]]
443
+ }
444
+ | arg '==' arg
445
+ {
446
+ result = CallNode.new val[0], val[1], [[val[2]]]
447
+ }
448
+ | arg '===' arg
449
+ {
450
+ result = CallNode.new val[0], val[1], [[val[2]]]
451
+ }
452
+ | arg '!=' arg
453
+ {
454
+ result = CallNode.new val[0], val[1], [[val[2]]]
455
+ }
456
+ | arg '=~' arg
457
+ {
458
+ result = CallNode.new val[0], val[1], [[val[2]]]
459
+ }
460
+ | arg '!~' arg
461
+ {
462
+ result = CallNode.new val[0], val[1], [[val[2]]]
463
+ }
464
+ | '!' arg
465
+ {
466
+ result = CallNode.new val[1], val[0], []
467
+ }
468
+ | '~' arg
469
+ {
470
+ result = CallNode.new val[1], val[0], []
471
+ }
472
+ | arg '<<' arg
473
+ {
474
+ result = CallNode.new val[0], val[1], [[val[2]]]
475
+ }
476
+ | arg '>>' arg
477
+ {
478
+ result = CallNode.new val[0], val[1], [[val[2]]]
479
+ }
480
+ | arg '&&' arg
481
+ {
482
+ result = AndNode.new val[1], val[0], val[2]
483
+ }
484
+ | arg '||' arg
485
+ {
486
+ result = OrNode.new val[1], val[0], val[2]
487
+ }
488
+ | DEFINED opt_nl arg
489
+ | arg '?' arg ':' arg
490
+ {
491
+ result = TernaryNode.new val[0], val[2], val[4]
492
+ }
493
+ | primary
494
+
495
+ arg_value:
496
+ arg
497
+
498
+ aref_args:
499
+ none
500
+ {
501
+ result = [[], nil]
502
+ }
503
+ | command opt_nl
504
+ | args trailer
505
+ {
506
+ result = [val[0], nil]
507
+ }
508
+ | args ',' SPLAT arg opt_nl
509
+ {
510
+ result = [val[0], val[3]]
511
+ }
512
+ | assocs trailer
513
+ {
514
+ result = [[HashNode.new(val[0], {}, {})], nil]
515
+ }
516
+ | SPLAT arg opt_nl
517
+ {
518
+ result = [[], val[1]]
519
+ }
520
+
521
+ paren_args:
522
+ '(' none ')'
523
+ {
524
+ result = [[]]
525
+ }
526
+ | '(' call_args opt_nl ')'
527
+ {
528
+ result = val[1]
529
+ }
530
+ | '(' block_call opt_nl ')'
531
+ | '(' args ',' block_call opt_nl ')'
532
+
533
+ opt_paren_args:
534
+ none
535
+ {
536
+ result = []
537
+ }
538
+ | paren_args
539
+
540
+ call_args:
541
+ command
542
+ {
543
+ result = [[val[0]], nil, nil, nil]
544
+ }
545
+ | args opt_block_arg
546
+ {
547
+ result = [val[0], nil, nil, val[1]]
548
+ }
549
+ | args ',' SPLAT arg_value opt_block_arg
550
+ {
551
+ result = [val[0], val[3], nil, val[4]]
552
+ }
553
+ | assocs opt_block_arg
554
+ {
555
+ result = [nil, nil, val[0], val[1]]
556
+ }
557
+ | assocs ',' SPLAT arg_value opt_block_arg
558
+ {
559
+ result = [nil, val[3], val[0], val[4]]
560
+ }
561
+ | args ',' assocs opt_block_arg
562
+ {
563
+ result = [val[0], nil, val[2], val[3]]
564
+ }
565
+ | args ',' assocs ',' SPLAT arg opt_block_arg
566
+ {
567
+ result = [val[0], val[5], val[2], val[6]]
568
+ }
569
+ | SPLAT arg_value opt_block_arg
570
+ {
571
+ result = [nil, val[1], nil, val[2]]
572
+ }
573
+ | block_arg
574
+ {
575
+ result = [nil, nil, nil, val[0]]
576
+ }
577
+
578
+ call_args2:
579
+ arg_value ',' args opt_block_arg
580
+ | arg_value ',' block_arg
581
+ | arg_value ',' SPLAT arg_value opt_block_arg
582
+ | arg_value ',' args ',' SPLAT arg_value opt_block_arg
583
+ | assocs opt_block_arg
584
+ | assocs ',' SPLAT arg_value opt_block_arg
585
+ | arg_value ',' assocs opt_block_arg
586
+ | arg_value ',' args ',' assocs opt_block_arg
587
+ | arg_value ',' assocs ',' SPLAT arg_value opt_block_arg
588
+ | arg_value ',' args ',' assocs ',' SPLAT arg_value opt_block_arg
589
+ | SPLAT arg_value opt_block_arg
590
+ | block_arg
591
+
592
+ command_args:
593
+ {
594
+ cmdarg_push 1
595
+ }
596
+ open_args
597
+ {
598
+ cmdarg_pop
599
+ result = val[1]
600
+ }
601
+
602
+ open_args:
603
+ call_args
604
+ | tLPAREN_ARG ')'
605
+ {
606
+ result = [[]]
607
+ }
608
+ | tLPAREN_ARG call_args2 ')'
609
+ {
610
+ result = val[1]
611
+ }
612
+
613
+ block_arg:
614
+ '&@' arg_value
615
+ {
616
+ result = val[1]
617
+ }
618
+
619
+ opt_block_arg:
620
+ ',' block_arg
621
+ {
622
+ result = val[1]
623
+ }
624
+ | none_block_pass
625
+ {
626
+ result = nil
627
+ }
628
+
629
+ args:
630
+ arg_value
631
+ {
632
+ result = [val[0]]
633
+ }
634
+ | args ',' arg_value
635
+ {
636
+ result = val[0] << val[2]
637
+ }
638
+
639
+ mrhs:
640
+ args ',' arg_value
641
+ | args ',' SPLAT arg_value
642
+ | SPLAT arg_value
643
+
644
+ primary:
645
+ literal
646
+ | strings
647
+ | xstring
648
+ | regexp
649
+ | words
650
+ | awords
651
+ | var_ref
652
+ | backref
653
+ | FID
654
+ | BEGIN bodystmt END
655
+ {
656
+ result = BeginNode.new val[0], val[1], val[2]
657
+ }
658
+ | tLPAREN_ARG expr opt_nl ')'
659
+ | PAREN_BEG compstmt ')'
660
+ {
661
+ result = ParenNode.new val[0], val[1], val[2]
662
+ }
663
+ | primary_value '::' CONSTANT
664
+ {
665
+ result = Colon2Node.new val[0], val[2]
666
+ }
667
+ | '::@' CONSTANT
668
+ {
669
+ result = Colon3Node.new val[1]
670
+ }
671
+ | primary_value '[@' aref_args ']'
672
+ {
673
+ result = CallNode.new val[0], { :line => val[0].line, :value => '[]' }, val[2]
674
+ }
675
+ | '[' aref_args ']'
676
+ {
677
+ result = ArrayNode.new val[1], val[0], val[2]
678
+ }
679
+ | '{' assoc_list '}'
680
+ {
681
+ result = HashNode.new val[1], val[0], val[2]
682
+ }
683
+ | RETURN
684
+ {
685
+ result = ReturnNode.new val[0], [nil]
686
+ }
687
+ | YIELD '(' call_args ')'
688
+ {
689
+ result = YieldNode.new val[0], val[2]
690
+ }
691
+ | YIELD '(' ')'
692
+ {
693
+ result = YieldNode.new val[0], []
694
+ }
695
+ | YIELD
696
+ {
697
+ result = YieldNode.new val[0], []
698
+ }
699
+ | DEFINED opt_nl '(' expr ')'
700
+ | operation brace_block
701
+ {
702
+ result = CallNode.new nil, val[0], [[]]
703
+ result.block = val[1]
704
+ }
705
+ | method_call
706
+ | method_call brace_block
707
+ {
708
+ result = val[0];
709
+ result.block = val[1]
710
+ }
711
+ | IF expr_value then compstmt if_tail END
712
+ {
713
+ result = IfNode.new val[0], val[1], val[3], val[4], val[5]
714
+ }
715
+ | UNLESS expr_value then compstmt opt_else END
716
+ {
717
+ result = IfNode.new val[0], val[1], val[3], val[4], val[5]
718
+ }
719
+ | WHILE
720
+ {
721
+ cond_push 1
722
+ }
723
+ expr_value do
724
+ {
725
+ cond_pop
726
+ }
727
+ compstmt END
728
+ {
729
+ result = WhileNode.new val[0], val[2], val[5], val[6]
730
+ }
731
+ | UNTIL
732
+ {
733
+ result = "this.cond_push(1);"
734
+ }
735
+ expr_value do
736
+ {
737
+ result = "this.cond_pop();"
738
+ }
739
+ compstmt END
740
+ {
741
+ result = "result = ['while', val[0], val[2], val[5]];"
742
+ }
743
+ | CASE expr_value opt_terms case_body END
744
+ {
745
+ result = CaseNode.new val[0], val[1], val[3], val[4]
746
+ }
747
+ | CASE opt_terms case_body END
748
+ {
749
+ result = "result = ['case', null, val[2]];"
750
+ }
751
+ | CASE opt_terms ELSE compstmt END
752
+ | FOR block_var IN
753
+ {
754
+ result = "this.cond_push(1);"
755
+ }
756
+ expr_value do
757
+ {
758
+ result = "this.cond_pop();"
759
+ }
760
+ compstmt END
761
+ | CLASS cpath superclass bodystmt END
762
+ {
763
+ result = ClassNode.new val[0], val[1], val[2], val[3], val[4]
764
+ }
765
+ | CLASS '<<' expr term bodystmt END
766
+ {
767
+ result = ClassShiftNode.new val[0], val[2], val[4], val[5]
768
+ }
769
+ | MODULE cpath bodystmt END
770
+ {
771
+ result = ModuleNode.new val[0], val[1], val[2], val[3]
772
+ }
773
+ | DEF fname f_arglist bodystmt END
774
+ {
775
+ result = DefNode.new val[0], nil, val[1], val[2], val[3], val[4]
776
+ }
777
+ | DEF singleton dot_or_colon fname f_arglist bodystmt END
778
+ {
779
+ result = DefNode.new val[0], val[1], val[3], val[4], val[5], val[6]
780
+ }
781
+ | BREAK
782
+ {
783
+ result = BreakNode.new val[0], []
784
+ }
785
+ | NEXT
786
+ {
787
+ result = NextNode.new val[0], []
788
+ }
789
+ | REDO
790
+ {
791
+ result = RedoNode.new val[0]
792
+ }
793
+ | RETRY
794
+
795
+ primary_value:
796
+ primary
797
+
798
+ then:
799
+ term
800
+ | ':'
801
+ | THEN
802
+ | term THEN
803
+
804
+ do:
805
+ term
806
+ | ':'
807
+ | DO_COND
808
+
809
+ if_tail:
810
+ opt_else
811
+ {
812
+ result = val[0]
813
+ }
814
+ | ELSIF expr_value then compstmt if_tail
815
+ {
816
+ result = [[val[0], val[1], val[3]]].concat val[4]
817
+ }
818
+
819
+ opt_else:
820
+ none
821
+ {
822
+ result = []
823
+ }
824
+ | ELSE compstmt
825
+ {
826
+ result = [[val[0], val[1]]]
827
+ }
828
+
829
+ block_var:
830
+ block_var_args
831
+ {
832
+ result = [val[0], nil]
833
+ }
834
+
835
+ block_var_args:
836
+ f_arg ',' f_block_optarg ',' f_rest_arg opt_f_block_arg
837
+ {
838
+ result = [val[0], val[2], val[4], val[5]]
839
+ }
840
+ | f_arg ',' f_block_optarg opt_f_block_arg
841
+ {
842
+ result = [val[0], val[2], nil, val[3]]
843
+ }
844
+ | f_arg ',' f_rest_arg opt_f_block_arg
845
+ {
846
+ result = [val[0], nil, val[2], val[3]]
847
+ }
848
+ | f_arg opt_f_block_arg
849
+ {
850
+ result = [val[0], nil, nil, val[1]]
851
+ }
852
+ | f_block_optarg ',' f_rest_arg opt_f_block_arg
853
+ {
854
+ result = [nil, val[0], val[2], val[3]]
855
+ }
856
+ | f_block_optarg opt_f_block_arg
857
+ {
858
+ result = [nil, val[0], nil, val[1]]
859
+ }
860
+ | f_rest_arg opt_f_block_arg
861
+ {
862
+ result = [nil, nil, val[0], val[1]]
863
+ }
864
+ | f_block_arg
865
+ {
866
+ result = [nil, nil, nil, val[0]]
867
+ }
868
+
869
+ f_block_optarg:
870
+ f_block_opt
871
+ {
872
+ result = [val[0]]
873
+ }
874
+ | f_block_optarg ',' f_block_opt
875
+ {
876
+ val[0] << val[2]
877
+ result = val[0]
878
+ }
879
+
880
+ f_block_opt:
881
+ IDENTIFIER '=' primary_value
882
+ {
883
+ result = [val[0], val[2]]
884
+ }
885
+
886
+ opt_block_var:
887
+ none
888
+ {
889
+ result = [nil]
890
+ }
891
+ | '|' '|'
892
+ {
893
+ result = [nil]
894
+ }
895
+ | '||'
896
+ {
897
+ result = [nil]
898
+ }
899
+ | '|' block_var '|'
900
+ {
901
+ result = val[1]
902
+ }
903
+
904
+ do_block:
905
+ DO_BLOCK
906
+ {
907
+ # result = "print('doing half command');"
908
+ }
909
+ opt_block_var compstmt END
910
+ {
911
+ result = BlockNode.new val[0], val[2], val[3], val[4]
912
+ }
913
+
914
+ block_call:
915
+ command do_block
916
+ {
917
+ result = val[0]
918
+ val[0].block = val[1]
919
+ }
920
+ | block_call '.' operation2 opt_paren_args
921
+ | block_call '::' operation2 opt_paren_args
922
+
923
+ method_call:
924
+ operation paren_args
925
+ {
926
+ result = CallNode.new nil, val[0], val[1]
927
+ }
928
+ | primary_value '.' operation2 opt_paren_args
929
+ {
930
+ result = CallNode.new val[0], val[2], val[3]
931
+ }
932
+ | primary_value '::' operation2 paren_args
933
+ | primary_value '::' operation3
934
+ | SUPER paren_args
935
+ {
936
+ result = SuperNode.new val[0], val[1]
937
+ }
938
+ | SUPER
939
+ {
940
+ result = SuperNode.new val[0], []
941
+ }
942
+
943
+ brace_block:
944
+ '{@' opt_block_var compstmt '}'
945
+ {
946
+ result = BlockNode.new val[0], val[1], val[2], val[3]
947
+ }
948
+ | DO opt_block_var compstmt END
949
+ {
950
+ result = BlockNode.new val[0], val[1], val[2], val[3]
951
+ }
952
+
953
+ case_body:
954
+ WHEN when_args then compstmt cases
955
+ {
956
+ # result = "result = [['when', val[1], val[3]]].concat(val[4]);"
957
+ result = [[val[0], val[1], val[3]]] + val[4]
958
+ }
959
+
960
+ when_args:
961
+ args
962
+ {
963
+ result = val[0]
964
+ }
965
+ | args ',' SPLAT arg_value
966
+ {
967
+ result = val[0]
968
+ }
969
+ | SPLAT arg_value
970
+ {
971
+ result = []
972
+ }
973
+
974
+ cases:
975
+ opt_else
976
+ | case_body
977
+
978
+ opt_rescue:
979
+ RESCUE exc_list exc_var then compstmt opt_rescue
980
+ {
981
+ result = [[val[0], val[1], val[2], val[4]]]
982
+ result.concat val[5]
983
+ }
984
+ |
985
+ {
986
+ result = []
987
+ }
988
+
989
+ exc_list:
990
+ arg_value
991
+ | mrhs
992
+ | none
993
+
994
+ exc_var:
995
+ '=>' lhs
996
+ {
997
+ result = val[1]
998
+ }
999
+ | none
1000
+ {
1001
+ result = nil
1002
+ }
1003
+
1004
+ opt_ensure:
1005
+ ENSURE compstmt
1006
+ | none
1007
+
1008
+ literal:
1009
+ numeric
1010
+ | symbol
1011
+ | dsym
1012
+
1013
+ strings:
1014
+ string
1015
+
1016
+ string:
1017
+ string1
1018
+ | string string1
1019
+
1020
+ string1:
1021
+ STRING_BEG string_contents STRING_END
1022
+ {
1023
+ result = StringNode.new val[1], val[2]
1024
+ }
1025
+ | STRING
1026
+
1027
+ xstring:
1028
+ XSTRING_BEG xstring_contents STRING_END
1029
+ {
1030
+ result = XStringNode.new val[0], val[1], val[2]
1031
+ }
1032
+
1033
+ regexp:
1034
+ REGEXP_BEG xstring_contents REGEXP_END
1035
+ {
1036
+ result = RegexpNode.new val[0], val[1]
1037
+ }
1038
+
1039
+ words:
1040
+ WORDS_BEG SPACE STRING_END
1041
+ {
1042
+ result = WordsNode.new val[0], [], val[2]
1043
+ }
1044
+ | WORDS_BEG word_list STRING_END
1045
+ {
1046
+ result = WordsNode.new val[0], val[1], val[2]
1047
+ }
1048
+
1049
+ word_list:
1050
+ none
1051
+ {
1052
+ result = []
1053
+ }
1054
+ | word_list word SPACE
1055
+ {
1056
+ result = val[0].concat([val[1]])
1057
+ }
1058
+
1059
+ word:
1060
+ string_content
1061
+ {
1062
+ result = val[0]
1063
+ }
1064
+ | word string_content
1065
+ {
1066
+ result = val[0].concat([val[1]])
1067
+ }
1068
+
1069
+ awords:
1070
+ AWORDS_BEG SPACE STRING_END
1071
+ {
1072
+ result = WordsNode.new val[0], [], val[2]
1073
+ }
1074
+ | AWORDS_BEG qword_list STRING_END
1075
+ {
1076
+ result = WordsNode.new val[0], val[1], val[2]
1077
+ }
1078
+
1079
+ qword_list:
1080
+ none
1081
+ {
1082
+ result = []
1083
+ }
1084
+ | qword_list STRING_CONTENT SPACE
1085
+ {
1086
+ result = val[0].concat([['string_content', val[1]]])
1087
+ }
1088
+
1089
+ string_contents:
1090
+ none
1091
+ {
1092
+ result = []
1093
+ }
1094
+ | string_contents string_content
1095
+ {
1096
+ result = val[0] << val[1]
1097
+ }
1098
+
1099
+ xstring_contents:
1100
+ none
1101
+ {
1102
+ result = []
1103
+ }
1104
+ | xstring_contents string_content
1105
+ {
1106
+ result = val[0].concat [val[1]]
1107
+ }
1108
+
1109
+ string_content:
1110
+ STRING_CONTENT
1111
+ {
1112
+ result = ['string_content', val[0]]
1113
+ }
1114
+ | STRING_DVAR string_dvar
1115
+ {
1116
+ result = ['string_dvar', val[1]]
1117
+ }
1118
+ | STRING_DBEG
1119
+ {
1120
+ cond_push 0
1121
+ cmdarg_push 0
1122
+ }
1123
+ compstmt '}'
1124
+ {
1125
+ cond_lexpop
1126
+ cmdarg_lexpop
1127
+ result = ['string_dbegin', val[2]]
1128
+ }
1129
+
1130
+ string_dvar:
1131
+ GVAR
1132
+ | IVAR
1133
+ | CVAR
1134
+ | backref
1135
+
1136
+
1137
+ symbol:
1138
+ SYMBOL_BEG sym
1139
+ {
1140
+ result = SymbolNode.new val[1]
1141
+ }
1142
+ | SYMBOL
1143
+
1144
+ sym: fname
1145
+ | IVAR
1146
+ | GVAR
1147
+ | CVAR
1148
+
1149
+ dsym:
1150
+ SYMBOL_BEG xstring_contents STRING_END
1151
+ {
1152
+ result = "result = ['dsym', val[1]];"
1153
+ }
1154
+
1155
+ numeric:
1156
+ INTEGER
1157
+ {
1158
+ result = NumericNode.new val[0]
1159
+ }
1160
+ | FLOAT
1161
+ {
1162
+ result = NumericNode.new val[0]
1163
+ }
1164
+ | '-@NUM' INTEGER =LOWEST
1165
+ | '-@NUM' FLOAT =LOWEST
1166
+
1167
+ variable:
1168
+ IDENTIFIER
1169
+ {
1170
+ result = IdentifierNode.new val[0]
1171
+ }
1172
+ | IVAR
1173
+ {
1174
+ result = IvarNode.new val[0]
1175
+ }
1176
+ | GVAR
1177
+ {
1178
+ result = GvarNode.new val[0];
1179
+ }
1180
+ | CONSTANT
1181
+ {
1182
+ result = ConstantNode.new val[0]
1183
+ }
1184
+ | CVAR
1185
+ {
1186
+ result = "result = ['cvar', val[0]];"
1187
+ }
1188
+ | NIL
1189
+ {
1190
+ result = NilNode.new val[0]
1191
+ }
1192
+ | SELF
1193
+ {
1194
+ result = SelfNode.new val[0]
1195
+ }
1196
+ | TRUE
1197
+ {
1198
+ result = TrueNode.new val[0]
1199
+ }
1200
+ | FALSE
1201
+ {
1202
+ result = FalseNode.new val[0]
1203
+ }
1204
+ | FILE
1205
+ {
1206
+ result = FileNode.new val[0]
1207
+ }
1208
+ | LINE
1209
+ {
1210
+ result = LineNode.new val[0]
1211
+ }
1212
+
1213
+ var_ref:
1214
+ variable
1215
+
1216
+ var_lhs:
1217
+ variable
1218
+
1219
+ backref:
1220
+ NTH_REF
1221
+ | BACK_REF
1222
+
1223
+ superclass:
1224
+ term
1225
+ {
1226
+ result = nil
1227
+ }
1228
+ | '<' expr_value term
1229
+ {
1230
+ result = val[1]
1231
+ }
1232
+ | error term
1233
+ {
1234
+ result = nil
1235
+ }
1236
+
1237
+ f_arglist:
1238
+ '(' f_args opt_nl ')'
1239
+ {
1240
+ result = val[1]
1241
+ }
1242
+ | f_args term
1243
+ {
1244
+ result = val[0]
1245
+ }
1246
+
1247
+ f_args:
1248
+ f_arg ',' f_optarg ',' f_rest_arg opt_f_block_arg
1249
+ {
1250
+ result = [val[0], val[2], val[4], val[5]]
1251
+ }
1252
+ | f_arg ',' f_optarg opt_f_block_arg
1253
+ {
1254
+ result = [val[0], val[2], nil, val[3]]
1255
+ }
1256
+ | f_arg ',' f_rest_arg opt_f_block_arg
1257
+ {
1258
+ result = [val[0], nil, val[2], val[3]]
1259
+ }
1260
+ | f_arg opt_f_block_arg
1261
+ {
1262
+ result = [val[0], nil, nil, val[1]]
1263
+ }
1264
+ | f_optarg ',' f_rest_arg opt_f_block_arg
1265
+ {
1266
+ rsult = [nil, val[0], val[2], val[3]]
1267
+ }
1268
+ | f_optarg opt_f_block_arg
1269
+ {
1270
+ result = [nil, val[0], nil, val[1]]
1271
+ }
1272
+ | f_rest_arg opt_f_block_arg
1273
+ {
1274
+ result = [nil, nil, val[0], val[1]]
1275
+ }
1276
+ | f_block_arg
1277
+ {
1278
+ result = [nil, nil, nil, val[0]]
1279
+ }
1280
+ |
1281
+ {
1282
+ result = [nil, nil, nil, nil]
1283
+ }
1284
+
1285
+ f_norm_arg:
1286
+ CONSTANT
1287
+ {
1288
+ result = "this.yyerror('formal argument cannot be a constant');"
1289
+ }
1290
+ | IVAR
1291
+ {
1292
+ result = "this.yyerror('formal argument cannot be an instance variable');"
1293
+ }
1294
+ | CVAR
1295
+ {
1296
+ result = "this.yyerror('formal argument cannot be a class variable');"
1297
+ }
1298
+ | GVAR
1299
+ {
1300
+ result = "this.yyerror('formal argument cannot be a global variable');"
1301
+ }
1302
+ | IDENTIFIER
1303
+
1304
+ f_arg:
1305
+ f_norm_arg
1306
+ {
1307
+ result = [val[0]]
1308
+ }
1309
+ | f_arg ',' f_norm_arg
1310
+ {
1311
+ val[0] << val[2]
1312
+ result = val[0]
1313
+ }
1314
+
1315
+ f_opt:
1316
+ IDENTIFIER '=' arg_value
1317
+ {
1318
+ result = [val[0], val[2]]
1319
+ }
1320
+
1321
+ f_optarg:
1322
+ f_opt
1323
+ {
1324
+ result = [val[0]]
1325
+ }
1326
+ | f_optarg ',' f_opt
1327
+ {
1328
+ result = val[0]
1329
+ val[0] << val[2]
1330
+ }
1331
+
1332
+ restarg_mark:
1333
+ '*'
1334
+ | SPLAT
1335
+
1336
+ f_rest_arg:
1337
+ restarg_mark IDENTIFIER
1338
+ {
1339
+ result = val[1]
1340
+ }
1341
+ | restarg_mark
1342
+ {
1343
+ result = val[0]
1344
+ }
1345
+
1346
+ blkarg_mark:
1347
+ '&'
1348
+ | '&@'
1349
+
1350
+ f_block_arg:
1351
+ blkarg_mark IDENTIFIER
1352
+ {
1353
+ result = val[1]
1354
+ }
1355
+
1356
+ opt_f_block_arg:
1357
+ ',' f_block_arg
1358
+ {
1359
+ result = val[1]
1360
+ }
1361
+ |
1362
+ {
1363
+ result = nil
1364
+ }
1365
+
1366
+ singleton:
1367
+ var_ref
1368
+ {
1369
+ result = val[0]
1370
+ }
1371
+ | '(' expr opt_nl ')'
1372
+ {
1373
+ result = val[1]
1374
+ }
1375
+
1376
+ assoc_list:
1377
+ none
1378
+ {
1379
+ result = []
1380
+ }
1381
+ | assocs trailer
1382
+ {
1383
+ result = val[0]
1384
+ }
1385
+ | args trailer
1386
+ {
1387
+ raise "unsupported assoc list type (#@line_number)"
1388
+ }
1389
+
1390
+ assocs:
1391
+ assoc
1392
+ {
1393
+ result = [val[0]]
1394
+ }
1395
+ | assocs ',' assoc
1396
+ {
1397
+ result = val[0] << val[2]
1398
+ }
1399
+
1400
+ assoc:
1401
+ arg_value '=>' arg_value
1402
+ {
1403
+ result = [val[0], val[2]]
1404
+ }
1405
+ | LABEL arg_value
1406
+ {
1407
+ result = [SymbolNode.new(val[0]), val[1]]
1408
+ }
1409
+
1410
+ operation:
1411
+ IDENTIFIER
1412
+ | CONSTANT
1413
+ | FID
1414
+
1415
+ operation2:
1416
+ IDENTIFIER
1417
+ | CONSTANT
1418
+ | FID
1419
+ | op
1420
+
1421
+ operation3:
1422
+ IDENTIFIER
1423
+ | FID
1424
+ | op
1425
+
1426
+ dot_or_colon:
1427
+ '.'
1428
+ | '::'
1429
+
1430
+ opt_terms:
1431
+ | terms
1432
+
1433
+ opt_nl:
1434
+ | '\\n'
1435
+
1436
+ trailer:
1437
+ | '\\n'
1438
+ | ','
1439
+
1440
+ term:
1441
+ ';'
1442
+ | '\\n'
1443
+
1444
+ terms:
1445
+ term
1446
+ | terms ';'
1447
+
1448
+ none:
1449
+
1450
+ none_block_pass:
1451
+
1452
+ end
1453
+
1454
+ ---- inner