parser 2.6.5.0 → 2.7.2.0

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