parser 2.5.1.0 → 3.0.1.1

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