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