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