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