parser 2.6.0.0 → 3.1.0.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 (102) hide show
  1. checksums.yaml +4 -4
  2. data/lib/parser/all.rb +3 -0
  3. data/lib/parser/ast/processor.rb +48 -1
  4. data/lib/parser/base.rb +30 -6
  5. data/lib/parser/builders/default.rb +670 -38
  6. data/lib/parser/context.rb +24 -26
  7. data/lib/parser/current.rb +36 -9
  8. data/lib/parser/current_arg_stack.rb +46 -0
  9. data/lib/parser/diagnostic/engine.rb +1 -2
  10. data/lib/parser/diagnostic.rb +1 -1
  11. data/lib/parser/lexer/dedenter.rb +58 -49
  12. data/lib/parser/lexer/explanation.rb +1 -1
  13. data/lib/parser/lexer.rb +13837 -11893
  14. data/lib/parser/macruby.rb +2544 -2489
  15. data/lib/parser/max_numparam_stack.rb +56 -0
  16. data/lib/parser/messages.rb +78 -44
  17. data/lib/parser/meta.rb +13 -3
  18. data/lib/parser/ruby18.rb +2313 -2259
  19. data/lib/parser/ruby19.rb +2537 -2488
  20. data/lib/parser/ruby20.rb +2724 -2673
  21. data/lib/parser/ruby21.rb +2766 -2727
  22. data/lib/parser/ruby22.rb +2683 -2628
  23. data/lib/parser/ruby23.rb +2796 -2755
  24. data/lib/parser/ruby24.rb +2812 -2771
  25. data/lib/parser/ruby25.rb +2703 -2670
  26. data/lib/parser/ruby26.rb +2794 -2747
  27. data/lib/parser/ruby27.rb +7914 -0
  28. data/lib/parser/ruby28.rb +8047 -0
  29. data/lib/parser/ruby30.rb +8096 -0
  30. data/lib/parser/ruby31.rb +8354 -0
  31. data/lib/parser/rubymotion.rb +2527 -2485
  32. data/lib/parser/runner/ruby_parse.rb +2 -2
  33. data/lib/parser/runner/ruby_rewrite.rb +2 -2
  34. data/lib/parser/runner.rb +36 -2
  35. data/lib/parser/source/buffer.rb +53 -28
  36. data/lib/parser/source/comment/associator.rb +31 -8
  37. data/lib/parser/source/comment.rb +14 -1
  38. data/lib/parser/source/map/method_definition.rb +25 -0
  39. data/lib/parser/source/range.rb +19 -3
  40. data/lib/parser/source/tree_rewriter/action.rb +137 -28
  41. data/lib/parser/source/tree_rewriter.rb +144 -14
  42. data/lib/parser/static_environment.rb +23 -0
  43. data/lib/parser/tree_rewriter.rb +3 -3
  44. data/lib/parser/variables_stack.rb +36 -0
  45. data/lib/parser/version.rb +1 -1
  46. data/lib/parser.rb +4 -0
  47. data/parser.gemspec +12 -19
  48. metadata +34 -99
  49. data/.gitignore +0 -32
  50. data/.travis.yml +0 -45
  51. data/.yardopts +0 -21
  52. data/CHANGELOG.md +0 -943
  53. data/CONTRIBUTING.md +0 -17
  54. data/Gemfile +0 -10
  55. data/README.md +0 -301
  56. data/Rakefile +0 -165
  57. data/ci/run_rubocop_specs +0 -14
  58. data/doc/AST_FORMAT.md +0 -1735
  59. data/doc/CUSTOMIZATION.md +0 -37
  60. data/doc/INTERNALS.md +0 -21
  61. data/doc/css/.gitkeep +0 -0
  62. data/doc/css/common.css +0 -68
  63. data/lib/parser/lexer.rl +0 -2383
  64. data/lib/parser/macruby.y +0 -2198
  65. data/lib/parser/ruby18.y +0 -1934
  66. data/lib/parser/ruby19.y +0 -2175
  67. data/lib/parser/ruby20.y +0 -2353
  68. data/lib/parser/ruby21.y +0 -2357
  69. data/lib/parser/ruby22.y +0 -2364
  70. data/lib/parser/ruby23.y +0 -2370
  71. data/lib/parser/ruby24.y +0 -2408
  72. data/lib/parser/ruby25.y +0 -2405
  73. data/lib/parser/ruby26.y +0 -2413
  74. data/lib/parser/rubymotion.y +0 -2182
  75. data/test/bug_163/fixtures/input.rb +0 -5
  76. data/test/bug_163/fixtures/output.rb +0 -5
  77. data/test/bug_163/rewriter.rb +0 -20
  78. data/test/helper.rb +0 -52
  79. data/test/parse_helper.rb +0 -315
  80. data/test/racc_coverage_helper.rb +0 -133
  81. data/test/test_base.rb +0 -31
  82. data/test/test_current.rb +0 -27
  83. data/test/test_diagnostic.rb +0 -96
  84. data/test/test_diagnostic_engine.rb +0 -62
  85. data/test/test_encoding.rb +0 -99
  86. data/test/test_lexer.rb +0 -3543
  87. data/test/test_lexer_stack_state.rb +0 -78
  88. data/test/test_parse_helper.rb +0 -80
  89. data/test/test_parser.rb +0 -7087
  90. data/test/test_runner_rewrite.rb +0 -47
  91. data/test/test_source_buffer.rb +0 -162
  92. data/test/test_source_comment.rb +0 -36
  93. data/test/test_source_comment_associator.rb +0 -367
  94. data/test/test_source_map.rb +0 -15
  95. data/test/test_source_range.rb +0 -172
  96. data/test/test_source_rewriter.rb +0 -541
  97. data/test/test_source_rewriter_action.rb +0 -46
  98. data/test/test_source_tree_rewriter.rb +0 -173
  99. data/test/test_static_environment.rb +0 -45
  100. data/test/using_tree_rewriter/fixtures/input.rb +0 -3
  101. data/test/using_tree_rewriter/fixtures/output.rb +0 -3
  102. data/test/using_tree_rewriter/using_tree_rewriter.rb +0 -9
data/lib/parser/ruby26.y DELETED
@@ -1,2413 +0,0 @@
1
- class Parser::Ruby26
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_.nil?
91
- diagnostic :error, :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(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 tDOT2
669
- {
670
- result = @builder.range_inclusive(val[0], val[1], nil)
671
- }
672
- | arg tDOT3
673
- {
674
- result = @builder.range_exclusive(val[0], val[1], nil)
675
- }
676
- | arg tPLUS arg
677
- {
678
- result = @builder.binary_op(val[0], val[1], val[2])
679
- }
680
- | arg tMINUS arg
681
- {
682
- result = @builder.binary_op(val[0], val[1], val[2])
683
- }
684
- | arg tSTAR2 arg
685
- {
686
- result = @builder.binary_op(val[0], val[1], val[2])
687
- }
688
- | arg tDIVIDE arg
689
- {
690
- result = @builder.binary_op(val[0], val[1], val[2])
691
- }
692
- | arg tPERCENT arg
693
- {
694
- result = @builder.binary_op(val[0], val[1], val[2])
695
- }
696
- | arg tPOW arg
697
- {
698
- result = @builder.binary_op(val[0], val[1], val[2])
699
- }
700
- | tUNARY_NUM simple_numeric tPOW arg
701
- {
702
- result = @builder.unary_op(val[0],
703
- @builder.binary_op(
704
- val[1], val[2], val[3]))
705
- }
706
- | tUPLUS arg
707
- {
708
- result = @builder.unary_op(val[0], val[1])
709
- }
710
- | tUMINUS arg
711
- {
712
- result = @builder.unary_op(val[0], val[1])
713
- }
714
- | arg tPIPE arg
715
- {
716
- result = @builder.binary_op(val[0], val[1], val[2])
717
- }
718
- | arg tCARET arg
719
- {
720
- result = @builder.binary_op(val[0], val[1], val[2])
721
- }
722
- | arg tAMPER2 arg
723
- {
724
- result = @builder.binary_op(val[0], val[1], val[2])
725
- }
726
- | arg tCMP arg
727
- {
728
- result = @builder.binary_op(val[0], val[1], val[2])
729
- }
730
- | rel_expr =tCMP
731
- | arg tEQ arg
732
- {
733
- result = @builder.binary_op(val[0], val[1], val[2])
734
- }
735
- | arg tEQQ arg
736
- {
737
- result = @builder.binary_op(val[0], val[1], val[2])
738
- }
739
- | arg tNEQ arg
740
- {
741
- result = @builder.binary_op(val[0], val[1], val[2])
742
- }
743
- | arg tMATCH arg
744
- {
745
- result = @builder.match_op(val[0], val[1], val[2])
746
- }
747
- | arg tNMATCH arg
748
- {
749
- result = @builder.binary_op(val[0], val[1], val[2])
750
- }
751
- | tBANG arg
752
- {
753
- result = @builder.not_op(val[0], nil, val[1], nil)
754
- }
755
- | tTILDE arg
756
- {
757
- result = @builder.unary_op(val[0], val[1])
758
- }
759
- | arg tLSHFT arg
760
- {
761
- result = @builder.binary_op(val[0], val[1], val[2])
762
- }
763
- | arg tRSHFT arg
764
- {
765
- result = @builder.binary_op(val[0], val[1], val[2])
766
- }
767
- | arg tANDOP arg
768
- {
769
- result = @builder.logical_op(:and, val[0], val[1], val[2])
770
- }
771
- | arg tOROP arg
772
- {
773
- result = @builder.logical_op(:or, val[0], val[1], val[2])
774
- }
775
- | kDEFINED opt_nl arg
776
- {
777
- result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil)
778
- }
779
- | arg tEH arg opt_nl tCOLON arg
780
- {
781
- result = @builder.ternary(val[0], val[1],
782
- val[2], val[4], val[5])
783
- }
784
- | primary
785
-
786
- relop: tGT | tLT | tGEQ | tLEQ
787
-
788
- rel_expr: arg relop arg =tGT
789
- {
790
- result = @builder.binary_op(val[0], val[1], val[2])
791
- }
792
- | rel_expr relop arg =tGT
793
- {
794
- result = @builder.binary_op(val[0], val[1], val[2])
795
- }
796
-
797
- arg_value: arg
798
-
799
- aref_args: none
800
- | args trailer
801
- | args tCOMMA assocs trailer
802
- {
803
- result = val[0] << @builder.associate(nil, val[2], nil)
804
- }
805
- | assocs trailer
806
- {
807
- result = [ @builder.associate(nil, val[0], nil) ]
808
- }
809
-
810
- arg_rhs: arg =tOP_ASGN
811
- | arg kRESCUE_MOD arg
812
- {
813
- rescue_body = @builder.rescue_body(val[1],
814
- nil, nil, nil,
815
- nil, val[2])
816
-
817
- result = @builder.begin_body(val[0], [ rescue_body ])
818
- }
819
-
820
- paren_args: tLPAREN2 opt_call_args rparen
821
- {
822
- result = val
823
- }
824
-
825
- opt_paren_args: # nothing
826
- {
827
- result = [ nil, [], nil ]
828
- }
829
- | paren_args
830
-
831
- opt_call_args: # nothing
832
- {
833
- result = []
834
- }
835
- | call_args
836
- | args tCOMMA
837
- | args tCOMMA assocs tCOMMA
838
- {
839
- result = val[0] << @builder.associate(nil, val[2], nil)
840
- }
841
- | assocs tCOMMA
842
- {
843
- result = [ @builder.associate(nil, val[0], nil) ]
844
- }
845
-
846
- call_args: command
847
- {
848
- result = [ val[0] ]
849
- }
850
- | args opt_block_arg
851
- {
852
- result = val[0].concat(val[1])
853
- }
854
- | assocs opt_block_arg
855
- {
856
- result = [ @builder.associate(nil, val[0], nil) ]
857
- result.concat(val[1])
858
- }
859
- | args tCOMMA assocs opt_block_arg
860
- {
861
- assocs = @builder.associate(nil, val[2], nil)
862
- result = val[0] << assocs
863
- result.concat(val[3])
864
- }
865
- | block_arg
866
- {
867
- result = [ val[0] ]
868
- }
869
-
870
- command_args: {
871
- # When branch gets invoked by RACC's lookahead
872
- # and command args start with '[' or '('
873
- # we need to put `true` to the cmdarg stack
874
- # **before** `false` pushed by lexer
875
- # m [], n
876
- # ^
877
- # Right here we have cmdarg [...0] because
878
- # lexer pushed it on '['
879
- # We need to modify cmdarg stack to [...10]
880
- #
881
- # For all other cases (like `m n` or `m n, []`) we simply put 1 to the stack
882
- # and later lexer pushes corresponding bits on top of it.
883
- last_token = @last_token[0]
884
- lookahead = last_token == :tLBRACK || last_token == :tLPAREN_ARG
885
-
886
- if lookahead
887
- top = @lexer.cmdarg.pop
888
- @lexer.cmdarg.push(true)
889
- @lexer.cmdarg.push(top)
890
- else
891
- @lexer.cmdarg.push(true)
892
- end
893
- }
894
- call_args
895
- {
896
- # call_args can be followed by tLBRACE_ARG (that does cmdarg.push(0) in the lexer)
897
- # but the push must be done after cmdarg.pop() in the parser.
898
- # So this code does cmdarg.pop() to pop 0 pushed by tLBRACE_ARG,
899
- # cmdarg.pop() to pop 1 pushed by command_args,
900
- # and cmdarg.push(0) to restore back the flag set by tLBRACE_ARG.
901
- last_token = @last_token[0]
902
- lookahead = last_token == :tLBRACE_ARG
903
- if lookahead
904
- top = @lexer.cmdarg.pop
905
- @lexer.cmdarg.pop
906
- @lexer.cmdarg.push(top)
907
- else
908
- @lexer.cmdarg.pop
909
- end
910
-
911
- result = val[1]
912
- }
913
-
914
- block_arg: tAMPER arg_value
915
- {
916
- result = @builder.block_pass(val[0], val[1])
917
- }
918
-
919
- opt_block_arg: tCOMMA block_arg
920
- {
921
- result = [ val[1] ]
922
- }
923
- | # nothing
924
- {
925
- result = []
926
- }
927
-
928
- args: arg_value
929
- {
930
- result = [ val[0] ]
931
- }
932
- | tSTAR arg_value
933
- {
934
- result = [ @builder.splat(val[0], val[1]) ]
935
- }
936
- | args tCOMMA arg_value
937
- {
938
- result = val[0] << val[2]
939
- }
940
- | args tCOMMA tSTAR arg_value
941
- {
942
- result = val[0] << @builder.splat(val[2], val[3])
943
- }
944
-
945
- mrhs_arg: mrhs
946
- {
947
- result = @builder.array(nil, val[0], nil)
948
- }
949
- | arg_value
950
-
951
- mrhs: args tCOMMA arg_value
952
- {
953
- result = val[0] << val[2]
954
- }
955
- | args tCOMMA tSTAR arg_value
956
- {
957
- result = val[0] << @builder.splat(val[2], val[3])
958
- }
959
- | tSTAR arg_value
960
- {
961
- result = [ @builder.splat(val[0], val[1]) ]
962
- }
963
-
964
- primary: literal
965
- | strings
966
- | xstring
967
- | regexp
968
- | words
969
- | qwords
970
- | symbols
971
- | qsymbols
972
- | var_ref
973
- | backref
974
- | tFID
975
- {
976
- result = @builder.call_method(nil, nil, val[0])
977
- }
978
- | kBEGIN
979
- {
980
- @lexer.cmdarg.push(false)
981
- }
982
- bodystmt kEND
983
- {
984
- @lexer.cmdarg.pop
985
-
986
- result = @builder.begin_keyword(val[0], val[2], val[3])
987
- }
988
- | tLPAREN_ARG stmt
989
- {
990
- @lexer.state = :expr_endarg
991
- }
992
- rparen
993
- {
994
- result = @builder.begin(val[0], val[1], val[3])
995
- }
996
- | tLPAREN_ARG
997
- {
998
- @lexer.state = :expr_endarg
999
- }
1000
- opt_nl tRPAREN
1001
- {
1002
- result = @builder.begin(val[0], nil, val[3])
1003
- }
1004
- | tLPAREN compstmt tRPAREN
1005
- {
1006
- result = @builder.begin(val[0], val[1], val[2])
1007
- }
1008
- | primary_value tCOLON2 tCONSTANT
1009
- {
1010
- result = @builder.const_fetch(val[0], val[1], val[2])
1011
- }
1012
- | tCOLON3 tCONSTANT
1013
- {
1014
- result = @builder.const_global(val[0], val[1])
1015
- }
1016
- | tLBRACK aref_args tRBRACK
1017
- {
1018
- result = @builder.array(val[0], val[1], val[2])
1019
- }
1020
- | tLBRACE assoc_list tRCURLY
1021
- {
1022
- result = @builder.associate(val[0], val[1], val[2])
1023
- }
1024
- | k_return
1025
- {
1026
- result = @builder.keyword_cmd(:return, val[0])
1027
- }
1028
- | kYIELD tLPAREN2 call_args rparen
1029
- {
1030
- result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3])
1031
- }
1032
- | kYIELD tLPAREN2 rparen
1033
- {
1034
- result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2])
1035
- }
1036
- | kYIELD
1037
- {
1038
- result = @builder.keyword_cmd(:yield, val[0])
1039
- }
1040
- | kDEFINED opt_nl tLPAREN2 expr rparen
1041
- {
1042
- result = @builder.keyword_cmd(:defined?, val[0],
1043
- val[2], [ val[3] ], val[4])
1044
- }
1045
- | kNOT tLPAREN2 expr rparen
1046
- {
1047
- result = @builder.not_op(val[0], val[1], val[2], val[3])
1048
- }
1049
- | kNOT tLPAREN2 rparen
1050
- {
1051
- result = @builder.not_op(val[0], val[1], nil, val[2])
1052
- }
1053
- | fcall brace_block
1054
- {
1055
- method_call = @builder.call_method(nil, nil, val[0])
1056
-
1057
- begin_t, args, body, end_t = val[1]
1058
- result = @builder.block(method_call,
1059
- begin_t, args, body, end_t)
1060
- }
1061
- | method_call
1062
- | method_call brace_block
1063
- {
1064
- begin_t, args, body, end_t = val[1]
1065
- result = @builder.block(val[0],
1066
- begin_t, args, body, end_t)
1067
- }
1068
- | tLAMBDA lambda
1069
- {
1070
- lambda_call = @builder.call_lambda(val[0])
1071
-
1072
- args, (begin_t, body, end_t) = val[1]
1073
- result = @builder.block(lambda_call,
1074
- begin_t, args, body, end_t)
1075
- }
1076
- | kIF expr_value then compstmt if_tail kEND
1077
- {
1078
- else_t, else_ = val[4]
1079
- result = @builder.condition(val[0], val[1], val[2],
1080
- val[3], else_t,
1081
- else_, val[5])
1082
- }
1083
- | kUNLESS expr_value then compstmt opt_else kEND
1084
- {
1085
- else_t, else_ = val[4]
1086
- result = @builder.condition(val[0], val[1], val[2],
1087
- else_, else_t,
1088
- val[3], val[5])
1089
- }
1090
- | kWHILE expr_value_do compstmt kEND
1091
- {
1092
- result = @builder.loop(:while, val[0], *val[1], val[2], val[3])
1093
- }
1094
- | kUNTIL expr_value_do compstmt kEND
1095
- {
1096
- result = @builder.loop(:until, val[0], *val[1], val[2], val[3])
1097
- }
1098
- | kCASE expr_value opt_terms case_body kEND
1099
- {
1100
- *when_bodies, (else_t, else_body) = *val[3]
1101
-
1102
- result = @builder.case(val[0], val[1],
1103
- when_bodies, else_t, else_body,
1104
- val[4])
1105
- }
1106
- | kCASE opt_terms case_body kEND
1107
- {
1108
- *when_bodies, (else_t, else_body) = *val[2]
1109
-
1110
- result = @builder.case(val[0], nil,
1111
- when_bodies, else_t, else_body,
1112
- val[3])
1113
- }
1114
- | kFOR for_var kIN expr_value_do compstmt kEND
1115
- {
1116
- result = @builder.for(val[0], val[1], val[2], *val[3], val[4], val[5])
1117
- }
1118
- | kCLASS cpath superclass
1119
- {
1120
- @static_env.extend_static
1121
- @lexer.cmdarg.push(false)
1122
- @lexer.cond.push(false)
1123
- @context.push(:class)
1124
- }
1125
- bodystmt kEND
1126
- {
1127
- unless @context.class_definition_allowed?
1128
- diagnostic :error, :class_in_def, nil, val[0]
1129
- end
1130
-
1131
- lt_t, superclass = val[2]
1132
- result = @builder.def_class(val[0], val[1],
1133
- lt_t, superclass,
1134
- val[4], val[5])
1135
-
1136
- @lexer.cmdarg.pop
1137
- @lexer.cond.pop
1138
- @static_env.unextend
1139
- @context.pop
1140
- }
1141
- | kCLASS tLSHFT expr term
1142
- {
1143
- @static_env.extend_static
1144
- @lexer.cmdarg.push(false)
1145
- @lexer.cond.push(false)
1146
- @context.push(:sclass)
1147
- }
1148
- bodystmt kEND
1149
- {
1150
- result = @builder.def_sclass(val[0], val[1], val[2],
1151
- val[5], val[6])
1152
-
1153
- @lexer.cmdarg.pop
1154
- @lexer.cond.pop
1155
- @static_env.unextend
1156
- @context.pop
1157
- }
1158
- | kMODULE cpath
1159
- {
1160
- @static_env.extend_static
1161
- @lexer.cmdarg.push(false)
1162
- }
1163
- bodystmt kEND
1164
- {
1165
- unless @context.module_definition_allowed?
1166
- diagnostic :error, :module_in_def, nil, val[0]
1167
- end
1168
-
1169
- result = @builder.def_module(val[0], val[1],
1170
- val[3], val[4])
1171
-
1172
- @lexer.cmdarg.pop
1173
- @static_env.unextend
1174
- }
1175
- | kDEF fname
1176
- {
1177
- @static_env.extend_static
1178
- @lexer.cmdarg.push(false)
1179
- @lexer.cond.push(false)
1180
- @context.push(:def)
1181
- }
1182
- f_arglist bodystmt kEND
1183
- {
1184
- result = @builder.def_method(val[0], val[1],
1185
- val[3], val[4], val[5])
1186
-
1187
- @lexer.cmdarg.pop
1188
- @lexer.cond.pop
1189
- @static_env.unextend
1190
- @context.pop
1191
- }
1192
- | kDEF singleton dot_or_colon
1193
- {
1194
- @lexer.state = :expr_fname
1195
- }
1196
- fname
1197
- {
1198
- @static_env.extend_static
1199
- @lexer.cmdarg.push(false)
1200
- @lexer.cond.push(false)
1201
- @context.push(:defs)
1202
- }
1203
- f_arglist bodystmt kEND
1204
- {
1205
- result = @builder.def_singleton(val[0], val[1], val[2],
1206
- val[4], val[6], val[7], val[8])
1207
-
1208
- @lexer.cmdarg.pop
1209
- @lexer.cond.pop
1210
- @static_env.unextend
1211
- @context.pop
1212
- }
1213
- | kBREAK
1214
- {
1215
- result = @builder.keyword_cmd(:break, val[0])
1216
- }
1217
- | kNEXT
1218
- {
1219
- result = @builder.keyword_cmd(:next, val[0])
1220
- }
1221
- | kREDO
1222
- {
1223
- result = @builder.keyword_cmd(:redo, val[0])
1224
- }
1225
- | kRETRY
1226
- {
1227
- result = @builder.keyword_cmd(:retry, val[0])
1228
- }
1229
-
1230
- primary_value: primary
1231
-
1232
- k_return: kRETURN
1233
- {
1234
- if @context.in_class?
1235
- diagnostic :error, :invalid_return, nil, val[0]
1236
- end
1237
- }
1238
-
1239
- then: term
1240
- | kTHEN
1241
- | term kTHEN
1242
- {
1243
- result = val[1]
1244
- }
1245
-
1246
- do: term
1247
- | kDO_COND
1248
-
1249
- if_tail: opt_else
1250
- | kELSIF expr_value then compstmt if_tail
1251
- {
1252
- else_t, else_ = val[4]
1253
- result = [ val[0],
1254
- @builder.condition(val[0], val[1], val[2],
1255
- val[3], else_t,
1256
- else_, nil),
1257
- ]
1258
- }
1259
-
1260
- opt_else: none
1261
- | kELSE compstmt
1262
- {
1263
- result = val
1264
- }
1265
-
1266
- for_var: lhs
1267
- | mlhs
1268
-
1269
- f_marg: f_norm_arg
1270
- {
1271
- result = @builder.arg(val[0])
1272
- }
1273
- | tLPAREN f_margs rparen
1274
- {
1275
- result = @builder.multi_lhs(val[0], val[1], val[2])
1276
- }
1277
-
1278
- f_marg_list: f_marg
1279
- {
1280
- result = [ val[0] ]
1281
- }
1282
- | f_marg_list tCOMMA f_marg
1283
- {
1284
- result = val[0] << val[2]
1285
- }
1286
-
1287
- f_margs: f_marg_list
1288
- | f_marg_list tCOMMA tSTAR f_norm_arg
1289
- {
1290
- result = val[0].
1291
- push(@builder.restarg(val[2], val[3]))
1292
- }
1293
- | f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list
1294
- {
1295
- result = val[0].
1296
- push(@builder.restarg(val[2], val[3])).
1297
- concat(val[5])
1298
- }
1299
- | f_marg_list tCOMMA tSTAR
1300
- {
1301
- result = val[0].
1302
- push(@builder.restarg(val[2]))
1303
- }
1304
- | f_marg_list tCOMMA tSTAR tCOMMA f_marg_list
1305
- {
1306
- result = val[0].
1307
- push(@builder.restarg(val[2])).
1308
- concat(val[4])
1309
- }
1310
- | tSTAR f_norm_arg
1311
- {
1312
- result = [ @builder.restarg(val[0], val[1]) ]
1313
- }
1314
- | tSTAR f_norm_arg tCOMMA f_marg_list
1315
- {
1316
- result = [ @builder.restarg(val[0], val[1]),
1317
- *val[3] ]
1318
- }
1319
- | tSTAR
1320
- {
1321
- result = [ @builder.restarg(val[0]) ]
1322
- }
1323
- | tSTAR tCOMMA f_marg_list
1324
- {
1325
- result = [ @builder.restarg(val[0]),
1326
- *val[2] ]
1327
- }
1328
-
1329
- block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg
1330
- {
1331
- result = val[0].concat(val[2]).concat(val[3])
1332
- }
1333
- | f_block_kwarg opt_f_block_arg
1334
- {
1335
- result = val[0].concat(val[1])
1336
- }
1337
- | f_kwrest opt_f_block_arg
1338
- {
1339
- result = val[0].concat(val[1])
1340
- }
1341
- | f_block_arg
1342
- {
1343
- result = [ val[0] ]
1344
- }
1345
-
1346
- opt_block_args_tail:
1347
- tCOMMA block_args_tail
1348
- {
1349
- result = val[1]
1350
- }
1351
- | # nothing
1352
- {
1353
- result = []
1354
- }
1355
-
1356
- block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1357
- {
1358
- result = val[0].
1359
- concat(val[2]).
1360
- concat(val[4]).
1361
- concat(val[5])
1362
- }
1363
- | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1364
- {
1365
- result = val[0].
1366
- concat(val[2]).
1367
- concat(val[4]).
1368
- concat(val[6]).
1369
- concat(val[7])
1370
- }
1371
- | f_arg tCOMMA f_block_optarg opt_block_args_tail
1372
- {
1373
- result = val[0].
1374
- concat(val[2]).
1375
- concat(val[3])
1376
- }
1377
- | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail
1378
- {
1379
- result = val[0].
1380
- concat(val[2]).
1381
- concat(val[4]).
1382
- concat(val[5])
1383
- }
1384
- | f_arg tCOMMA f_rest_arg opt_block_args_tail
1385
- {
1386
- result = val[0].
1387
- concat(val[2]).
1388
- concat(val[3])
1389
- }
1390
- | f_arg tCOMMA
1391
- | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1392
- {
1393
- result = val[0].
1394
- concat(val[2]).
1395
- concat(val[4]).
1396
- concat(val[5])
1397
- }
1398
- | f_arg opt_block_args_tail
1399
- {
1400
- if val[1].empty? && val[0].size == 1
1401
- result = [@builder.procarg0(val[0][0])]
1402
- else
1403
- result = val[0].concat(val[1])
1404
- end
1405
- }
1406
- | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1407
- {
1408
- result = val[0].
1409
- concat(val[2]).
1410
- concat(val[3])
1411
- }
1412
- | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1413
- {
1414
- result = val[0].
1415
- concat(val[2]).
1416
- concat(val[4]).
1417
- concat(val[5])
1418
- }
1419
- | f_block_optarg opt_block_args_tail
1420
- {
1421
- result = val[0].
1422
- concat(val[1])
1423
- }
1424
- | f_block_optarg tCOMMA f_arg opt_block_args_tail
1425
- {
1426
- result = val[0].
1427
- concat(val[2]).
1428
- concat(val[3])
1429
- }
1430
- | f_rest_arg opt_block_args_tail
1431
- {
1432
- result = val[0].
1433
- concat(val[1])
1434
- }
1435
- | f_rest_arg tCOMMA f_arg opt_block_args_tail
1436
- {
1437
- result = val[0].
1438
- concat(val[2]).
1439
- concat(val[3])
1440
- }
1441
- | block_args_tail
1442
-
1443
- opt_block_param: # nothing
1444
- {
1445
- result = @builder.args(nil, [], nil)
1446
- }
1447
- | block_param_def
1448
- {
1449
- @lexer.state = :expr_value
1450
- }
1451
-
1452
- block_param_def: tPIPE opt_bv_decl tPIPE
1453
- {
1454
- result = @builder.args(val[0], val[1], val[2])
1455
- }
1456
- | tOROP
1457
- {
1458
- result = @builder.args(val[0], [], val[0])
1459
- }
1460
- | tPIPE block_param opt_bv_decl tPIPE
1461
- {
1462
- result = @builder.args(val[0], val[1].concat(val[2]), val[3])
1463
- }
1464
-
1465
- opt_bv_decl: opt_nl
1466
- {
1467
- result = []
1468
- }
1469
- | opt_nl tSEMI bv_decls opt_nl
1470
- {
1471
- result = val[2]
1472
- }
1473
-
1474
- bv_decls: bvar
1475
- {
1476
- result = [ val[0] ]
1477
- }
1478
- | bv_decls tCOMMA bvar
1479
- {
1480
- result = val[0] << val[2]
1481
- }
1482
-
1483
- bvar: tIDENTIFIER
1484
- {
1485
- @static_env.declare val[0][0]
1486
- result = @builder.shadowarg(val[0])
1487
- }
1488
- | f_bad_arg
1489
-
1490
- lambda: {
1491
- @static_env.extend_dynamic
1492
- }
1493
- f_larglist
1494
- {
1495
- @lexer.cmdarg.push(false)
1496
- }
1497
- lambda_body
1498
- {
1499
- @lexer.cmdarg.pop
1500
-
1501
- result = [ val[1], val[3] ]
1502
-
1503
- @static_env.unextend
1504
- }
1505
-
1506
- f_larglist: tLPAREN2 f_args opt_bv_decl tRPAREN
1507
- {
1508
- result = @builder.args(val[0], val[1].concat(val[2]), val[3])
1509
- }
1510
- | f_args
1511
- {
1512
- result = @builder.args(nil, val[0], nil)
1513
- }
1514
-
1515
- lambda_body: tLAMBEG
1516
- {
1517
- @context.push(:lambda)
1518
- }
1519
- compstmt tRCURLY
1520
- {
1521
- result = [ val[0], val[2], val[3] ]
1522
- @context.pop
1523
- }
1524
- | kDO_LAMBDA
1525
- {
1526
- @context.push(:lambda)
1527
- }
1528
- bodystmt kEND
1529
- {
1530
- result = [ val[0], val[2], val[3] ]
1531
- @context.pop
1532
- }
1533
-
1534
- do_block: kDO_BLOCK
1535
- {
1536
- @context.push(:block)
1537
- }
1538
- do_body kEND
1539
- {
1540
- result = [ val[0], *val[2], val[3] ]
1541
- @context.pop
1542
- }
1543
-
1544
- block_call: command do_block
1545
- {
1546
- begin_t, block_args, body, end_t = val[1]
1547
- result = @builder.block(val[0],
1548
- begin_t, block_args, body, end_t)
1549
- }
1550
- | block_call dot_or_colon operation2 opt_paren_args
1551
- {
1552
- lparen_t, args, rparen_t = val[3]
1553
- result = @builder.call_method(val[0], val[1], val[2],
1554
- lparen_t, args, rparen_t)
1555
- }
1556
- | block_call dot_or_colon operation2 opt_paren_args brace_block
1557
- {
1558
- lparen_t, args, rparen_t = val[3]
1559
- method_call = @builder.call_method(val[0], val[1], val[2],
1560
- lparen_t, args, rparen_t)
1561
-
1562
- begin_t, args, body, end_t = val[4]
1563
- result = @builder.block(method_call,
1564
- begin_t, args, body, end_t)
1565
- }
1566
- | block_call dot_or_colon operation2 command_args do_block
1567
- {
1568
- method_call = @builder.call_method(val[0], val[1], val[2],
1569
- nil, val[3], nil)
1570
-
1571
- begin_t, args, body, end_t = val[4]
1572
- result = @builder.block(method_call,
1573
- begin_t, args, body, end_t)
1574
- }
1575
-
1576
- method_call: fcall paren_args
1577
- {
1578
- lparen_t, args, rparen_t = val[1]
1579
- result = @builder.call_method(nil, nil, val[0],
1580
- lparen_t, args, rparen_t)
1581
- }
1582
- | primary_value call_op operation2 opt_paren_args
1583
- {
1584
- lparen_t, args, rparen_t = val[3]
1585
- result = @builder.call_method(val[0], val[1], val[2],
1586
- lparen_t, args, rparen_t)
1587
- }
1588
- | primary_value tCOLON2 operation2 paren_args
1589
- {
1590
- lparen_t, args, rparen_t = val[3]
1591
- result = @builder.call_method(val[0], val[1], val[2],
1592
- lparen_t, args, rparen_t)
1593
- }
1594
- | primary_value tCOLON2 operation3
1595
- {
1596
- result = @builder.call_method(val[0], val[1], val[2])
1597
- }
1598
- | primary_value call_op paren_args
1599
- {
1600
- lparen_t, args, rparen_t = val[2]
1601
- result = @builder.call_method(val[0], val[1], nil,
1602
- lparen_t, args, rparen_t)
1603
- }
1604
- | primary_value tCOLON2 paren_args
1605
- {
1606
- lparen_t, args, rparen_t = val[2]
1607
- result = @builder.call_method(val[0], val[1], nil,
1608
- lparen_t, args, rparen_t)
1609
- }
1610
- | kSUPER paren_args
1611
- {
1612
- lparen_t, args, rparen_t = val[1]
1613
- result = @builder.keyword_cmd(:super, val[0],
1614
- lparen_t, args, rparen_t)
1615
- }
1616
- | kSUPER
1617
- {
1618
- result = @builder.keyword_cmd(:zsuper, val[0])
1619
- }
1620
- | primary_value tLBRACK2 opt_call_args rbracket
1621
- {
1622
- result = @builder.index(val[0], val[1], val[2], val[3])
1623
- }
1624
-
1625
- brace_block: tLCURLY
1626
- {
1627
- @context.push(:block)
1628
- }
1629
- brace_body tRCURLY
1630
- {
1631
- result = [ val[0], *val[2], val[3] ]
1632
- @context.pop
1633
- }
1634
- | kDO
1635
- {
1636
- @context.push(:block)
1637
- }
1638
- do_body kEND
1639
- {
1640
- result = [ val[0], *val[2], val[3] ]
1641
- @context.pop
1642
- }
1643
-
1644
- brace_body: {
1645
- @static_env.extend_dynamic
1646
- }
1647
- opt_block_param compstmt
1648
- {
1649
- result = [ val[1], val[2] ]
1650
-
1651
- @static_env.unextend
1652
- }
1653
-
1654
- do_body: {
1655
- @static_env.extend_dynamic
1656
- }
1657
- {
1658
- @lexer.cmdarg.push(false)
1659
- }
1660
- opt_block_param bodystmt
1661
- {
1662
- result = [ val[2], val[3] ]
1663
-
1664
- @static_env.unextend
1665
- @lexer.cmdarg.pop
1666
- }
1667
-
1668
- case_body: kWHEN args then compstmt cases
1669
- {
1670
- result = [ @builder.when(val[0], val[1], val[2], val[3]),
1671
- *val[4] ]
1672
- }
1673
-
1674
- cases: opt_else
1675
- {
1676
- result = [ val[0] ]
1677
- }
1678
- | case_body
1679
-
1680
- opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue
1681
- {
1682
- assoc_t, exc_var = val[2]
1683
-
1684
- if val[1]
1685
- exc_list = @builder.array(nil, val[1], nil)
1686
- end
1687
-
1688
- result = [ @builder.rescue_body(val[0],
1689
- exc_list, assoc_t, exc_var,
1690
- val[3], val[4]),
1691
- *val[5] ]
1692
- }
1693
- |
1694
- {
1695
- result = []
1696
- }
1697
-
1698
- exc_list: arg_value
1699
- {
1700
- result = [ val[0] ]
1701
- }
1702
- | mrhs
1703
- | none
1704
-
1705
- exc_var: tASSOC lhs
1706
- {
1707
- result = [ val[0], val[1] ]
1708
- }
1709
- | none
1710
-
1711
- opt_ensure: kENSURE compstmt
1712
- {
1713
- result = [ val[0], val[1] ]
1714
- }
1715
- | none
1716
-
1717
- literal: numeric
1718
- | symbol
1719
- | dsym
1720
-
1721
- strings: string
1722
- {
1723
- result = @builder.string_compose(nil, val[0], nil)
1724
- }
1725
-
1726
- string: string1
1727
- {
1728
- result = [ val[0] ]
1729
- }
1730
- | string string1
1731
- {
1732
- result = val[0] << val[1]
1733
- }
1734
-
1735
- string1: tSTRING_BEG string_contents tSTRING_END
1736
- {
1737
- string = @builder.string_compose(val[0], val[1], val[2])
1738
- result = @builder.dedent_string(string, @lexer.dedent_level)
1739
- }
1740
- | tSTRING
1741
- {
1742
- string = @builder.string(val[0])
1743
- result = @builder.dedent_string(string, @lexer.dedent_level)
1744
- }
1745
- | tCHARACTER
1746
- {
1747
- result = @builder.character(val[0])
1748
- }
1749
-
1750
- xstring: tXSTRING_BEG xstring_contents tSTRING_END
1751
- {
1752
- string = @builder.xstring_compose(val[0], val[1], val[2])
1753
- result = @builder.dedent_string(string, @lexer.dedent_level)
1754
- }
1755
-
1756
- regexp: tREGEXP_BEG regexp_contents tSTRING_END tREGEXP_OPT
1757
- {
1758
- opts = @builder.regexp_options(val[3])
1759
- result = @builder.regexp_compose(val[0], val[1], val[2], opts)
1760
- }
1761
-
1762
- words: tWORDS_BEG word_list tSTRING_END
1763
- {
1764
- result = @builder.words_compose(val[0], val[1], val[2])
1765
- }
1766
-
1767
- word_list: # nothing
1768
- {
1769
- result = []
1770
- }
1771
- | word_list word tSPACE
1772
- {
1773
- result = val[0] << @builder.word(val[1])
1774
- }
1775
-
1776
- word: string_content
1777
- {
1778
- result = [ val[0] ]
1779
- }
1780
- | word string_content
1781
- {
1782
- result = val[0] << val[1]
1783
- }
1784
-
1785
- symbols: tSYMBOLS_BEG symbol_list tSTRING_END
1786
- {
1787
- result = @builder.symbols_compose(val[0], val[1], val[2])
1788
- }
1789
-
1790
- symbol_list: # nothing
1791
- {
1792
- result = []
1793
- }
1794
- | symbol_list word tSPACE
1795
- {
1796
- result = val[0] << @builder.word(val[1])
1797
- }
1798
-
1799
- qwords: tQWORDS_BEG qword_list tSTRING_END
1800
- {
1801
- result = @builder.words_compose(val[0], val[1], val[2])
1802
- }
1803
-
1804
- qsymbols: tQSYMBOLS_BEG qsym_list tSTRING_END
1805
- {
1806
- result = @builder.symbols_compose(val[0], val[1], val[2])
1807
- }
1808
-
1809
- qword_list: # nothing
1810
- {
1811
- result = []
1812
- }
1813
- | qword_list tSTRING_CONTENT tSPACE
1814
- {
1815
- result = val[0] << @builder.string_internal(val[1])
1816
- }
1817
-
1818
- qsym_list: # nothing
1819
- {
1820
- result = []
1821
- }
1822
- | qsym_list tSTRING_CONTENT tSPACE
1823
- {
1824
- result = val[0] << @builder.symbol_internal(val[1])
1825
- }
1826
-
1827
- string_contents: # nothing
1828
- {
1829
- result = []
1830
- }
1831
- | string_contents string_content
1832
- {
1833
- result = val[0] << val[1]
1834
- }
1835
-
1836
- xstring_contents: # nothing
1837
- {
1838
- result = []
1839
- }
1840
- | xstring_contents string_content
1841
- {
1842
- result = val[0] << val[1]
1843
- }
1844
-
1845
- regexp_contents: # nothing
1846
- {
1847
- result = []
1848
- }
1849
- | regexp_contents string_content
1850
- {
1851
- result = val[0] << val[1]
1852
- }
1853
-
1854
- string_content: tSTRING_CONTENT
1855
- {
1856
- result = @builder.string_internal(val[0])
1857
- }
1858
- | tSTRING_DVAR string_dvar
1859
- {
1860
- result = val[1]
1861
- }
1862
- | tSTRING_DBEG
1863
- {
1864
- @lexer.cmdarg.push(false)
1865
- @lexer.cond.push(false)
1866
- }
1867
- compstmt tSTRING_DEND
1868
- {
1869
- @lexer.cmdarg.pop
1870
- @lexer.cond.pop
1871
-
1872
- result = @builder.begin(val[0], val[2], val[3])
1873
- }
1874
-
1875
- string_dvar: tGVAR
1876
- {
1877
- result = @builder.gvar(val[0])
1878
- }
1879
- | tIVAR
1880
- {
1881
- result = @builder.ivar(val[0])
1882
- }
1883
- | tCVAR
1884
- {
1885
- result = @builder.cvar(val[0])
1886
- }
1887
- | backref
1888
-
1889
-
1890
- symbol: tSYMBOL
1891
- {
1892
- @lexer.state = :expr_end
1893
- result = @builder.symbol(val[0])
1894
- }
1895
-
1896
- dsym: tSYMBEG xstring_contents tSTRING_END
1897
- {
1898
- @lexer.state = :expr_end
1899
- result = @builder.symbol_compose(val[0], val[1], val[2])
1900
- }
1901
-
1902
- numeric: simple_numeric
1903
- {
1904
- result = val[0]
1905
- }
1906
- | tUNARY_NUM simple_numeric =tLOWEST
1907
- {
1908
- if @builder.respond_to? :negate
1909
- # AST builder interface compatibility
1910
- result = @builder.negate(val[0], val[1])
1911
- else
1912
- result = @builder.unary_num(val[0], val[1])
1913
- end
1914
- }
1915
-
1916
- simple_numeric: tINTEGER
1917
- {
1918
- @lexer.state = :expr_end
1919
- result = @builder.integer(val[0])
1920
- }
1921
- | tFLOAT
1922
- {
1923
- @lexer.state = :expr_end
1924
- result = @builder.float(val[0])
1925
- }
1926
- | tRATIONAL
1927
- {
1928
- @lexer.state = :expr_end
1929
- result = @builder.rational(val[0])
1930
- }
1931
- | tIMAGINARY
1932
- {
1933
- @lexer.state = :expr_end
1934
- result = @builder.complex(val[0])
1935
- }
1936
-
1937
- user_variable: tIDENTIFIER
1938
- {
1939
- result = @builder.ident(val[0])
1940
- }
1941
- | tIVAR
1942
- {
1943
- result = @builder.ivar(val[0])
1944
- }
1945
- | tGVAR
1946
- {
1947
- result = @builder.gvar(val[0])
1948
- }
1949
- | tCONSTANT
1950
- {
1951
- result = @builder.const(val[0])
1952
- }
1953
- | tCVAR
1954
- {
1955
- result = @builder.cvar(val[0])
1956
- }
1957
-
1958
- keyword_variable: kNIL
1959
- {
1960
- result = @builder.nil(val[0])
1961
- }
1962
- | kSELF
1963
- {
1964
- result = @builder.self(val[0])
1965
- }
1966
- | kTRUE
1967
- {
1968
- result = @builder.true(val[0])
1969
- }
1970
- | kFALSE
1971
- {
1972
- result = @builder.false(val[0])
1973
- }
1974
- | k__FILE__
1975
- {
1976
- result = @builder.__FILE__(val[0])
1977
- }
1978
- | k__LINE__
1979
- {
1980
- result = @builder.__LINE__(val[0])
1981
- }
1982
- | k__ENCODING__
1983
- {
1984
- result = @builder.__ENCODING__(val[0])
1985
- }
1986
-
1987
- var_ref: user_variable
1988
- {
1989
- result = @builder.accessible(val[0])
1990
- }
1991
- | keyword_variable
1992
- {
1993
- result = @builder.accessible(val[0])
1994
- }
1995
-
1996
- var_lhs: user_variable
1997
- {
1998
- result = @builder.assignable(val[0])
1999
- }
2000
- | keyword_variable
2001
- {
2002
- result = @builder.assignable(val[0])
2003
- }
2004
-
2005
- backref: tNTH_REF
2006
- {
2007
- result = @builder.nth_ref(val[0])
2008
- }
2009
- | tBACK_REF
2010
- {
2011
- result = @builder.back_ref(val[0])
2012
- }
2013
-
2014
- superclass: tLT
2015
- {
2016
- @lexer.state = :expr_value
2017
- }
2018
- expr_value term
2019
- {
2020
- result = [ val[0], val[2] ]
2021
- }
2022
- | # nothing
2023
- {
2024
- result = nil
2025
- }
2026
-
2027
- f_arglist: tLPAREN2 f_args rparen
2028
- {
2029
- result = @builder.args(val[0], val[1], val[2])
2030
-
2031
- @lexer.state = :expr_value
2032
- }
2033
- | {
2034
- result = @lexer.in_kwarg
2035
- @lexer.in_kwarg = true
2036
- }
2037
- f_args term
2038
- {
2039
- @lexer.in_kwarg = val[0]
2040
- result = @builder.args(nil, val[1], nil)
2041
- }
2042
-
2043
- args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg
2044
- {
2045
- result = val[0].concat(val[2]).concat(val[3])
2046
- }
2047
- | f_kwarg opt_f_block_arg
2048
- {
2049
- result = val[0].concat(val[1])
2050
- }
2051
- | f_kwrest opt_f_block_arg
2052
- {
2053
- result = val[0].concat(val[1])
2054
- }
2055
- | f_block_arg
2056
- {
2057
- result = [ val[0] ]
2058
- }
2059
-
2060
- opt_args_tail: tCOMMA args_tail
2061
- {
2062
- result = val[1]
2063
- }
2064
- | # nothing
2065
- {
2066
- result = []
2067
- }
2068
-
2069
- f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail
2070
- {
2071
- result = val[0].
2072
- concat(val[2]).
2073
- concat(val[4]).
2074
- concat(val[5])
2075
- }
2076
- | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
2077
- {
2078
- result = val[0].
2079
- concat(val[2]).
2080
- concat(val[4]).
2081
- concat(val[6]).
2082
- concat(val[7])
2083
- }
2084
- | f_arg tCOMMA f_optarg opt_args_tail
2085
- {
2086
- result = val[0].
2087
- concat(val[2]).
2088
- concat(val[3])
2089
- }
2090
- | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail
2091
- {
2092
- result = val[0].
2093
- concat(val[2]).
2094
- concat(val[4]).
2095
- concat(val[5])
2096
- }
2097
- | f_arg tCOMMA f_rest_arg opt_args_tail
2098
- {
2099
- result = val[0].
2100
- concat(val[2]).
2101
- concat(val[3])
2102
- }
2103
- | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
2104
- {
2105
- result = val[0].
2106
- concat(val[2]).
2107
- concat(val[4]).
2108
- concat(val[5])
2109
- }
2110
- | f_arg opt_args_tail
2111
- {
2112
- result = val[0].
2113
- concat(val[1])
2114
- }
2115
- | f_optarg tCOMMA f_rest_arg opt_args_tail
2116
- {
2117
- result = val[0].
2118
- concat(val[2]).
2119
- concat(val[3])
2120
- }
2121
- | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
2122
- {
2123
- result = val[0].
2124
- concat(val[2]).
2125
- concat(val[4]).
2126
- concat(val[5])
2127
- }
2128
- | f_optarg opt_args_tail
2129
- {
2130
- result = val[0].
2131
- concat(val[1])
2132
- }
2133
- | f_optarg tCOMMA f_arg opt_args_tail
2134
- {
2135
- result = val[0].
2136
- concat(val[2]).
2137
- concat(val[3])
2138
- }
2139
- | f_rest_arg opt_args_tail
2140
- {
2141
- result = val[0].
2142
- concat(val[1])
2143
- }
2144
- | f_rest_arg tCOMMA f_arg opt_args_tail
2145
- {
2146
- result = val[0].
2147
- concat(val[2]).
2148
- concat(val[3])
2149
- }
2150
- | args_tail
2151
- {
2152
- result = val[0]
2153
- }
2154
- | # nothing
2155
- {
2156
- result = []
2157
- }
2158
-
2159
- f_bad_arg: tCONSTANT
2160
- {
2161
- diagnostic :error, :argument_const, nil, val[0]
2162
- }
2163
- | tIVAR
2164
- {
2165
- diagnostic :error, :argument_ivar, nil, val[0]
2166
- }
2167
- | tGVAR
2168
- {
2169
- diagnostic :error, :argument_gvar, nil, val[0]
2170
- }
2171
- | tCVAR
2172
- {
2173
- diagnostic :error, :argument_cvar, nil, val[0]
2174
- }
2175
-
2176
- f_norm_arg: f_bad_arg
2177
- | tIDENTIFIER
2178
- {
2179
- @static_env.declare val[0][0]
2180
-
2181
- result = val[0]
2182
- }
2183
-
2184
- f_arg_asgn: f_norm_arg
2185
- {
2186
- result = val[0]
2187
- }
2188
-
2189
- f_arg_item: f_arg_asgn
2190
- {
2191
- result = @builder.arg(val[0])
2192
- }
2193
- | tLPAREN f_margs rparen
2194
- {
2195
- result = @builder.multi_lhs(val[0], val[1], val[2])
2196
- }
2197
-
2198
- f_arg: f_arg_item
2199
- {
2200
- result = [ val[0] ]
2201
- }
2202
- | f_arg tCOMMA f_arg_item
2203
- {
2204
- result = val[0] << val[2]
2205
- }
2206
-
2207
- f_label: tLABEL
2208
- {
2209
- check_kwarg_name(val[0])
2210
-
2211
- @static_env.declare val[0][0]
2212
-
2213
- result = val[0]
2214
- }
2215
-
2216
- f_kw: f_label arg_value
2217
- {
2218
- result = @builder.kwoptarg(val[0], val[1])
2219
- }
2220
- | f_label
2221
- {
2222
- result = @builder.kwarg(val[0])
2223
- }
2224
-
2225
- f_block_kw: f_label primary_value
2226
- {
2227
- result = @builder.kwoptarg(val[0], val[1])
2228
- }
2229
- | f_label
2230
- {
2231
- result = @builder.kwarg(val[0])
2232
- }
2233
-
2234
- f_block_kwarg: f_block_kw
2235
- {
2236
- result = [ val[0] ]
2237
- }
2238
- | f_block_kwarg tCOMMA f_block_kw
2239
- {
2240
- result = val[0] << val[2]
2241
- }
2242
-
2243
- f_kwarg: f_kw
2244
- {
2245
- result = [ val[0] ]
2246
- }
2247
- | f_kwarg tCOMMA f_kw
2248
- {
2249
- result = val[0] << val[2]
2250
- }
2251
-
2252
- kwrest_mark: tPOW | tDSTAR
2253
-
2254
- f_kwrest: kwrest_mark tIDENTIFIER
2255
- {
2256
- @static_env.declare val[1][0]
2257
-
2258
- result = [ @builder.kwrestarg(val[0], val[1]) ]
2259
- }
2260
- | kwrest_mark
2261
- {
2262
- result = [ @builder.kwrestarg(val[0]) ]
2263
- }
2264
-
2265
- f_opt: f_arg_asgn tEQL arg_value
2266
- {
2267
- result = @builder.optarg(val[0], val[1], val[2])
2268
- }
2269
-
2270
- f_block_opt: f_arg_asgn tEQL primary_value
2271
- {
2272
- result = @builder.optarg(val[0], val[1], val[2])
2273
- }
2274
-
2275
- f_block_optarg: f_block_opt
2276
- {
2277
- result = [ val[0] ]
2278
- }
2279
- | f_block_optarg tCOMMA f_block_opt
2280
- {
2281
- result = val[0] << val[2]
2282
- }
2283
-
2284
- f_optarg: f_opt
2285
- {
2286
- result = [ val[0] ]
2287
- }
2288
- | f_optarg tCOMMA f_opt
2289
- {
2290
- result = val[0] << val[2]
2291
- }
2292
-
2293
- restarg_mark: tSTAR2 | tSTAR
2294
-
2295
- f_rest_arg: restarg_mark tIDENTIFIER
2296
- {
2297
- @static_env.declare val[1][0]
2298
-
2299
- result = [ @builder.restarg(val[0], val[1]) ]
2300
- }
2301
- | restarg_mark
2302
- {
2303
- result = [ @builder.restarg(val[0]) ]
2304
- }
2305
-
2306
- blkarg_mark: tAMPER2 | tAMPER
2307
-
2308
- f_block_arg: blkarg_mark tIDENTIFIER
2309
- {
2310
- @static_env.declare val[1][0]
2311
-
2312
- result = @builder.blockarg(val[0], val[1])
2313
- }
2314
-
2315
- opt_f_block_arg: tCOMMA f_block_arg
2316
- {
2317
- result = [ val[1] ]
2318
- }
2319
- |
2320
- {
2321
- result = []
2322
- }
2323
-
2324
- singleton: var_ref
2325
- | tLPAREN2 expr rparen
2326
- {
2327
- result = val[1]
2328
- }
2329
-
2330
- assoc_list: # nothing
2331
- {
2332
- result = []
2333
- }
2334
- | assocs trailer
2335
-
2336
- assocs: assoc
2337
- {
2338
- result = [ val[0] ]
2339
- }
2340
- | assocs tCOMMA assoc
2341
- {
2342
- result = val[0] << val[2]
2343
- }
2344
-
2345
- assoc: arg_value tASSOC arg_value
2346
- {
2347
- result = @builder.pair(val[0], val[1], val[2])
2348
- }
2349
- | tLABEL arg_value
2350
- {
2351
- result = @builder.pair_keyword(val[0], val[1])
2352
- }
2353
- | tSTRING_BEG string_contents tLABEL_END arg_value
2354
- {
2355
- result = @builder.pair_quoted(val[0], val[1], val[2], val[3])
2356
- }
2357
- | tDSTAR arg_value
2358
- {
2359
- result = @builder.kwsplat(val[0], val[1])
2360
- }
2361
-
2362
- operation: tIDENTIFIER | tCONSTANT | tFID
2363
- operation2: tIDENTIFIER | tCONSTANT | tFID | op
2364
- operation3: tIDENTIFIER | tFID | op
2365
- dot_or_colon: call_op | tCOLON2
2366
- call_op: tDOT
2367
- {
2368
- result = [:dot, val[0][1]]
2369
- }
2370
- | tANDDOT
2371
- {
2372
- result = [:anddot, val[0][1]]
2373
- }
2374
- opt_terms: | terms
2375
- opt_nl: | tNL
2376
- rparen: opt_nl tRPAREN
2377
- {
2378
- result = val[1]
2379
- }
2380
- rbracket: opt_nl tRBRACK
2381
- {
2382
- result = val[1]
2383
- }
2384
- trailer: | tNL | tCOMMA
2385
-
2386
- term: tSEMI
2387
- {
2388
- yyerrok
2389
- }
2390
- | tNL
2391
-
2392
- terms: term
2393
- | terms tSEMI
2394
-
2395
- none: # nothing
2396
- {
2397
- result = nil
2398
- }
2399
- end
2400
-
2401
- ---- header
2402
-
2403
- require 'parser'
2404
-
2405
- ---- inner
2406
-
2407
- def version
2408
- 26
2409
- end
2410
-
2411
- def default_encoding
2412
- Encoding::UTF_8
2413
- end