opal 0.5.2 → 0.5.4

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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -0
  3. data/lib/opal.rb +0 -5
  4. data/lib/opal/compiler.rb +24 -44
  5. data/lib/opal/nodes/base.rb +5 -8
  6. data/lib/opal/nodes/call.rb +4 -0
  7. data/lib/opal/nodes/class.rb +6 -7
  8. data/lib/opal/nodes/def.rb +4 -4
  9. data/lib/opal/nodes/definitions.rb +0 -14
  10. data/lib/opal/nodes/iter.rb +51 -38
  11. data/lib/opal/nodes/literal.rb +21 -24
  12. data/lib/opal/nodes/module.rb +4 -4
  13. data/lib/opal/nodes/runtime_helpers.rb +45 -0
  14. data/lib/opal/nodes/scope.rb +280 -0
  15. data/lib/opal/nodes/singleton_class.rb +4 -5
  16. data/lib/opal/nodes/super.rb +1 -1
  17. data/lib/opal/nodes/top.rb +9 -7
  18. data/lib/opal/nodes/yield.rb +14 -3
  19. data/lib/opal/parser.rb +4 -18
  20. data/lib/opal/parser/grammar.rb +3745 -3667
  21. data/lib/opal/parser/grammar.y +1692 -1778
  22. data/lib/opal/parser/keywords.rb +35 -35
  23. data/lib/opal/parser/lexer.rb +356 -325
  24. data/lib/opal/parser/sexp.rb +1 -1
  25. data/lib/opal/version.rb +1 -1
  26. data/opal.gemspec +1 -0
  27. data/opal/core/array.rb +320 -81
  28. data/opal/core/enumerable.rb +46 -5
  29. data/opal/core/hash.rb +6 -64
  30. data/opal/core/helpers.rb +67 -0
  31. data/opal/core/method.rb +1 -1
  32. data/opal/core/module.rb +4 -4
  33. data/opal/core/range.rb +1 -12
  34. data/opal/core/regexp.rb +2 -8
  35. data/opal/core/runtime.js +74 -3
  36. data/opal/core/string.rb +99 -74
  37. data/opal/opal.rb +3 -72
  38. data/spec/filters/bugs/array.rb +2 -30
  39. data/spec/filters/bugs/basic_object.rb +0 -1
  40. data/spec/filters/bugs/string.rb +26 -21
  41. data/spec/filters/unsupported/enumerator.rb +3 -0
  42. data/spec/filters/unsupported/float.rb +1 -0
  43. data/spec/filters/unsupported/immutable_strings.rb +15 -0
  44. data/spec/filters/unsupported/tainted.rb +58 -30
  45. data/spec/filters/unsupported/trusted.rb +35 -15
  46. data/spec/opal/parser/class_spec.rb +4 -4
  47. data/spec/opal/parser/def_spec.rb +4 -4
  48. data/spec/opal/parser/lvar_spec.rb +6 -6
  49. data/spec/opal/parser/module_spec.rb +4 -4
  50. data/spec/opal/parser/sclass_spec.rb +2 -2
  51. data/spec/stdlib/native/exposure_spec.rb +33 -0
  52. data/stdlib/buffer.rb +1 -1
  53. data/stdlib/buffer/view.rb +1 -1
  54. data/stdlib/native.rb +193 -174
  55. data/stdlib/opal-parser.rb +0 -6
  56. data/stdlib/pp.rb +9 -0
  57. data/tasks/mspec.rake +3 -1
  58. metadata +9 -9
  59. data/lib/opal/nodes/base_scope.rb +0 -11
  60. data/lib/opal/target_scope.rb +0 -281
  61. data/spec/filters/20.rb +0 -4
  62. data/spec/filters/unsupported/array_subclasses.rb +0 -37
@@ -1,1790 +1,1704 @@
1
1
  class Opal::Parser
2
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
- LCURLY '}' 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 LAMBDA LAMBEG DO_LAMBDA
3
+ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
4
+ kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT
5
+ kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER
6
+ kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD
7
+ kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__
8
+ k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT
9
+ tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT
10
+ tREGEXP_END tUPLUS tUMINUS '-@NUM' tPOW tCMP tEQ tEQQ tNEQ tGEQ tLEQ tANDOP
11
+ tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF tASET tLSHFT tRSHFT
12
+ tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN tLPAREN2 tRPAREN tLPAREN_ARG
13
+ ARRAY_BEG tRBRACK tLBRACE tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2
14
+ tTILDE tPERCENT tDIVIDE tPLUS tMINUS tLT tGT tPIPE tBANG tCARET
15
+ tLCURLY tRCURLY tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG
16
+ tWORDS_BEG tAWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END tSTRING
17
+ tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA tLAMBEG
18
+ tLBRACK2 tLBRACK
18
19
 
19
20
  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
21
+ right tBANG tTILDE tUPLUS
22
+ right tPOW
23
+ right '-@NUM' tUMINUS
24
+ left tSTAR2 tDIVIDE tPERCENT
25
+ left tPLUS tMINUS
26
+ left tLSHFT tRSHFT
27
+ left tAMPER2
28
+ left tPIPE tCARET
29
+ left tGT tGEQ tLT tLEQ
30
+ nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
31
+ left tANDOP
32
+ left tOROP
33
+ nonassoc tDOT2 tDOT3
34
+ right tEH tCOLON
35
+ left kRESCUE_MOD
36
+ right tEQL tOP_ASGN
37
+ nonassoc kDEFINED
38
+ right kNOT
39
+ left kOR kAND
40
+ nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD
40
41
  nonassoc tLBRACE_ARG
41
- nonassoc LOWEST
42
+ nonassoc tLOWEST
42
43
  preclow
43
44
 
44
45
  rule
45
46
 
46
- target:
47
- compstmt
48
- {
49
- result = val[0]
50
- }
51
-
52
- bodystmt:
53
- compstmt opt_rescue opt_else opt_ensure
54
- {
55
- result = new_body val[0], val[1], val[2], val[3]
56
- }
57
-
58
- compstmt:
59
- stmts opt_terms
60
- {
61
- comp = new_compstmt val[0]
62
- if comp and comp.type == :begin and comp.size == 2
63
- result = comp[1]
64
- result.line = comp.line
65
- else
66
- result = comp
67
- end
68
- }
69
-
70
- stmts:
71
- none
72
- {
73
- result = new_block
74
- }
75
- | stmt
76
- {
77
- result = new_block val[0]
78
- }
79
- | stmts terms stmt
80
- {
81
- val[0] << val[2]
82
- result = val[0]
83
- }
84
-
85
- stmt:
86
- ALIAS fitem
87
- {
88
- lexer.lex_state = :expr_fname
89
- }
90
- fitem
91
- {
92
- result = s(:alias, val[1], val[3])
93
- }
94
- | ALIAS GVAR GVAR
95
- {
96
- result = s(:valias, val[1].intern, val[2].intern)
97
- }
98
- | ALIAS GVAR BACK_REF
99
- | ALIAS GVAR NTH_REF
100
- {
101
- result = s(:valias, val[1].intern, val[2].intern)
102
- }
103
- | UNDEF undef_list
104
- {
105
- result = val[1]
106
- }
107
- | stmt IF_MOD expr_value
108
- {
109
- result = new_if val[2], val[0], nil
110
- }
111
- | stmt UNLESS_MOD expr_value
112
- {
113
- result = new_if val[2], nil, val[0]
114
- }
115
- | stmt WHILE_MOD expr_value
116
- {
117
- result = s(:while, val[2], val[0], true)
118
- }
119
- | stmt UNTIL_MOD expr_value
120
- {
121
- result = s(:until, val[2], val[0], true)
122
- }
123
- | stmt RESCUE_MOD stmt
124
- {
125
- result = s(:rescue_mod, val[0], val[2])
126
- }
127
- | klBEGIN LCURLY compstmt '}'
128
- | klEND LCURLY compstmt '}'
129
- | lhs '=' command_call
130
- {
131
- result = new_assign val[0], val[2]
132
- }
133
- | mlhs '=' command_call
134
- {
135
- result = s(:masgn, val[0], s(:to_ary, val[2]))
136
- }
137
- | var_lhs OP_ASGN command_call
138
- {
139
- result = new_op_asgn val[1].intern, val[0], val[2]
140
- }
141
- | primary_value '[@' aref_args ']' OP_ASGN command_call
142
- # {
143
- # result = OpAsgnNode.new(val[4], ArefNode.new(val[0], val[2]), val[5])
144
- # }
145
- | primary_value '.' IDENTIFIER OP_ASGN command_call
146
- {
147
- result = s(:op_asgn2, val[0], "#{val[2]}=".intern, val[3].intern, val[4])
148
- }
149
- | primary_value '.' CONSTANT OP_ASGN command_call
150
- | primary_value '::' IDENTIFIER OP_ASGN command_call
151
- | backref OP_ASGN command_call
152
- | lhs '=' mrhs
153
- {
154
- result = new_assign val[0], s(:svalue, val[2])
155
- }
156
- | mlhs '=' arg_value
157
- {
158
- result = s(:masgn, val[0], s(:to_ary, val[2]))
159
- }
160
- | mlhs '=' mrhs
161
- {
162
- result = s(:masgn, val[0], val[2])
163
- }
164
- | expr
165
-
166
- expr:
167
- command_call
168
- | expr AND expr
169
- {
170
- result = s(:and, val[0], val[2])
171
- result.line = val[0].line
172
- }
173
- | expr OR expr
174
- {
175
- result = s(:or, val[0], val[2])
176
- result.line = val[0].line
177
- }
178
- | NOT expr
179
- {
180
- result = s(:not, val[1])
181
- result.line = val[1].line
182
- }
183
- | '!' command_call
184
- {
185
- result = s(:not, val[1])
186
- }
187
- | arg
188
-
189
- expr_value:
190
- expr
191
-
192
- command_call:
193
- command
194
- | block_command
195
- | RETURN call_args
196
- {
197
- args = val[1]
198
- args = args[1] if args.size == 2
199
- result = s(:return, args)
200
- }
201
- | BREAK call_args
202
- {
203
- args = val[1]
204
- args = args[1] if args.size == 2
205
- result = s(:break, args)
206
- }
207
- | NEXT call_args
208
- {
209
- args = val[1]
210
- args = args[1] if args.size == 2
211
- result = s(:next, args)
212
- }
213
-
214
- block_command:
215
- block_call
216
- | block_call '.' operation2 command_args
217
- | block_call '::' operation2 command_args
218
-
219
- cmd_brace_block:
220
- tLBRACE_ARG opt_block_var compstmt '}'
221
-
222
- command:
223
- operation command_args =LOWEST
224
- {
225
- result = new_call nil, val[0].intern, val[1]
226
- }
227
- | operation command_args cmd_brace_block
228
- | primary_value '.' operation2 command_args =LOWEST
229
- {
230
- result = new_call val[0], val[2].intern, val[3]
231
- }
232
- | primary_value '.' operation2 command_args cmd_brace_block
233
- | primary_value '::' operation2 command_args =LOWEST
234
- {
235
- result = new_call val[0], val[2].intern, val[3]
236
- }
237
- | primary_value '::' operation2 command_args cmd_brace_block
238
- | SUPER command_args
239
- {
240
- result = new_super val[1]
241
- }
242
- | YIELD command_args
243
- {
244
- result = new_yield val[1]
245
- }
246
-
247
- mlhs:
248
- mlhs_basic
249
- {
250
- result = val[0]
251
- }
252
- | PAREN_BEG mlhs_entry ')'
253
- {
254
- result = val[1]
255
- }
256
-
257
- mlhs_entry:
258
- mlhs_basic
259
- {
260
- result = val[0]
261
- }
262
- | PAREN_BEG mlhs_entry ')'
263
- {
264
- result = val[1]
265
- }
266
-
267
- mlhs_basic:
268
- mlhs_head
269
- {
270
- result = val[0]
271
- }
272
- | mlhs_head mlhs_item
273
- {
274
- result = val[0] << val[1]
275
- }
276
- | mlhs_head SPLAT mlhs_node
277
- {
278
- result = val[0] << s(:splat, val[2])
279
- }
280
- | mlhs_head SPLAT mlhs_node ',' mlhs_post
281
- | mlhs_head SPLAT
282
- {
283
- result = val[0] << s(:splat)
284
- }
285
- | mlhs_head SPLAT ',' mlhs_post
286
- | SPLAT mlhs_node
287
- {
288
- result = s(:array, s(:splat, val[1]))
289
- }
290
- | SPLAT
291
- {
292
- result = s(:array, s(:splat))
293
- }
294
- | SPLAT ',' mlhs_post
295
-
296
- mlhs_item:
297
- mlhs_node
298
- {
299
- result = val[0]
300
- }
301
- | PAREN_BEG mlhs_entry ')'
302
- {
303
- result = val[1]
304
- }
305
-
306
- mlhs_head:
307
- mlhs_item ','
308
- {
309
- result = s(:array, val[0])
310
- }
311
- | mlhs_head mlhs_item ','
312
- {
313
- result = val[0] << val[1]
314
- }
315
-
316
- mlhs_post:
317
- mlhs_item
318
- | mlhs_post ',' mlhs_item
319
-
320
- mlhs_node:
321
- variable
322
- {
323
- result = new_assignable val[0]
324
- }
325
- | primary_value '[@' aref_args ']'
326
- {
327
- args = val[2]
328
- args.type = :arglist if args.type == :array
329
- result = s(:attrasgn, val[0], :[]=, args)
330
- }
331
- | primary_value '.' IDENTIFIER
332
- {
333
- result = new_call val[0], val[2].intern, s(:arglist)
334
- }
335
- | primary_value '::' IDENTIFIER
336
- | primary_value '.' CONSTANT
337
- | primary_value '::' CONSTANT
338
- | '::@' CONSTANT
339
- | backref
340
-
341
- lhs:
342
- variable
343
- {
344
- result = new_assignable val[0]
345
- }
346
- | primary_value '[@' aref_args ']'
347
- {
348
- args = val[2]
349
- args.type = :arglist if args.type == :array
350
- result = s(:attrasgn, val[0], :[]=, args)
351
- }
352
- | primary_value '.' IDENTIFIER
353
- {
354
- result = s(:attrasgn, val[0], "#{val[2]}=".intern, s(:arglist))
355
- }
356
- | primary_value '::' IDENTIFIER
357
- {
358
- result = s(:attrasgn, val[0], "#{val[2]}=".intern, s(:arglist))
359
- }
360
- | primary_value '.' CONSTANT
361
- {
362
- result = s(:attrasgn, val[0], "#{val[2]}=".intern, s(:arglist))
363
- }
364
- | primary_value '::' CONSTANT
365
- {
366
- result = s(:colon2, val[0], val[2].intern)
367
- }
368
- | '::@' CONSTANT
369
- {
370
- result = s(:colon3, val[1].intern)
371
- }
372
- | backref
373
-
374
- cname:
375
- CONSTANT
376
-
377
- cpath:
378
- '::@' cname
379
- {
380
- result = s(:colon3, val[1].intern)
381
- }
382
- | cname
383
- {
384
- result = val[0].intern
385
- }
386
- | primary_value '::' cname
387
- {
388
- result = s(:colon2, val[0], val[2].intern)
389
- }
390
-
391
- fname:
392
- IDENTIFIER
393
- | CONSTANT
394
- | FID
395
- | op
396
- {
397
- lexer.lex_state = :expr_end
398
- result = val[0]
399
- }
400
- | reswords
401
- {
402
- lexer.lex_state = :expr_end
403
- result = val[0]
404
- }
405
-
406
- fitem:
407
- fname
408
- {
409
- result = s(:sym, val[0].intern)
410
- }
411
- | symbol
412
-
413
- undef_list:
414
- fitem
415
- {
416
- result = s(:undef, val[0])
417
- }
418
- | undef_list ',' fitem
419
- {
420
- result = val[0] << val[2]
421
- }
422
-
423
- op:
424
- '|' | '^' | '&' | '<=>' | '==' | '==='
425
- | '=~' | '>' | '>=' | '<' | '<=' | '<<'
426
- | '>>' | '+' | '-' | '*' | SPLAT | '/'
427
- | '%' | '**' | '~' | '+@' | '-@' | '[]'
428
- | '[]=' | BACK_REF2 | '!' | '!='
429
-
430
- reswords:
431
- LINE | FILE | klBEGIN | klEND | ALIAS | AND
432
- | BEGIN | BREAK | CASE | CLASS | DEF | DEFINED
433
- | DO | ELSE | ELSIF | END | ENSURE | FALSE
434
- | FOR | IN | MODULE | NEXT | NIL | NOT
435
- | OR | REDO | RESCUE | RETRY | RETURN | SELF
436
- | SUPER | THEN | TRUE | UNDEF | WHEN | YIELD
437
- | IF_MOD | UNLESS_MOD | WHILE_MOD | UNTIL_MOD | RESCUE_MOD
438
- | IF | WHILE | UNTIL | UNLESS
439
-
440
- arg:
441
- lhs '=' arg
442
- {
443
- result = new_assign val[0], val[2]
444
- }
445
- | lhs '=' arg RESCUE_MOD arg
446
- {
447
- result = new_assign val[0], s(:rescue_mod, val[2], val[4])
448
- }
449
- | var_lhs OP_ASGN arg
450
- {
451
- result = new_op_asgn val[1].intern, val[0], val[2]
452
- }
453
- | primary_value '[@' aref_args ']' OP_ASGN arg
454
- {
455
- args = val[2]
456
- args.type = :arglist if args.type == :array
457
- result = s(:op_asgn1, val[0], val[2], val[4].intern, val[5])
458
- result.line = val[0].line
459
- }
460
- | primary_value '.' IDENTIFIER OP_ASGN arg
461
- {
462
- result = s(:op_asgn2, val[0], "#{val[2]}=".intern, val[3].intern, val[4])
463
- }
464
- | primary_value '.' CONSTANT OP_ASGN arg
465
- | primary_value '::' IDENTIFIER OP_ASGN arg
466
- | primary_value '::' CONSTANT OP_ASGN arg
467
- | '::@' CONSTANT OP_ASGN arg
468
- | backref OP_ASGN arg
469
- | arg '..' arg
470
- {
471
- result = s(:dot2, val[0], val[2])
472
- result.line = val[0].line
473
- }
474
- | arg '...' arg
475
- {
476
- result = s(:dot3, val[0], val[2])
477
- result.line = val[0].line
478
- }
479
- | arg '+' arg
480
- {
481
- result = new_call val[0], :"+", s(:arglist, val[2])
482
- }
483
- | arg '-' arg
484
- {
485
- result = new_call val[0], :"-", s(:arglist, val[2])
486
- }
487
- | arg '*' arg
488
- {
489
- result = new_call val[0], :"*", s(:arglist, val[2])
490
- }
491
- | arg '/' arg
492
- {
493
- result = new_call val[0], :"/", s(:arglist, val[2])
494
- }
495
- | arg '%' arg
496
- {
497
- result = new_call val[0], :"%", s(:arglist, val[2])
498
- }
499
- | arg '**' arg
500
- {
501
- result = new_call val[0], :"**", s(:arglist, val[2])
502
- }
503
- | '-@NUM' INTEGER '**' arg
504
- | '-@NUM' FLOAT '**' arg
505
- | '+@' arg
506
- {
507
- result = new_call val[1], :"+@", s(:arglist)
508
- result = val[1] if [:int, :float].include? val[1].type
509
- }
510
- | '-@' arg
511
- {
512
- result = new_call val[1], :"-@", s(:arglist)
513
- if val[1].type == :int
514
- val[1][1] = -val[1][1]
515
- result = val[1]
516
- elsif val[1].type == :float
517
- val[1][1] = -val[1][1].to_f
518
- result = val[1]
519
- end
520
- }
521
- | arg '|' arg
522
- {
523
- result = new_call val[0], :"|", s(:arglist, val[2])
524
- }
525
- | arg '^' arg
526
- {
527
- result = new_call val[0], :"^", s(:arglist, val[2])
528
- }
529
- | arg '&' arg
530
- {
531
- result = new_call val[0], :"&", s(:arglist, val[2])
532
- }
533
- | arg '<=>' arg
534
- {
535
- result = new_call val[0], :"<=>", s(:arglist, val[2])
536
- }
537
- | arg '>' arg
538
- {
539
- result = new_call val[0], :">", s(:arglist, val[2])
540
- }
541
- | arg '>=' arg
542
- {
543
- result = new_call val[0], :">=", s(:arglist, val[2])
544
- }
545
- | arg '<' arg
546
- {
547
- result = new_call val[0], :"<", s(:arglist, val[2])
548
- }
549
- | arg '<=' arg
550
- {
551
- result = new_call val[0], :"<=", s(:arglist, val[2])
552
- }
553
- | arg '==' arg
554
- {
555
- result = new_call val[0], :"==", s(:arglist, val[2])
556
- }
557
- | arg '===' arg
558
- {
559
- result = new_call val[0], :"===", s(:arglist, val[2])
560
- }
561
- | arg '!=' arg
562
- {
563
- result = s(:not, new_call(val[0], :"==", s(:arglist, val[2])))
564
- }
565
- | arg '=~' arg
566
- {
567
- result = new_call val[0], :"=~", s(:arglist, val[2])
568
- }
569
- | arg '!~' arg
570
- {
571
- result = s(:not, new_call(val[0], :"=~", s(:arglist, val[2])))
572
- }
573
- | '!' arg
574
- {
575
- result = s(:not, val[1])
576
- }
577
- | '~' arg
578
- {
579
- result = new_call val[1], :"~", s(:arglist)
580
- }
581
- | arg '<<' arg
582
- {
583
- result = new_call val[0], :"<<", s(:arglist, val[2])
584
- }
585
- | arg '>>' arg
586
- {
587
- result = new_call val[0], :">>", s(:arglist, val[2])
588
- }
589
- | arg '&&' arg
590
- {
591
- result = s(:and, val[0], val[2])
592
- result.line = val[0].line
593
- }
594
- | arg '||' arg
595
- {
596
- result = s(:or, val[0], val[2])
597
- result.line = val[0].line
598
- }
599
- | DEFINED opt_nl arg
600
- {
601
- result = s(:defined, val[2])
602
- }
603
- | arg '?' arg ':' arg
604
- {
605
- result = s(:if, val[0], val[2], val[4])
606
- result.line = val[0].line
607
- }
608
- | primary
609
-
610
- arg_value:
611
- arg
612
-
613
- aref_args:
614
- none
615
- {
616
- result = nil
617
- }
618
- | command opt_nl
619
- {
620
- result = s(:array, val[0])
621
- }
622
- | args trailer
623
- {
624
- result = val[0]
625
- }
626
- | args ',' assocs trailer
627
- {
628
- val[0] << s(:hash, *val[2])
629
- result = val[0]
630
- }
631
- | assocs trailer
632
- {
633
- result = s(:array, s(:hash, *val[0]))
634
- }
635
-
636
- paren_args:
637
- '(' none ')'
638
- {
639
- result = nil
640
- }
641
- | '(' call_args opt_nl ')'
642
- {
643
- result = val[1]
644
- }
645
- | '(' block_call opt_nl ')'
646
- | '(' args ',' block_call opt_nl ')'
647
-
648
- opt_paren_args:
649
- none
650
- | paren_args
651
-
652
- call_args:
653
- command
654
- {
655
- result = s(:array, val[0])
656
- }
657
- | args opt_block_arg
658
- {
659
- result = val[0]
660
- add_block_pass val[0], val[1]
661
- }
662
- | assocs opt_block_arg
663
- {
664
- result = s(:arglist, s(:hash, *val[0]))
665
- add_block_pass result, val[1]
666
- }
667
- | args ',' assocs opt_block_arg
668
- {
669
- result = val[0]
670
- result << s(:hash, *val[2])
671
- }
672
- | block_arg
673
- {
674
- result = s(:arglist)
675
- add_block_pass result, val[0]
676
- }
677
-
678
- call_args2:
679
- arg_value ',' args opt_block_arg
680
- | block_arg
681
-
682
- command_args:
683
- {
684
- lexer.cmdarg_push 1
685
- }
686
- open_args
687
- {
688
- lexer.cmdarg_pop
689
- result = val[1]
690
- }
691
-
692
- open_args:
693
- call_args
694
- | tLPAREN_ARG ')'
695
- {
696
- result = nil
697
- }
698
- | tLPAREN_ARG call_args2 ')'
699
- {
700
- result = val[1]
701
- }
702
-
703
- block_arg:
704
- '&@' arg_value
705
- {
706
- result = s(:block_pass, val[1])
707
- }
708
-
709
- opt_block_arg:
710
- ',' block_arg
711
- {
712
- result = val[1]
713
- }
714
- | none_block_pass
715
- {
716
- result = nil
717
- }
718
-
719
- args:
720
- arg_value
721
- {
722
- result = s(:array, val[0])
723
- }
724
- | SPLAT arg_value
725
- {
726
- result = s(:array, s(:splat, val[1]))
727
- }
728
- | args ',' arg_value
729
- {
730
- result = val[0] << val[2]
731
- }
732
- | args ',' SPLAT arg_value
733
- {
734
- result = val[0] << s(:splat, val[3])
735
- }
736
-
737
- mrhs:
738
- args ',' arg_value
739
- {
740
- val[0] << val[2]
741
- result = val[0]
742
- }
743
- | args ',' SPLAT arg_value
744
- | SPLAT arg_value
745
- {
746
- result = s(:splat, val[1])
747
- }
748
-
749
- primary:
750
- literal
751
- | strings
752
- | xstring
753
- | regexp
754
- | words
755
- | awords
756
- | var_ref
757
- | backref
758
- | FID
759
- | BEGIN
760
- {
761
- result = lexer.line
762
- }
763
- bodystmt END
764
- {
765
- result = s(:begin, val[2])
766
- result.line = val[1]
767
- }
768
- | tLPAREN_ARG expr opt_nl ')'
769
- {
770
- result = val[1]
771
- }
772
- | PAREN_BEG compstmt ')'
773
- {
774
- result = s(:paren, val[1] || s(:nil))
775
- }
776
- | primary_value '::' CONSTANT
777
- {
778
- result = s(:colon2, val[0], val[2].intern)
779
- }
780
- | '::@' CONSTANT
781
- {
782
- result = s(:colon3, val[1])
783
- }
784
- | primary_value '[@' aref_args ']'
785
- {
786
- result = new_call val[0], :[], val[2]
787
- }
788
- | '[' aref_args ']'
789
- {
790
- result = val[1] || s(:array)
791
- }
792
- | '{' assoc_list '}'
793
- {
794
- result = s(:hash, *val[1])
795
- }
796
- | RETURN
797
- {
798
- result = s(:return)
799
- }
800
- | YIELD '(' call_args ')'
801
- {
802
- result = new_yield val[2]
803
- }
804
- | YIELD '(' ')'
805
- {
806
- result = s(:yield)
807
- }
808
- | YIELD
809
- {
810
- result = s(:yield)
811
- }
812
- | DEFINED opt_nl '(' expr ')'
813
- {
814
- result = s(:defined, val[3])
815
- }
816
- | NOT '(' expr ')'
817
- {
818
- result = s(:not, val[2])
819
- result.line = val[2].line
820
- }
821
- | NOT '(' ')'
822
- {
823
- result = s(:not, s(:nil))
824
- }
825
- | operation brace_block
826
- {
827
- result = new_call nil, val[0].intern, s(:arglist)
828
- result << val[1]
829
- }
830
- | method_call
831
- | method_call brace_block
832
- {
833
- val[0] << val[1]
834
- result = val[0]
835
- }
836
- | LAMBDA lambda
837
- {
838
- result = val[1]
839
- }
840
- | IF expr_value then compstmt if_tail END
841
- {
842
- result = new_if val[1], val[3], val[4]
843
- }
844
- | UNLESS expr_value then compstmt opt_else END
845
- {
846
- result = new_if val[1], val[4], val[3]
847
- }
848
- | WHILE
849
- {
850
- lexer.cond_push 1
851
- result = lexer.line
852
- }
853
- expr_value do
854
- {
855
- lexer.cond_pop
856
- }
857
- compstmt END
858
- {
859
- result = s(:while, val[2], val[5], true)
860
- result.line = val[1]
861
- }
862
- | UNTIL
863
- {
864
- lexer.cond_push 1
865
- result = lexer.line
866
- }
867
- expr_value do
868
- {
869
- lexer.cond_pop
870
- }
871
- compstmt END
872
- {
873
- result = s(:until, val[2], val[5], true)
874
- result.line = val[1]
875
- }
876
- | CASE expr_value opt_terms case_body END
877
- {
878
- result = s(:case, val[1], *val[3])
879
- result.line = val[1].line
880
- }
881
- | CASE opt_terms case_body END
882
- {
883
- result = s(:case, nil, *val[2])
884
- # result.line = val[2].line
885
- }
886
- | CASE opt_terms ELSE compstmt END
887
- {
888
- result = s(:case, nil, val[3])
889
- # result.line = val[3].line
890
- }
891
- | FOR mlhs IN
892
- {
893
- result = "this.cond_push(1);"
894
- }
895
- expr_value do
896
- {
897
- result = "this.cond_pop();"
898
- }
899
- compstmt END
900
- | CLASS
901
- {
902
- result = lexer.line
903
- }
904
- cpath superclass
905
- {
906
- # ...
907
- }
908
- bodystmt END
909
- {
910
- result = new_class val[2], val[3], val[5]
911
- result.line = val[1]
912
- result.end_line = lexer.line
913
- }
914
- | CLASS '<<'
915
- {
916
- result = lexer.line
917
- }
918
- expr term
919
- {
920
- # ...
921
- }
922
- bodystmt END
923
- {
924
- result = new_sclass val[3], val[6]
925
- result.line = val[2]
926
- }
927
- | MODULE
928
- {
929
- result = lexer.line
930
- }
931
- cpath
932
- {
933
- # ...
934
- }
935
- bodystmt END
936
- {
937
- result = new_module val[2], val[4]
938
- result.line = val[1]
939
- result.end_line = lexer.line
940
- }
941
- | DEF fname
942
- {
943
- result = lexer.scope_line
944
- push_scope
945
- }
946
- f_arglist bodystmt END
947
- {
948
- result = new_def val[2], nil, val[1], val[3], val[4]
949
- pop_scope
950
- }
951
- | DEF singleton dot_or_colon
952
- {
953
- lexer.lex_state = :expr_fname
954
- }
955
- fname
956
- {
957
- result = lexer.scope_line
958
- push_scope
959
- }
960
- f_arglist bodystmt END
961
- {
962
- result = new_def val[5], val[1], val[4], val[6], val[7]
963
- pop_scope
964
- }
965
- | BREAK
966
- {
967
- result = s(:break)
968
- }
969
- | NEXT
970
- {
971
- result = s(:next)
972
- }
973
- | REDO
974
- {
975
- result = s(:redo)
976
- }
977
- | RETRY
978
-
979
- primary_value:
980
- primary
981
-
982
- then:
983
- term
984
- | ':'
985
- | THEN
986
- | term THEN
987
-
988
- do:
989
- term
990
- | ':'
991
- | DO_COND
992
-
993
- lambda:
994
- f_larglist lambda_body
995
- {
996
- result = new_call nil, :lambda, s(:arglist)
997
- result << new_iter(val[0], val[1])
998
- }
999
-
1000
- f_larglist:
1001
- '(' block_param ')'
1002
- {
1003
- result = val[1]
1004
- }
1005
- | '(' ')'
1006
- {
1007
- result = nil
1008
- }
1009
- | block_param
1010
- | none
1011
-
1012
- lambda_body:
1013
- LAMBEG compstmt '}'
1014
- {
1015
- result = val[1]
1016
- }
1017
- | DO_LAMBDA compstmt END
1018
- {
1019
- result = val[1]
1020
- }
1021
-
1022
- if_tail:
1023
- opt_else
1024
- {
1025
- result = val[0]
1026
- }
1027
- | ELSIF
1028
- {
1029
- result = lexer.line
1030
- }
1031
- expr_value then compstmt if_tail
1032
- {
1033
- result = s(:if, val[2], val[4], val[5])
1034
- result.line = val[1]
1035
- }
1036
-
1037
- opt_else:
1038
- none
1039
- | ELSE compstmt
1040
- {
1041
- result = val[1]
1042
- }
1043
-
1044
- f_block_optarg:
1045
- f_block_opt
1046
- {
1047
- result = s(:block, val[0])
1048
- }
1049
- | f_block_optarg ',' f_block_opt
1050
- {
1051
- val[0] << val[2]
1052
- result = val[0]
1053
- }
1054
-
1055
- f_block_opt:
1056
- IDENTIFIER '=' primary_value
1057
- {
1058
- result = new_assign new_assignable(s(:identifier, val[0].intern)), val[2]
1059
- }
1060
-
1061
- opt_block_var:
1062
- none
1063
- | '|' '|'
1064
- {
1065
- result = 0
1066
- }
1067
- | '||'
1068
- {
1069
- result = 0
1070
- }
1071
- | '|' block_param '|'
1072
- {
1073
- result = val[1]
1074
- }
1075
-
1076
- block_args_tail:
1077
- f_block_arg
1078
- {
1079
- result = val[0]
1080
- }
1081
-
1082
- opt_block_args_tail:
1083
- ',' block_args_tail
1084
- {
1085
- result = val[1]
1086
- }
1087
- | none
1088
- {
1089
- nil
1090
- }
1091
-
1092
- block_param:
1093
- f_arg ',' f_block_optarg ',' f_rest_arg opt_block_args_tail
1094
- {
1095
- result = new_block_args val[0], val[2], val[4], val[5]
1096
- }
1097
- | f_arg ',' f_block_optarg opt_block_args_tail
1098
- {
1099
- result = new_block_args val[0], val[2], nil, val[3]
1100
- }
1101
- | f_arg ',' f_rest_arg opt_block_args_tail
1102
- {
1103
- result = new_block_args val[0], nil, val[2], val[3]
1104
- }
1105
- | f_arg ','
1106
- {
1107
- result = new_block_args val[0], nil, nil, nil
1108
- }
1109
- | f_arg opt_block_args_tail
1110
- {
1111
- result = new_block_args val[0], nil, nil, val[1]
1112
- }
1113
- | f_block_optarg ',' f_rest_arg opt_block_args_tail
1114
- {
1115
- result = new_block_args nil, val[0], val[2], val[3]
1116
- }
1117
- | f_block_optarg opt_block_args_tail
1118
- {
1119
- result = new_block_args nil, val[0], nil, val[1]
1120
- }
1121
- | f_rest_arg opt_block_args_tail
1122
- {
1123
- result = new_block_args nil, nil, val[0], val[1]
1124
- }
1125
- | block_args_tail
1126
- {
1127
- result = new_block_args nil, nil, nil, val[0]
1128
- }
1129
-
1130
- do_block:
1131
- DO_BLOCK
1132
- {
1133
- push_scope :block
1134
- result = lexer.line
1135
- }
1136
- opt_block_var compstmt END
1137
- {
1138
- result = new_iter val[2], val[3]
1139
- result.line = val[1]
1140
- pop_scope
1141
- }
1142
-
1143
- block_call:
1144
- command do_block
1145
- {
1146
- val[0] << val[1]
1147
- result = val[0]
1148
- }
1149
- | block_call '.' operation2 opt_paren_args
1150
- | block_call '::' operation2 opt_paren_args
1151
-
1152
- method_call:
1153
- operation paren_args
1154
- {
1155
- result = new_call nil, val[0].intern, val[1]
1156
- }
1157
- | primary_value '.' operation2 opt_paren_args
1158
- {
1159
- result = new_call val[0], val[2].intern, val[3]
1160
- }
1161
- | primary_value '.' paren_args
1162
- {
1163
- result = new_call val[0], :call, val[2]
1164
- }
1165
- | primary_value '::' operation2 paren_args
1166
- {
1167
- result = new_call val[0], val[2].intern, val[3]
1168
- }
1169
- | primary_value '::' operation3
1170
- {
1171
- result = new_call val[0], val[2].intern, s(:arglist)
1172
- }
1173
- | SUPER paren_args
1174
- {
1175
- result = new_super val[1]
1176
- }
1177
- | SUPER
1178
- {
1179
- result = s(:super, nil)
1180
- }
1181
-
1182
- brace_block:
1183
- LCURLY
1184
- {
1185
- push_scope :block
1186
- result = lexer.line
1187
- }
1188
- opt_block_var compstmt '}'
1189
- {
1190
- result = new_iter val[2], val[3]
1191
- result.line = val[1]
1192
- pop_scope
1193
- }
1194
- | DO
1195
- {
1196
- push_scope :block
1197
- result = lexer.line
1198
- }
1199
- opt_block_var compstmt END
1200
- {
1201
- result = new_iter val[2], val[3]
1202
- result.line = val[1]
1203
- pop_scope
1204
- }
1205
-
1206
- case_body:
1207
- WHEN
1208
- {
1209
- result = lexer.line
1210
- }
1211
- args then compstmt cases
1212
- {
1213
- part = s(:when, val[2], val[4])
1214
- part.line = val[2].line
1215
- result = [part]
1216
- result.push *val[5] if val[5]
1217
- }
1218
-
1219
- cases:
1220
- opt_else
1221
- {
1222
- result = [val[0]]
1223
- }
1224
- | case_body
1225
-
1226
- opt_rescue:
1227
- RESCUE exc_list exc_var then compstmt opt_rescue
1228
- {
1229
- exc = val[1] || s(:array)
1230
- exc << new_assign(val[2], s(:gvar, '$!'.intern)) if val[2]
1231
- result = [s(:resbody, exc, val[4])]
1232
- result.push val[5].first if val[5]
1233
- }
1234
- |
1235
- {
1236
- result = nil
1237
- }
1238
-
1239
- exc_list:
1240
- arg_value
1241
- {
1242
- result = s(:array, val[0])
1243
- }
1244
- | mrhs
1245
- | none
1246
-
1247
- exc_var:
1248
- '=>' lhs
1249
- {
1250
- result = val[1]
1251
- }
1252
- | none
1253
- {
1254
- result = nil
1255
- }
1256
-
1257
- opt_ensure:
1258
- ENSURE compstmt
1259
- {
1260
- result = val[1].nil? ? s(:nil) : val[1]
1261
- }
1262
- | none
1263
-
1264
- literal:
1265
- numeric
1266
- | symbol
1267
- | dsym
1268
-
1269
- strings:
1270
- string
1271
- {
1272
- result = new_str val[0]
1273
- }
1274
-
1275
- string:
1276
- string1
1277
- | string string1
1278
-
1279
- string1:
1280
- STRING_BEG string_contents STRING_END
1281
- {
1282
- result = val[1]
1283
- }
1284
- | STRING
1285
- {
1286
- result = s(:str, val[0])
1287
- }
1288
-
1289
- xstring:
1290
- XSTRING_BEG xstring_contents STRING_END
1291
- {
1292
- result = new_xstr val[1]
1293
- }
1294
-
1295
- regexp:
1296
- REGEXP_BEG xstring_contents REGEXP_END
1297
- {
1298
- result = new_regexp val[1], val[2]
1299
- }
1300
-
1301
- words:
1302
- WORDS_BEG SPACE STRING_END
1303
- {
1304
- result = s(:array)
1305
- }
1306
- | WORDS_BEG word_list STRING_END
1307
- {
1308
- result = val[1]
1309
- }
1310
-
1311
- word_list:
1312
- none
1313
- {
1314
- result = s(:array)
1315
- }
1316
- | word_list word SPACE
1317
- {
1318
- part = val[1]
1319
- part = s(:dstr, "", val[1]) if part.type == :evstr
1320
- result = val[0] << part
1321
- }
1322
-
1323
- word:
1324
- string_content
1325
- {
1326
- result = val[0]
1327
- }
1328
- | word string_content
1329
- {
1330
- result = val[0].concat([val[1]])
1331
- }
1332
-
1333
- awords:
1334
- AWORDS_BEG SPACE STRING_END
1335
- {
1336
- result = s(:array)
1337
- }
1338
- | AWORDS_BEG qword_list STRING_END
1339
- {
1340
- result = val[1]
1341
- }
1342
-
1343
- qword_list:
1344
- none
1345
- {
1346
- result = s(:array)
1347
- }
1348
- | qword_list STRING_CONTENT SPACE
1349
- {
1350
- result = val[0] << s(:str, val[1])
1351
- }
1352
-
1353
- string_contents:
1354
- none
1355
- {
1356
- result = nil
1357
- }
1358
- | string_contents string_content
1359
- {
1360
- result = str_append val[0], val[1]
1361
- }
1362
-
1363
- xstring_contents:
1364
- none
1365
- {
1366
- result = nil
1367
- }
1368
- | xstring_contents string_content
1369
- {
1370
- result = str_append val[0], val[1]
1371
- }
1372
-
1373
- string_content:
1374
- STRING_CONTENT
1375
- {
1376
- result = s(:str, val[0])
1377
- }
1378
- | STRING_DVAR
1379
- {
1380
- result = lexer.strterm
1381
- lexer.strterm = nil
1382
- }
1383
- string_dvar
1384
- {
1385
- lexer.strterm = val[1]
1386
- result = s(:evstr, val[2])
1387
- }
1388
- | STRING_DBEG
1389
- {
1390
- lexer.cond_push 0
1391
- lexer.cmdarg_push 0
1392
- result = lexer.strterm
1393
- lexer.strterm = nil
1394
- lexer.lex_state = :expr_beg
1395
- }
1396
- compstmt '}'
1397
- {
1398
- lexer.strterm = val[1]
1399
- lexer.cond_lexpop
1400
- lexer.cmdarg_lexpop
1401
- result = s(:evstr, val[2])
1402
- }
1403
-
1404
- string_dvar:
1405
- GVAR
1406
- {
1407
- result = s(:gvar, val[0].intern)
1408
- }
1409
- | IVAR
1410
- {
1411
- result = s(:ivar, val[0].intern)
1412
- }
1413
- | CVAR
1414
- {
1415
- result = s(:cvar, val[0].intern)
1416
- }
1417
- | backref
1418
-
1419
-
1420
- symbol:
1421
- SYMBOL_BEG sym
1422
- {
1423
- result = s(:sym, val[1].intern)
1424
- lexer.lex_state = :expr_end
1425
- }
1426
- | SYMBOL
1427
- {
1428
- result = s(:sym, val[0].intern)
1429
- }
1430
-
1431
- sym: fname
1432
- | IVAR
1433
- | GVAR
1434
- | CVAR
1435
-
1436
- dsym:
1437
- SYMBOL_BEG xstring_contents STRING_END
1438
- {
1439
- result = new_dsym val[1]
1440
- }
1441
-
1442
- numeric:
1443
- INTEGER
1444
- {
1445
- result = s(:int, val[0])
1446
- }
1447
- | FLOAT
1448
- {
1449
- result = s(:float, val[0])
1450
- }
1451
- | '-@NUM' INTEGER =LOWEST
1452
- | '-@NUM' FLOAT =LOWEST
1453
-
1454
- variable:
1455
- IDENTIFIER
1456
- {
1457
- result = s(:identifier, val[0].intern)
1458
- }
1459
- | IVAR
1460
- {
1461
- result = s(:ivar, val[0].intern)
1462
- }
1463
- | GVAR
1464
- {
1465
- result = s(:gvar, val[0].intern)
1466
- }
1467
- | CONSTANT
1468
- {
1469
- result = s(:const, val[0].intern)
1470
- }
1471
- | CVAR
1472
- {
1473
- result = s(:cvar, val[0].intern)
1474
- }
1475
- | NIL
1476
- {
1477
- result = s(:nil)
1478
- }
1479
- | SELF
1480
- {
1481
- result = s(:self)
1482
- }
1483
- | TRUE
1484
- {
1485
- result = s(:true)
1486
- }
1487
- | FALSE
1488
- {
1489
- result = s(:false)
1490
- }
1491
- | FILE
1492
- {
1493
- result = s(:str, self.file)
1494
- }
1495
- | LINE
1496
- {
1497
- result = s(:int, lexer.line)
1498
- }
1499
-
1500
- var_ref:
1501
- variable
1502
- {
1503
- result = new_var_ref val[0]
1504
- }
1505
-
1506
- var_lhs:
1507
- variable
1508
- {
1509
- result = new_assignable val[0]
1510
- }
1511
-
1512
- backref:
1513
- NTH_REF
1514
- {
1515
- result = s(:nth_ref, val[0])
1516
- }
1517
- | BACK_REF
1518
-
1519
- superclass:
1520
- term
1521
- {
1522
- result = nil
1523
- }
1524
- | '<' expr_value term
1525
- {
1526
- result = val[1]
1527
- }
1528
- | error term
1529
- {
1530
- result = nil
1531
- }
1532
-
1533
- f_arglist:
1534
- '(' f_args opt_nl ')'
1535
- {
1536
- result = val[1]
1537
- lexer.lex_state = :expr_beg
1538
- }
1539
- | f_args term
1540
- {
1541
- result = val[0]
1542
- }
1543
-
1544
- f_args:
1545
- f_arg ',' f_optarg ',' f_rest_arg opt_f_block_arg
1546
- {
1547
- result = new_args val[0], val[2], val[4], val[5]
1548
- }
1549
- | f_arg ',' f_optarg opt_f_block_arg
1550
- {
1551
- result = new_args val[0], val[2], nil, val[3]
1552
- }
1553
- | f_arg ',' f_rest_arg opt_f_block_arg
1554
- {
1555
- result = new_args val[0], nil, val[2], val[3]
1556
- }
1557
- | f_arg opt_f_block_arg
1558
- {
1559
- result = new_args val[0], nil, nil, val[1]
1560
- }
1561
- | f_optarg ',' f_rest_arg opt_f_block_arg
1562
- {
1563
- result = new_args nil, val[0], val[2], val[3]
1564
- }
1565
- | f_optarg opt_f_block_arg
1566
- {
1567
- result = new_args nil, val[0], nil, val[1]
1568
- }
1569
- | f_rest_arg opt_f_block_arg
1570
- {
1571
- result = new_args nil, nil, val[0], val[1]
1572
- }
1573
- | f_block_arg
1574
- {
1575
- result = new_args nil, nil, nil, val[0]
1576
- }
1577
- |
1578
- {
1579
- result = s(:args)
1580
- }
1581
-
1582
- f_norm_arg:
1583
- CONSTANT
1584
- {
1585
- raise 'formal argument cannot be a constant'
1586
- }
1587
- | IVAR
1588
- {
1589
- raise 'formal argument cannot be an instance variable'
1590
- }
1591
- | CVAR
1592
- {
1593
- raise 'formal argument cannot be a class variable'
1594
- }
1595
- | GVAR
1596
- {
1597
- raise 'formal argument cannot be a global variable'
1598
- }
1599
- | IDENTIFIER
1600
- {
1601
- result = val[0].intern
1602
- scope.add_local result
1603
- }
1604
-
1605
- f_arg_item:
1606
- f_norm_arg
1607
- {
1608
- result = val[0]
1609
- }
1610
- | PAREN_BEG f_margs ')'
1611
- {
1612
- result = val[1]
1613
- }
1614
-
1615
- f_marg:
1616
- f_norm_arg
1617
- {
1618
- result = s(:lasgn, val[0])
1619
- }
1620
- | PAREN_BEG f_margs ')'
1621
-
1622
- f_marg_list:
1623
- f_marg
1624
- {
1625
- result = s(:array, val[0])
1626
- }
1627
- | f_marg_list ',' f_marg
1628
- {
1629
- val[0] << val[2]
1630
- result = val[0]
1631
- }
1632
-
1633
- f_margs:
1634
- f_marg_list
1635
- | f_marg_list ',' SPLAT f_norm_arg
1636
- | f_marg_list ',' SPLAT
1637
- | SPLAT f_norm_arg
1638
- | SPLAT
1639
-
1640
- f_arg:
1641
- f_arg_item
1642
- {
1643
- result = [val[0]]
1644
- }
1645
- | f_arg ',' f_arg_item
1646
- {
1647
- val[0] << val[2]
1648
- result = val[0]
1649
- }
1650
-
1651
- f_opt:
1652
- IDENTIFIER '=' arg_value
1653
- {
1654
- result = new_assign new_assignable(s(:identifier, val[0].intern)), val[2]
1655
- }
1656
-
1657
- f_optarg:
1658
- f_opt
1659
- {
1660
- result = s(:block, val[0])
1661
- }
1662
- | f_optarg ',' f_opt
1663
- {
1664
- result = val[0]
1665
- val[0] << val[2]
1666
- }
1667
-
1668
- restarg_mark:
1669
- '*'
1670
- | SPLAT
1671
-
1672
- f_rest_arg:
1673
- restarg_mark IDENTIFIER
1674
- {
1675
- result = "*#{val[1]}".intern
1676
- }
1677
- | restarg_mark
1678
- {
1679
- result = :"*"
1680
- }
1681
-
1682
- blkarg_mark:
1683
- '&'
1684
- | '&@'
1685
-
1686
- f_block_arg:
1687
- blkarg_mark IDENTIFIER
1688
- {
1689
- result = "&#{val[1]}".intern
1690
- }
1691
-
1692
- opt_f_block_arg:
1693
- ',' f_block_arg
1694
- {
1695
- result = val[1]
1696
- }
1697
- |
1698
- {
1699
- result = nil
1700
- }
1701
-
1702
- singleton:
1703
- var_ref
1704
- {
1705
- result = val[0]
1706
- }
1707
- | '(' expr opt_nl ')'
1708
- {
1709
- result = val[1]
1710
- }
1711
-
1712
- assoc_list:
1713
- none
1714
- {
1715
- result = []
1716
- }
1717
- | assocs trailer
1718
- {
1719
- result = val[0]
1720
- }
1721
- | args trailer
1722
- {
1723
- raise "unsupported assoc list type (#@line_number)"
1724
- }
1725
-
1726
- assocs:
1727
- assoc
1728
- {
1729
- result = val[0]
1730
- }
1731
- | assocs ',' assoc
1732
- {
1733
- result = val[0].push *val[2]
1734
- }
1735
-
1736
- assoc:
1737
- arg_value '=>' arg_value
1738
- {
1739
- result = [val[0], val[2]]
1740
- }
1741
- | LABEL arg_value
1742
- {
1743
- result = [s(:sym, val[0].intern), val[1]]
1744
- }
1745
-
1746
- operation:
1747
- IDENTIFIER
1748
- | CONSTANT
1749
- | FID
1750
-
1751
- operation2:
1752
- IDENTIFIER
1753
- | CONSTANT
1754
- | FID
1755
- | op
1756
-
1757
- operation3:
1758
- IDENTIFIER
1759
- | FID
1760
- | op
1761
-
1762
- dot_or_colon:
1763
- '.'
1764
- | '::'
1765
-
1766
- opt_terms:
1767
- | terms
1768
-
1769
- opt_nl:
1770
- | '\\n'
1771
-
1772
- trailer:
1773
- | '\\n'
1774
- | ','
1775
-
1776
- term:
1777
- ';'
1778
- | '\\n'
1779
-
1780
- terms:
1781
- term
1782
- | terms ';'
1783
-
1784
- none:
1785
-
1786
- none_block_pass:
1787
-
47
+ program: top_compstmt
48
+ {
49
+ result = val[0]
50
+ }
51
+
52
+ top_compstmt: top_stmts opt_terms
53
+ {
54
+ comp = new_compstmt val[0]
55
+ if comp and comp.type == :begin and comp.size == 2
56
+ result = comp[1]
57
+ result.line = comp.line
58
+ else
59
+ result = comp
60
+ end
61
+ }
62
+
63
+ top_stmts: # none
64
+ {
65
+ result = new_block
66
+ }
67
+ | top_stmt
68
+ {
69
+ result = new_block val[0]
70
+ }
71
+ | top_stmts terms top_stmt
72
+ {
73
+ val[0] << val[2]
74
+ result = val[0]
75
+ }
76
+
77
+ top_stmt: stmt
78
+ | klBEGIN tLCURLY top_compstmt tRCURLY
79
+ {
80
+ result = val[2]
81
+ }
82
+
83
+ bodystmt: compstmt opt_rescue opt_else opt_ensure
84
+ {
85
+ result = new_body val[0], val[1], val[2], val[3]
86
+ }
87
+
88
+ compstmt: stmts opt_terms
89
+ {
90
+ comp = new_compstmt val[0]
91
+ if comp and comp.type == :begin and comp.size == 2
92
+ result = comp[1]
93
+ result.line = comp.line
94
+ else
95
+ result = comp
96
+ end
97
+ }
98
+
99
+ stmts: # none
100
+ {
101
+ result = new_block
102
+ }
103
+ | stmt
104
+ {
105
+ result = new_block val[0]
106
+ }
107
+ | stmts terms stmt
108
+ {
109
+ val[0] << val[2]
110
+ result = val[0]
111
+ }
112
+
113
+ stmt: kALIAS fitem
114
+ {
115
+ lexer.lex_state = :expr_fname
116
+ }
117
+ fitem
118
+ {
119
+ result = s(:alias, val[1], val[3])
120
+ }
121
+ | kALIAS tGVAR tGVAR
122
+ {
123
+ result = s(:valias, val[1].intern, val[2].intern)
124
+ }
125
+ | kALIAS tGVAR tBACK_REF
126
+ | kALIAS tGVAR tNTH_REF
127
+ {
128
+ result = s(:valias, val[1].intern, val[2].intern)
129
+ }
130
+ | kUNDEF undef_list
131
+ {
132
+ result = val[1]
133
+ }
134
+ | stmt kIF_MOD expr_value
135
+ {
136
+ result = new_if val[2], val[0], nil
137
+ }
138
+ | stmt kUNLESS_MOD expr_value
139
+ {
140
+ result = new_if val[2], nil, val[0]
141
+ }
142
+ | stmt kWHILE_MOD expr_value
143
+ {
144
+ result = s(:while, val[2], val[0], true)
145
+ }
146
+ | stmt kUNTIL_MOD expr_value
147
+ {
148
+ result = s(:until, val[2], val[0], true)
149
+ }
150
+ | stmt kRESCUE_MOD stmt
151
+ {
152
+ result = s(:rescue_mod, val[0], val[2])
153
+ }
154
+ | klEND tLCURLY compstmt tRCURLY
155
+ | lhs tEQL command_call
156
+ {
157
+ result = new_assign val[0], val[2]
158
+ }
159
+ | mlhs tEQL command_call
160
+ {
161
+ result = s(:masgn, val[0], s(:to_ary, val[2]))
162
+ }
163
+ | var_lhs tOP_ASGN command_call
164
+ {
165
+ result = new_op_asgn val[1].intern, val[0], val[2]
166
+ }
167
+ | primary_value tLBRACK2 aref_args tRBRACK tOP_ASGN command_call
168
+ | primary_value tDOT tIDENTIFIER tOP_ASGN command_call
169
+ {
170
+ result = s(:op_asgn2, val[0], "#{val[2]}=".intern, val[3].intern, val[4])
171
+ }
172
+ | primary_value tDOT tCONSTANT tOP_ASGN command_call
173
+ | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
174
+ | backref tOP_ASGN command_call
175
+ | lhs tEQL mrhs
176
+ {
177
+ result = new_assign val[0], s(:svalue, val[2])
178
+ }
179
+ | mlhs tEQL arg_value
180
+ {
181
+ result = s(:masgn, val[0], s(:to_ary, val[2]))
182
+ }
183
+ | mlhs tEQL mrhs
184
+ {
185
+ result = s(:masgn, val[0], val[2])
186
+ }
187
+ | expr
188
+
189
+ expr: command_call
190
+ | expr kAND expr
191
+ {
192
+ result = s(:and, val[0], val[2])
193
+ result.line = val[0].line
194
+ }
195
+ | expr kOR expr
196
+ {
197
+ result = s(:or, val[0], val[2])
198
+ result.line = val[0].line
199
+ }
200
+ | kNOT expr
201
+ {
202
+ result = s(:not, val[1])
203
+ result.line = val[1].line
204
+ }
205
+ | tBANG command_call
206
+ {
207
+ result = s(:not, val[1])
208
+ }
209
+ | arg
210
+
211
+ expr_value: expr
212
+
213
+ command_call: command
214
+ | block_command
215
+ | kRETURN call_args
216
+ {
217
+ args = val[1]
218
+ args = args[1] if args.size == 2
219
+ result = s(:return, args)
220
+ }
221
+ | kBREAK call_args
222
+ {
223
+ args = val[1]
224
+ args = args[1] if args.size == 2
225
+ result = s(:break, args)
226
+ }
227
+ | kNEXT call_args
228
+ {
229
+ args = val[1]
230
+ args = args[1] if args.size == 2
231
+ result = s(:next, args)
232
+ }
233
+
234
+ block_command: block_call
235
+ | block_call tDOT operation2 command_args
236
+ | block_call tCOLON2 operation2 command_args
237
+
238
+ cmd_brace_block: tLBRACE_ARG opt_block_var compstmt tRCURLY
239
+
240
+ command: operation command_args =tLOWEST
241
+ {
242
+ result = new_call nil, val[0].intern, val[1]
243
+ }
244
+ | operation command_args cmd_brace_block
245
+ | primary_value tDOT operation2 command_args =tLOWEST
246
+ {
247
+ result = new_call val[0], val[2].intern, val[3]
248
+ }
249
+ | primary_value tDOT operation2 command_args cmd_brace_block
250
+ | primary_value tCOLON2 operation2 command_args =tLOWEST
251
+ {
252
+ result = new_call val[0], val[2].intern, val[3]
253
+ }
254
+ | primary_value tCOLON2 operation2 command_args cmd_brace_block
255
+ | kSUPER command_args
256
+ {
257
+ result = new_super val[1]
258
+ }
259
+ | kYIELD command_args
260
+ {
261
+ result = new_yield val[1]
262
+ }
263
+
264
+ mlhs: mlhs_basic
265
+ {
266
+ result = val[0]
267
+ }
268
+ | tLPAREN mlhs_entry tRPAREN
269
+ {
270
+ result = val[1]
271
+ }
272
+
273
+ mlhs_entry: mlhs_basic
274
+ {
275
+ result = val[0]
276
+ }
277
+ | tLPAREN mlhs_entry tRPAREN
278
+ {
279
+ result = val[1]
280
+ }
281
+
282
+ mlhs_basic: mlhs_head
283
+ {
284
+ result = val[0]
285
+ }
286
+ | mlhs_head mlhs_item
287
+ {
288
+ result = val[0] << val[1]
289
+ }
290
+ | mlhs_head tSTAR mlhs_node
291
+ {
292
+ result = val[0] << s(:splat, val[2])
293
+ }
294
+ | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post
295
+ | mlhs_head tSTAR
296
+ {
297
+ result = val[0] << s(:splat)
298
+ }
299
+ | mlhs_head tSTAR tCOMMA mlhs_post
300
+ | tSTAR mlhs_node
301
+ {
302
+ result = s(:array, s(:splat, val[1]))
303
+ }
304
+ | tSTAR
305
+ {
306
+ result = s(:array, s(:splat))
307
+ }
308
+ | tSTAR tCOMMA mlhs_post
309
+
310
+ mlhs_item: mlhs_node
311
+ {
312
+ result = val[0]
313
+ }
314
+ | tLPAREN mlhs_entry tRPAREN
315
+ {
316
+ result = val[1]
317
+ }
318
+
319
+ mlhs_head: mlhs_item tCOMMA
320
+ {
321
+ result = s(:array, val[0])
322
+ }
323
+ | mlhs_head mlhs_item tCOMMA
324
+ {
325
+ result = val[0] << val[1]
326
+ }
327
+
328
+ mlhs_post: mlhs_item
329
+ | mlhs_post tCOMMA mlhs_item
330
+
331
+ mlhs_node: variable
332
+ {
333
+ result = new_assignable val[0]
334
+ }
335
+ | primary_value tLBRACK2 aref_args tRBRACK
336
+ {
337
+ args = val[2]
338
+ args.type = :arglist if args.type == :array
339
+ result = s(:attrasgn, val[0], :[]=, args)
340
+ }
341
+ | primary_value tDOT tIDENTIFIER
342
+ {
343
+ result = new_call val[0], val[2].intern, s(:arglist)
344
+ }
345
+ | primary_value tCOLON2 tIDENTIFIER
346
+ | primary_value tDOT tCONSTANT
347
+ | primary_value tCOLON2 tCONSTANT
348
+ | tCOLON3 tCONSTANT
349
+ | backref
350
+
351
+ lhs: variable
352
+ {
353
+ result = new_assignable val[0]
354
+ }
355
+ | primary_value tLBRACK2 aref_args tRBRACK
356
+ {
357
+ args = val[2]
358
+ args.type = :arglist if args.type == :array
359
+ result = s(:attrasgn, val[0], :[]=, args)
360
+ }
361
+ | primary_value tDOT tIDENTIFIER
362
+ {
363
+ result = s(:attrasgn, val[0], "#{val[2]}=".intern, s(:arglist))
364
+ }
365
+ | primary_value tCOLON2 tIDENTIFIER
366
+ {
367
+ result = s(:attrasgn, val[0], "#{val[2]}=".intern, s(:arglist))
368
+ }
369
+ | primary_value tDOT tCONSTANT
370
+ {
371
+ result = s(:attrasgn, val[0], "#{val[2]}=".intern, s(:arglist))
372
+ }
373
+ | primary_value tCOLON2 tCONSTANT
374
+ {
375
+ result = s(:colon2, val[0], val[2].intern)
376
+ }
377
+ | tCOLON3 tCONSTANT
378
+ {
379
+ result = s(:colon3, val[1].intern)
380
+ }
381
+ | backref
382
+
383
+ cname: tCONSTANT
384
+
385
+ cpath: tCOLON3 cname
386
+ {
387
+ result = s(:colon3, val[1].intern)
388
+ }
389
+ | cname
390
+ {
391
+ result = val[0].intern
392
+ }
393
+ | primary_value tCOLON2 cname
394
+ {
395
+ result = s(:colon2, val[0], val[2].intern)
396
+ }
397
+
398
+ fname: tIDENTIFIER
399
+ | tCONSTANT
400
+ | tFID
401
+ | op
402
+ {
403
+ lexer.lex_state = :expr_end
404
+ result = val[0]
405
+ }
406
+ | reswords
407
+ {
408
+ lexer.lex_state = :expr_end
409
+ result = val[0]
410
+ }
411
+
412
+ fitem: fname
413
+ {
414
+ result = s(:sym, val[0].intern)
415
+ }
416
+ | symbol
417
+
418
+ undef_list: fitem
419
+ {
420
+ result = s(:undef, val[0])
421
+ }
422
+ | undef_list tCOMMA fitem
423
+ {
424
+ result = val[0] << val[2]
425
+ }
426
+
427
+ op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ
428
+ | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ
429
+ | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
430
+ | tSTAR | tDIVIDE | tPERCENT | tPOW | tBANG | tTILDE
431
+ | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2
432
+
433
+ reswords: k__LINE__ | k__FILE__ | klBEGIN | klEND | kALIAS | kAND
434
+ | kBEGIN | kBREAK | kCASE | kCLASS | kDEF | kDEFINED
435
+ | kDO | kELSE | kELSIF | kEND | kENSURE | kFALSE
436
+ | kFOR | kIN | kMODULE | kNEXT | kNIL | kNOT
437
+ | kOR | kREDO | kRESCUE | kRETRY | kRETURN | kSELF
438
+ | kSUPER | kTHEN | kTRUE | kUNDEF | kWHEN | kYIELD
439
+ | kIF_MOD | kUNLESS_MOD | kWHILE_MOD | kUNTIL_MOD | kRESCUE_MOD
440
+ | kIF | kWHILE | kUNTIL | kUNLESS
441
+
442
+ arg: lhs tEQL arg
443
+ {
444
+ result = new_assign val[0], val[2]
445
+ }
446
+ | lhs tEQL arg kRESCUE_MOD arg
447
+ {
448
+ result = new_assign val[0], s(:rescue_mod, val[2], val[4])
449
+ }
450
+ | var_lhs tOP_ASGN arg
451
+ {
452
+ result = new_op_asgn val[1].intern, val[0], val[2]
453
+ }
454
+ | primary_value tLBRACK2 aref_args tRBRACK tOP_ASGN arg
455
+ {
456
+ args = val[2]
457
+ args.type = :arglist if args.type == :array
458
+ result = s(:op_asgn1, val[0], val[2], val[4].intern, val[5])
459
+ result.line = val[0].line
460
+ }
461
+ | primary_value tDOT tIDENTIFIER tOP_ASGN arg
462
+ {
463
+ result = s(:op_asgn2, val[0], "#{val[2]}=".intern, val[3].intern, val[4])
464
+ }
465
+ | primary_value tDOT tCONSTANT tOP_ASGN arg
466
+ | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg
467
+ | primary_value tCOLON2 tCONSTANT tOP_ASGN arg
468
+ | tCOLON3 tCONSTANT tOP_ASGN arg
469
+ | backref tOP_ASGN arg
470
+ | arg tDOT2 arg
471
+ {
472
+ result = s(:irange, val[0], val[2])
473
+ result.line = val[0].line
474
+ }
475
+ | arg tDOT3 arg
476
+ {
477
+ result = s(:erange, val[0], val[2])
478
+ result.line = val[0].line
479
+ }
480
+ | arg tPLUS arg
481
+ {
482
+ result = new_call val[0], :"+", s(:arglist, val[2])
483
+ }
484
+ | arg tMINUS arg
485
+ {
486
+ result = new_call val[0], :"-", s(:arglist, val[2])
487
+ }
488
+ | arg tSTAR2 arg
489
+ {
490
+ result = new_call val[0], :"*", s(:arglist, val[2])
491
+ }
492
+ | arg tDIVIDE arg
493
+ {
494
+ result = new_call val[0], :"/", s(:arglist, val[2])
495
+ }
496
+ | arg tPERCENT arg
497
+ {
498
+ result = new_call val[0], :"%", s(:arglist, val[2])
499
+ }
500
+ | arg tPOW arg
501
+ {
502
+ result = new_call val[0], :"**", s(:arglist, val[2])
503
+ }
504
+ | '-@NUM' tINTEGER tPOW arg
505
+ | '-@NUM' tFLOAT tPOW arg
506
+ | tUPLUS arg
507
+ {
508
+ result = new_call val[1], :"+@", s(:arglist)
509
+ result = val[1] if [:int, :float].include? val[1].type
510
+ }
511
+ | tUMINUS arg
512
+ {
513
+ result = new_call val[1], :"-@", s(:arglist)
514
+ if val[1].type == :int
515
+ val[1][1] = -val[1][1]
516
+ result = val[1]
517
+ elsif val[1].type == :float
518
+ val[1][1] = -val[1][1].to_f
519
+ result = val[1]
520
+ end
521
+ }
522
+ | arg tPIPE arg
523
+ {
524
+ result = new_call val[0], :"|", s(:arglist, val[2])
525
+ }
526
+ | arg tCARET arg
527
+ {
528
+ result = new_call val[0], :"^", s(:arglist, val[2])
529
+ }
530
+ | arg tAMPER2 arg
531
+ {
532
+ result = new_call val[0], :"&", s(:arglist, val[2])
533
+ }
534
+ | arg tCMP arg
535
+ {
536
+ result = new_call val[0], :"<=>", s(:arglist, val[2])
537
+ }
538
+ | arg tGT arg
539
+ {
540
+ result = new_call val[0], :">", s(:arglist, val[2])
541
+ }
542
+ | arg tGEQ arg
543
+ {
544
+ result = new_call val[0], :">=", s(:arglist, val[2])
545
+ }
546
+ | arg tLT arg
547
+ {
548
+ result = new_call val[0], :"<", s(:arglist, val[2])
549
+ }
550
+ | arg tLEQ arg
551
+ {
552
+ result = new_call val[0], :"<=", s(:arglist, val[2])
553
+ }
554
+ | arg tEQ arg
555
+ {
556
+ result = new_call val[0], :"==", s(:arglist, val[2])
557
+ }
558
+ | arg tEQQ arg
559
+ {
560
+ result = new_call val[0], :"===", s(:arglist, val[2])
561
+ }
562
+ | arg tNEQ arg
563
+ {
564
+ result = s(:not, new_call(val[0], :"==", s(:arglist, val[2])))
565
+ }
566
+ | arg tMATCH arg
567
+ {
568
+ result = new_call val[0], :"=~", s(:arglist, val[2])
569
+ }
570
+ | arg tNMATCH arg
571
+ {
572
+ result = s(:not, new_call(val[0], :"=~", s(:arglist, val[2])))
573
+ }
574
+ | tBANG arg
575
+ {
576
+ result = s(:not, val[1])
577
+ }
578
+ | tTILDE arg
579
+ {
580
+ result = new_call val[1], :"~", s(:arglist)
581
+ }
582
+ | arg tLSHFT arg
583
+ {
584
+ result = new_call val[0], :"<<", s(:arglist, val[2])
585
+ }
586
+ | arg tRSHFT arg
587
+ {
588
+ result = new_call val[0], :">>", s(:arglist, val[2])
589
+ }
590
+ | arg tANDOP arg
591
+ {
592
+ result = s(:and, val[0], val[2])
593
+ result.line = val[0].line
594
+ }
595
+ | arg tOROP arg
596
+ {
597
+ result = s(:or, val[0], val[2])
598
+ result.line = val[0].line
599
+ }
600
+ | kDEFINED opt_nl arg
601
+ {
602
+ result = s(:defined, val[2])
603
+ }
604
+ | arg tEH arg tCOLON arg
605
+ {
606
+ result = s(:if, val[0], val[2], val[4])
607
+ result.line = val[0].line
608
+ }
609
+ | primary
610
+
611
+ arg_value: arg
612
+
613
+ aref_args: none
614
+ {
615
+ result = nil
616
+ }
617
+ | command opt_nl
618
+ {
619
+ result = s(:array, val[0])
620
+ }
621
+ | args trailer
622
+ {
623
+ result = val[0]
624
+ }
625
+ | args tCOMMA assocs trailer
626
+ {
627
+ val[0] << s(:hash, *val[2])
628
+ result = val[0]
629
+ }
630
+ | assocs trailer
631
+ {
632
+ result = s(:array, s(:hash, *val[0]))
633
+ }
634
+
635
+ paren_args: tLPAREN2 none tRPAREN
636
+ {
637
+ result = nil
638
+ }
639
+ | tLPAREN2 call_args opt_nl tRPAREN
640
+ {
641
+ result = val[1]
642
+ }
643
+ | tLPAREN2 block_call opt_nl tRPAREN
644
+ | tLPAREN2 args tCOMMA block_call opt_nl tRPAREN
645
+
646
+ opt_paren_args: none
647
+ | paren_args
648
+
649
+ call_args: command
650
+ {
651
+ result = s(:array, val[0])
652
+ }
653
+ | args opt_block_arg
654
+ {
655
+ result = val[0]
656
+ add_block_pass val[0], val[1]
657
+ }
658
+ | assocs opt_block_arg
659
+ {
660
+ result = s(:arglist, s(:hash, *val[0]))
661
+ add_block_pass result, val[1]
662
+ }
663
+ | args tCOMMA assocs opt_block_arg
664
+ {
665
+ result = val[0]
666
+ result << s(:hash, *val[2])
667
+ }
668
+ | block_arg
669
+ {
670
+ result = s(:arglist)
671
+ add_block_pass result, val[0]
672
+ }
673
+
674
+ call_args2: arg_value tCOMMA args opt_block_arg
675
+ | block_arg
676
+
677
+ command_args: {
678
+ lexer.cmdarg_push 1
679
+ }
680
+ open_args
681
+ {
682
+ lexer.cmdarg_pop
683
+ result = val[1]
684
+ }
685
+
686
+ open_args: call_args
687
+ | tLPAREN_ARG tRPAREN
688
+ {
689
+ result = nil
690
+ }
691
+ | tLPAREN_ARG call_args2 tRPAREN
692
+ {
693
+ result = val[1]
694
+ }
695
+
696
+ block_arg: tAMPER arg_value
697
+ {
698
+ result = s(:block_pass, val[1])
699
+ }
700
+
701
+ opt_block_arg: tCOMMA block_arg
702
+ {
703
+ result = val[1]
704
+ }
705
+ | # none
706
+ {
707
+ result = nil
708
+ }
709
+
710
+ args: arg_value
711
+ {
712
+ result = s(:array, val[0])
713
+ }
714
+ | tSTAR arg_value
715
+ {
716
+ result = s(:array, s(:splat, val[1]))
717
+ }
718
+ | args tCOMMA arg_value
719
+ {
720
+ result = val[0] << val[2]
721
+ }
722
+ | args tCOMMA tSTAR arg_value
723
+ {
724
+ result = val[0] << s(:splat, val[3])
725
+ }
726
+
727
+ mrhs: args tCOMMA arg_value
728
+ {
729
+ val[0] << val[2]
730
+ result = val[0]
731
+ }
732
+ | args tCOMMA tSTAR arg_value
733
+ | tSTAR arg_value
734
+ {
735
+ result = s(:splat, val[1])
736
+ }
737
+
738
+ primary: literal
739
+ | strings
740
+ | xstring
741
+ | regexp
742
+ | words
743
+ | awords
744
+ | var_ref
745
+ | backref
746
+ | tFID
747
+ | kBEGIN
748
+ {
749
+ result = lexer.line
750
+ }
751
+ bodystmt kEND
752
+ {
753
+ result = s(:begin, val[2])
754
+ result.line = val[1]
755
+ }
756
+ | tLPAREN_ARG expr opt_nl tRPAREN
757
+ {
758
+ result = val[1]
759
+ }
760
+ | tLPAREN compstmt tRPAREN
761
+ {
762
+ result = s(:paren, val[1] || s(:nil))
763
+ }
764
+ | primary_value tCOLON2 tCONSTANT
765
+ {
766
+ result = s(:colon2, val[0], val[2].intern)
767
+ }
768
+ | tCOLON3 tCONSTANT
769
+ {
770
+ result = s(:colon3, val[1])
771
+ }
772
+ | primary_value tLBRACK2 aref_args tRBRACK
773
+ {
774
+ result = new_call val[0], :[], val[2]
775
+ }
776
+ | tLBRACK aref_args tRBRACK
777
+ {
778
+ result = val[1] || s(:array)
779
+ }
780
+ | '{' assoc_list tRCURLY
781
+ {
782
+ result = s(:hash, *val[1])
783
+ }
784
+ | kRETURN
785
+ {
786
+ result = s(:return)
787
+ }
788
+ | kYIELD tLPAREN2 call_args tRPAREN
789
+ {
790
+ result = new_yield val[2]
791
+ }
792
+ | kYIELD tLPAREN2 tRPAREN
793
+ {
794
+ result = s(:yield)
795
+ }
796
+ | kYIELD
797
+ {
798
+ result = s(:yield)
799
+ }
800
+ | kDEFINED opt_nl tLPAREN2 expr tRPAREN
801
+ {
802
+ result = s(:defined, val[3])
803
+ }
804
+ | kNOT tLPAREN2 expr tRPAREN
805
+ {
806
+ result = s(:not, val[2])
807
+ result.line = val[2].line
808
+ }
809
+ | kNOT tLPAREN2 tRPAREN
810
+ {
811
+ result = s(:not, s(:nil))
812
+ }
813
+ | operation brace_block
814
+ {
815
+ result = new_call nil, val[0].intern, s(:arglist)
816
+ result << val[1]
817
+ }
818
+ | method_call
819
+ | method_call brace_block
820
+ {
821
+ val[0] << val[1]
822
+ result = val[0]
823
+ }
824
+ | tLAMBDA lambda
825
+ {
826
+ result = val[1]
827
+ }
828
+ | kIF expr_value then compstmt if_tail kEND
829
+ {
830
+ result = new_if val[1], val[3], val[4]
831
+ }
832
+ | kUNLESS expr_value then compstmt opt_else kEND
833
+ {
834
+ result = new_if val[1], val[4], val[3]
835
+ }
836
+ | kWHILE
837
+ {
838
+ lexer.cond_push 1
839
+ result = lexer.line
840
+ }
841
+ expr_value do
842
+ {
843
+ lexer.cond_pop
844
+ }
845
+ compstmt kEND
846
+ {
847
+ result = s(:while, val[2], val[5], true)
848
+ result.line = val[1]
849
+ }
850
+ | kUNTIL
851
+ {
852
+ lexer.cond_push 1
853
+ result = lexer.line
854
+ }
855
+ expr_value do
856
+ {
857
+ lexer.cond_pop
858
+ }
859
+ compstmt kEND
860
+ {
861
+ result = s(:until, val[2], val[5], true)
862
+ result.line = val[1]
863
+ }
864
+ | kCASE expr_value opt_terms case_body kEND
865
+ {
866
+ result = s(:case, val[1], *val[3])
867
+ result.line = val[1].line
868
+ }
869
+ | kCASE opt_terms case_body kEND
870
+ {
871
+ result = s(:case, nil, *val[2])
872
+ # result.line = val[2].line
873
+ }
874
+ | kCASE opt_terms kELSE compstmt kEND
875
+ {
876
+ result = s(:case, nil, val[3])
877
+ # result.line = val[3].line
878
+ }
879
+ | kFOR mlhs kIN
880
+ {
881
+ # ...
882
+ }
883
+ expr_value do
884
+ {
885
+ # ...
886
+ }
887
+ compstmt kEND
888
+ | kCLASS
889
+ {
890
+ result = lexer.line
891
+ }
892
+ cpath superclass
893
+ {
894
+ # ...
895
+ }
896
+ bodystmt kEND
897
+ {
898
+ result = new_class val[2], val[3], val[5]
899
+ result.line = val[1]
900
+ result.end_line = lexer.line
901
+ }
902
+ | kCLASS tLSHFT
903
+ {
904
+ result = lexer.line
905
+ }
906
+ expr term
907
+ {
908
+ # ...
909
+ }
910
+ bodystmt kEND
911
+ {
912
+ result = new_sclass val[3], val[6]
913
+ result.line = val[2]
914
+ }
915
+ | kMODULE
916
+ {
917
+ result = lexer.line
918
+ }
919
+ cpath
920
+ {
921
+ # ...
922
+ }
923
+ bodystmt kEND
924
+ {
925
+ result = new_module val[2], val[4]
926
+ result.line = val[1]
927
+ result.end_line = lexer.line
928
+ }
929
+ | kDEF fname
930
+ {
931
+ result = lexer.scope_line
932
+ push_scope
933
+ }
934
+ f_arglist bodystmt kEND
935
+ {
936
+ result = new_def val[2], nil, val[1], val[3], val[4]
937
+ pop_scope
938
+ }
939
+ | kDEF singleton dot_or_colon
940
+ {
941
+ lexer.lex_state = :expr_fname
942
+ }
943
+ fname
944
+ {
945
+ result = lexer.scope_line
946
+ push_scope
947
+ }
948
+ f_arglist bodystmt kEND
949
+ {
950
+ result = new_def val[5], val[1], val[4], val[6], val[7]
951
+ pop_scope
952
+ }
953
+ | kBREAK
954
+ {
955
+ result = s(:break)
956
+ }
957
+ | kNEXT
958
+ {
959
+ result = s(:next)
960
+ }
961
+ | kREDO
962
+ {
963
+ result = s(:redo)
964
+ }
965
+ | kRETRY
966
+
967
+ primary_value: primary
968
+
969
+ then: term
970
+ | tCOLON
971
+ | kTHEN
972
+ | term kTHEN
973
+
974
+ do: term
975
+ | tCOLON
976
+ | kDO_COND
977
+
978
+ lambda: f_larglist lambda_body
979
+ {
980
+ result = new_call nil, :lambda, s(:arglist)
981
+ result << new_iter(val[0], val[1])
982
+ }
983
+
984
+ f_larglist: tLPAREN2 block_param tRPAREN
985
+ {
986
+ result = val[1]
987
+ }
988
+ | tLPAREN2 tRPAREN
989
+ {
990
+ result = nil
991
+ }
992
+ | block_param
993
+ | none
994
+
995
+ lambda_body: tLAMBEG compstmt tRCURLY
996
+ {
997
+ result = val[1]
998
+ }
999
+ | kDO_LAMBDA compstmt kEND
1000
+ {
1001
+ result = val[1]
1002
+ }
1003
+
1004
+ if_tail: opt_else
1005
+ {
1006
+ result = val[0]
1007
+ }
1008
+ | kELSIF
1009
+ {
1010
+ result = lexer.line
1011
+ }
1012
+ expr_value then compstmt if_tail
1013
+ {
1014
+ result = s(:if, val[2], val[4], val[5])
1015
+ result.line = val[1]
1016
+ }
1017
+
1018
+ opt_else: none
1019
+ | kELSE compstmt
1020
+ {
1021
+ result = val[1]
1022
+ }
1023
+
1024
+ f_block_optarg: f_block_opt
1025
+ {
1026
+ result = s(:block, val[0])
1027
+ }
1028
+ | f_block_optarg tCOMMA f_block_opt
1029
+ {
1030
+ val[0] << val[2]
1031
+ result = val[0]
1032
+ }
1033
+
1034
+ f_block_opt: tIDENTIFIER tEQL primary_value
1035
+ {
1036
+ result = new_assign new_assignable(s(:identifier, val[0].intern)), val[2]
1037
+ }
1038
+
1039
+ opt_block_var: none
1040
+ | tPIPE tPIPE
1041
+ {
1042
+ result = 0
1043
+ }
1044
+ | tOROP
1045
+ {
1046
+ result = 0
1047
+ }
1048
+ | tPIPE block_param tPIPE
1049
+ {
1050
+ result = val[1]
1051
+ }
1052
+
1053
+ block_args_tail: f_block_arg
1054
+ {
1055
+ result = val[0]
1056
+ }
1057
+
1058
+ opt_block_args_tail: tCOMMA block_args_tail
1059
+ {
1060
+ result = val[1]
1061
+ }
1062
+ | none
1063
+ {
1064
+ nil
1065
+ }
1066
+
1067
+ block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1068
+ {
1069
+ result = new_block_args val[0], val[2], val[4], val[5]
1070
+ }
1071
+ | f_arg tCOMMA f_block_optarg opt_block_args_tail
1072
+ {
1073
+ result = new_block_args val[0], val[2], nil, val[3]
1074
+ }
1075
+ | f_arg tCOMMA f_rest_arg opt_block_args_tail
1076
+ {
1077
+ result = new_block_args val[0], nil, val[2], val[3]
1078
+ }
1079
+ | f_arg tCOMMA
1080
+ {
1081
+ result = new_block_args val[0], nil, nil, nil
1082
+ }
1083
+ | f_arg opt_block_args_tail
1084
+ {
1085
+ result = new_block_args val[0], nil, nil, val[1]
1086
+ }
1087
+ | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1088
+ {
1089
+ result = new_block_args nil, val[0], val[2], val[3]
1090
+ }
1091
+ | f_block_optarg opt_block_args_tail
1092
+ {
1093
+ result = new_block_args nil, val[0], nil, val[1]
1094
+ }
1095
+ | f_rest_arg opt_block_args_tail
1096
+ {
1097
+ result = new_block_args nil, nil, val[0], val[1]
1098
+ }
1099
+ | block_args_tail
1100
+ {
1101
+ result = new_block_args nil, nil, nil, val[0]
1102
+ }
1103
+
1104
+ do_block: kDO_BLOCK
1105
+ {
1106
+ push_scope :block
1107
+ result = lexer.line
1108
+ }
1109
+ opt_block_var compstmt kEND
1110
+ {
1111
+ result = new_iter val[2], val[3]
1112
+ result.line = val[1]
1113
+ pop_scope
1114
+ }
1115
+
1116
+ block_call: command do_block
1117
+ {
1118
+ val[0] << val[1]
1119
+ result = val[0]
1120
+ }
1121
+ | block_call tDOT operation2 opt_paren_args
1122
+ | block_call tCOLON2 operation2 opt_paren_args
1123
+
1124
+ method_call: operation paren_args
1125
+ {
1126
+ result = new_call nil, val[0].intern, val[1]
1127
+ }
1128
+ | primary_value tDOT operation2 opt_paren_args
1129
+ {
1130
+ result = new_call val[0], val[2].intern, val[3]
1131
+ }
1132
+ | primary_value tDOT paren_args
1133
+ {
1134
+ result = new_call val[0], :call, val[2]
1135
+ }
1136
+ | primary_value tCOLON2 operation2 paren_args
1137
+ {
1138
+ result = new_call val[0], val[2].intern, val[3]
1139
+ }
1140
+ | primary_value tCOLON2 operation3
1141
+ {
1142
+ result = new_call val[0], val[2].intern, s(:arglist)
1143
+ }
1144
+ | kSUPER paren_args
1145
+ {
1146
+ result = new_super val[1]
1147
+ }
1148
+ | kSUPER
1149
+ {
1150
+ result = s(:super, nil)
1151
+ }
1152
+
1153
+ brace_block: tLCURLY
1154
+ {
1155
+ push_scope :block
1156
+ result = lexer.line
1157
+ }
1158
+ opt_block_var compstmt tRCURLY
1159
+ {
1160
+ result = new_iter val[2], val[3]
1161
+ result.line = val[1]
1162
+ pop_scope
1163
+ }
1164
+ | kDO
1165
+ {
1166
+ push_scope :block
1167
+ result = lexer.line
1168
+ }
1169
+ opt_block_var compstmt kEND
1170
+ {
1171
+ result = new_iter val[2], val[3]
1172
+ result.line = val[1]
1173
+ pop_scope
1174
+ }
1175
+
1176
+ case_body: kWHEN
1177
+ {
1178
+ result = lexer.line
1179
+ }
1180
+ args then compstmt cases
1181
+ {
1182
+ part = s(:when, val[2], val[4])
1183
+ part.line = val[2].line
1184
+ result = [part]
1185
+ result.push *val[5] if val[5]
1186
+ }
1187
+
1188
+ cases: opt_else
1189
+ {
1190
+ result = [val[0]]
1191
+ }
1192
+ | case_body
1193
+
1194
+ opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue
1195
+ {
1196
+ exc = val[1] || s(:array)
1197
+ exc << new_assign(val[2], s(:gvar, '$!'.intern)) if val[2]
1198
+ result = [s(:resbody, exc, val[4])]
1199
+ result.push val[5].first if val[5]
1200
+ }
1201
+ | # none
1202
+ {
1203
+ result = nil
1204
+ }
1205
+
1206
+ exc_list: arg_value
1207
+ {
1208
+ result = s(:array, val[0])
1209
+ }
1210
+ | mrhs
1211
+ | none
1212
+
1213
+ exc_var: tASSOC lhs
1214
+ {
1215
+ result = val[1]
1216
+ }
1217
+ | none
1218
+ {
1219
+ result = nil
1220
+ }
1221
+
1222
+ opt_ensure: kENSURE compstmt
1223
+ {
1224
+ result = val[1].nil? ? s(:nil) : val[1]
1225
+ }
1226
+ | none
1227
+
1228
+ literal: numeric
1229
+ | symbol
1230
+ | dsym
1231
+
1232
+ strings: string
1233
+ {
1234
+ result = new_str val[0]
1235
+ }
1236
+
1237
+ string: string1
1238
+ | string string1
1239
+
1240
+ string1: tSTRING_BEG string_contents tSTRING_END
1241
+ {
1242
+ result = val[1]
1243
+ }
1244
+ | tSTRING
1245
+ {
1246
+ result = s(:str, val[0])
1247
+ }
1248
+
1249
+ xstring: tXSTRING_BEG xstring_contents tSTRING_END
1250
+ {
1251
+ result = new_xstr val[1]
1252
+ }
1253
+
1254
+ regexp: tREGEXP_BEG xstring_contents tREGEXP_END
1255
+ {
1256
+ result = new_regexp val[1], val[2]
1257
+ }
1258
+
1259
+ words: tWORDS_BEG tSPACE tSTRING_END
1260
+ {
1261
+ result = s(:array)
1262
+ }
1263
+ | tWORDS_BEG word_list tSTRING_END
1264
+ {
1265
+ result = val[1]
1266
+ }
1267
+
1268
+ word_list: none
1269
+ {
1270
+ result = s(:array)
1271
+ }
1272
+ | word_list word tSPACE
1273
+ {
1274
+ part = val[1]
1275
+ part = s(:dstr, "", val[1]) if part.type == :evstr
1276
+ result = val[0] << part
1277
+ }
1278
+
1279
+ word: string_content
1280
+ {
1281
+ result = val[0]
1282
+ }
1283
+ | word string_content
1284
+ {
1285
+ result = val[0].concat([val[1]])
1286
+ }
1287
+
1288
+ awords: tAWORDS_BEG tSPACE tSTRING_END
1289
+ {
1290
+ result = s(:array)
1291
+ }
1292
+ | tAWORDS_BEG qword_list tSTRING_END
1293
+ {
1294
+ result = val[1]
1295
+ }
1296
+
1297
+ qword_list: none
1298
+ {
1299
+ result = s(:array)
1300
+ }
1301
+ | qword_list tSTRING_CONTENT tSPACE
1302
+ {
1303
+ result = val[0] << s(:str, val[1])
1304
+ }
1305
+
1306
+ string_contents: none
1307
+ {
1308
+ result = nil
1309
+ }
1310
+ | string_contents string_content
1311
+ {
1312
+ result = str_append val[0], val[1]
1313
+ }
1314
+
1315
+ xstring_contents: none
1316
+ {
1317
+ result = nil
1318
+ }
1319
+ | xstring_contents string_content
1320
+ {
1321
+ result = str_append val[0], val[1]
1322
+ }
1323
+
1324
+ string_content: tSTRING_CONTENT
1325
+ {
1326
+ result = s(:str, val[0])
1327
+ }
1328
+ | tSTRING_DVAR
1329
+ {
1330
+ result = lexer.strterm
1331
+ lexer.strterm = nil
1332
+ }
1333
+ string_dvar
1334
+ {
1335
+ lexer.strterm = val[1]
1336
+ result = s(:evstr, val[2])
1337
+ }
1338
+ | tSTRING_DBEG
1339
+ {
1340
+ lexer.cond_push 0
1341
+ lexer.cmdarg_push 0
1342
+ result = lexer.strterm
1343
+ lexer.strterm = nil
1344
+ lexer.lex_state = :expr_beg
1345
+ }
1346
+ compstmt tRCURLY
1347
+ {
1348
+ lexer.strterm = val[1]
1349
+ lexer.cond_lexpop
1350
+ lexer.cmdarg_lexpop
1351
+ result = s(:evstr, val[2])
1352
+ }
1353
+
1354
+ string_dvar: tGVAR
1355
+ {
1356
+ result = s(:gvar, val[0].intern)
1357
+ }
1358
+ | tIVAR
1359
+ {
1360
+ result = s(:ivar, val[0].intern)
1361
+ }
1362
+ | tCVAR
1363
+ {
1364
+ result = s(:cvar, val[0].intern)
1365
+ }
1366
+ | backref
1367
+
1368
+
1369
+ symbol: tSYMBEG sym
1370
+ {
1371
+ result = s(:sym, val[1].intern)
1372
+ lexer.lex_state = :expr_end
1373
+ }
1374
+ | tSYMBOL
1375
+ {
1376
+ result = s(:sym, val[0].intern)
1377
+ }
1378
+
1379
+ sym: fname
1380
+ | tIVAR
1381
+ | tGVAR
1382
+ | tCVAR
1383
+
1384
+ dsym: tSYMBEG xstring_contents tSTRING_END
1385
+ {
1386
+ result = new_dsym val[1]
1387
+ }
1388
+
1389
+ numeric: tINTEGER
1390
+ {
1391
+ result = s(:int, val[0])
1392
+ }
1393
+ | tFLOAT
1394
+ {
1395
+ result = s(:float, val[0])
1396
+ }
1397
+ | '-@NUM' tINTEGER =tLOWEST
1398
+ | '-@NUM' tFLOAT =tLOWEST
1399
+
1400
+ variable: tIDENTIFIER
1401
+ {
1402
+ result = s(:identifier, val[0].intern)
1403
+ }
1404
+ | tIVAR
1405
+ {
1406
+ result = s(:ivar, val[0].intern)
1407
+ }
1408
+ | tGVAR
1409
+ {
1410
+ result = s(:gvar, val[0].intern)
1411
+ }
1412
+ | tCONSTANT
1413
+ {
1414
+ result = s(:const, val[0].intern)
1415
+ }
1416
+ | tCVAR
1417
+ {
1418
+ result = s(:cvar, val[0].intern)
1419
+ }
1420
+ | kNIL
1421
+ {
1422
+ result = s(:nil)
1423
+ }
1424
+ | kSELF
1425
+ {
1426
+ result = s(:self)
1427
+ }
1428
+ | kTRUE
1429
+ {
1430
+ result = s(:true)
1431
+ }
1432
+ | kFALSE
1433
+ {
1434
+ result = s(:false)
1435
+ }
1436
+ | k__FILE__
1437
+ {
1438
+ result = s(:str, self.file)
1439
+ }
1440
+ | k__LINE__
1441
+ {
1442
+ result = s(:int, lexer.line)
1443
+ }
1444
+
1445
+ var_ref: variable
1446
+ {
1447
+ result = new_var_ref val[0]
1448
+ }
1449
+
1450
+ var_lhs: variable
1451
+ {
1452
+ result = new_assignable val[0]
1453
+ }
1454
+
1455
+ backref: tNTH_REF
1456
+ {
1457
+ result = s(:nth_ref, val[0])
1458
+ }
1459
+ | tBACK_REF
1460
+
1461
+ superclass: term
1462
+ {
1463
+ result = nil
1464
+ }
1465
+ | tLT expr_value term
1466
+ {
1467
+ result = val[1]
1468
+ }
1469
+ | error term
1470
+ {
1471
+ result = nil
1472
+ }
1473
+
1474
+ f_arglist: tLPAREN2 f_args opt_nl tRPAREN
1475
+ {
1476
+ result = val[1]
1477
+ lexer.lex_state = :expr_beg
1478
+ }
1479
+ | f_args term
1480
+ {
1481
+ result = val[0]
1482
+ }
1483
+
1484
+ f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_f_block_arg
1485
+ {
1486
+ result = new_args val[0], val[2], val[4], val[5]
1487
+ }
1488
+ | f_arg tCOMMA f_optarg opt_f_block_arg
1489
+ {
1490
+ result = new_args val[0], val[2], nil, val[3]
1491
+ }
1492
+ | f_arg tCOMMA f_rest_arg opt_f_block_arg
1493
+ {
1494
+ result = new_args val[0], nil, val[2], val[3]
1495
+ }
1496
+ | f_arg opt_f_block_arg
1497
+ {
1498
+ result = new_args val[0], nil, nil, val[1]
1499
+ }
1500
+ | f_optarg tCOMMA f_rest_arg opt_f_block_arg
1501
+ {
1502
+ result = new_args nil, val[0], val[2], val[3]
1503
+ }
1504
+ | f_optarg opt_f_block_arg
1505
+ {
1506
+ result = new_args nil, val[0], nil, val[1]
1507
+ }
1508
+ | f_rest_arg opt_f_block_arg
1509
+ {
1510
+ result = new_args nil, nil, val[0], val[1]
1511
+ }
1512
+ | f_block_arg
1513
+ {
1514
+ result = new_args nil, nil, nil, val[0]
1515
+ }
1516
+ | # none
1517
+ {
1518
+ result = s(:args)
1519
+ }
1520
+
1521
+ f_norm_arg: f_bad_arg
1522
+ | tIDENTIFIER
1523
+ {
1524
+ result = val[0].intern
1525
+ scope.add_local result
1526
+ }
1527
+
1528
+ f_bad_arg: tCONSTANT
1529
+ {
1530
+ raise 'formal argument cannot be a constant'
1531
+ }
1532
+ | tIVAR
1533
+ {
1534
+ raise 'formal argument cannot be an instance variable'
1535
+ }
1536
+ | tCVAR
1537
+ {
1538
+ raise 'formal argument cannot be a class variable'
1539
+ }
1540
+ | tGVAR
1541
+ {
1542
+ raise 'formal argument cannot be a global variable'
1543
+ }
1544
+
1545
+ f_arg_item: f_norm_arg
1546
+ {
1547
+ result = val[0]
1548
+ }
1549
+ | tLPAREN f_margs tRPAREN
1550
+ {
1551
+ result = val[1]
1552
+ }
1553
+
1554
+ f_marg: f_norm_arg
1555
+ {
1556
+ result = s(:lasgn, val[0])
1557
+ }
1558
+ | tLPAREN f_margs tRPAREN
1559
+
1560
+ f_marg_list: f_marg
1561
+ {
1562
+ result = s(:array, val[0])
1563
+ }
1564
+ | f_marg_list tCOMMA f_marg
1565
+ {
1566
+ val[0] << val[2]
1567
+ result = val[0]
1568
+ }
1569
+
1570
+ f_margs: f_marg_list
1571
+ | f_marg_list tCOMMA tSTAR f_norm_arg
1572
+ | f_marg_list tCOMMA tSTAR
1573
+ | tSTAR f_norm_arg
1574
+ | tSTAR
1575
+
1576
+ f_arg: f_arg_item
1577
+ {
1578
+ result = [val[0]]
1579
+ }
1580
+ | f_arg tCOMMA f_arg_item
1581
+ {
1582
+ val[0] << val[2]
1583
+ result = val[0]
1584
+ }
1585
+
1586
+ f_opt: tIDENTIFIER tEQL arg_value
1587
+ {
1588
+ result = new_assign new_assignable(s(:identifier, val[0].intern)), val[2]
1589
+ }
1590
+
1591
+ f_optarg: f_opt
1592
+ {
1593
+ result = s(:block, val[0])
1594
+ }
1595
+ | f_optarg tCOMMA f_opt
1596
+ {
1597
+ result = val[0]
1598
+ val[0] << val[2]
1599
+ }
1600
+
1601
+ restarg_mark: tSTAR2
1602
+ | tSTAR
1603
+
1604
+ f_rest_arg: restarg_mark tIDENTIFIER
1605
+ {
1606
+ result = "*#{val[1]}".intern
1607
+ }
1608
+ | restarg_mark
1609
+ {
1610
+ result = :"*"
1611
+ }
1612
+
1613
+ blkarg_mark: tAMPER2
1614
+ | tAMPER
1615
+
1616
+ f_block_arg: blkarg_mark tIDENTIFIER
1617
+ {
1618
+ result = "&#{val[1]}".intern
1619
+ }
1620
+
1621
+ opt_f_block_arg: tCOMMA f_block_arg
1622
+ {
1623
+ result = val[1]
1624
+ }
1625
+ | # none
1626
+ {
1627
+ result = nil
1628
+ }
1629
+
1630
+ singleton: var_ref
1631
+ {
1632
+ result = val[0]
1633
+ }
1634
+ | tLPAREN2 expr opt_nl tRPAREN
1635
+ {
1636
+ result = val[1]
1637
+ }
1638
+
1639
+ assoc_list: # none
1640
+ {
1641
+ result = []
1642
+ }
1643
+ | assocs trailer
1644
+ {
1645
+ result = val[0]
1646
+ }
1647
+
1648
+ assocs: assoc
1649
+ {
1650
+ result = val[0]
1651
+ }
1652
+ | assocs tCOMMA assoc
1653
+ {
1654
+ result = val[0].push *val[2]
1655
+ }
1656
+
1657
+ assoc: arg_value tASSOC arg_value
1658
+ {
1659
+ result = [val[0], val[2]]
1660
+ }
1661
+ | tLABEL arg_value
1662
+ {
1663
+ result = [s(:sym, val[0].intern), val[1]]
1664
+ }
1665
+
1666
+ operation: tIDENTIFIER
1667
+ | tCONSTANT
1668
+ | tFID
1669
+
1670
+ operation2: tIDENTIFIER
1671
+ | tCONSTANT
1672
+ | tFID
1673
+ | op
1674
+
1675
+ operation3: tIDENTIFIER
1676
+ | tFID
1677
+ | op
1678
+
1679
+ dot_or_colon: tDOT
1680
+ | tCOLON2
1681
+
1682
+ opt_terms: # none
1683
+ | terms
1684
+
1685
+ opt_nl: # none
1686
+ | tNL
1687
+
1688
+ trailer: # none
1689
+ | tNL
1690
+ | tCOMMA
1691
+
1692
+ term: tSEMI
1693
+ | tNL
1694
+
1695
+ terms: term
1696
+ | terms tSEMI
1697
+
1698
+ none: # none
1699
+ {
1700
+ result = nil
1701
+ }
1788
1702
  end
1789
1703
 
1790
1704
  ---- inner