parser 2.6.5.0 → 2.7.2.0

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