parser 2.7.1.5 → 2.7.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/lib/parser/current.rb +1 -1
  3. data/lib/parser/meta.rb +2 -2
  4. data/lib/parser/ruby28.rb +8047 -0
  5. data/lib/parser/version.rb +1 -1
  6. data/parser.gemspec +1 -20
  7. metadata +7 -96
  8. data/.travis.yml +0 -41
  9. data/.yardopts +0 -21
  10. data/CHANGELOG.md +0 -1137
  11. data/CONTRIBUTING.md +0 -17
  12. data/Gemfile +0 -10
  13. data/LICENSE.txt +0 -25
  14. data/README.md +0 -309
  15. data/Rakefile +0 -167
  16. data/ci/run_rubocop_specs +0 -14
  17. data/doc/AST_FORMAT.md +0 -2284
  18. data/doc/CUSTOMIZATION.md +0 -37
  19. data/doc/INTERNALS.md +0 -21
  20. data/doc/css/.gitkeep +0 -0
  21. data/doc/css/common.css +0 -68
  22. data/lib/parser/lexer.rl +0 -2550
  23. data/lib/parser/macruby.y +0 -2208
  24. data/lib/parser/ruby18.y +0 -1936
  25. data/lib/parser/ruby19.y +0 -2185
  26. data/lib/parser/ruby20.y +0 -2363
  27. data/lib/parser/ruby21.y +0 -2364
  28. data/lib/parser/ruby22.y +0 -2371
  29. data/lib/parser/ruby23.y +0 -2377
  30. data/lib/parser/ruby24.y +0 -2415
  31. data/lib/parser/ruby25.y +0 -2412
  32. data/lib/parser/ruby26.y +0 -2420
  33. data/lib/parser/ruby27.y +0 -2949
  34. data/lib/parser/ruby30.y +0 -3048
  35. data/lib/parser/rubymotion.y +0 -2192
  36. data/test/bug_163/fixtures/input.rb +0 -5
  37. data/test/bug_163/fixtures/output.rb +0 -5
  38. data/test/bug_163/rewriter.rb +0 -20
  39. data/test/helper.rb +0 -103
  40. data/test/parse_helper.rb +0 -328
  41. data/test/racc_coverage_helper.rb +0 -133
  42. data/test/test_ast_processor.rb +0 -32
  43. data/test/test_base.rb +0 -31
  44. data/test/test_current.rb +0 -31
  45. data/test/test_diagnostic.rb +0 -95
  46. data/test/test_diagnostic_engine.rb +0 -59
  47. data/test/test_encoding.rb +0 -99
  48. data/test/test_lexer.rb +0 -3617
  49. data/test/test_lexer_stack_state.rb +0 -78
  50. data/test/test_meta.rb +0 -12
  51. data/test/test_parse_helper.rb +0 -83
  52. data/test/test_parser.rb +0 -9986
  53. data/test/test_runner_parse.rb +0 -56
  54. data/test/test_runner_rewrite.rb +0 -47
  55. data/test/test_source_buffer.rb +0 -165
  56. data/test/test_source_comment.rb +0 -36
  57. data/test/test_source_comment_associator.rb +0 -399
  58. data/test/test_source_map.rb +0 -14
  59. data/test/test_source_range.rb +0 -192
  60. data/test/test_source_rewriter.rb +0 -541
  61. data/test/test_source_rewriter_action.rb +0 -46
  62. data/test/test_source_tree_rewriter.rb +0 -361
  63. data/test/test_static_environment.rb +0 -45
  64. data/test/using_tree_rewriter/fixtures/input.rb +0 -3
  65. data/test/using_tree_rewriter/fixtures/output.rb +0 -3
  66. data/test/using_tree_rewriter/using_tree_rewriter.rb +0 -9
@@ -1,1936 +0,0 @@
1
- class Parser::Ruby18
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 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__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tNTH_REF
9
- tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT tUPLUS
10
- tUMINUS tUNARY_NUM tPOW tCMP tEQ tEQQ tNEQ tGEQ tLEQ tANDOP
11
- tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF tASET tLSHFT tRSHFT
12
- tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN tLPAREN2 tRPAREN tLPAREN_ARG
13
- tLBRACK tLBRACK2 tRBRACK tLBRACE tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2
14
- tTILDE tPERCENT tDIVIDE tPLUS tMINUS tLT tGT tPIPE tBANG tCARET
15
- tLCURLY tRCURLY tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG
16
- tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END tSTRING
17
- tSYMBOL tREGEXP_OPT tNL tEH tCOLON tCOMMA tSPACE tSEMI
18
-
19
- prechigh
20
- right tBANG tTILDE tUPLUS
21
- right tPOW
22
- right tUNARY_NUM tUMINUS
23
- left tSTAR2 tDIVIDE tPERCENT
24
- left tPLUS tMINUS
25
- left tLSHFT tRSHFT
26
- left tAMPER2
27
- left tPIPE tCARET
28
- left tGT tGEQ tLT tLEQ
29
- nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
30
- left tANDOP
31
- left tOROP
32
- nonassoc tDOT2 tDOT3
33
- right tEH tCOLON
34
- left kRESCUE_MOD
35
- right tEQL tOP_ASGN
36
- nonassoc kDEFINED
37
- right kNOT
38
- left kOR kAND
39
- nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD
40
- nonassoc tLBRACE_ARG
41
- nonassoc tLOWEST
42
- preclow
43
-
44
- rule
45
-
46
- program: compstmt
47
- {
48
- result = val[0]
49
- }
50
-
51
- bodystmt: compstmt opt_rescue opt_else opt_ensure
52
- {
53
- rescue_bodies = val[1]
54
- else_t, else_ = val[2]
55
- ensure_t, ensure_ = val[3]
56
-
57
- if rescue_bodies.empty? && !else_t.nil?
58
- diagnostic :warning, :useless_else, nil, else_t
59
- end
60
-
61
- result = @builder.begin_body(val[0],
62
- rescue_bodies,
63
- else_t, else_,
64
- ensure_t, ensure_)
65
- }
66
-
67
- compstmt: stmts opt_terms
68
- {
69
- result = @builder.compstmt(val[0])
70
- }
71
-
72
- stmts: # nothing
73
- {
74
- result = []
75
- }
76
- | stmt
77
- {
78
- result = [ val[0] ]
79
- }
80
- | error stmt
81
- {
82
- result = [ val[1] ]
83
- }
84
- | stmts terms stmt
85
- {
86
- result = val[0] << val[2]
87
- }
88
-
89
- stmt: kALIAS fitem
90
- {
91
- @lexer.state = :expr_fname
92
- }
93
- fitem
94
- {
95
- result = @builder.alias(val[0], val[1], val[3])
96
- }
97
- | kALIAS tGVAR tGVAR
98
- {
99
- result = @builder.alias(val[0],
100
- @builder.gvar(val[1]),
101
- @builder.gvar(val[2]))
102
- }
103
- | kALIAS tGVAR tBACK_REF
104
- {
105
- result = @builder.alias(val[0],
106
- @builder.gvar(val[1]),
107
- @builder.back_ref(val[2]))
108
- }
109
- | kALIAS tGVAR tNTH_REF
110
- {
111
- diagnostic :error, :nth_ref_alias, nil, val[2]
112
- }
113
- | kUNDEF undef_list
114
- {
115
- result = @builder.undef_method(val[0], val[1])
116
- }
117
- | stmt kIF_MOD expr_value
118
- {
119
- result = @builder.condition_mod(val[0], nil,
120
- val[1], val[2])
121
- }
122
- | stmt kUNLESS_MOD expr_value
123
- {
124
- result = @builder.condition_mod(nil, val[0],
125
- val[1], val[2])
126
- }
127
- | stmt kWHILE_MOD expr_value
128
- {
129
- result = @builder.loop_mod(:while, val[0], val[1], val[2])
130
- }
131
- | stmt kUNTIL_MOD expr_value
132
- {
133
- result = @builder.loop_mod(:until, val[0], val[1], val[2])
134
- }
135
- | stmt kRESCUE_MOD stmt
136
- {
137
- rescue_body = @builder.rescue_body(val[1],
138
- nil, nil, nil,
139
- nil, val[2])
140
-
141
- result = @builder.begin_body(val[0], [ rescue_body ])
142
- }
143
- | klBEGIN tLCURLY compstmt tRCURLY
144
- {
145
- if @context.indirectly_in_def?
146
- diagnostic :error, :begin_in_method, nil, val[0]
147
- end
148
-
149
- result = @builder.preexe(val[0], val[1], val[2], val[3])
150
- }
151
- | klEND tLCURLY compstmt tRCURLY
152
- {
153
- result = @builder.postexe(val[0], val[1], val[2], val[3])
154
- }
155
- | lhs tEQL command_call
156
- {
157
- result = @builder.assign(val[0], val[1], val[2])
158
- }
159
- | mlhs tEQL command_call
160
- {
161
- result = @builder.multi_assign(val[0], val[1], val[2])
162
- }
163
- | var_lhs tOP_ASGN command_call
164
- {
165
- result = @builder.op_assign(val[0], val[1], val[2])
166
- }
167
- | primary_value tLBRACK2 aref_args tRBRACK tOP_ASGN command_call
168
- {
169
- result = @builder.op_assign(
170
- @builder.index(
171
- val[0], val[1], val[2], val[3]),
172
- val[4], val[5])
173
- }
174
- | primary_value tDOT tIDENTIFIER tOP_ASGN command_call
175
- {
176
- result = @builder.op_assign(
177
- @builder.call_method(
178
- val[0], val[1], val[2]),
179
- val[3], val[4])
180
- }
181
- | primary_value tDOT tCONSTANT tOP_ASGN command_call
182
- {
183
- result = @builder.op_assign(
184
- @builder.call_method(
185
- val[0], val[1], val[2]),
186
- val[3], val[4])
187
- }
188
- | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
189
- {
190
- result = @builder.op_assign(
191
- @builder.call_method(
192
- val[0], val[1], val[2]),
193
- val[3], val[4])
194
- }
195
- | backref tOP_ASGN command_call
196
- {
197
- @builder.op_assign(val[0], val[1], val[2])
198
- }
199
- | lhs tEQL mrhs
200
- {
201
- result = @builder.assign(val[0], val[1],
202
- @builder.array(nil, val[2], nil))
203
- }
204
- | mlhs tEQL arg_value
205
- {
206
- result = @builder.multi_assign(val[0], val[1], val[2])
207
- }
208
- | mlhs tEQL mrhs
209
- {
210
- result = @builder.multi_assign(val[0], val[1],
211
- @builder.array(nil, val[2], nil))
212
- }
213
- | expr
214
-
215
- expr: command_call
216
- | expr kAND expr
217
- {
218
- result = @builder.logical_op(:and, val[0], val[1], val[2])
219
- }
220
- | expr kOR expr
221
- {
222
- result = @builder.logical_op(:or, val[0], val[1], val[2])
223
- }
224
- | kNOT expr
225
- {
226
- result = @builder.not_op(val[0], nil, val[1], nil)
227
- }
228
- | tBANG command_call
229
- {
230
- result = @builder.not_op(val[0], nil, val[1], nil)
231
- }
232
- | arg
233
-
234
- expr_value: expr
235
-
236
- command_call: command
237
- | block_command
238
- | kRETURN call_args
239
- {
240
- result = @builder.keyword_cmd(:return, val[0],
241
- nil, val[1], nil)
242
- }
243
- | kBREAK call_args
244
- {
245
- result = @builder.keyword_cmd(:break, val[0],
246
- nil, val[1], nil)
247
- }
248
- | kNEXT call_args
249
- {
250
- result = @builder.keyword_cmd(:next, val[0],
251
- nil, val[1], nil)
252
- }
253
-
254
- block_command: block_call
255
- | block_call tDOT operation2 command_args
256
- {
257
- lparen_t, args, rparen_t = val[3]
258
- result = @builder.call_method(val[0], val[1], val[2],
259
- lparen_t, args, rparen_t)
260
- }
261
- | block_call tCOLON2 operation2 command_args
262
- {
263
- lparen_t, args, rparen_t = val[3]
264
- result = @builder.call_method(val[0], val[1], val[2],
265
- lparen_t, args, rparen_t)
266
- }
267
-
268
- cmd_brace_block: tLBRACE_ARG
269
- {
270
- @static_env.extend_dynamic
271
- @context.push(:block)
272
- }
273
- opt_block_var compstmt tRCURLY
274
- {
275
- result = [ val[0], val[2], val[3], val[4] ]
276
-
277
- @static_env.unextend
278
- @context.pop
279
- }
280
-
281
- command: operation command_args =tLOWEST
282
- {
283
- lparen_t, args, rparen_t = val[1]
284
- result = @builder.call_method(nil, nil, val[0],
285
- lparen_t, args, rparen_t)
286
- }
287
- | operation command_args cmd_brace_block
288
- {
289
- lparen_t, args, rparen_t = val[1]
290
- method_call = @builder.call_method(nil, nil, val[0],
291
- lparen_t, args, rparen_t)
292
-
293
- begin_t, block_args, body, end_t = val[2]
294
- result = @builder.block(method_call,
295
- begin_t, block_args, body, end_t)
296
- }
297
- | primary_value tDOT operation2 command_args =tLOWEST
298
- {
299
- lparen_t, args, rparen_t = val[3]
300
- result = @builder.call_method(val[0], val[1], val[2],
301
- lparen_t, args, rparen_t)
302
-
303
- }
304
- | primary_value tDOT operation2 command_args cmd_brace_block
305
- {
306
- lparen_t, args, rparen_t = val[3]
307
- method_call = @builder.call_method(val[0], val[1], val[2],
308
- lparen_t, args, rparen_t)
309
-
310
- begin_t, block_args, body, end_t = val[4]
311
- result = @builder.block(method_call,
312
- begin_t, block_args, body, end_t)
313
- }
314
- | primary_value tCOLON2 operation2 command_args =tLOWEST
315
- {
316
- lparen_t, args, rparen_t = val[3]
317
- result = @builder.call_method(val[0], val[1], val[2],
318
- lparen_t, args, rparen_t)
319
- }
320
- | primary_value tCOLON2 operation2 command_args cmd_brace_block
321
- {
322
- lparen_t, args, rparen_t = val[3]
323
- method_call = @builder.call_method(val[0], val[1], val[2],
324
- lparen_t, args, rparen_t)
325
-
326
- begin_t, block_args, body, end_t = val[4]
327
- result = @builder.block(method_call,
328
- begin_t, block_args, body, end_t)
329
- }
330
- | kSUPER command_args
331
- {
332
- lparen_t, args, rparen_t = val[1]
333
- result = @builder.keyword_cmd(:super, val[0],
334
- lparen_t, args, rparen_t)
335
- }
336
- | kYIELD command_args
337
- {
338
- lparen_t, args, rparen_t = val[1]
339
- result = @builder.keyword_cmd(:yield, val[0],
340
- lparen_t, args, rparen_t)
341
- }
342
-
343
- mlhs: mlhs_basic
344
- {
345
- result = @builder.multi_lhs(nil, val[0], nil)
346
- }
347
- | tLPAREN mlhs_entry tRPAREN
348
- {
349
- result = @builder.begin(val[0], val[1], val[2])
350
- }
351
-
352
- mlhs_entry: mlhs_basic
353
- {
354
- result = @builder.multi_lhs(nil, val[0], nil)
355
- }
356
- | tLPAREN mlhs_entry tRPAREN
357
- {
358
- result = @builder.multi_lhs(val[0], val[1], val[2])
359
- }
360
-
361
- mlhs_basic: mlhs_head
362
- {
363
- result = val[0]
364
- }
365
- | mlhs_head mlhs_item
366
- {
367
- result = val[0] << val[1]
368
- }
369
- | mlhs_head tSTAR mlhs_node
370
- {
371
- result = val[0] << @builder.splat(val[1], val[2])
372
- }
373
- | mlhs_head tSTAR
374
- {
375
- result = val[0] << @builder.splat(val[1])
376
- }
377
- | tSTAR mlhs_node
378
- {
379
- result = [ @builder.splat(val[0], val[1]) ]
380
- }
381
- | tSTAR
382
- {
383
- result = [ @builder.splat(val[0]) ]
384
- }
385
-
386
- mlhs_item: mlhs_node
387
- | tLPAREN mlhs_entry tRPAREN
388
- {
389
- result = @builder.begin(val[0], val[1], val[2])
390
- }
391
-
392
- mlhs_head: mlhs_item tCOMMA
393
- {
394
- result = [ val[0] ]
395
- }
396
- | mlhs_head mlhs_item tCOMMA
397
- {
398
- result = val[0] << val[1]
399
- }
400
-
401
- mlhs_node: variable
402
- {
403
- result = @builder.assignable(val[0])
404
- }
405
- | primary_value tLBRACK2 aref_args tRBRACK
406
- {
407
- result = @builder.index_asgn(val[0], val[1], val[2], val[3])
408
- }
409
- | primary_value tDOT tIDENTIFIER
410
- {
411
- result = @builder.attr_asgn(val[0], val[1], val[2])
412
- }
413
- | primary_value tCOLON2 tIDENTIFIER
414
- {
415
- result = @builder.attr_asgn(val[0], val[1], val[2])
416
- }
417
- | primary_value tDOT tCONSTANT
418
- {
419
- result = @builder.attr_asgn(val[0], val[1], val[2])
420
- }
421
- | primary_value tCOLON2 tCONSTANT
422
- {
423
- result = @builder.assignable(
424
- @builder.const_fetch(val[0], val[1], val[2]))
425
- }
426
- | tCOLON3 tCONSTANT
427
- {
428
- result = @builder.assignable(
429
- @builder.const_global(val[0], val[1]))
430
- }
431
- | backref
432
- {
433
- result = @builder.assignable(val[0])
434
- }
435
-
436
- lhs: variable
437
- {
438
- result = @builder.assignable(val[0])
439
- }
440
- | primary_value tLBRACK2 aref_args tRBRACK
441
- {
442
- result = @builder.index_asgn(val[0], val[1], val[2], val[3])
443
- }
444
- | primary_value tDOT tIDENTIFIER
445
- {
446
- result = @builder.attr_asgn(val[0], val[1], val[2])
447
- }
448
- | primary_value tCOLON2 tIDENTIFIER
449
- {
450
- result = @builder.attr_asgn(val[0], val[1], val[2])
451
- }
452
- | primary_value tDOT tCONSTANT
453
- {
454
- result = @builder.attr_asgn(val[0], val[1], val[2])
455
- }
456
- | primary_value tCOLON2 tCONSTANT
457
- {
458
- result = @builder.assignable(
459
- @builder.const_fetch(val[0], val[1], val[2]))
460
- }
461
- | tCOLON3 tCONSTANT
462
- {
463
- result = @builder.assignable(
464
- @builder.const_global(val[0], val[1]))
465
- }
466
- | backref
467
- {
468
- result = @builder.assignable(val[0])
469
- }
470
-
471
- cname: tIDENTIFIER
472
- {
473
- diagnostic :error, :module_name_const, nil, val[0]
474
- }
475
- | tCONSTANT
476
-
477
- cpath: tCOLON3 cname
478
- {
479
- result = @builder.const_global(val[0], val[1])
480
- }
481
- | cname
482
- {
483
- result = @builder.const(val[0])
484
- }
485
- | primary_value tCOLON2 cname
486
- {
487
- result = @builder.const_fetch(val[0], val[1], val[2])
488
- }
489
-
490
- fname: tIDENTIFIER | tCONSTANT | tFID
491
- | op
492
- | reswords
493
-
494
- fsym: fname
495
- {
496
- result = @builder.symbol_internal(val[0])
497
- }
498
- | symbol
499
-
500
- fitem: fsym
501
- | dsym
502
-
503
- undef_list: fitem
504
- {
505
- result = [ val[0] ]
506
- }
507
- | undef_list tCOMMA
508
- {
509
- @lexer.state = :expr_fname
510
- }
511
- fitem
512
- {
513
- result = val[0] << val[3]
514
- }
515
-
516
- op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ
517
- | tMATCH | tGT | tGEQ | tLT | tLEQ | tLSHFT
518
- | tRSHFT | tPLUS | tMINUS | tSTAR2 | tSTAR | tDIVIDE
519
- | tPERCENT | tPOW | tTILDE | tUPLUS | tUMINUS | tAREF
520
- | tASET | tBACK_REF2
521
-
522
- reswords: k__LINE__ | k__FILE__ | klBEGIN | klEND | kALIAS | kAND
523
- | kBEGIN | kBREAK | kCASE | kCLASS | kDEF | kDEFINED
524
- | kDO | kELSE | kELSIF | kEND | kENSURE | kFALSE
525
- | kFOR | kIN | kMODULE | kNEXT | kNIL | kNOT
526
- | kOR | kREDO | kRESCUE | kRETRY | kRETURN | kSELF
527
- | kSUPER | kTHEN | kTRUE | kUNDEF | kWHEN | kYIELD
528
- | kIF | kUNLESS | kWHILE | kUNTIL
529
-
530
- arg: lhs tEQL arg
531
- {
532
- result = @builder.assign(val[0], val[1], val[2])
533
- }
534
- | lhs tEQL arg kRESCUE_MOD arg
535
- {
536
- rescue_body = @builder.rescue_body(val[3],
537
- nil, nil, nil,
538
- nil, val[4])
539
-
540
- rescue_ = @builder.begin_body(val[2], [ rescue_body ])
541
-
542
- result = @builder.assign(val[0], val[1], rescue_)
543
- }
544
- | var_lhs tOP_ASGN arg
545
- {
546
- result = @builder.op_assign(val[0], val[1], val[2])
547
- }
548
- | primary_value tLBRACK2 aref_args tRBRACK tOP_ASGN arg
549
- {
550
- result = @builder.op_assign(
551
- @builder.index(
552
- val[0], val[1], val[2], val[3]),
553
- val[4], val[5])
554
- }
555
- | primary_value tDOT tIDENTIFIER tOP_ASGN arg
556
- {
557
- result = @builder.op_assign(
558
- @builder.call_method(
559
- val[0], val[1], val[2]),
560
- val[3], val[4])
561
- }
562
- | primary_value tDOT tCONSTANT tOP_ASGN arg
563
- {
564
- result = @builder.op_assign(
565
- @builder.call_method(
566
- val[0], val[1], val[2]),
567
- val[3], val[4])
568
- }
569
- | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg
570
- {
571
- result = @builder.op_assign(
572
- @builder.call_method(
573
- val[0], val[1], val[2]),
574
- val[3], val[4])
575
- }
576
- | primary_value tCOLON2 tCONSTANT tOP_ASGN arg
577
- {
578
- diagnostic :error, :dynamic_const, nil, val[2], [ val[3] ]
579
- }
580
- | tCOLON3 tCONSTANT tOP_ASGN arg
581
- {
582
- diagnostic :error, :dynamic_const, nil, val[1], [ val[2] ]
583
- }
584
- | backref tOP_ASGN arg
585
- {
586
- result = @builder.op_assign(val[0], val[1], val[2])
587
- }
588
- | arg tDOT2 arg
589
- {
590
- result = @builder.range_inclusive(val[0], val[1], val[2])
591
- }
592
- | arg tDOT3 arg
593
- {
594
- result = @builder.range_exclusive(val[0], val[1], val[2])
595
- }
596
- | arg tPLUS arg
597
- {
598
- result = @builder.binary_op(val[0], val[1], val[2])
599
- }
600
- | arg tMINUS arg
601
- {
602
- result = @builder.binary_op(val[0], val[1], val[2])
603
- }
604
- | arg tSTAR2 arg
605
- {
606
- result = @builder.binary_op(val[0], val[1], val[2])
607
- }
608
- | arg tDIVIDE arg
609
- {
610
- result = @builder.binary_op(val[0], val[1], val[2])
611
- }
612
- | arg tPERCENT arg
613
- {
614
- result = @builder.binary_op(val[0], val[1], val[2])
615
- }
616
- | arg tPOW arg
617
- {
618
- result = @builder.binary_op(val[0], val[1], val[2])
619
- }
620
- | tUNARY_NUM tINTEGER tPOW arg
621
- {
622
- result = @builder.unary_op(val[0],
623
- @builder.binary_op(
624
- @builder.integer(val[1]),
625
- val[2], val[3]))
626
- }
627
- | tUNARY_NUM tFLOAT tPOW arg
628
- {
629
- result = @builder.unary_op(val[0],
630
- @builder.binary_op(
631
- @builder.float(val[1]),
632
- val[2], val[3]))
633
- }
634
- | tUPLUS arg
635
- {
636
- result = @builder.unary_op(val[0], val[1])
637
- }
638
- | tUMINUS arg
639
- {
640
- result = @builder.unary_op(val[0], val[1])
641
- }
642
- | arg tPIPE arg
643
- {
644
- result = @builder.binary_op(val[0], val[1], val[2])
645
- }
646
- | arg tCARET arg
647
- {
648
- result = @builder.binary_op(val[0], val[1], val[2])
649
- }
650
- | arg tAMPER2 arg
651
- {
652
- result = @builder.binary_op(val[0], val[1], val[2])
653
- }
654
- | arg tCMP arg
655
- {
656
- result = @builder.binary_op(val[0], val[1], val[2])
657
- }
658
- | arg tGT arg
659
- {
660
- result = @builder.binary_op(val[0], val[1], val[2])
661
- }
662
- | arg tGEQ arg
663
- {
664
- result = @builder.binary_op(val[0], val[1], val[2])
665
- }
666
- | arg tLT arg
667
- {
668
- result = @builder.binary_op(val[0], val[1], val[2])
669
- }
670
- | arg tLEQ arg
671
- {
672
- result = @builder.binary_op(val[0], val[1], val[2])
673
- }
674
- | arg tEQ arg
675
- {
676
- result = @builder.binary_op(val[0], val[1], val[2])
677
- }
678
- | arg tEQQ arg
679
- {
680
- result = @builder.binary_op(val[0], val[1], val[2])
681
- }
682
- | arg tNEQ arg
683
- {
684
- result = @builder.binary_op(val[0], val[1], val[2])
685
- }
686
- | arg tMATCH arg
687
- {
688
- result = @builder.binary_op(val[0], val[1], val[2])
689
- }
690
- | arg tNMATCH arg
691
- {
692
- result = @builder.binary_op(val[0], val[1], val[2])
693
- }
694
- | tBANG arg
695
- {
696
- result = @builder.not_op(val[0], nil, val[1], nil)
697
- }
698
- | tTILDE arg
699
- {
700
- result = @builder.unary_op(val[0], val[1])
701
- }
702
- | arg tLSHFT arg
703
- {
704
- result = @builder.binary_op(val[0], val[1], val[2])
705
- }
706
- | arg tRSHFT arg
707
- {
708
- result = @builder.binary_op(val[0], val[1], val[2])
709
- }
710
- | arg tANDOP arg
711
- {
712
- result = @builder.logical_op(:and, val[0], val[1], val[2])
713
- }
714
- | arg tOROP arg
715
- {
716
- result = @builder.logical_op(:or, val[0], val[1], val[2])
717
- }
718
- | kDEFINED opt_nl arg
719
- {
720
- result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil)
721
- }
722
- | arg tEH arg tCOLON arg
723
- {
724
- result = @builder.ternary(val[0], val[1],
725
- val[2], val[3], val[4])
726
- }
727
- | primary
728
-
729
- arg_value: arg
730
-
731
- aref_args: none
732
- | command opt_nl
733
- {
734
- result = [ val[0] ]
735
- }
736
- | args trailer
737
- {
738
- result = val[0]
739
- }
740
- | args tCOMMA tSTAR arg opt_nl
741
- {
742
- result = val[0] << @builder.splat(val[2], val[3])
743
- }
744
- | assocs trailer
745
- {
746
- result = [ @builder.associate(nil, val[0], nil) ]
747
- }
748
- | tSTAR arg opt_nl
749
- {
750
- result = [ @builder.splat(val[0], val[1]) ]
751
- }
752
-
753
- paren_args: tLPAREN2 none tRPAREN
754
- {
755
- result = [ val[0], [], val[2] ]
756
- }
757
- | tLPAREN2 call_args opt_nl tRPAREN
758
- {
759
- result = [ val[0], val[1], val[3] ]
760
- }
761
- | tLPAREN2 block_call opt_nl tRPAREN
762
- {
763
- result = [ val[0], [ val[1] ], val[3] ]
764
- }
765
- | tLPAREN2 args tCOMMA block_call opt_nl tRPAREN
766
- {
767
- result = [ val[0], val[1] << val[3], val[5] ]
768
- }
769
-
770
- opt_paren_args: # nothing
771
- {
772
- result = [ nil, [], nil ]
773
- }
774
- | paren_args
775
-
776
- call_args: command
777
- {
778
- result = [ val[0] ]
779
- }
780
- | args opt_block_arg
781
- {
782
- result = val[0].concat(val[1])
783
- }
784
- | args tCOMMA tSTAR arg_value opt_block_arg
785
- {
786
- result = val[0].concat(
787
- [ @builder.splat(val[2], val[3]),
788
- *val[4] ])
789
- }
790
- | assocs opt_block_arg
791
- {
792
- result = [ @builder.associate(nil, val[0], nil),
793
- *val[1] ]
794
- }
795
- | assocs tCOMMA tSTAR arg_value opt_block_arg
796
- {
797
- result = [ @builder.associate(nil, val[0], nil),
798
- @builder.splat(val[2], val[3]),
799
- *val[4] ]
800
- }
801
- | args tCOMMA assocs opt_block_arg
802
- {
803
- result = val[0].concat(
804
- [ @builder.associate(nil, val[2], nil),
805
- *val[3] ])
806
- }
807
- | args tCOMMA assocs tCOMMA tSTAR arg opt_block_arg
808
- {
809
- result = val[0].concat(
810
- [ @builder.associate(nil, val[2], nil),
811
- @builder.splat(val[4], val[5]),
812
- *val[6] ])
813
- }
814
- | tSTAR arg_value opt_block_arg
815
- {
816
- result = [ @builder.splat(val[0], val[1]),
817
- *val[2] ]
818
- }
819
- | block_arg
820
- {
821
- result = [ val[0] ]
822
- }
823
-
824
- call_args2: arg_value tCOMMA args opt_block_arg
825
- {
826
- result = [ val[0], *val[2].concat(val[3]) ]
827
- }
828
- | arg_value tCOMMA block_arg
829
- {
830
- result = [ val[0], val[2] ]
831
- }
832
- | arg_value tCOMMA tSTAR arg_value opt_block_arg
833
- {
834
- result = [ val[0],
835
- @builder.splat(val[2], val[3]),
836
- *val[4] ]
837
- }
838
- | arg_value tCOMMA args tCOMMA tSTAR arg_value opt_block_arg
839
- {
840
- result = [ val[0],
841
- *val[2].
842
- push(@builder.splat(val[4], val[5])).
843
- concat(val[6]) ]
844
- }
845
- | assocs opt_block_arg
846
- {
847
- result = [ @builder.associate(nil, val[0], nil),
848
- *val[1] ]
849
- }
850
- | assocs tCOMMA tSTAR arg_value opt_block_arg
851
- {
852
- result = [ @builder.associate(nil, val[0], nil),
853
- @builder.splat(val[2], val[3]),
854
- *val[4] ]
855
- }
856
- | arg_value tCOMMA assocs opt_block_arg
857
- {
858
- result = [ val[0],
859
- @builder.associate(nil, val[2], nil),
860
- *val[3] ]
861
- }
862
- | arg_value tCOMMA args tCOMMA assocs opt_block_arg
863
- {
864
- result = [ val[0],
865
- *val[2].
866
- push(@builder.associate(nil, val[4], nil)).
867
- concat(val[5]) ]
868
- }
869
- | arg_value tCOMMA assocs tCOMMA tSTAR arg_value opt_block_arg
870
- {
871
- result = [ val[0],
872
- @builder.associate(nil, val[2], nil),
873
- @builder.splat(val[4], val[5]),
874
- *val[6] ]
875
- }
876
- | arg_value tCOMMA args tCOMMA assocs tCOMMA tSTAR arg_value opt_block_arg
877
- {
878
- result = [ val[0],
879
- *val[2].
880
- push(@builder.associate(nil, val[4], nil)).
881
- push(@builder.splat(val[6], val[7])).
882
- concat(val[8]) ]
883
- }
884
- | tSTAR arg_value opt_block_arg
885
- {
886
- result = [ @builder.splat(val[0], val[1]),
887
- *val[2] ]
888
- }
889
- | block_arg
890
- {
891
- result = [ val[0] ]
892
- }
893
-
894
- command_args: {
895
- result = @lexer.cmdarg.dup
896
- @lexer.cmdarg.push(true)
897
- }
898
- open_args
899
- {
900
- @lexer.cmdarg = val[0]
901
-
902
- result = val[1]
903
- }
904
-
905
- open_args: call_args
906
- {
907
- result = [ nil, val[0], nil ]
908
- }
909
- | tLPAREN_ARG
910
- {
911
- @lexer.state = :expr_endarg
912
- }
913
- tRPAREN
914
- {
915
- result = [ val[0], [], val[2] ]
916
- }
917
- | tLPAREN_ARG call_args2
918
- {
919
- @lexer.state = :expr_endarg
920
- }
921
- tRPAREN
922
- {
923
- result = [ val[0], val[1], val[3] ]
924
- }
925
-
926
- block_arg: tAMPER arg_value
927
- {
928
- result = @builder.block_pass(val[0], val[1])
929
- }
930
-
931
- opt_block_arg: tCOMMA block_arg
932
- {
933
- result = [ val[1] ]
934
- }
935
- | # nothing
936
- {
937
- result = []
938
- }
939
-
940
- args: arg_value
941
- {
942
- result = [ val[0] ]
943
- }
944
- | args tCOMMA arg_value
945
- {
946
- result = val[0] << val[2]
947
- }
948
-
949
- mrhs: args tCOMMA arg_value
950
- {
951
- result = val[0] << val[2]
952
- }
953
- | args tCOMMA tSTAR arg_value
954
- {
955
- result = val[0] << @builder.splat(val[2], val[3])
956
- }
957
- | tSTAR arg_value
958
- {
959
- result = [ @builder.splat(val[0], val[1]) ]
960
- }
961
-
962
- primary: literal
963
- | strings
964
- | xstring
965
- | regexp
966
- | words
967
- | qwords
968
- | var_ref
969
- | backref
970
- | tFID
971
- {
972
- result = @builder.call_method(nil, nil, val[0])
973
- }
974
- | kBEGIN bodystmt kEND
975
- {
976
- result = @builder.begin_keyword(val[0], val[1], val[2])
977
- }
978
- | tLPAREN_ARG expr
979
- {
980
- @lexer.state = :expr_endarg
981
- }
982
- opt_nl tRPAREN
983
- {
984
- result = @builder.begin(val[0], val[1], val[4])
985
- }
986
- | tLPAREN compstmt tRPAREN
987
- {
988
- result = @builder.begin(val[0], val[1], val[2])
989
- }
990
- | primary_value tCOLON2 tCONSTANT
991
- {
992
- result = @builder.const_fetch(val[0], val[1], val[2])
993
- }
994
- | tCOLON3 tCONSTANT
995
- {
996
- result = @builder.const_global(val[0], val[1])
997
- }
998
- | primary_value tLBRACK2 aref_args tRBRACK
999
- {
1000
- result = @builder.index(val[0], val[1], val[2], val[3])
1001
- }
1002
- | tLBRACK aref_args tRBRACK
1003
- {
1004
- result = @builder.array(val[0], val[1], val[2])
1005
- }
1006
- | tLBRACE assoc_list tRCURLY
1007
- {
1008
- result = @builder.associate(val[0], val[1], val[2])
1009
- }
1010
- | kRETURN
1011
- {
1012
- result = @builder.keyword_cmd(:return, val[0])
1013
- }
1014
- | kYIELD tLPAREN2 call_args tRPAREN
1015
- {
1016
- result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3])
1017
- }
1018
- | kYIELD tLPAREN2 tRPAREN
1019
- {
1020
- result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2])
1021
- }
1022
- | kYIELD
1023
- {
1024
- result = @builder.keyword_cmd(:yield, val[0])
1025
- }
1026
- | kDEFINED opt_nl tLPAREN2 expr tRPAREN
1027
- {
1028
- result = @builder.keyword_cmd(:defined?, val[0],
1029
- val[2], [ val[3] ], val[4])
1030
- }
1031
- | operation brace_block
1032
- {
1033
- method_call = @builder.call_method(nil, nil, val[0])
1034
-
1035
- begin_t, args, body, end_t = val[1]
1036
- result = @builder.block(method_call,
1037
- begin_t, args, body, end_t)
1038
- }
1039
- | method_call
1040
- | method_call brace_block
1041
- {
1042
- begin_t, args, body, end_t = val[1]
1043
- result = @builder.block(val[0],
1044
- begin_t, args, body, end_t)
1045
- }
1046
- | kIF expr_value then compstmt if_tail kEND
1047
- {
1048
- else_t, else_ = val[4]
1049
- result = @builder.condition(val[0], val[1], val[2],
1050
- val[3], else_t,
1051
- else_, val[5])
1052
- }
1053
- | kUNLESS expr_value then compstmt opt_else kEND
1054
- {
1055
- else_t, else_ = val[4]
1056
- result = @builder.condition(val[0], val[1], val[2],
1057
- else_, else_t,
1058
- val[3], val[5])
1059
- }
1060
- | kWHILE
1061
- {
1062
- @lexer.cond.push(true)
1063
- }
1064
- expr_value do
1065
- {
1066
- @lexer.cond.pop
1067
- }
1068
- compstmt kEND
1069
- {
1070
- result = @builder.loop(:while, val[0], val[2], val[3],
1071
- val[5], val[6])
1072
- }
1073
- | kUNTIL
1074
- {
1075
- @lexer.cond.push(true)
1076
- }
1077
- expr_value do
1078
- {
1079
- @lexer.cond.pop
1080
- }
1081
- compstmt kEND
1082
- {
1083
- result = @builder.loop(:until, val[0], val[2], val[3],
1084
- val[5], val[6])
1085
- }
1086
- | kCASE expr_value opt_terms case_body kEND
1087
- {
1088
- when_bodies = val[3][0..-2]
1089
- else_t, else_body = val[3][-1]
1090
-
1091
- result = @builder.case(val[0], val[1],
1092
- when_bodies, else_t, else_body,
1093
- val[4])
1094
- }
1095
- | kCASE opt_terms case_body kEND
1096
- {
1097
- when_bodies = val[2][0..-2]
1098
- else_t, else_body = val[2][-1]
1099
-
1100
- result = @builder.case(val[0], nil,
1101
- when_bodies, else_t, else_body,
1102
- val[3])
1103
- }
1104
- | kCASE opt_terms kELSE compstmt kEND
1105
- {
1106
- result = @builder.case(val[0], nil,
1107
- [], val[2], val[3],
1108
- val[4])
1109
- }
1110
- | kFOR for_var kIN
1111
- {
1112
- @lexer.cond.push(true)
1113
- }
1114
- expr_value do
1115
- {
1116
- @lexer.cond.pop
1117
- }
1118
- compstmt kEND
1119
- {
1120
- result = @builder.for(val[0], val[1],
1121
- val[2], val[4],
1122
- val[5], val[7], val[8])
1123
- }
1124
- | kCLASS cpath superclass
1125
- {
1126
- @static_env.extend_static
1127
- @context.push(:class)
1128
- }
1129
- bodystmt kEND
1130
- {
1131
- unless @context.class_definition_allowed?
1132
- diagnostic :error, :class_in_def, nil, val[0]
1133
- end
1134
-
1135
- lt_t, superclass = val[2]
1136
- result = @builder.def_class(val[0], val[1],
1137
- lt_t, superclass,
1138
- val[4], val[5])
1139
-
1140
- @static_env.unextend
1141
- @context.pop
1142
- }
1143
- | kCLASS tLSHFT expr term
1144
- {
1145
- @static_env.extend_static
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
- @static_env.unextend
1154
- @context.pop
1155
- }
1156
- | kMODULE cpath
1157
- {
1158
- @static_env.extend_static
1159
- @context.push(:module)
1160
- }
1161
- bodystmt kEND
1162
- {
1163
- unless @context.module_definition_allowed?
1164
- diagnostic :error, :module_in_def, nil, val[0]
1165
- end
1166
-
1167
- result = @builder.def_module(val[0], val[1],
1168
- val[3], val[4])
1169
-
1170
- @static_env.unextend
1171
- @context.pop
1172
- }
1173
- | kDEF fname
1174
- {
1175
- @static_env.extend_static
1176
- @context.push(:def)
1177
- }
1178
- f_arglist bodystmt kEND
1179
- {
1180
- result = @builder.def_method(val[0], val[1],
1181
- val[3], val[4], val[5])
1182
-
1183
- @static_env.unextend
1184
- @context.pop
1185
- }
1186
- | kDEF singleton dot_or_colon
1187
- {
1188
- @lexer.state = :expr_fname
1189
- }
1190
- fname
1191
- {
1192
- @static_env.extend_static
1193
- @context.push(:defs)
1194
- }
1195
- f_arglist bodystmt kEND
1196
- {
1197
- result = @builder.def_singleton(val[0], val[1], val[2],
1198
- val[4], val[6], val[7], val[8])
1199
-
1200
- @static_env.unextend
1201
- @context.pop
1202
- }
1203
- | kBREAK
1204
- {
1205
- result = @builder.keyword_cmd(:break, val[0])
1206
- }
1207
- | kNEXT
1208
- {
1209
- result = @builder.keyword_cmd(:next, val[0])
1210
- }
1211
- | kREDO
1212
- {
1213
- result = @builder.keyword_cmd(:redo, val[0])
1214
- }
1215
- | kRETRY
1216
- {
1217
- result = @builder.keyword_cmd(:retry, val[0])
1218
- }
1219
-
1220
- primary_value: primary
1221
-
1222
- then: term
1223
- | tCOLON
1224
- | kTHEN
1225
- | term kTHEN
1226
- {
1227
- result = val[1]
1228
- }
1229
-
1230
- do: term
1231
- | tCOLON
1232
- | kDO_COND
1233
-
1234
- if_tail: opt_else
1235
- | kELSIF expr_value then compstmt if_tail
1236
- {
1237
- else_t, else_ = val[4]
1238
- result = [ val[0],
1239
- @builder.condition(val[0], val[1], val[2],
1240
- val[3], else_t,
1241
- else_, nil),
1242
- ]
1243
- }
1244
-
1245
- opt_else: none
1246
- | kELSE compstmt
1247
- {
1248
- result = val
1249
- }
1250
-
1251
- for_var: lhs
1252
- | mlhs
1253
-
1254
- block_par: mlhs_item
1255
- {
1256
- result = [ @builder.arg_expr(val[0]) ]
1257
- }
1258
- | block_par tCOMMA mlhs_item
1259
- {
1260
- result = val[0] << @builder.arg_expr(val[2])
1261
- }
1262
-
1263
- block_var: block_par
1264
- | block_par tCOMMA
1265
- | block_par tCOMMA tAMPER lhs
1266
- {
1267
- result = val[0].
1268
- push(@builder.blockarg_expr(val[2], val[3]))
1269
- }
1270
- | block_par tCOMMA tSTAR lhs tCOMMA tAMPER lhs
1271
- {
1272
- result = val[0].
1273
- push(@builder.restarg_expr(val[2], val[3])).
1274
- push(@builder.blockarg_expr(val[5], val[6]))
1275
- }
1276
- | block_par tCOMMA tSTAR tCOMMA tAMPER lhs
1277
- {
1278
- result = val[0].
1279
- push(@builder.restarg_expr(val[2])).
1280
- push(@builder.blockarg_expr(val[4], val[5]))
1281
- }
1282
- | block_par tCOMMA tSTAR lhs
1283
- {
1284
- result = val[0].
1285
- push(@builder.restarg_expr(val[2], val[3]))
1286
- }
1287
- | block_par tCOMMA tSTAR
1288
- {
1289
- result = val[0].
1290
- push(@builder.restarg_expr(val[2]))
1291
- }
1292
- | tSTAR lhs tCOMMA tAMPER lhs
1293
- {
1294
- result = [ @builder.restarg_expr(val[0], val[1]),
1295
- @builder.blockarg_expr(val[3], val[4]) ]
1296
- }
1297
- | tSTAR tCOMMA tAMPER lhs
1298
- {
1299
- result = [ @builder.restarg_expr(val[0]),
1300
- @builder.blockarg_expr(val[2], val[3]) ]
1301
- }
1302
- | tSTAR lhs
1303
- {
1304
- result = [ @builder.restarg_expr(val[0], val[1]) ]
1305
- }
1306
- | tSTAR
1307
- {
1308
- result = [ @builder.restarg_expr(val[0]) ]
1309
- }
1310
- | tAMPER lhs
1311
- {
1312
- result = [ @builder.blockarg_expr(val[0], val[1]) ]
1313
- }
1314
- ;
1315
-
1316
- opt_block_var: # nothing
1317
- {
1318
- result = @builder.args(nil, [], nil)
1319
- }
1320
- | tPIPE tPIPE
1321
- {
1322
- result = @builder.args(val[0], [], val[1])
1323
- }
1324
- | tOROP
1325
- {
1326
- result = @builder.args(val[0], [], val[0])
1327
- }
1328
- | tPIPE block_var tPIPE
1329
- {
1330
- result = @builder.args(val[0], val[1], val[2], false)
1331
- }
1332
-
1333
- do_block: kDO_BLOCK
1334
- {
1335
- @static_env.extend_dynamic
1336
- @context.push(:block)
1337
- }
1338
- opt_block_var compstmt kEND
1339
- {
1340
- result = [ val[0], val[2], val[3], val[4] ]
1341
-
1342
- @static_env.unextend
1343
- @context.pop
1344
- }
1345
-
1346
- block_call: command do_block
1347
- {
1348
- begin_t, block_args, body, end_t = val[1]
1349
- result = @builder.block(val[0],
1350
- begin_t, block_args, body, end_t)
1351
- }
1352
- | block_call tDOT operation2 opt_paren_args
1353
- {
1354
- lparen_t, args, rparen_t = val[3]
1355
- result = @builder.call_method(val[0], val[1], val[2],
1356
- lparen_t, args, rparen_t)
1357
- }
1358
- | block_call tCOLON2 operation2 opt_paren_args
1359
- {
1360
- lparen_t, args, rparen_t = val[3]
1361
- result = @builder.call_method(val[0], val[1], val[2],
1362
- lparen_t, args, rparen_t)
1363
- }
1364
-
1365
- method_call: operation paren_args
1366
- {
1367
- lparen_t, args, rparen_t = val[1]
1368
- result = @builder.call_method(nil, nil, val[0],
1369
- lparen_t, args, rparen_t)
1370
- }
1371
- | primary_value tDOT operation2 opt_paren_args
1372
- {
1373
- lparen_t, args, rparen_t = val[3]
1374
- result = @builder.call_method(val[0], val[1], val[2],
1375
- lparen_t, args, rparen_t)
1376
- }
1377
- | primary_value tCOLON2 operation2 paren_args
1378
- {
1379
- lparen_t, args, rparen_t = val[3]
1380
- result = @builder.call_method(val[0], val[1], val[2],
1381
- lparen_t, args, rparen_t)
1382
- }
1383
- | primary_value tCOLON2 operation3
1384
- {
1385
- result = @builder.call_method(val[0], val[1], val[2])
1386
- }
1387
- | kSUPER paren_args
1388
- {
1389
- lparen_t, args, rparen_t = val[1]
1390
- result = @builder.keyword_cmd(:super, val[0],
1391
- lparen_t, args, rparen_t)
1392
- }
1393
- | kSUPER
1394
- {
1395
- result = @builder.keyword_cmd(:zsuper, val[0])
1396
- }
1397
-
1398
- brace_block: tLCURLY
1399
- {
1400
- @static_env.extend_dynamic
1401
- @context.push(:block)
1402
- }
1403
- opt_block_var compstmt tRCURLY
1404
- {
1405
- result = [ val[0], val[2], val[3], val[4] ]
1406
-
1407
- @static_env.unextend
1408
- @context.pop
1409
- }
1410
- | kDO
1411
- {
1412
- @static_env.extend_dynamic
1413
- @context.push(:block)
1414
- }
1415
- opt_block_var compstmt kEND
1416
- {
1417
- result = [ val[0], val[2], val[3], val[4] ]
1418
-
1419
- @static_env.unextend
1420
- @context.pop
1421
- }
1422
-
1423
- case_body: kWHEN when_args then compstmt cases
1424
- {
1425
- result = [ @builder.when(val[0], val[1], val[2], val[3]),
1426
- *val[4] ]
1427
- }
1428
-
1429
- when_args: args
1430
- | args tCOMMA tSTAR arg_value
1431
- {
1432
- result = val[0] << @builder.splat(val[2], val[3])
1433
- }
1434
- | tSTAR arg_value
1435
- {
1436
- result = [ @builder.splat(val[0], val[1]) ]
1437
- }
1438
-
1439
- cases: opt_else
1440
- {
1441
- result = [ val[0] ]
1442
- }
1443
- | case_body
1444
-
1445
- opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue
1446
- {
1447
- assoc_t, exc_var = val[2]
1448
-
1449
- if val[1]
1450
- exc_list = @builder.array(nil, val[1], nil)
1451
- end
1452
-
1453
- result = [ @builder.rescue_body(val[0],
1454
- exc_list, assoc_t, exc_var,
1455
- val[3], val[4]),
1456
- *val[5] ]
1457
- }
1458
- | # nothing
1459
- {
1460
- result = []
1461
- }
1462
-
1463
- exc_list: arg_value
1464
- {
1465
- result = [ val[0] ]
1466
- }
1467
- | mrhs
1468
- | none
1469
-
1470
- exc_var: tASSOC lhs
1471
- {
1472
- result = [ val[0], val[1] ]
1473
- }
1474
- | none
1475
-
1476
- opt_ensure: kENSURE compstmt
1477
- {
1478
- result = [ val[0], val[1] ]
1479
- }
1480
- | none
1481
-
1482
- literal: numeric
1483
- | symbol
1484
- | dsym
1485
-
1486
- strings: string
1487
- {
1488
- result = @builder.string_compose(nil, val[0], nil)
1489
- }
1490
-
1491
- string: string1
1492
- {
1493
- result = [ val[0] ]
1494
- }
1495
- | string string1
1496
- {
1497
- result = val[0] << val[1]
1498
- }
1499
-
1500
- string1: tSTRING_BEG string_contents tSTRING_END
1501
- {
1502
- result = @builder.string_compose(val[0], val[1], val[2])
1503
- }
1504
- | tSTRING
1505
- {
1506
- result = @builder.string(val[0])
1507
- }
1508
-
1509
- xstring: tXSTRING_BEG xstring_contents tSTRING_END
1510
- {
1511
- result = @builder.xstring_compose(val[0], val[1], val[2])
1512
- }
1513
-
1514
- regexp: tREGEXP_BEG xstring_contents tSTRING_END tREGEXP_OPT
1515
- {
1516
- opts = @builder.regexp_options(val[3])
1517
- result = @builder.regexp_compose(val[0], val[1], val[2], opts)
1518
- }
1519
-
1520
- words: tWORDS_BEG word_list tSTRING_END
1521
- {
1522
- result = @builder.words_compose(val[0], val[1], val[2])
1523
- }
1524
-
1525
- word_list: # nothing
1526
- {
1527
- result = []
1528
- }
1529
- | word_list word tSPACE
1530
- {
1531
- result = val[0] << @builder.word(val[1])
1532
- }
1533
-
1534
- word: string_content
1535
- {
1536
- result = [ val[0] ]
1537
- }
1538
- | word string_content
1539
- {
1540
- result = val[0] << val[1]
1541
- }
1542
-
1543
- qwords: tQWORDS_BEG qword_list tSTRING_END
1544
- {
1545
- result = @builder.words_compose(val[0], val[1], val[2])
1546
- }
1547
-
1548
- qword_list: # nothing
1549
- {
1550
- result = []
1551
- }
1552
- | qword_list tSTRING_CONTENT tSPACE
1553
- {
1554
- result = val[0] << @builder.string_internal(val[1])
1555
- }
1556
-
1557
- string_contents: # nothing
1558
- {
1559
- result = []
1560
- }
1561
- | string_contents string_content
1562
- {
1563
- result = val[0] << val[1]
1564
- }
1565
-
1566
- xstring_contents: # nothing
1567
- {
1568
- result = []
1569
- }
1570
- | xstring_contents string_content
1571
- {
1572
- result = val[0] << val[1]
1573
- }
1574
-
1575
- string_content: tSTRING_CONTENT
1576
- {
1577
- result = @builder.string_internal(val[0])
1578
- }
1579
- | tSTRING_DVAR string_dvar
1580
- {
1581
- result = val[1]
1582
- }
1583
- | tSTRING_DBEG
1584
- {
1585
- @lexer.cond.push(false)
1586
- @lexer.cmdarg.push(false)
1587
- }
1588
- compstmt tRCURLY
1589
- {
1590
- @lexer.cond.lexpop
1591
- @lexer.cmdarg.lexpop
1592
-
1593
- result = @builder.begin(val[0], val[2], val[3])
1594
- }
1595
-
1596
- string_dvar: tGVAR
1597
- {
1598
- result = @builder.gvar(val[0])
1599
- }
1600
- | tIVAR
1601
- {
1602
- result = @builder.ivar(val[0])
1603
- }
1604
- | tCVAR
1605
- {
1606
- result = @builder.cvar(val[0])
1607
- }
1608
- | backref
1609
-
1610
-
1611
- symbol: tSYMBOL
1612
- {
1613
- result = @builder.symbol(val[0])
1614
- }
1615
-
1616
- dsym: tSYMBEG xstring_contents tSTRING_END
1617
- {
1618
- result = @builder.symbol_compose(val[0], val[1], val[2])
1619
- }
1620
-
1621
- numeric: tINTEGER
1622
- {
1623
- result = @builder.integer(val[0])
1624
- }
1625
- | tFLOAT
1626
- {
1627
- result = @builder.float(val[0])
1628
- }
1629
- | tUNARY_NUM tINTEGER =tLOWEST
1630
- {
1631
- num = @builder.integer(val[1])
1632
- if @builder.respond_to? :negate
1633
- # AST builder interface compatibility
1634
- result = @builder.negate(val[0], num)
1635
- else
1636
- result = @builder.unary_num(val[0], num)
1637
- end
1638
- }
1639
- | tUNARY_NUM tFLOAT =tLOWEST
1640
- {
1641
- num = @builder.float(val[1])
1642
- if @builder.respond_to? :negate
1643
- # AST builder interface compatibility
1644
- result = @builder.negate(val[0], num)
1645
- else
1646
- result = @builder.unary_num(val[0], num)
1647
- end
1648
- }
1649
-
1650
- variable: tIDENTIFIER
1651
- {
1652
- result = @builder.ident(val[0])
1653
- }
1654
- | tIVAR
1655
- {
1656
- result = @builder.ivar(val[0])
1657
- }
1658
- | tGVAR
1659
- {
1660
- result = @builder.gvar(val[0])
1661
- }
1662
- | tCVAR
1663
- {
1664
- result = @builder.cvar(val[0])
1665
- }
1666
- | tCONSTANT
1667
- {
1668
- result = @builder.const(val[0])
1669
- }
1670
- | kNIL
1671
- {
1672
- result = @builder.nil(val[0])
1673
- }
1674
- | kSELF
1675
- {
1676
- result = @builder.self(val[0])
1677
- }
1678
- | kTRUE
1679
- {
1680
- result = @builder.true(val[0])
1681
- }
1682
- | kFALSE
1683
- {
1684
- result = @builder.false(val[0])
1685
- }
1686
- | k__FILE__
1687
- {
1688
- result = @builder.__FILE__(val[0])
1689
- }
1690
- | k__LINE__
1691
- {
1692
- result = @builder.__LINE__(val[0])
1693
- }
1694
-
1695
- var_ref: variable
1696
- {
1697
- result = @builder.accessible(val[0])
1698
- }
1699
-
1700
- var_lhs: variable
1701
- {
1702
- result = @builder.assignable(val[0])
1703
- }
1704
-
1705
- backref: tNTH_REF
1706
- {
1707
- result = @builder.nth_ref(val[0])
1708
- }
1709
- | tBACK_REF
1710
- {
1711
- result = @builder.back_ref(val[0])
1712
- }
1713
-
1714
- superclass: term
1715
- {
1716
- result = nil
1717
- }
1718
- | tLT expr_value term
1719
- {
1720
- result = [ val[0], val[1] ]
1721
- }
1722
- | error term
1723
- {
1724
- yyerrok
1725
- result = nil
1726
- }
1727
-
1728
- f_arglist: tLPAREN2 f_args opt_nl tRPAREN
1729
- {
1730
- result = @builder.args(val[0], val[1], val[3])
1731
-
1732
- @lexer.state = :expr_beg
1733
- }
1734
- | f_args term
1735
- {
1736
- result = @builder.args(nil, val[0], nil)
1737
- }
1738
-
1739
- f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_f_block_arg
1740
- {
1741
- result = val[0].
1742
- concat(val[2]).
1743
- concat(val[4]).
1744
- concat(val[5])
1745
- }
1746
- | f_arg tCOMMA f_optarg opt_f_block_arg
1747
- {
1748
- result = val[0].
1749
- concat(val[2]).
1750
- concat(val[3])
1751
- }
1752
- | f_arg tCOMMA f_rest_arg opt_f_block_arg
1753
- {
1754
- result = val[0].
1755
- concat(val[2]).
1756
- concat(val[3])
1757
- }
1758
- | f_arg opt_f_block_arg
1759
- {
1760
- result = val[0].
1761
- concat(val[1])
1762
- }
1763
- | f_optarg tCOMMA f_rest_arg opt_f_block_arg
1764
- {
1765
- result = val[0].
1766
- concat(val[2]).
1767
- concat(val[3])
1768
- }
1769
- | f_optarg opt_f_block_arg
1770
- {
1771
- result = val[0].
1772
- concat(val[1])
1773
- }
1774
- | f_rest_arg opt_f_block_arg
1775
- {
1776
- result = val[0].
1777
- concat(val[1])
1778
- }
1779
- | f_block_arg
1780
- {
1781
- result = [ val[0] ]
1782
- }
1783
- | # nothing
1784
- {
1785
- result = []
1786
- }
1787
-
1788
- f_norm_arg: tCONSTANT
1789
- {
1790
- diagnostic :error, :argument_const, nil, val[0]
1791
- }
1792
- | tIVAR
1793
- {
1794
- diagnostic :error, :argument_ivar, nil, val[0]
1795
- }
1796
- | tGVAR
1797
- {
1798
- diagnostic :error, :argument_gvar, nil, val[0]
1799
- }
1800
- | tCVAR
1801
- {
1802
- diagnostic :error, :argument_cvar, nil, val[0]
1803
- }
1804
- | tIDENTIFIER
1805
- {
1806
- @static_env.declare val[0][0]
1807
-
1808
- result = @builder.arg(val[0])
1809
- }
1810
-
1811
- f_arg: f_norm_arg
1812
- {
1813
- result = [ val[0] ]
1814
- }
1815
- | f_arg tCOMMA f_norm_arg
1816
- {
1817
- result = val[0] << val[2]
1818
- }
1819
-
1820
- f_opt: tIDENTIFIER tEQL arg_value
1821
- {
1822
- @static_env.declare val[0][0]
1823
-
1824
- result = @builder.optarg(val[0], val[1], val[2])
1825
- }
1826
-
1827
- f_optarg: f_opt
1828
- {
1829
- result = [ val[0] ]
1830
- }
1831
- | f_optarg tCOMMA f_opt
1832
- {
1833
- result = val[0] << val[2]
1834
- }
1835
-
1836
- restarg_mark: tSTAR2 | tSTAR
1837
-
1838
- f_rest_arg: restarg_mark tIDENTIFIER
1839
- {
1840
- @static_env.declare val[1][0]
1841
-
1842
- result = [ @builder.restarg(val[0], val[1]) ]
1843
- }
1844
- | restarg_mark
1845
- {
1846
- result = [ @builder.restarg(val[0]) ]
1847
- }
1848
-
1849
- blkarg_mark: tAMPER2 | tAMPER
1850
-
1851
- f_block_arg: blkarg_mark tIDENTIFIER
1852
- {
1853
- @static_env.declare val[1][0]
1854
-
1855
- result = @builder.blockarg(val[0], val[1])
1856
- }
1857
-
1858
- opt_f_block_arg: tCOMMA f_block_arg
1859
- {
1860
- result = [ val[1] ]
1861
- }
1862
- | # nothing
1863
- {
1864
- result = []
1865
- }
1866
-
1867
- singleton: var_ref
1868
- | tLPAREN2 expr opt_nl tRPAREN
1869
- {
1870
- result = val[1]
1871
- }
1872
-
1873
- assoc_list: # nothing
1874
- {
1875
- result = []
1876
- }
1877
- | assocs trailer
1878
- {
1879
- result = val[0]
1880
- }
1881
- | args trailer
1882
- {
1883
- result = @builder.pair_list_18(val[0])
1884
- }
1885
-
1886
- assocs: assoc
1887
- {
1888
- result = [ val[0] ]
1889
- }
1890
- | assocs tCOMMA assoc
1891
- {
1892
- result = val[0] << val[2]
1893
- }
1894
-
1895
- assoc: arg_value tASSOC arg_value
1896
- {
1897
- result = @builder.pair(val[0], val[1], val[2])
1898
- }
1899
-
1900
- operation: tIDENTIFIER | tCONSTANT | tFID
1901
- operation2: tIDENTIFIER | tCONSTANT | tFID | op
1902
- operation3: tIDENTIFIER | tFID | op
1903
- dot_or_colon: tDOT | tCOLON2
1904
- opt_terms: | terms
1905
- opt_nl: | tNL
1906
- trailer: | tNL | tCOMMA
1907
-
1908
- term: tSEMI
1909
- {
1910
- yyerrok
1911
- }
1912
- | tNL
1913
-
1914
- terms: term
1915
- | terms tSEMI
1916
-
1917
- none: # nothing
1918
- {
1919
- result = nil
1920
- }
1921
-
1922
- end
1923
-
1924
- ---- header
1925
-
1926
- require 'parser'
1927
-
1928
- ---- inner
1929
-
1930
- def version
1931
- 18
1932
- end
1933
-
1934
- def default_encoding
1935
- Encoding::BINARY
1936
- end