parser 2.2.2.6 → 2.2.3.0

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.
@@ -1462,9 +1462,17 @@ opt_block_args_tail:
1462
1462
  lambda: {
1463
1463
  @static_env.extend_dynamic
1464
1464
  }
1465
- f_larglist lambda_body
1465
+ f_larglist
1466
1466
  {
1467
- result = [ val[1], val[2] ]
1467
+ result = @lexer.cmdarg.dup
1468
+ @lexer.cmdarg.clear
1469
+ }
1470
+ lambda_body
1471
+ {
1472
+ @lexer.cmdarg = val[2]
1473
+ @lexer.cmdarg.lexpop
1474
+
1475
+ result = [ val[1], val[3] ]
1468
1476
 
1469
1477
  @static_env.unextend
1470
1478
  }
@@ -1471,9 +1471,17 @@ opt_block_args_tail:
1471
1471
  lambda: {
1472
1472
  @static_env.extend_dynamic
1473
1473
  }
1474
- f_larglist lambda_body
1474
+ f_larglist
1475
1475
  {
1476
- result = [ val[1], val[2] ]
1476
+ result = @lexer.cmdarg.dup
1477
+ @lexer.cmdarg.clear
1478
+ }
1479
+ lambda_body
1480
+ {
1481
+ @lexer.cmdarg = val[2]
1482
+ @lexer.cmdarg.lexpop
1483
+
1484
+ result = [ val[1], val[3] ]
1477
1485
 
1478
1486
  @static_env.unextend
1479
1487
  }
@@ -0,0 +1,2144 @@
1
+ class Parser::RubyMotion
2
+
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 tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ
11
+ tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF
12
+ tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN
13
+ tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE
14
+ tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE
15
+ tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY
16
+ tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG tREGEXP_OPT
17
+ tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END
18
+ tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA tLAMBEG
19
+ tCHARACTER
20
+
21
+ prechigh
22
+ right tBANG tTILDE tUPLUS
23
+ right tPOW
24
+ right tUMINUS_NUM tUMINUS
25
+ left tSTAR2 tDIVIDE tPERCENT
26
+ left tPLUS tMINUS
27
+ left tLSHFT tRSHFT
28
+ left tAMPER2
29
+ left tPIPE tCARET
30
+ left tGT tGEQ tLT tLEQ
31
+ nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
32
+ left tANDOP
33
+ left tOROP
34
+ nonassoc tDOT2 tDOT3
35
+ right tEH tCOLON
36
+ left kRESCUE_MOD
37
+ right tEQL tOP_ASGN
38
+ nonassoc kDEFINED
39
+ right kNOT
40
+ left kOR kAND
41
+ nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD
42
+ nonassoc tLBRACE_ARG
43
+ nonassoc tLOWEST
44
+ preclow
45
+
46
+ rule
47
+
48
+ program: compstmt
49
+
50
+ bodystmt: compstmt opt_rescue opt_else opt_ensure
51
+ {
52
+ rescue_bodies = val[1]
53
+ else_t, else_ = val[2]
54
+ ensure_t, ensure_ = val[3]
55
+
56
+ if rescue_bodies.empty? && !else_.nil?
57
+ diagnostic :warning, :useless_else, nil, else_t
58
+ end
59
+
60
+ result = @builder.begin_body(val[0],
61
+ rescue_bodies,
62
+ else_t, else_,
63
+ ensure_t, ensure_)
64
+ }
65
+
66
+ compstmt: stmts opt_terms
67
+ {
68
+ result = @builder.compstmt(val[0])
69
+ }
70
+
71
+ stmts: # nothing
72
+ {
73
+ result = []
74
+ }
75
+ | stmt
76
+ {
77
+ result = [ val[0] ]
78
+ }
79
+ | stmts terms stmt
80
+ {
81
+ result = val[0] << val[2]
82
+ }
83
+ | error stmt
84
+ {
85
+ result = [ val[1] ]
86
+ }
87
+
88
+ stmt: kALIAS fitem
89
+ {
90
+ @lexer.state = :expr_fname
91
+ }
92
+ fitem
93
+ {
94
+ result = @builder.alias(val[0], val[1], val[3])
95
+ }
96
+ | kALIAS tGVAR tGVAR
97
+ {
98
+ result = @builder.alias(val[0],
99
+ @builder.gvar(val[1]),
100
+ @builder.gvar(val[2]))
101
+ }
102
+ | kALIAS tGVAR tBACK_REF
103
+ {
104
+ result = @builder.alias(val[0],
105
+ @builder.gvar(val[1]),
106
+ @builder.back_ref(val[2]))
107
+ }
108
+ | kALIAS tGVAR tNTH_REF
109
+ {
110
+ diagnostic :error, :nth_ref_alias, nil, val[2]
111
+ }
112
+ | kUNDEF undef_list
113
+ {
114
+ result = @builder.undef_method(val[0], val[1])
115
+ }
116
+ | stmt kIF_MOD expr_value
117
+ {
118
+ result = @builder.condition_mod(val[0], nil,
119
+ val[1], val[2])
120
+ }
121
+ | stmt kUNLESS_MOD expr_value
122
+ {
123
+ result = @builder.condition_mod(nil, val[0],
124
+ val[1], val[2])
125
+ }
126
+ | stmt kWHILE_MOD expr_value
127
+ {
128
+ result = @builder.loop_mod(:while, val[0], val[1], val[2])
129
+ }
130
+ | stmt kUNTIL_MOD expr_value
131
+ {
132
+ result = @builder.loop_mod(:until, val[0], val[1], val[2])
133
+ }
134
+ | stmt kRESCUE_MOD stmt
135
+ {
136
+ rescue_body = @builder.rescue_body(val[1],
137
+ nil, nil, nil,
138
+ nil, val[2])
139
+
140
+ result = @builder.begin_body(val[0], [ rescue_body ])
141
+ }
142
+ | klBEGIN tLCURLY compstmt tRCURLY
143
+ {
144
+ if in_def?
145
+ diagnostic :error, :begin_in_method, nil, val[0]
146
+ end
147
+
148
+ result = @builder.preexe(val[0], val[1], val[2], val[3])
149
+ }
150
+ | klEND tLCURLY compstmt tRCURLY
151
+ {
152
+ result = @builder.postexe(val[0], val[1], val[2], val[3])
153
+ }
154
+ | lhs tEQL command_call
155
+ {
156
+ result = @builder.assign(val[0], val[1], val[2])
157
+ }
158
+ | mlhs tEQL command_call
159
+ {
160
+ result = @builder.multi_assign(val[0], val[1], val[2])
161
+ }
162
+ | var_lhs tOP_ASGN command_call
163
+ {
164
+ result = @builder.op_assign(val[0], val[1], val[2])
165
+ }
166
+ | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_call
167
+ {
168
+ result = @builder.op_assign(
169
+ @builder.index(
170
+ val[0], val[1], val[2], val[3]),
171
+ val[4], val[5])
172
+ }
173
+ | primary_value tDOT tIDENTIFIER tOP_ASGN command_call
174
+ {
175
+ result = @builder.op_assign(
176
+ @builder.call_method(
177
+ val[0], val[1], val[2]),
178
+ val[3], val[4])
179
+ }
180
+ | primary_value tDOT tCONSTANT tOP_ASGN command_call
181
+ {
182
+ result = @builder.op_assign(
183
+ @builder.call_method(
184
+ val[0], val[1], val[2]),
185
+ val[3], val[4])
186
+ }
187
+ | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
188
+ {
189
+ result = @builder.op_assign(
190
+ @builder.call_method(
191
+ val[0], val[1], val[2]),
192
+ val[3], val[4])
193
+ }
194
+ | backref tOP_ASGN command_call
195
+ {
196
+ @builder.op_assign(val[0], val[1], val[2])
197
+ }
198
+ | lhs tEQL mrhs
199
+ {
200
+ result = @builder.assign(val[0], val[1],
201
+ @builder.array(nil, val[2], nil))
202
+ }
203
+ | mlhs tEQL arg_value
204
+ {
205
+ result = @builder.multi_assign(val[0], val[1], val[2])
206
+ }
207
+ | mlhs tEQL mrhs
208
+ {
209
+ result = @builder.multi_assign(val[0], val[1],
210
+ @builder.array(nil, val[2], nil))
211
+ }
212
+ | expr
213
+
214
+ expr: command_call
215
+ | expr kAND expr
216
+ {
217
+ result = @builder.logical_op(:and, val[0], val[1], val[2])
218
+ }
219
+ | expr kOR expr
220
+ {
221
+ result = @builder.logical_op(:or, val[0], val[1], val[2])
222
+ }
223
+ | kNOT opt_nl expr
224
+ {
225
+ result = @builder.not_op(val[0], nil, val[2], nil)
226
+ }
227
+ | tBANG command_call
228
+ {
229
+ result = @builder.not_op(val[0], nil, val[1], nil)
230
+ }
231
+ | arg
232
+
233
+ expr_value: expr
234
+
235
+ command_call: command
236
+ | block_command
237
+ | kRETURN call_args
238
+ {
239
+ result = @builder.keyword_cmd(:return, val[0],
240
+ nil, val[1], nil)
241
+ }
242
+ | kBREAK call_args
243
+ {
244
+ result = @builder.keyword_cmd(:break, val[0],
245
+ nil, val[1], nil)
246
+ }
247
+ | kNEXT call_args
248
+ {
249
+ result = @builder.keyword_cmd(:next, val[0],
250
+ nil, val[1], nil)
251
+ }
252
+
253
+ block_command: block_call
254
+ | block_call tDOT operation2 command_args
255
+ {
256
+ result = @builder.call_method(val[0], val[1], val[2],
257
+ *val[3])
258
+ }
259
+ | block_call tCOLON2 operation2 command_args
260
+ {
261
+ result = @builder.call_method(val[0], val[1], val[2],
262
+ *val[3])
263
+ }
264
+
265
+ cmd_brace_block: tLBRACE_ARG
266
+ {
267
+ @static_env.extend_dynamic
268
+ }
269
+ opt_block_param compstmt tRCURLY
270
+ {
271
+ result = [ val[0], val[2], val[3], val[4] ]
272
+
273
+ @static_env.unextend
274
+ }
275
+
276
+ command: operation command_args =tLOWEST
277
+ {
278
+ result = @builder.call_method(nil, nil, val[0],
279
+ *val[1])
280
+ }
281
+ | operation command_args cmd_brace_block
282
+ {
283
+ method_call = @builder.call_method(nil, nil, val[0],
284
+ *val[1])
285
+
286
+ begin_t, args, body, end_t = val[2]
287
+ result = @builder.block(method_call,
288
+ begin_t, args, body, end_t)
289
+ }
290
+ | primary_value tDOT operation2 command_args =tLOWEST
291
+ {
292
+ result = @builder.call_method(val[0], val[1], val[2],
293
+ *val[3])
294
+ }
295
+ | primary_value tDOT operation2 command_args cmd_brace_block
296
+ {
297
+ method_call = @builder.call_method(val[0], val[1], val[2],
298
+ *val[3])
299
+
300
+ begin_t, args, body, end_t = val[4]
301
+ result = @builder.block(method_call,
302
+ begin_t, args, body, end_t)
303
+ }
304
+ | primary_value tCOLON2 operation2 command_args =tLOWEST
305
+ {
306
+ result = @builder.call_method(val[0], val[1], val[2],
307
+ *val[3])
308
+ }
309
+ | primary_value tCOLON2 operation2 command_args cmd_brace_block
310
+ {
311
+ method_call = @builder.call_method(val[0], val[1], val[2],
312
+ *val[3])
313
+
314
+ begin_t, args, body, end_t = val[4]
315
+ result = @builder.block(method_call,
316
+ begin_t, args, body, end_t)
317
+ }
318
+ | kSUPER command_args
319
+ {
320
+ result = @builder.keyword_cmd(:super, val[0],
321
+ *val[1])
322
+ }
323
+ | kYIELD command_args
324
+ {
325
+ result = @builder.keyword_cmd(:yield, val[0],
326
+ *val[1])
327
+ }
328
+
329
+ mlhs: mlhs_basic
330
+ {
331
+ result = @builder.multi_lhs(nil, val[0], nil)
332
+ }
333
+ | tLPAREN mlhs_inner rparen
334
+ {
335
+ result = @builder.begin(val[0], val[1], val[2])
336
+ }
337
+
338
+ mlhs_inner: mlhs_basic
339
+ {
340
+ result = @builder.multi_lhs(nil, val[0], nil)
341
+ }
342
+ | tLPAREN mlhs_inner rparen
343
+ {
344
+ result = @builder.multi_lhs(val[0], val[1], val[2])
345
+ }
346
+
347
+ mlhs_basic: mlhs_head
348
+ | mlhs_head mlhs_item
349
+ {
350
+ result = val[0].
351
+ push(val[1])
352
+ }
353
+ | mlhs_head tSTAR mlhs_node
354
+ {
355
+ result = val[0].
356
+ push(@builder.splat(val[1], val[2]))
357
+ }
358
+ | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post
359
+ {
360
+ result = val[0].
361
+ push(@builder.splat(val[1], val[2])).
362
+ concat(val[4])
363
+ }
364
+ | mlhs_head tSTAR
365
+ {
366
+ result = val[0].
367
+ push(@builder.splat(val[1]))
368
+ }
369
+ | mlhs_head tSTAR tCOMMA mlhs_post
370
+ {
371
+ result = val[0].
372
+ push(@builder.splat(val[1])).
373
+ concat(val[3])
374
+ }
375
+ | tSTAR mlhs_node
376
+ {
377
+ result = [ @builder.splat(val[0], val[1]) ]
378
+ }
379
+ | tSTAR mlhs_node tCOMMA mlhs_post
380
+ {
381
+ result = [ @builder.splat(val[0], val[1]),
382
+ *val[3] ]
383
+ }
384
+ | tSTAR
385
+ {
386
+ result = [ @builder.splat(val[0]) ]
387
+ }
388
+ | tSTAR tCOMMA mlhs_post
389
+ {
390
+ result = [ @builder.splat(val[0]),
391
+ *val[2] ]
392
+ }
393
+
394
+ mlhs_item: mlhs_node
395
+ | tLPAREN mlhs_inner rparen
396
+ {
397
+ result = @builder.begin(val[0], val[1], val[2])
398
+ }
399
+
400
+ mlhs_head: mlhs_item tCOMMA
401
+ {
402
+ result = [ val[0] ]
403
+ }
404
+ | mlhs_head mlhs_item tCOMMA
405
+ {
406
+ result = val[0] << val[1]
407
+ }
408
+
409
+ mlhs_post: mlhs_item
410
+ {
411
+ result = [ val[0] ]
412
+ }
413
+ | mlhs_post tCOMMA mlhs_item
414
+ {
415
+ result = val[0] << val[2]
416
+ }
417
+
418
+ mlhs_node: variable
419
+ {
420
+ result = @builder.assignable(val[0])
421
+ }
422
+ | primary_value tLBRACK2 opt_call_args rbracket
423
+ {
424
+ result = @builder.index_asgn(val[0], val[1], val[2], val[3])
425
+ }
426
+ | primary_value tDOT tIDENTIFIER
427
+ {
428
+ result = @builder.attr_asgn(val[0], val[1], val[2])
429
+ }
430
+ | primary_value tCOLON2 tIDENTIFIER
431
+ {
432
+ result = @builder.attr_asgn(val[0], val[1], val[2])
433
+ }
434
+ | primary_value tDOT tCONSTANT
435
+ {
436
+ result = @builder.attr_asgn(val[0], val[1], val[2])
437
+ }
438
+ | primary_value tCOLON2 tCONSTANT
439
+ {
440
+ result = @builder.assignable(
441
+ @builder.const_fetch(val[0], val[1], val[2]))
442
+ }
443
+ | tCOLON3 tCONSTANT
444
+ {
445
+ result = @builder.assignable(
446
+ @builder.const_global(val[0], val[1]))
447
+ }
448
+ | backref
449
+ {
450
+ result = @builder.assignable(val[0])
451
+ }
452
+
453
+ lhs: variable
454
+ {
455
+ result = @builder.assignable(val[0])
456
+ }
457
+ | primary_value tLBRACK2 opt_call_args rbracket
458
+ {
459
+ result = @builder.index_asgn(val[0], val[1], val[2], val[3])
460
+ }
461
+ | primary_value tDOT tIDENTIFIER
462
+ {
463
+ result = @builder.attr_asgn(val[0], val[1], val[2])
464
+ }
465
+ | primary_value tCOLON2 tIDENTIFIER
466
+ {
467
+ result = @builder.attr_asgn(val[0], val[1], val[2])
468
+ }
469
+ | primary_value tDOT tCONSTANT
470
+ {
471
+ result = @builder.attr_asgn(val[0], val[1], val[2])
472
+ }
473
+ | primary_value tCOLON2 tCONSTANT
474
+ {
475
+ result = @builder.assignable(
476
+ @builder.const_fetch(val[0], val[1], val[2]))
477
+ }
478
+ | tCOLON3 tCONSTANT
479
+ {
480
+ result = @builder.assignable(
481
+ @builder.const_global(val[0], val[1]))
482
+ }
483
+ | backref
484
+ {
485
+ result = @builder.assignable(val[0])
486
+ }
487
+
488
+ cname: tIDENTIFIER
489
+ {
490
+ diagnostic :error, :module_name_const, nil, val[0]
491
+ }
492
+ | tCONSTANT
493
+
494
+ cpath: tCOLON3 cname
495
+ {
496
+ result = @builder.const_global(val[0], val[1])
497
+ }
498
+ | cname
499
+ {
500
+ result = @builder.const(val[0])
501
+ }
502
+ | primary_value tCOLON2 cname
503
+ {
504
+ result = @builder.const_fetch(val[0], val[1], val[2])
505
+ }
506
+
507
+ fname: tIDENTIFIER | tCONSTANT | tFID
508
+ | op
509
+ | reswords
510
+
511
+ fsym: fname
512
+ {
513
+ result = @builder.symbol(val[0])
514
+ }
515
+ | symbol
516
+
517
+ fitem: fsym
518
+ | dsym
519
+
520
+ undef_list: fitem
521
+ {
522
+ result = [ val[0] ]
523
+ }
524
+ | undef_list tCOMMA
525
+ {
526
+ @lexer.state = :expr_fname
527
+ }
528
+ fitem
529
+ {
530
+ result = val[0] << val[3]
531
+ }
532
+
533
+ op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ
534
+ | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ
535
+ | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
536
+ | tSTAR | tDIVIDE | tPERCENT | tPOW | tBANG | tTILDE
537
+ | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2
538
+
539
+ reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND
540
+ | kALIAS | kAND | kBEGIN | kBREAK | kCASE
541
+ | kCLASS | kDEF | kDEFINED | kDO | kELSE
542
+ | kELSIF | kEND | kENSURE | kFALSE | kFOR
543
+ | kIN | kMODULE | kNEXT | kNIL | kNOT
544
+ | kOR | kREDO | kRESCUE | kRETRY | kRETURN
545
+ | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF
546
+ | kWHEN | kYIELD | kIF | kUNLESS | kWHILE
547
+ | kUNTIL
548
+
549
+ arg: lhs tEQL arg
550
+ {
551
+ result = @builder.assign(val[0], val[1], val[2])
552
+ }
553
+ | lhs tEQL arg kRESCUE_MOD arg
554
+ {
555
+ rescue_body = @builder.rescue_body(val[3],
556
+ nil, nil, nil,
557
+ nil, val[4])
558
+
559
+ rescue_ = @builder.begin_body(val[2], [ rescue_body ])
560
+
561
+ result = @builder.assign(val[0], val[1], rescue_)
562
+ }
563
+ | var_lhs tOP_ASGN arg
564
+ {
565
+ result = @builder.op_assign(val[0], val[1], val[2])
566
+ }
567
+ | var_lhs tOP_ASGN arg kRESCUE_MOD arg
568
+ {
569
+ rescue_body = @builder.rescue_body(val[3],
570
+ nil, nil, nil,
571
+ nil, val[4])
572
+
573
+ rescue_ = @builder.begin_body(val[2], [ rescue_body ])
574
+
575
+ result = @builder.op_assign(val[0], val[1], rescue_)
576
+ }
577
+ | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg
578
+ {
579
+ result = @builder.op_assign(
580
+ @builder.index(
581
+ val[0], val[1], val[2], val[3]),
582
+ val[4], val[5])
583
+ }
584
+ | primary_value tDOT tIDENTIFIER tOP_ASGN arg
585
+ {
586
+ result = @builder.op_assign(
587
+ @builder.call_method(
588
+ val[0], val[1], val[2]),
589
+ val[3], val[4])
590
+ }
591
+ | primary_value tDOT tCONSTANT tOP_ASGN arg
592
+ {
593
+ result = @builder.op_assign(
594
+ @builder.call_method(
595
+ val[0], val[1], val[2]),
596
+ val[3], val[4])
597
+ }
598
+ | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg
599
+ {
600
+ result = @builder.op_assign(
601
+ @builder.call_method(
602
+ val[0], val[1], val[2]),
603
+ val[3], val[4])
604
+ }
605
+ | primary_value tCOLON2 tCONSTANT tOP_ASGN arg
606
+ {
607
+ diagnostic :error, :dynamic_const, nil, val[2], [ val[3] ]
608
+ }
609
+ | tCOLON3 tCONSTANT tOP_ASGN arg
610
+ {
611
+ diagnostic :error, :dynamic_const, nil, val[1], [ val[2] ]
612
+ }
613
+ | backref tOP_ASGN arg
614
+ {
615
+ result = @builder.op_assign(val[0], val[1], val[2])
616
+ }
617
+ | arg tDOT2 arg
618
+ {
619
+ result = @builder.range_inclusive(val[0], val[1], val[2])
620
+ }
621
+ | arg tDOT3 arg
622
+ {
623
+ result = @builder.range_exclusive(val[0], val[1], val[2])
624
+ }
625
+ | arg tPLUS arg
626
+ {
627
+ result = @builder.binary_op(val[0], val[1], val[2])
628
+ }
629
+ | arg tMINUS arg
630
+ {
631
+ result = @builder.binary_op(val[0], val[1], val[2])
632
+ }
633
+ | arg tSTAR2 arg
634
+ {
635
+ result = @builder.binary_op(val[0], val[1], val[2])
636
+ }
637
+ | arg tDIVIDE arg
638
+ {
639
+ result = @builder.binary_op(val[0], val[1], val[2])
640
+ }
641
+ | arg tPERCENT arg
642
+ {
643
+ result = @builder.binary_op(val[0], val[1], val[2])
644
+ }
645
+ | arg tPOW arg
646
+ {
647
+ result = @builder.binary_op(val[0], val[1], val[2])
648
+ }
649
+ | tUMINUS_NUM tINTEGER tPOW arg
650
+ {
651
+ result = @builder.unary_op(val[0],
652
+ @builder.binary_op(
653
+ @builder.integer(val[1]),
654
+ val[2], val[3]))
655
+ }
656
+ | tUMINUS_NUM tFLOAT tPOW arg
657
+ {
658
+ result = @builder.unary_op(val[0],
659
+ @builder.binary_op(
660
+ @builder.float(val[1]),
661
+ val[2], val[3]))
662
+ }
663
+ | tUPLUS arg
664
+ {
665
+ result = @builder.unary_op(val[0], val[1])
666
+ }
667
+ | tUMINUS arg
668
+ {
669
+ result = @builder.unary_op(val[0], val[1])
670
+ }
671
+ | arg tPIPE arg
672
+ {
673
+ result = @builder.binary_op(val[0], val[1], val[2])
674
+ }
675
+ | arg tCARET arg
676
+ {
677
+ result = @builder.binary_op(val[0], val[1], val[2])
678
+ }
679
+ | arg tAMPER2 arg
680
+ {
681
+ result = @builder.binary_op(val[0], val[1], val[2])
682
+ }
683
+ | arg tCMP arg
684
+ {
685
+ result = @builder.binary_op(val[0], val[1], val[2])
686
+ }
687
+ | arg tGT arg
688
+ {
689
+ result = @builder.binary_op(val[0], val[1], val[2])
690
+ }
691
+ | arg tGEQ arg
692
+ {
693
+ result = @builder.binary_op(val[0], val[1], val[2])
694
+ }
695
+ | arg tLT arg
696
+ {
697
+ result = @builder.binary_op(val[0], val[1], val[2])
698
+ }
699
+ | arg tLEQ arg
700
+ {
701
+ result = @builder.binary_op(val[0], val[1], val[2])
702
+ }
703
+ | arg tEQ arg
704
+ {
705
+ result = @builder.binary_op(val[0], val[1], val[2])
706
+ }
707
+ | arg tEQQ arg
708
+ {
709
+ result = @builder.binary_op(val[0], val[1], val[2])
710
+ }
711
+ | arg tNEQ arg
712
+ {
713
+ result = @builder.binary_op(val[0], val[1], val[2])
714
+ }
715
+ | arg tMATCH arg
716
+ {
717
+ result = @builder.match_op(val[0], val[1], val[2])
718
+ }
719
+ | arg tNMATCH arg
720
+ {
721
+ result = @builder.binary_op(val[0], val[1], val[2])
722
+ }
723
+ | tBANG arg
724
+ {
725
+ result = @builder.not_op(val[0], nil, val[1], nil)
726
+ }
727
+ | tTILDE arg
728
+ {
729
+ result = @builder.unary_op(val[0], val[1])
730
+ }
731
+ | arg tLSHFT arg
732
+ {
733
+ result = @builder.binary_op(val[0], val[1], val[2])
734
+ }
735
+ | arg tRSHFT arg
736
+ {
737
+ result = @builder.binary_op(val[0], val[1], val[2])
738
+ }
739
+ | arg tANDOP arg
740
+ {
741
+ result = @builder.logical_op(:and, val[0], val[1], val[2])
742
+ }
743
+ | arg tOROP arg
744
+ {
745
+ result = @builder.logical_op(:or, val[0], val[1], val[2])
746
+ }
747
+ | kDEFINED opt_nl arg
748
+ {
749
+ result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil)
750
+ }
751
+
752
+ | arg tEH arg opt_nl tCOLON arg
753
+ {
754
+ result = @builder.ternary(val[0], val[1],
755
+ val[2], val[4], val[5])
756
+ }
757
+ | primary
758
+
759
+ arg_value: arg
760
+
761
+ aref_args: none
762
+ | args trailer
763
+ | args tCOMMA assocs trailer
764
+ {
765
+ result = val[0] << @builder.associate(nil, val[2], nil)
766
+ }
767
+ | assocs trailer
768
+ {
769
+ result = [ @builder.associate(nil, val[0], nil) ]
770
+ }
771
+
772
+ paren_args: tLPAREN2 opt_call_args rparen
773
+ {
774
+ result = val
775
+ }
776
+
777
+ opt_paren_args: # nothing
778
+ {
779
+ result = [ nil, [], nil ]
780
+ }
781
+ | paren_args
782
+
783
+ opt_call_args: # nothing
784
+ {
785
+ result = []
786
+ }
787
+ | call_args
788
+
789
+ call_args: command
790
+ {
791
+ result = [ val[0] ]
792
+ }
793
+ | args opt_block_arg
794
+ {
795
+ result = val[0].concat(val[1])
796
+ }
797
+ | assocs opt_block_arg
798
+ {
799
+ result = [ @builder.associate(nil, val[0], nil) ]
800
+ result.concat(val[1])
801
+ }
802
+ | args tCOMMA assocs opt_block_arg
803
+ {
804
+ assocs = @builder.associate(nil, val[2], nil)
805
+ result = val[0] << assocs
806
+ result.concat(val[3])
807
+ }
808
+ | args tCOMMA assocs tCOMMA args opt_block_arg
809
+ {
810
+ val[2][-1] = @builder.objc_varargs(val[2][-1], val[4])
811
+ assocs = @builder.associate(nil, val[2], nil)
812
+ result = val[0] << assocs
813
+ result.concat(val[5])
814
+ }
815
+ | block_arg
816
+ {
817
+ result = [ val[0] ]
818
+ }
819
+
820
+ call_args2: arg_value tCOMMA args opt_block_arg
821
+ {
822
+ result = [ val[0], *val[2].concat(val[3]) ]
823
+ }
824
+ | arg_value tCOMMA block_arg
825
+ {
826
+ result = [ val[0], val[2] ]
827
+ }
828
+ | assocs opt_block_arg
829
+ {
830
+ result = [ @builder.associate(nil, val[0], nil),
831
+ *val[1] ]
832
+ }
833
+ | arg_value tCOMMA assocs opt_block_arg
834
+ {
835
+ result = [ val[0],
836
+ @builder.associate(nil, val[2], nil),
837
+ *val[3] ]
838
+ }
839
+ | arg_value tCOMMA args tCOMMA assocs opt_block_arg
840
+ {
841
+ result = [ val[0],
842
+ *val[2].
843
+ push(@builder.associate(nil, val[4], nil)).
844
+ concat(val[5]) ]
845
+ }
846
+ | block_arg
847
+ {
848
+ result = [ val[0] ]
849
+ }
850
+
851
+ command_args: {
852
+ result = @lexer.cmdarg.dup
853
+ @lexer.cmdarg.push(true)
854
+ }
855
+ open_args
856
+ {
857
+ @lexer.cmdarg = val[0]
858
+
859
+ result = val[1]
860
+ }
861
+
862
+ open_args: call_args
863
+ {
864
+ result = [ nil, val[0], nil ]
865
+ }
866
+ | tLPAREN_ARG
867
+ {
868
+ @lexer.state = :expr_endarg
869
+ }
870
+ rparen
871
+ {
872
+ result = [ val[0], [], val[2] ]
873
+ }
874
+ | tLPAREN_ARG call_args2
875
+ {
876
+ @lexer.state = :expr_endarg
877
+ }
878
+ rparen
879
+ {
880
+ result = [ val[0], val[1], val[3] ]
881
+ }
882
+
883
+ block_arg: tAMPER arg_value
884
+ {
885
+ result = @builder.block_pass(val[0], val[1])
886
+ }
887
+
888
+ opt_block_arg: tCOMMA block_arg
889
+ {
890
+ result = [ val[1] ]
891
+ }
892
+ | tCOMMA
893
+ {
894
+ result = []
895
+ }
896
+ | # nothing
897
+ {
898
+ result = []
899
+ }
900
+
901
+ args: arg_value
902
+ {
903
+ result = [ val[0] ]
904
+ }
905
+ | tSTAR arg_value
906
+ {
907
+ result = [ @builder.splat(val[0], val[1]) ]
908
+ }
909
+ | args tCOMMA arg_value
910
+ {
911
+ result = val[0] << val[2]
912
+ }
913
+ | args tCOMMA tSTAR arg_value
914
+ {
915
+ result = val[0] << @builder.splat(val[2], val[3])
916
+ }
917
+
918
+ mrhs: args tCOMMA arg_value
919
+ {
920
+ result = val[0] << val[2]
921
+ }
922
+ | args tCOMMA tSTAR arg_value
923
+ {
924
+ result = val[0] << @builder.splat(val[2], val[3])
925
+ }
926
+ | tSTAR arg_value
927
+ {
928
+ result = [ @builder.splat(val[0], val[1]) ]
929
+ }
930
+
931
+ primary: literal
932
+ | strings
933
+ | xstring
934
+ | regexp
935
+ | words
936
+ | qwords
937
+ | var_ref
938
+ | backref
939
+ | tFID
940
+ {
941
+ result = @builder.call_method(nil, nil, val[0])
942
+ }
943
+ | kBEGIN bodystmt kEND
944
+ {
945
+ result = @builder.begin_keyword(val[0], val[1], val[2])
946
+ }
947
+ | tLPAREN_ARG expr
948
+ {
949
+ @lexer.state = :expr_endarg
950
+ }
951
+ rparen
952
+ {
953
+ result = @builder.begin(val[0], val[1], val[3])
954
+ }
955
+ | tLPAREN compstmt tRPAREN
956
+ {
957
+ result = @builder.begin(val[0], val[1], val[2])
958
+ }
959
+ | primary_value tCOLON2 tCONSTANT
960
+ {
961
+ result = @builder.const_fetch(val[0], val[1], val[2])
962
+ }
963
+ | tCOLON3 tCONSTANT
964
+ {
965
+ result = @builder.const_global(val[0], val[1])
966
+ }
967
+ | tLBRACK aref_args tRBRACK
968
+ {
969
+ result = @builder.array(val[0], val[1], val[2])
970
+ }
971
+ | tLBRACE assoc_list tRCURLY
972
+ {
973
+ result = @builder.associate(val[0], val[1], val[2])
974
+ }
975
+ | kRETURN
976
+ {
977
+ result = @builder.keyword_cmd(:return, val[0])
978
+ }
979
+ | kYIELD tLPAREN2 call_args rparen
980
+ {
981
+ result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3])
982
+ }
983
+ | kYIELD tLPAREN2 rparen
984
+ {
985
+ result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2])
986
+ }
987
+ | kYIELD
988
+ {
989
+ result = @builder.keyword_cmd(:yield, val[0])
990
+ }
991
+ | kDEFINED opt_nl tLPAREN2 expr rparen
992
+ {
993
+ result = @builder.keyword_cmd(:defined?, val[0],
994
+ val[2], [ val[3] ], val[4])
995
+ }
996
+ | kNOT tLPAREN2 expr rparen
997
+ {
998
+ result = @builder.not_op(val[0], val[1], val[2], val[3])
999
+ }
1000
+ | kNOT tLPAREN2 rparen
1001
+ {
1002
+ result = @builder.not_op(val[0], val[1], nil, val[2])
1003
+ }
1004
+ | operation brace_block
1005
+ {
1006
+ method_call = @builder.call_method(nil, nil, val[0])
1007
+
1008
+ begin_t, args, body, end_t = val[1]
1009
+ result = @builder.block(method_call,
1010
+ begin_t, args, body, end_t)
1011
+ }
1012
+ | method_call
1013
+ | method_call brace_block
1014
+ {
1015
+ begin_t, args, body, end_t = val[1]
1016
+ result = @builder.block(val[0],
1017
+ begin_t, args, body, end_t)
1018
+ }
1019
+ | tLAMBDA lambda
1020
+ {
1021
+ lambda_call = @builder.call_lambda(val[0])
1022
+
1023
+ args, (begin_t, body, end_t) = val[1]
1024
+ result = @builder.block(lambda_call,
1025
+ begin_t, args, body, end_t)
1026
+ }
1027
+ | kIF expr_value then compstmt if_tail kEND
1028
+ {
1029
+ else_t, else_ = val[4]
1030
+ result = @builder.condition(val[0], val[1], val[2],
1031
+ val[3], else_t,
1032
+ else_, val[5])
1033
+ }
1034
+ | kUNLESS expr_value then compstmt opt_else kEND
1035
+ {
1036
+ else_t, else_ = val[4]
1037
+ result = @builder.condition(val[0], val[1], val[2],
1038
+ else_, else_t,
1039
+ val[3], val[5])
1040
+ }
1041
+ | kWHILE
1042
+ {
1043
+ @lexer.cond.push(true)
1044
+ }
1045
+ expr_value do
1046
+ {
1047
+ @lexer.cond.pop
1048
+ }
1049
+ compstmt kEND
1050
+ {
1051
+ result = @builder.loop(:while, val[0], val[2], val[3],
1052
+ val[5], val[6])
1053
+ }
1054
+ | kUNTIL
1055
+ {
1056
+ @lexer.cond.push(true)
1057
+ }
1058
+ expr_value do
1059
+ {
1060
+ @lexer.cond.pop
1061
+ }
1062
+ compstmt kEND
1063
+ {
1064
+ result = @builder.loop(:until, val[0], val[2], val[3],
1065
+ val[5], val[6])
1066
+ }
1067
+ | kCASE expr_value opt_terms case_body kEND
1068
+ {
1069
+ *when_bodies, (else_t, else_body) = *val[3]
1070
+
1071
+ result = @builder.case(val[0], val[1],
1072
+ when_bodies, else_t, else_body,
1073
+ val[4])
1074
+ }
1075
+ | kCASE opt_terms case_body kEND
1076
+ {
1077
+ *when_bodies, (else_t, else_body) = *val[2]
1078
+
1079
+ result = @builder.case(val[0], nil,
1080
+ when_bodies, else_t, else_body,
1081
+ val[3])
1082
+ }
1083
+ | kFOR for_var kIN
1084
+ {
1085
+ @lexer.cond.push(true)
1086
+ }
1087
+ expr_value do
1088
+ {
1089
+ @lexer.cond.pop
1090
+ }
1091
+ compstmt kEND
1092
+ {
1093
+ result = @builder.for(val[0], val[1],
1094
+ val[2], val[4],
1095
+ val[5], val[7], val[8])
1096
+ }
1097
+ | kCLASS cpath superclass
1098
+ {
1099
+ @static_env.extend_static
1100
+ @lexer.push_cmdarg
1101
+ }
1102
+ bodystmt kEND
1103
+ {
1104
+ if in_def?
1105
+ diagnostic :error, :class_in_def, nil, val[0]
1106
+ end
1107
+
1108
+ lt_t, superclass = val[2]
1109
+ result = @builder.def_class(val[0], val[1],
1110
+ lt_t, superclass,
1111
+ val[4], val[5])
1112
+
1113
+ @lexer.pop_cmdarg
1114
+ @static_env.unextend
1115
+ }
1116
+ | kCLASS tLSHFT expr term
1117
+ {
1118
+ result = @def_level
1119
+ @def_level = 0
1120
+
1121
+ @static_env.extend_static
1122
+ @lexer.push_cmdarg
1123
+ }
1124
+ bodystmt kEND
1125
+ {
1126
+ result = @builder.def_sclass(val[0], val[1], val[2],
1127
+ val[5], val[6])
1128
+
1129
+ @lexer.pop_cmdarg
1130
+ @static_env.unextend
1131
+
1132
+ @def_level = val[4]
1133
+ }
1134
+ | kMODULE cpath
1135
+ {
1136
+ @static_env.extend_static
1137
+ @lexer.push_cmdarg
1138
+ }
1139
+ bodystmt kEND
1140
+ {
1141
+ if in_def?
1142
+ diagnostic :error, :module_in_def, nil, val[0]
1143
+ end
1144
+
1145
+ result = @builder.def_module(val[0], val[1],
1146
+ val[3], val[4])
1147
+
1148
+ @lexer.pop_cmdarg
1149
+ @static_env.unextend
1150
+ }
1151
+ | kDEF fname
1152
+ {
1153
+ @def_level += 1
1154
+ @static_env.extend_static
1155
+ @lexer.push_cmdarg
1156
+ }
1157
+ f_arglist bodystmt kEND
1158
+ {
1159
+ result = @builder.def_method(val[0], val[1],
1160
+ val[3], val[4], val[5])
1161
+
1162
+ @lexer.pop_cmdarg
1163
+ @static_env.unextend
1164
+ @def_level -= 1
1165
+ }
1166
+ | kDEF singleton dot_or_colon
1167
+ {
1168
+ @lexer.state = :expr_fname
1169
+ }
1170
+ fname
1171
+ {
1172
+ @def_level += 1
1173
+ @static_env.extend_static
1174
+ @lexer.push_cmdarg
1175
+ }
1176
+ f_arglist bodystmt kEND
1177
+ {
1178
+ result = @builder.def_singleton(val[0], val[1], val[2],
1179
+ val[4], val[6], val[7], val[8])
1180
+
1181
+ @lexer.pop_cmdarg
1182
+ @static_env.unextend
1183
+ @def_level -= 1
1184
+ }
1185
+ | kBREAK
1186
+ {
1187
+ result = @builder.keyword_cmd(:break, val[0])
1188
+ }
1189
+ | kNEXT
1190
+ {
1191
+ result = @builder.keyword_cmd(:next, val[0])
1192
+ }
1193
+ | kREDO
1194
+ {
1195
+ result = @builder.keyword_cmd(:redo, val[0])
1196
+ }
1197
+ | kRETRY
1198
+ {
1199
+ result = @builder.keyword_cmd(:retry, val[0])
1200
+ }
1201
+
1202
+ primary_value: primary
1203
+
1204
+ then: term
1205
+ | kTHEN
1206
+ | term kTHEN
1207
+ {
1208
+ result = val[1]
1209
+ }
1210
+
1211
+ do: term
1212
+ | kDO_COND
1213
+
1214
+ if_tail: opt_else
1215
+ | kELSIF expr_value then compstmt if_tail
1216
+ {
1217
+ else_t, else_ = val[4]
1218
+ result = [ val[0],
1219
+ @builder.condition(val[0], val[1], val[2],
1220
+ val[3], else_t,
1221
+ else_, nil),
1222
+ ]
1223
+ }
1224
+
1225
+ opt_else: none
1226
+ | kELSE compstmt
1227
+ {
1228
+ result = val
1229
+ }
1230
+
1231
+ for_var: lhs
1232
+ | mlhs
1233
+
1234
+ f_marg: f_norm_arg
1235
+ | tLPAREN f_margs rparen
1236
+ {
1237
+ result = @builder.multi_lhs(val[0], val[1], val[2])
1238
+ }
1239
+
1240
+ f_marg_list: f_marg
1241
+ {
1242
+ result = [ val[0] ]
1243
+ }
1244
+ | f_marg_list tCOMMA f_marg
1245
+ {
1246
+ result = val[0] << val[2]
1247
+ }
1248
+
1249
+ f_margs: f_marg_list
1250
+ | f_marg_list tCOMMA tSTAR f_norm_arg
1251
+ {
1252
+ result = val[0].
1253
+ push(@builder.objc_restarg(val[2], val[3]))
1254
+ }
1255
+ | f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list
1256
+ {
1257
+ result = val[0].
1258
+ push(@builder.objc_restarg(val[2], val[3])).
1259
+ concat(val[5])
1260
+ }
1261
+ | f_marg_list tCOMMA tSTAR
1262
+ {
1263
+ result = val[0].
1264
+ push(@builder.objc_restarg(val[2]))
1265
+ }
1266
+ | f_marg_list tCOMMA tSTAR tCOMMA f_marg_list
1267
+ {
1268
+ result = val[0].
1269
+ push(@builder.objc_restarg(val[2])).
1270
+ concat(val[4])
1271
+ }
1272
+ | tSTAR f_norm_arg
1273
+ {
1274
+ result = [ @builder.objc_restarg(val[0], val[1]) ]
1275
+ }
1276
+ | tSTAR f_norm_arg tCOMMA f_marg_list
1277
+ {
1278
+ result = [ @builder.objc_restarg(val[0], val[1]),
1279
+ *val[3] ]
1280
+ }
1281
+ | tSTAR
1282
+ {
1283
+ result = [ @builder.objc_restarg(val[0]) ]
1284
+ }
1285
+ | tSTAR tCOMMA f_marg_list
1286
+ {
1287
+ result = [ @builder.objc_restarg(val[0]),
1288
+ *val[2] ]
1289
+ }
1290
+
1291
+ block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_f_block_arg
1292
+ {
1293
+ result = val[0].
1294
+ concat(val[2]).
1295
+ concat(val[4]).
1296
+ concat(val[5])
1297
+ }
1298
+ | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
1299
+ {
1300
+ result = val[0].
1301
+ concat(val[2]).
1302
+ concat(val[4]).
1303
+ concat(val[6]).
1304
+ concat(val[7])
1305
+ }
1306
+ | f_arg tCOMMA f_block_optarg opt_f_block_arg
1307
+ {
1308
+ result = val[0].
1309
+ concat(val[2]).
1310
+ concat(val[3])
1311
+ }
1312
+ | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_f_block_arg
1313
+ {
1314
+ result = val[0].
1315
+ concat(val[2]).
1316
+ concat(val[4]).
1317
+ concat(val[5])
1318
+ }
1319
+ | f_arg tCOMMA f_rest_arg opt_f_block_arg
1320
+ {
1321
+ result = val[0].
1322
+ concat(val[2]).
1323
+ concat(val[3])
1324
+ }
1325
+ | f_arg tCOMMA
1326
+ | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
1327
+ {
1328
+ result = val[0].
1329
+ concat(val[2]).
1330
+ concat(val[4]).
1331
+ concat(val[5])
1332
+ }
1333
+ | f_arg opt_f_block_arg
1334
+ {
1335
+ result = val[0].concat(val[1])
1336
+ }
1337
+ | f_block_optarg tCOMMA f_rest_arg opt_f_block_arg
1338
+ {
1339
+ result = val[0].
1340
+ concat(val[2]).
1341
+ concat(val[3])
1342
+ }
1343
+ | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
1344
+ {
1345
+ result = val[0].
1346
+ concat(val[2]).
1347
+ concat(val[4]).
1348
+ concat(val[5])
1349
+ }
1350
+ | f_block_optarg opt_f_block_arg
1351
+ {
1352
+ result = val[0].
1353
+ concat(val[1])
1354
+ }
1355
+ | f_block_optarg tCOMMA f_arg opt_f_block_arg
1356
+ {
1357
+ result = val[0].
1358
+ concat(val[2]).
1359
+ concat(val[3])
1360
+ }
1361
+ | f_rest_arg opt_f_block_arg
1362
+ {
1363
+ result = val[0].
1364
+ concat(val[1])
1365
+ }
1366
+ | f_rest_arg tCOMMA f_arg opt_f_block_arg
1367
+ {
1368
+ result = val[0].
1369
+ concat(val[2]).
1370
+ concat(val[3])
1371
+ }
1372
+ | f_block_arg
1373
+ {
1374
+ result = [ val[0] ]
1375
+ }
1376
+
1377
+ opt_block_param: # nothing
1378
+ {
1379
+ result = @builder.args(nil, [], nil)
1380
+ }
1381
+ | block_param_def
1382
+ {
1383
+ @lexer.state = :expr_value
1384
+ }
1385
+
1386
+ block_param_def: tPIPE opt_bv_decl tPIPE
1387
+ {
1388
+ result = @builder.args(val[0], val[1], val[2])
1389
+ }
1390
+ | tOROP
1391
+ {
1392
+ result = @builder.args(val[0], [], val[0])
1393
+ }
1394
+ | tPIPE block_param opt_bv_decl tPIPE
1395
+ {
1396
+ result = @builder.args(val[0], val[1].concat(val[2]), val[3])
1397
+ }
1398
+
1399
+ opt_bv_decl: # nothing
1400
+ {
1401
+ result = []
1402
+ }
1403
+ | tSEMI bv_decls
1404
+ {
1405
+ result = val[1]
1406
+ }
1407
+
1408
+ bv_decls: bvar
1409
+ {
1410
+ result = [ val[0] ]
1411
+ }
1412
+ | bv_decls tCOMMA bvar
1413
+ {
1414
+ result = val[0] << val[2]
1415
+ }
1416
+
1417
+ bvar: tIDENTIFIER
1418
+ {
1419
+ result = @builder.shadowarg(val[0])
1420
+ }
1421
+ | f_bad_arg
1422
+
1423
+ lambda: {
1424
+ @static_env.extend_dynamic
1425
+ }
1426
+ f_larglist lambda_body
1427
+ {
1428
+ result = [ val[1], val[2] ]
1429
+
1430
+ @static_env.unextend
1431
+ }
1432
+
1433
+ f_larglist: tLPAREN2 f_args opt_bv_decl rparen
1434
+ {
1435
+ result = @builder.args(val[0], val[1].concat(val[2]), val[3])
1436
+ }
1437
+ | f_args opt_bv_decl
1438
+ {
1439
+ result = @builder.args(nil, val[0].concat(val[1]), nil)
1440
+ }
1441
+
1442
+ lambda_body: tLAMBEG compstmt tRCURLY
1443
+ {
1444
+ result = [ val[0], val[1], val[2] ]
1445
+ }
1446
+ | kDO_LAMBDA compstmt kEND
1447
+ {
1448
+ result = [ val[0], val[1], val[2] ]
1449
+ }
1450
+
1451
+ do_block: kDO_BLOCK
1452
+ {
1453
+ @static_env.extend_dynamic
1454
+ }
1455
+ opt_block_param compstmt kEND
1456
+ {
1457
+ result = [ val[0], val[2], val[3], val[4] ]
1458
+
1459
+ @static_env.unextend
1460
+ }
1461
+
1462
+ block_call: command do_block
1463
+ {
1464
+ begin_t, block_args, body, end_t = val[1]
1465
+ result = @builder.block(val[0],
1466
+ begin_t, block_args, body, end_t)
1467
+ }
1468
+ | block_call tDOT operation2 opt_paren_args
1469
+ {
1470
+ lparen_t, args, rparen_t = val[3]
1471
+ result = @builder.call_method(val[0], val[1], val[2],
1472
+ lparen_t, args, rparen_t)
1473
+ }
1474
+ | block_call tCOLON2 operation2 opt_paren_args
1475
+ {
1476
+ lparen_t, args, rparen_t = val[3]
1477
+ result = @builder.call_method(val[0], val[1], val[2],
1478
+ lparen_t, args, rparen_t)
1479
+ }
1480
+
1481
+ method_call: operation paren_args
1482
+ {
1483
+ lparen_t, args, rparen_t = val[1]
1484
+ result = @builder.call_method(nil, nil, val[0],
1485
+ lparen_t, args, rparen_t)
1486
+ }
1487
+ | primary_value tDOT operation2 opt_paren_args
1488
+ {
1489
+ lparen_t, args, rparen_t = val[3]
1490
+ result = @builder.call_method(val[0], val[1], val[2],
1491
+ lparen_t, args, rparen_t)
1492
+ }
1493
+ | primary_value tCOLON2 operation2 paren_args
1494
+ {
1495
+ lparen_t, args, rparen_t = val[3]
1496
+ result = @builder.call_method(val[0], val[1], val[2],
1497
+ lparen_t, args, rparen_t)
1498
+ }
1499
+ | primary_value tCOLON2 operation3
1500
+ {
1501
+ result = @builder.call_method(val[0], val[1], val[2])
1502
+ }
1503
+ | primary_value tDOT paren_args
1504
+ {
1505
+ lparen_t, args, rparen_t = val[2]
1506
+ result = @builder.call_method(val[0], val[1], nil,
1507
+ lparen_t, args, rparen_t)
1508
+ }
1509
+ | primary_value tCOLON2 paren_args
1510
+ {
1511
+ lparen_t, args, rparen_t = val[2]
1512
+ result = @builder.call_method(val[0], val[1], nil,
1513
+ lparen_t, args, rparen_t)
1514
+ }
1515
+ | kSUPER paren_args
1516
+ {
1517
+ lparen_t, args, rparen_t = val[1]
1518
+ result = @builder.keyword_cmd(:super, val[0],
1519
+ lparen_t, args, rparen_t)
1520
+ }
1521
+ | kSUPER
1522
+ {
1523
+ result = @builder.keyword_cmd(:zsuper, val[0])
1524
+ }
1525
+ | primary_value tLBRACK2 opt_call_args rbracket
1526
+ {
1527
+ result = @builder.index(val[0], val[1], val[2], val[3])
1528
+ }
1529
+
1530
+ brace_block: tLCURLY
1531
+ {
1532
+ @static_env.extend_dynamic
1533
+ }
1534
+ opt_block_param compstmt tRCURLY
1535
+ {
1536
+ result = [ val[0], val[2], val[3], val[4] ]
1537
+
1538
+ @static_env.unextend
1539
+ }
1540
+ | kDO
1541
+ {
1542
+ @static_env.extend_dynamic
1543
+ }
1544
+ opt_block_param compstmt kEND
1545
+ {
1546
+ result = [ val[0], val[2], val[3], val[4] ]
1547
+
1548
+ @static_env.unextend
1549
+ }
1550
+
1551
+ case_body: kWHEN args then compstmt cases
1552
+ {
1553
+ result = [ @builder.when(val[0], val[1], val[2], val[3]),
1554
+ *val[4] ]
1555
+ }
1556
+
1557
+ cases: opt_else
1558
+ {
1559
+ result = [ val[0] ]
1560
+ }
1561
+ | case_body
1562
+
1563
+ opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue
1564
+ {
1565
+ assoc_t, exc_var = val[2]
1566
+
1567
+ if val[1]
1568
+ exc_list = @builder.array(nil, val[1], nil)
1569
+ end
1570
+
1571
+ result = [ @builder.rescue_body(val[0],
1572
+ exc_list, assoc_t, exc_var,
1573
+ val[3], val[4]),
1574
+ *val[5] ]
1575
+ }
1576
+ |
1577
+ {
1578
+ result = []
1579
+ }
1580
+
1581
+ exc_list: arg_value
1582
+ {
1583
+ result = [ val[0] ]
1584
+ }
1585
+ | mrhs
1586
+ | none
1587
+
1588
+ exc_var: tASSOC lhs
1589
+ {
1590
+ result = [ val[0], val[1] ]
1591
+ }
1592
+ | none
1593
+
1594
+ opt_ensure: kENSURE compstmt
1595
+ {
1596
+ result = [ val[0], val[1] ]
1597
+ }
1598
+ | none
1599
+
1600
+ literal: numeric
1601
+ | symbol
1602
+ | dsym
1603
+
1604
+ strings: string
1605
+ {
1606
+ result = @builder.string_compose(nil, val[0], nil)
1607
+ }
1608
+
1609
+ string: string1
1610
+ {
1611
+ result = [ val[0] ]
1612
+ }
1613
+ | string string1
1614
+ {
1615
+ result = val[0] << val[1]
1616
+ }
1617
+
1618
+ string1: tSTRING_BEG string_contents tSTRING_END
1619
+ {
1620
+ result = @builder.string_compose(val[0], val[1], val[2])
1621
+ }
1622
+ | tSTRING
1623
+ {
1624
+ result = @builder.string(val[0])
1625
+ }
1626
+ | tCHARACTER
1627
+ {
1628
+ result = @builder.character(val[0])
1629
+ }
1630
+
1631
+ xstring: tXSTRING_BEG xstring_contents tSTRING_END
1632
+ {
1633
+ result = @builder.xstring_compose(val[0], val[1], val[2])
1634
+ }
1635
+
1636
+ regexp: tREGEXP_BEG regexp_contents tSTRING_END tREGEXP_OPT
1637
+ {
1638
+ opts = @builder.regexp_options(val[3])
1639
+ result = @builder.regexp_compose(val[0], val[1], val[2], opts)
1640
+ }
1641
+
1642
+ words: tWORDS_BEG word_list tSTRING_END
1643
+ {
1644
+ result = @builder.words_compose(val[0], val[1], val[2])
1645
+ }
1646
+
1647
+ word_list: # nothing
1648
+ {
1649
+ result = []
1650
+ }
1651
+ | word_list word tSPACE
1652
+ {
1653
+ result = val[0] << @builder.word(val[1])
1654
+ }
1655
+
1656
+ word: string_content
1657
+ {
1658
+ result = [ val[0] ]
1659
+ }
1660
+ | word string_content
1661
+ {
1662
+ result = val[0] << val[1]
1663
+ }
1664
+
1665
+ qwords: tQWORDS_BEG qword_list tSTRING_END
1666
+ {
1667
+ result = @builder.words_compose(val[0], val[1], val[2])
1668
+ }
1669
+
1670
+ qword_list: # nothing
1671
+ {
1672
+ result = []
1673
+ }
1674
+ | qword_list tSTRING_CONTENT tSPACE
1675
+ {
1676
+ result = val[0] << @builder.string_internal(val[1])
1677
+ }
1678
+
1679
+ string_contents: # nothing
1680
+ {
1681
+ result = []
1682
+ }
1683
+ | string_contents string_content
1684
+ {
1685
+ result = val[0] << val[1]
1686
+ }
1687
+
1688
+ xstring_contents: # nothing
1689
+ {
1690
+ result = []
1691
+ }
1692
+ | xstring_contents string_content
1693
+ {
1694
+ result = val[0] << val[1]
1695
+ }
1696
+
1697
+ regexp_contents: # nothing
1698
+ {
1699
+ result = []
1700
+ }
1701
+ | regexp_contents string_content
1702
+ {
1703
+ result = val[0] << val[1]
1704
+ }
1705
+
1706
+ string_content: tSTRING_CONTENT
1707
+ {
1708
+ result = @builder.string_internal(val[0])
1709
+ }
1710
+ | tSTRING_DVAR string_dvar
1711
+ {
1712
+ result = val[1]
1713
+ }
1714
+ | tSTRING_DBEG
1715
+ {
1716
+ @lexer.cond.push(false)
1717
+ @lexer.cmdarg.push(false)
1718
+ }
1719
+ compstmt tRCURLY
1720
+ {
1721
+ @lexer.cond.lexpop
1722
+ @lexer.cmdarg.lexpop
1723
+
1724
+ result = @builder.begin(val[0], val[2], val[3])
1725
+ }
1726
+
1727
+ string_dvar: tGVAR
1728
+ {
1729
+ result = @builder.gvar(val[0])
1730
+ }
1731
+ | tIVAR
1732
+ {
1733
+ result = @builder.ivar(val[0])
1734
+ }
1735
+ | tCVAR
1736
+ {
1737
+ result = @builder.cvar(val[0])
1738
+ }
1739
+ | backref
1740
+
1741
+
1742
+ symbol: tSYMBOL
1743
+ {
1744
+ result = @builder.symbol(val[0])
1745
+ }
1746
+
1747
+ dsym: tSYMBEG xstring_contents tSTRING_END
1748
+ {
1749
+ result = @builder.symbol_compose(val[0], val[1], val[2])
1750
+ }
1751
+
1752
+ numeric: tINTEGER
1753
+ {
1754
+ result = @builder.integer(val[0])
1755
+ }
1756
+ | tFLOAT
1757
+ {
1758
+ result = @builder.float(val[0])
1759
+ }
1760
+ | tUMINUS_NUM tINTEGER =tLOWEST
1761
+ {
1762
+ result = @builder.negate(val[0],
1763
+ @builder.integer(val[1]))
1764
+ }
1765
+ | tUMINUS_NUM tFLOAT =tLOWEST
1766
+ {
1767
+ result = @builder.negate(val[0],
1768
+ @builder.float(val[1]))
1769
+ }
1770
+
1771
+ variable: tIDENTIFIER
1772
+ {
1773
+ result = @builder.ident(val[0])
1774
+ }
1775
+ | tIVAR
1776
+ {
1777
+ result = @builder.ivar(val[0])
1778
+ }
1779
+ | tGVAR
1780
+ {
1781
+ result = @builder.gvar(val[0])
1782
+ }
1783
+ | tCONSTANT
1784
+ {
1785
+ result = @builder.const(val[0])
1786
+ }
1787
+ | tCVAR
1788
+ {
1789
+ result = @builder.cvar(val[0])
1790
+ }
1791
+ | kNIL
1792
+ {
1793
+ result = @builder.nil(val[0])
1794
+ }
1795
+ | kSELF
1796
+ {
1797
+ result = @builder.self(val[0])
1798
+ }
1799
+ | kTRUE
1800
+ {
1801
+ result = @builder.true(val[0])
1802
+ }
1803
+ | kFALSE
1804
+ {
1805
+ result = @builder.false(val[0])
1806
+ }
1807
+ | k__FILE__
1808
+ {
1809
+ result = @builder.__FILE__(val[0])
1810
+ }
1811
+ | k__LINE__
1812
+ {
1813
+ result = @builder.__LINE__(val[0])
1814
+ }
1815
+ | k__ENCODING__
1816
+ {
1817
+ result = @builder.__ENCODING__(val[0])
1818
+ }
1819
+
1820
+ var_ref: variable
1821
+ {
1822
+ result = @builder.accessible(val[0])
1823
+ }
1824
+
1825
+ var_lhs: variable
1826
+ {
1827
+ result = @builder.assignable(val[0])
1828
+ }
1829
+
1830
+ backref: tNTH_REF
1831
+ {
1832
+ result = @builder.nth_ref(val[0])
1833
+ }
1834
+ | tBACK_REF
1835
+ {
1836
+ result = @builder.back_ref(val[0])
1837
+ }
1838
+
1839
+ superclass: term
1840
+ {
1841
+ result = nil
1842
+ }
1843
+ | tLT expr_value term
1844
+ {
1845
+ result = [ val[0], val[1] ]
1846
+ }
1847
+ | error term
1848
+ {
1849
+ yyerrok
1850
+ result = nil
1851
+ }
1852
+
1853
+ f_arglist: tLPAREN2 f_args rparen
1854
+ {
1855
+ result = @builder.args(val[0], val[1], val[2])
1856
+
1857
+ @lexer.state = :expr_value
1858
+ }
1859
+ | f_args term
1860
+ {
1861
+ result = @builder.args(nil, val[0], nil)
1862
+ }
1863
+
1864
+ f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_f_block_arg
1865
+ {
1866
+ result = val[0].
1867
+ concat(val[2]).
1868
+ concat(val[4]).
1869
+ concat(val[5])
1870
+ }
1871
+ | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
1872
+ {
1873
+ result = val[0].
1874
+ concat(val[2]).
1875
+ concat(val[4]).
1876
+ concat(val[6]).
1877
+ concat(val[7])
1878
+ }
1879
+ | f_arg tCOMMA f_optarg opt_f_block_arg
1880
+ {
1881
+ result = val[0].
1882
+ concat(val[2]).
1883
+ concat(val[3])
1884
+ }
1885
+ | f_arg tCOMMA f_optarg tCOMMA f_arg opt_f_block_arg
1886
+ {
1887
+ result = val[0].
1888
+ concat(val[2]).
1889
+ concat(val[4]).
1890
+ concat(val[5])
1891
+ }
1892
+ | f_arg tCOMMA f_rest_arg opt_f_block_arg
1893
+ {
1894
+ result = val[0].
1895
+ concat(val[2]).
1896
+ concat(val[3])
1897
+ }
1898
+ | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
1899
+ {
1900
+ result = val[0].
1901
+ concat(val[2]).
1902
+ concat(val[4]).
1903
+ concat(val[5])
1904
+ }
1905
+ | f_arg opt_f_block_arg
1906
+ {
1907
+ result = val[0].
1908
+ concat(val[1])
1909
+ }
1910
+ | f_optarg tCOMMA f_rest_arg opt_f_block_arg
1911
+ {
1912
+ result = val[0].
1913
+ concat(val[2]).
1914
+ concat(val[3])
1915
+ }
1916
+ | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
1917
+ {
1918
+ result = val[0].
1919
+ concat(val[2]).
1920
+ concat(val[4]).
1921
+ concat(val[5])
1922
+ }
1923
+ | f_optarg opt_f_block_arg
1924
+ {
1925
+ result = val[0].
1926
+ concat(val[1])
1927
+ }
1928
+ | f_optarg tCOMMA f_arg opt_f_block_arg
1929
+ {
1930
+ result = val[0].
1931
+ concat(val[2]).
1932
+ concat(val[3])
1933
+ }
1934
+ | f_rest_arg opt_f_block_arg
1935
+ {
1936
+ result = val[0].
1937
+ concat(val[1])
1938
+ }
1939
+ | f_rest_arg tCOMMA f_arg opt_f_block_arg
1940
+ {
1941
+ result = val[0].
1942
+ concat(val[2]).
1943
+ concat(val[3])
1944
+ }
1945
+ | f_block_arg
1946
+ {
1947
+ result = [ val[0] ]
1948
+ }
1949
+ | # nothing
1950
+ {
1951
+ result = []
1952
+ }
1953
+
1954
+ f_bad_arg: tCONSTANT
1955
+ {
1956
+ diagnostic :error, :argument_const, nil, val[0]
1957
+ }
1958
+ | tIVAR
1959
+ {
1960
+ diagnostic :error, :argument_ivar, nil, val[0]
1961
+ }
1962
+ | tGVAR
1963
+ {
1964
+ diagnostic :error, :argument_gvar, nil, val[0]
1965
+ }
1966
+ | tCVAR
1967
+ {
1968
+ diagnostic :error, :argument_cvar, nil, val[0]
1969
+ }
1970
+
1971
+ f_norm_arg: f_bad_arg
1972
+ | tIDENTIFIER
1973
+ {
1974
+ @static_env.declare val[0][0]
1975
+
1976
+ result = @builder.arg(val[0])
1977
+ }
1978
+ | tIDENTIFIER tASSOC tIDENTIFIER
1979
+ {
1980
+ @static_env.declare val[2][0]
1981
+
1982
+ result = @builder.objc_kwarg(val[0], val[1], val[2])
1983
+ }
1984
+ | tLABEL tIDENTIFIER
1985
+ {
1986
+ @static_env.declare val[1][0]
1987
+
1988
+ result = @builder.objc_kwarg(val[0], nil, val[1])
1989
+ }
1990
+
1991
+ f_arg_item: f_norm_arg
1992
+ | tLPAREN f_margs rparen
1993
+ {
1994
+ result = @builder.multi_lhs(val[0], val[1], val[2])
1995
+ }
1996
+
1997
+ f_arg: f_arg_item
1998
+ {
1999
+ result = [ val[0] ]
2000
+ }
2001
+ | f_arg tCOMMA f_arg_item
2002
+ {
2003
+ result = val[0] << val[2]
2004
+ }
2005
+
2006
+ f_opt: tIDENTIFIER tEQL arg_value
2007
+ {
2008
+ @static_env.declare val[0][0]
2009
+
2010
+ result = @builder.optarg(val[0], val[1], val[2])
2011
+ }
2012
+
2013
+ f_block_opt: tIDENTIFIER tEQL primary_value
2014
+ {
2015
+ @static_env.declare val[0][0]
2016
+
2017
+ result = @builder.optarg(val[0], val[1], val[2])
2018
+ }
2019
+
2020
+ f_block_optarg: f_block_opt
2021
+ {
2022
+ result = [ val[0] ]
2023
+ }
2024
+ | f_block_optarg tCOMMA f_block_opt
2025
+ {
2026
+ result = val[0] << val[2]
2027
+ }
2028
+
2029
+ f_optarg: f_opt
2030
+ {
2031
+ result = [ val[0] ]
2032
+ }
2033
+ | f_optarg tCOMMA f_opt
2034
+ {
2035
+ result = val[0] << val[2]
2036
+ }
2037
+
2038
+ restarg_mark: tSTAR2 | tSTAR
2039
+
2040
+ f_rest_arg: restarg_mark tIDENTIFIER
2041
+ {
2042
+ @static_env.declare val[1][0]
2043
+
2044
+ result = [ @builder.restarg(val[0], val[1]) ]
2045
+ }
2046
+ | restarg_mark
2047
+ {
2048
+ result = [ @builder.restarg(val[0]) ]
2049
+ }
2050
+
2051
+ blkarg_mark: tAMPER2 | tAMPER
2052
+
2053
+ f_block_arg: blkarg_mark tIDENTIFIER
2054
+ {
2055
+ @static_env.declare val[1][0]
2056
+
2057
+ result = @builder.blockarg(val[0], val[1])
2058
+ }
2059
+
2060
+ opt_f_block_arg: tCOMMA f_block_arg
2061
+ {
2062
+ result = [ val[1] ]
2063
+ }
2064
+ | # nothing
2065
+ {
2066
+ result = []
2067
+ }
2068
+
2069
+ singleton: var_ref
2070
+ | tLPAREN2 expr rparen
2071
+ {
2072
+ result = val[1]
2073
+ }
2074
+
2075
+ assoc_list: # nothing
2076
+ {
2077
+ result = []
2078
+ }
2079
+ | assocs trailer
2080
+
2081
+ assocs: assoc
2082
+ {
2083
+ result = [ val[0] ]
2084
+ }
2085
+ | assocs tCOMMA assoc
2086
+ {
2087
+ result = val[0] << val[2]
2088
+ }
2089
+
2090
+ assoc: arg_value tASSOC arg_value
2091
+ {
2092
+ result = @builder.pair(val[0], val[1], val[2])
2093
+ }
2094
+ | tLABEL arg_value
2095
+ {
2096
+ result = @builder.pair_keyword(val[0], val[1])
2097
+ }
2098
+
2099
+ operation: tIDENTIFIER | tCONSTANT | tFID
2100
+ operation2: tIDENTIFIER | tCONSTANT | tFID | op
2101
+ operation3: tIDENTIFIER | tFID | op
2102
+ dot_or_colon: tDOT | tCOLON2
2103
+ opt_terms: | terms
2104
+ opt_nl: | tNL
2105
+ rparen: opt_nl tRPAREN
2106
+ {
2107
+ result = val[1]
2108
+ }
2109
+ rbracket: opt_nl tRBRACK
2110
+ {
2111
+ result = val[1]
2112
+ }
2113
+ trailer: | tNL | tCOMMA
2114
+
2115
+ term: tSEMI
2116
+ {
2117
+ yyerrok
2118
+ }
2119
+ | tNL
2120
+
2121
+ terms: term
2122
+ | terms tSEMI
2123
+
2124
+ none: # nothing
2125
+ {
2126
+ result = nil
2127
+ }
2128
+ end
2129
+
2130
+ ---- header
2131
+
2132
+ require 'parser'
2133
+
2134
+ Parser.check_for_encoding_support
2135
+
2136
+ ---- inner
2137
+
2138
+ def version
2139
+ 19 # closest released match: v1_9_0_2
2140
+ end
2141
+
2142
+ def default_encoding
2143
+ Encoding::BINARY
2144
+ end