opal 0.5.2 → 0.5.4

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