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