parser 2.2.2.6 → 2.2.3.0

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