ruby_parser 3.15.0 → 3.18.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/History.rdoc +101 -0
- data/Manifest.txt +5 -0
- data/README.rdoc +1 -0
- data/Rakefile +128 -30
- data/bin/ruby_parse_extract_error +1 -1
- data/compare/normalize.rb +8 -3
- data/debugging.md +133 -0
- data/gauntlet.md +106 -0
- data/lib/rp_extensions.rb +15 -36
- data/lib/rp_stringscanner.rb +20 -51
- data/lib/ruby20_parser.rb +3559 -3499
- data/lib/ruby20_parser.y +333 -248
- data/lib/ruby21_parser.rb +3650 -3614
- data/lib/ruby21_parser.y +328 -245
- data/lib/ruby22_parser.rb +3690 -3628
- data/lib/ruby22_parser.y +332 -247
- data/lib/ruby23_parser.rb +3629 -3573
- data/lib/ruby23_parser.y +332 -247
- data/lib/ruby24_parser.rb +3712 -3654
- data/lib/ruby24_parser.y +332 -247
- data/lib/ruby25_parser.rb +3712 -3654
- data/lib/ruby25_parser.y +332 -247
- data/lib/ruby26_parser.rb +3715 -3658
- data/lib/ruby26_parser.y +332 -246
- data/lib/ruby27_parser.rb +5009 -3722
- data/lib/ruby27_parser.y +928 -245
- data/lib/ruby30_parser.rb +8741 -0
- data/lib/ruby30_parser.y +3463 -0
- data/lib/ruby3_parser.yy +3467 -0
- data/lib/ruby_lexer.rb +273 -602
- data/lib/ruby_lexer.rex +28 -21
- data/lib/ruby_lexer.rex.rb +60 -24
- data/lib/ruby_lexer_strings.rb +638 -0
- data/lib/ruby_parser.rb +2 -0
- data/lib/ruby_parser.yy +969 -252
- data/lib/ruby_parser_extras.rb +297 -116
- data/test/test_ruby_lexer.rb +213 -129
- data/test/test_ruby_parser.rb +1288 -110
- data/tools/munge.rb +36 -8
- data/tools/ripper.rb +15 -10
- data.tar.gz.sig +0 -0
- metadata +48 -35
- metadata.gz.sig +1 -4
data/lib/ruby27_parser.y
CHANGED
@@ -18,10 +18,11 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
|
|
18
18
|
tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG
|
19
19
|
tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END
|
20
20
|
tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA
|
21
|
-
tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND
|
21
|
+
tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND
|
22
22
|
tRATIONAL tIMAGINARY
|
23
23
|
tLABEL_END
|
24
24
|
tLONELY
|
25
|
+
tBDOT2 tBDOT3
|
25
26
|
|
26
27
|
preclow
|
27
28
|
nonassoc tLOWEST
|
@@ -33,7 +34,7 @@ preclow
|
|
33
34
|
right tEQL tOP_ASGN
|
34
35
|
left kRESCUE_MOD
|
35
36
|
right tEH tCOLON
|
36
|
-
nonassoc tDOT2 tDOT3
|
37
|
+
nonassoc tDOT2 tDOT3 tBDOT2 tBDOT3
|
37
38
|
left tOROP
|
38
39
|
left tANDOP
|
39
40
|
nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
|
@@ -56,6 +57,9 @@ rule
|
|
56
57
|
top_compstmt
|
57
58
|
{
|
58
59
|
result = new_compstmt val
|
60
|
+
|
61
|
+
lexer.cond.pop # local_pop
|
62
|
+
lexer.cmdarg.pop
|
59
63
|
}
|
60
64
|
|
61
65
|
top_compstmt: top_stmts opt_terms
|
@@ -76,7 +80,7 @@ rule
|
|
76
80
|
| klBEGIN
|
77
81
|
{
|
78
82
|
if (self.in_def || self.in_single > 0) then
|
79
|
-
|
83
|
+
debug 11
|
80
84
|
yyerror "BEGIN in method"
|
81
85
|
end
|
82
86
|
self.env.extend
|
@@ -101,6 +105,8 @@ rule
|
|
101
105
|
bodystmt: compstmt opt_rescue k_else
|
102
106
|
{
|
103
107
|
res = _values[-2]
|
108
|
+
# TODO: move down to main match so I can just use val
|
109
|
+
|
104
110
|
yyerror "else without rescue is useless" unless res
|
105
111
|
}
|
106
112
|
compstmt
|
@@ -131,7 +137,7 @@ rule
|
|
131
137
|
| error stmt
|
132
138
|
{
|
133
139
|
result = val[1]
|
134
|
-
|
140
|
+
debug 12
|
135
141
|
}
|
136
142
|
|
137
143
|
stmt_or_begin: stmt
|
@@ -139,6 +145,10 @@ rule
|
|
139
145
|
{
|
140
146
|
yyerror "BEGIN is permitted only at toplevel"
|
141
147
|
}
|
148
|
+
begin_block
|
149
|
+
{
|
150
|
+
result = val[2] # wtf?
|
151
|
+
}
|
142
152
|
|
143
153
|
stmt: kALIAS fitem
|
144
154
|
{
|
@@ -151,12 +161,12 @@ rule
|
|
151
161
|
}
|
152
162
|
| kALIAS tGVAR tGVAR
|
153
163
|
{
|
154
|
-
(_, line), lhs, rhs = val
|
164
|
+
(_, line), (lhs, _), (rhs, _) = val
|
155
165
|
result = s(:valias, lhs.to_sym, rhs.to_sym).line line
|
156
166
|
}
|
157
167
|
| kALIAS tGVAR tBACK_REF
|
158
168
|
{
|
159
|
-
(_, line), lhs, rhs = val
|
169
|
+
(_, line), (lhs, _), (rhs, _) = val
|
160
170
|
result = s(:valias, lhs.to_sym, :"$#{rhs}").line line
|
161
171
|
}
|
162
172
|
| kALIAS tGVAR tNTH_REF
|
@@ -199,7 +209,7 @@ rule
|
|
199
209
|
(_, line), _, stmt, _ = val
|
200
210
|
|
201
211
|
if (self.in_def || self.in_single > 0) then
|
202
|
-
|
212
|
+
debug 13
|
203
213
|
yyerror "END in method; use at_exit"
|
204
214
|
end
|
205
215
|
|
@@ -215,6 +225,15 @@ rule
|
|
215
225
|
lhs, _, rhs = val
|
216
226
|
result = new_assign lhs, s(:svalue, rhs).line(rhs.line)
|
217
227
|
}
|
228
|
+
| mlhs tEQL mrhs_arg kRESCUE_MOD stmt
|
229
|
+
{
|
230
|
+
# unwraps s(:to_ary, rhs)
|
231
|
+
lhs, _, (_, rhs), _, resbody = val
|
232
|
+
|
233
|
+
resbody = new_resbody s(:array).line(resbody.line), resbody
|
234
|
+
|
235
|
+
result = new_masgn lhs, new_rescue(rhs, resbody), :wrap
|
236
|
+
}
|
218
237
|
| mlhs tEQL mrhs_arg
|
219
238
|
{
|
220
239
|
result = new_masgn val[0], val[2]
|
@@ -239,32 +258,31 @@ rule
|
|
239
258
|
}
|
240
259
|
| primary_value call_op tIDENTIFIER tOP_ASGN command_rhs
|
241
260
|
{
|
242
|
-
prim, _, id,
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
result.line = val[0].line
|
261
|
+
prim, (call_op, _), (id, _), (op_asgn, _), rhs = val
|
262
|
+
|
263
|
+
result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym)
|
264
|
+
result.sexp_type = :safe_op_asgn if call_op == '&.'
|
265
|
+
result.line prim.line
|
248
266
|
}
|
249
267
|
| primary_value call_op tCONSTANT tOP_ASGN command_rhs
|
250
268
|
{
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
result.line
|
269
|
+
prim, (call_op, _), (id, _), (op_asgn, _), rhs = val
|
270
|
+
|
271
|
+
result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym)
|
272
|
+
result.sexp_type = :safe_op_asgn if call_op == '&.'
|
273
|
+
result.line prim.line
|
256
274
|
}
|
257
275
|
| primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs
|
258
276
|
{
|
259
|
-
lhs1, _, lhs2,
|
277
|
+
lhs1, _, (lhs2, line), (id, _), rhs = val
|
260
278
|
|
261
|
-
result = s(:op_asgn, lhs1, rhs, lhs2.to_sym,
|
279
|
+
result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line
|
262
280
|
}
|
263
281
|
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs
|
264
282
|
{
|
265
|
-
lhs1, _, lhs2,
|
283
|
+
lhs1, _, (lhs2, line), (id, _), rhs = val
|
266
284
|
|
267
|
-
result = s(:op_asgn, lhs1, rhs, lhs2.to_sym,
|
285
|
+
result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line
|
268
286
|
}
|
269
287
|
| backref tOP_ASGN command_rhs
|
270
288
|
{
|
@@ -311,6 +329,28 @@ rule
|
|
311
329
|
# REFACTOR: call_uni_op -- see parse26.y
|
312
330
|
}
|
313
331
|
| arg
|
332
|
+
kIN
|
333
|
+
{
|
334
|
+
# TODO? value_expr($1);
|
335
|
+
self.lexer.lex_state = EXPR_BEG|EXPR_LABEL
|
336
|
+
self.lexer.command_start = false
|
337
|
+
result = self.in_kwarg
|
338
|
+
self.in_kwarg = true
|
339
|
+
self.env.extend
|
340
|
+
}
|
341
|
+
p_expr
|
342
|
+
{
|
343
|
+
self.env.unextend
|
344
|
+
|
345
|
+
expr, _, old_kwarg, pat = val
|
346
|
+
|
347
|
+
expr = value_expr expr
|
348
|
+
|
349
|
+
self.in_kwarg = old_kwarg
|
350
|
+
pat_in = new_in pat, nil, nil, expr.line
|
351
|
+
result = new_case expr, pat_in, expr.line
|
352
|
+
}
|
353
|
+
| arg =tLBRACE_ARG
|
314
354
|
|
315
355
|
expr_value: expr
|
316
356
|
{
|
@@ -335,7 +375,7 @@ rule
|
|
335
375
|
block_command: block_call
|
336
376
|
| block_call call_op2 operation2 command_args
|
337
377
|
{
|
338
|
-
blk, _, msg, args = val
|
378
|
+
blk, _, (msg, _line), args = val
|
339
379
|
result = new_call(blk, msg.to_sym, args).line blk.line
|
340
380
|
}
|
341
381
|
|
@@ -349,15 +389,15 @@ rule
|
|
349
389
|
_, line, body, _ = val
|
350
390
|
|
351
391
|
result = body
|
352
|
-
result.line
|
392
|
+
result.line line
|
353
393
|
|
354
394
|
# self.env.unextend
|
355
395
|
}
|
356
396
|
|
357
397
|
fcall: operation
|
358
398
|
{
|
359
|
-
msg, = val
|
360
|
-
result = new_call(nil, msg.to_sym).line
|
399
|
+
(msg, line), = val
|
400
|
+
result = new_call(nil, msg.to_sym).line line
|
361
401
|
}
|
362
402
|
|
363
403
|
command: fcall command_args =tLOWEST
|
@@ -380,12 +420,14 @@ rule
|
|
380
420
|
}
|
381
421
|
| primary_value call_op operation2 command_args =tLOWEST
|
382
422
|
{
|
383
|
-
lhs, callop, op, args = val
|
423
|
+
lhs, callop, (op, _), args = val
|
424
|
+
|
384
425
|
result = new_call lhs, op.to_sym, args, callop
|
426
|
+
result.line lhs.line
|
385
427
|
}
|
386
428
|
| primary_value call_op operation2 command_args cmd_brace_block
|
387
429
|
{
|
388
|
-
recv, _, msg, args, block = val
|
430
|
+
recv, _, (msg, _line), args, block = val
|
389
431
|
call = new_call recv, msg.to_sym, args, val[1]
|
390
432
|
|
391
433
|
block_dup_check call, block
|
@@ -395,11 +437,14 @@ rule
|
|
395
437
|
}
|
396
438
|
| primary_value tCOLON2 operation2 command_args =tLOWEST
|
397
439
|
{
|
398
|
-
|
440
|
+
lhs, _, (id, line), args = val
|
441
|
+
|
442
|
+
result = new_call lhs, id.to_sym, args
|
443
|
+
result.line line
|
399
444
|
}
|
400
445
|
| primary_value tCOLON2 operation2 command_args cmd_brace_block
|
401
446
|
{
|
402
|
-
recv, _, msg, args, block = val
|
447
|
+
recv, _, (msg, _line), args, block = val
|
403
448
|
call = new_call recv, msg.to_sym, args
|
404
449
|
|
405
450
|
block_dup_check call, block
|
@@ -557,25 +602,29 @@ rule
|
|
557
602
|
}
|
558
603
|
| primary_value call_op tIDENTIFIER
|
559
604
|
{
|
560
|
-
|
605
|
+
lhs, call_op, (id, _line) = val
|
606
|
+
|
607
|
+
result = new_attrasgn lhs, id, call_op
|
561
608
|
}
|
562
609
|
| primary_value tCOLON2 tIDENTIFIER
|
563
610
|
{
|
564
|
-
recv, _, id = val
|
611
|
+
recv, _, (id, _line) = val
|
565
612
|
result = new_attrasgn recv, id
|
566
613
|
}
|
567
614
|
| primary_value call_op tCONSTANT
|
568
615
|
{
|
569
|
-
|
616
|
+
lhs, call_op, (id, _line) = val
|
617
|
+
|
618
|
+
result = new_attrasgn lhs, id, call_op
|
570
619
|
}
|
571
620
|
| primary_value tCOLON2 tCONSTANT
|
572
621
|
{
|
573
622
|
if (self.in_def || self.in_single > 0) then
|
574
|
-
|
623
|
+
debug 14
|
575
624
|
yyerror "dynamic constant assignment"
|
576
625
|
end
|
577
626
|
|
578
|
-
expr, _, id = val
|
627
|
+
expr, _, (id, _line) = val
|
579
628
|
l = expr.line
|
580
629
|
|
581
630
|
result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l
|
@@ -583,58 +632,65 @@ rule
|
|
583
632
|
| tCOLON3 tCONSTANT
|
584
633
|
{
|
585
634
|
if (self.in_def || self.in_single > 0) then
|
586
|
-
|
635
|
+
debug 15
|
587
636
|
yyerror "dynamic constant assignment"
|
588
637
|
end
|
589
638
|
|
590
|
-
_, id = val
|
591
|
-
l = lexer.lineno
|
639
|
+
_, (id, l) = val
|
592
640
|
|
593
641
|
result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l
|
594
642
|
}
|
595
643
|
| backref
|
596
644
|
{
|
597
|
-
|
645
|
+
ref, = val
|
646
|
+
|
647
|
+
self.backref_assign_error ref
|
598
648
|
}
|
599
649
|
|
600
650
|
lhs: user_variable
|
601
651
|
{
|
602
|
-
|
603
|
-
|
604
|
-
result
|
652
|
+
var, = val
|
653
|
+
|
654
|
+
result = self.assignable var
|
605
655
|
}
|
606
656
|
| keyword_variable
|
607
657
|
{
|
608
|
-
|
609
|
-
|
610
|
-
result
|
611
|
-
|
658
|
+
var, = val
|
659
|
+
|
660
|
+
result = self.assignable var
|
661
|
+
|
662
|
+
debug 16
|
612
663
|
}
|
613
664
|
| primary_value tLBRACK2 opt_call_args rbracket
|
614
665
|
{
|
615
666
|
lhs, _, args, _ = val
|
667
|
+
|
616
668
|
result = self.aryset lhs, args
|
617
669
|
}
|
618
670
|
| primary_value call_op tIDENTIFIER # REFACTOR
|
619
671
|
{
|
620
|
-
lhs, op, id = val
|
672
|
+
lhs, op, (id, _line) = val
|
673
|
+
|
621
674
|
result = new_attrasgn lhs, id, op
|
622
675
|
}
|
623
676
|
| primary_value tCOLON2 tIDENTIFIER
|
624
677
|
{
|
625
|
-
lhs, _, id = val
|
678
|
+
lhs, _, (id, _line) = val
|
679
|
+
|
626
680
|
result = new_attrasgn lhs, id
|
627
681
|
}
|
628
682
|
| primary_value call_op tCONSTANT # REFACTOR?
|
629
683
|
{
|
630
|
-
|
684
|
+
lhs, call_op, (id, _line) = val
|
685
|
+
|
686
|
+
result = new_attrasgn lhs, id, call_op
|
631
687
|
}
|
632
688
|
| primary_value tCOLON2 tCONSTANT
|
633
689
|
{
|
634
|
-
expr, _, id = val
|
690
|
+
expr, _, (id, _line) = val
|
635
691
|
|
636
692
|
if (self.in_def || self.in_single > 0) then
|
637
|
-
|
693
|
+
debug 17
|
638
694
|
yyerror "dynamic constant assignment"
|
639
695
|
end
|
640
696
|
|
@@ -643,14 +699,13 @@ rule
|
|
643
699
|
}
|
644
700
|
| tCOLON3 tCONSTANT
|
645
701
|
{
|
646
|
-
_, id = val
|
702
|
+
_, (id, l) = val
|
647
703
|
|
648
704
|
if (self.in_def || self.in_single > 0) then
|
649
|
-
|
705
|
+
debug 18
|
650
706
|
yyerror "dynamic constant assignment"
|
651
707
|
end
|
652
708
|
|
653
|
-
l = lexer.lineno
|
654
709
|
result = s(:const, s(:colon3, id.to_sym).line(l)).line l
|
655
710
|
}
|
656
711
|
| backref
|
@@ -666,16 +721,17 @@ rule
|
|
666
721
|
|
667
722
|
cpath: tCOLON3 cname
|
668
723
|
{
|
669
|
-
_, name = val
|
670
|
-
result = s(:colon3, name.to_sym).line
|
724
|
+
_, (name, line) = val
|
725
|
+
result = s(:colon3, name.to_sym).line line
|
671
726
|
}
|
672
727
|
| cname
|
673
728
|
{
|
674
|
-
|
729
|
+
(id, line), = val
|
730
|
+
result = [id.to_sym, line] # TODO: sexp?
|
675
731
|
}
|
676
732
|
| primary_value tCOLON2 cname
|
677
733
|
{
|
678
|
-
pval, _, name = val
|
734
|
+
pval, _, (name, _line) = val
|
679
735
|
|
680
736
|
result = s(:colon2, pval, name.to_sym)
|
681
737
|
result.line pval.line
|
@@ -685,24 +741,17 @@ rule
|
|
685
741
|
| op
|
686
742
|
{
|
687
743
|
lexer.lex_state = EXPR_END
|
688
|
-
result = val[0]
|
689
744
|
}
|
690
745
|
|
691
746
|
| reswords
|
692
|
-
{
|
693
|
-
(sym, _line), = val
|
694
|
-
lexer.lex_state = EXPR_END
|
695
|
-
result = sym
|
696
|
-
}
|
697
747
|
|
698
|
-
|
699
|
-
|
700
|
-
fitem: fsym
|
748
|
+
fitem: fname
|
701
749
|
{
|
702
|
-
id, = val
|
703
|
-
|
750
|
+
(id, line), = val
|
751
|
+
|
752
|
+
result = s(:lit, id.to_sym).line line
|
704
753
|
}
|
705
|
-
|
|
754
|
+
| symbol
|
706
755
|
|
707
756
|
undef_list: fitem
|
708
757
|
{
|
@@ -723,8 +772,6 @@ rule
|
|
723
772
|
| tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
|
724
773
|
| tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE
|
725
774
|
| tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2
|
726
|
-
# TODO: tUBANG dead?
|
727
|
-
| tUBANG
|
728
775
|
|
729
776
|
reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND
|
730
777
|
| kALIAS | kAND | kBEGIN | kBREAK | kCASE
|
@@ -758,24 +805,20 @@ rule
|
|
758
805
|
}
|
759
806
|
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs
|
760
807
|
{
|
761
|
-
lhs, _, id, op, rhs = val
|
808
|
+
lhs, _, (id, _line), (op, _), rhs = val
|
762
809
|
|
763
810
|
result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line
|
764
811
|
}
|
765
812
|
| primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs
|
766
813
|
{
|
767
|
-
lhs1, _, lhs2, op, rhs = val
|
814
|
+
lhs1, _, (lhs2, _line), op, rhs = val
|
768
815
|
|
769
816
|
lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line
|
770
817
|
result = new_const_op_asgn [lhs, op, rhs]
|
771
818
|
}
|
772
|
-
| tCOLON3 tCONSTANT
|
819
|
+
| tCOLON3 tCONSTANT tOP_ASGN arg_rhs
|
773
820
|
{
|
774
|
-
|
775
|
-
}
|
776
|
-
tOP_ASGN arg_rhs
|
777
|
-
{
|
778
|
-
_, lhs, line, op, rhs = val
|
821
|
+
_, (lhs, line), op, rhs = val
|
779
822
|
|
780
823
|
lhs = s(:colon3, lhs.to_sym).line line
|
781
824
|
result = new_const_op_asgn [lhs, op, rhs]
|
@@ -789,7 +832,7 @@ rule
|
|
789
832
|
| arg tDOT2 arg
|
790
833
|
{
|
791
834
|
v1, v2 = val[0], val[2]
|
792
|
-
if v1.
|
835
|
+
if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then
|
793
836
|
result = s(:lit, (v1.last)..(v2.last)).line v1.line
|
794
837
|
else
|
795
838
|
result = s(:dot2, v1, v2).line v1.line
|
@@ -798,7 +841,7 @@ rule
|
|
798
841
|
| arg tDOT3 arg
|
799
842
|
{
|
800
843
|
v1, v2 = val[0], val[2]
|
801
|
-
if v1.
|
844
|
+
if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then
|
802
845
|
result = s(:lit, (v1.last)...(v2.last)).line v1.line
|
803
846
|
else
|
804
847
|
result = s(:dot3, v1, v2).line v1.line
|
@@ -818,6 +861,22 @@ rule
|
|
818
861
|
|
819
862
|
result = s(:dot3, v1, v2).line v1.line
|
820
863
|
}
|
864
|
+
|
865
|
+
| tBDOT2 arg
|
866
|
+
{
|
867
|
+
_, v2, = val
|
868
|
+
v1 = nil
|
869
|
+
|
870
|
+
result = s(:dot2, v1, v2).line v2.line
|
871
|
+
}
|
872
|
+
| tBDOT3 arg
|
873
|
+
{
|
874
|
+
_, v2 = val
|
875
|
+
v1 = nil
|
876
|
+
|
877
|
+
result = s(:dot3, v1, v2).line v2.line
|
878
|
+
}
|
879
|
+
|
821
880
|
| arg tPLUS arg
|
822
881
|
{
|
823
882
|
result = new_call val[0], :+, argl(val[2])
|
@@ -844,8 +903,9 @@ rule
|
|
844
903
|
}
|
845
904
|
| tUMINUS_NUM simple_numeric tPOW arg
|
846
905
|
{
|
847
|
-
|
848
|
-
|
906
|
+
_, (num, line), _, arg = val
|
907
|
+
lit = s(:lit, num).line line
|
908
|
+
result = new_call(new_call(lit, :"**", argl(arg)), :"-@")
|
849
909
|
|
850
910
|
}
|
851
911
|
| tUPLUS arg
|
@@ -944,12 +1004,12 @@ rule
|
|
944
1004
|
|
945
1005
|
rel_expr: arg relop arg =tGT
|
946
1006
|
{
|
947
|
-
lhs, op, rhs = val
|
1007
|
+
lhs, (op, _), rhs = val
|
948
1008
|
result = new_call lhs, op.to_sym, argl(rhs)
|
949
1009
|
}
|
950
1010
|
| rel_expr relop arg =tGT
|
951
1011
|
{
|
952
|
-
lhs, op, rhs = val
|
1012
|
+
lhs, (op, _), rhs = val
|
953
1013
|
warn "comparison '%s' after comparison", op
|
954
1014
|
result = new_call lhs, op.to_sym, argl(rhs)
|
955
1015
|
}
|
@@ -989,6 +1049,24 @@ rule
|
|
989
1049
|
_, args, _ = val
|
990
1050
|
result = args
|
991
1051
|
}
|
1052
|
+
| tLPAREN2 args tCOMMA args_forward rparen
|
1053
|
+
{
|
1054
|
+
yyerror "Unexpected ..." unless
|
1055
|
+
self.lexer.is_local_id(:"*") &&
|
1056
|
+
self.lexer.is_local_id(:"**") &&
|
1057
|
+
self.lexer.is_local_id(:"&")
|
1058
|
+
|
1059
|
+
result = call_args val
|
1060
|
+
}
|
1061
|
+
| tLPAREN2 args_forward rparen
|
1062
|
+
{
|
1063
|
+
yyerror "Unexpected ..." unless
|
1064
|
+
self.lexer.is_local_id(:"*") &&
|
1065
|
+
self.lexer.is_local_id(:"**") &&
|
1066
|
+
self.lexer.is_local_id(:"&")
|
1067
|
+
|
1068
|
+
result = call_args val
|
1069
|
+
}
|
992
1070
|
|
993
1071
|
opt_paren_args: none
|
994
1072
|
| paren_args
|
@@ -1140,8 +1218,9 @@ rule
|
|
1140
1218
|
| backref
|
1141
1219
|
| tFID
|
1142
1220
|
{
|
1143
|
-
msg, = val
|
1221
|
+
(msg, line), = val
|
1144
1222
|
result = new_call nil, msg.to_sym
|
1223
|
+
result.line line
|
1145
1224
|
}
|
1146
1225
|
| k_begin
|
1147
1226
|
{
|
@@ -1183,15 +1262,15 @@ rule
|
|
1183
1262
|
}
|
1184
1263
|
| primary_value tCOLON2 tCONSTANT
|
1185
1264
|
{
|
1186
|
-
expr, _, id = val
|
1265
|
+
expr, _, (id, _line) = val
|
1187
1266
|
|
1188
1267
|
result = s(:colon2, expr, id.to_sym).line expr.line
|
1189
1268
|
}
|
1190
1269
|
| tCOLON3 tCONSTANT
|
1191
1270
|
{
|
1192
|
-
_, id = val
|
1271
|
+
_, (id, line) = val
|
1193
1272
|
|
1194
|
-
result = s(:colon3, id.to_sym).line
|
1273
|
+
result = s(:colon3, id.to_sym).line line
|
1195
1274
|
}
|
1196
1275
|
| tLBRACK { result = lexer.lineno } aref_args tRBRACK
|
1197
1276
|
{
|
@@ -1238,7 +1317,7 @@ rule
|
|
1238
1317
|
}
|
1239
1318
|
| kNOT tLPAREN2 rparen
|
1240
1319
|
{
|
1241
|
-
|
1320
|
+
debug 20
|
1242
1321
|
}
|
1243
1322
|
| fcall brace_block
|
1244
1323
|
{
|
@@ -1256,9 +1335,10 @@ rule
|
|
1256
1335
|
iter.insert 1, call # FIX
|
1257
1336
|
result = iter
|
1258
1337
|
}
|
1259
|
-
|
|
1338
|
+
| lambda
|
1260
1339
|
{
|
1261
|
-
|
1340
|
+
expr, = val
|
1341
|
+
result = expr
|
1262
1342
|
}
|
1263
1343
|
| k_if expr_value then compstmt if_tail k_end
|
1264
1344
|
{
|
@@ -1290,6 +1370,12 @@ rule
|
|
1290
1370
|
(_, line), _, body, _ = val
|
1291
1371
|
result = new_case nil, body, line
|
1292
1372
|
}
|
1373
|
+
| k_case expr_value opt_terms p_case_body k_end
|
1374
|
+
{
|
1375
|
+
(_, line), expr, _, body, _ = val
|
1376
|
+
|
1377
|
+
result = new_case expr, body, line
|
1378
|
+
}
|
1293
1379
|
| k_for for_var kIN expr_value_do compstmt k_end
|
1294
1380
|
{
|
1295
1381
|
_, var, _, iter, body, _ = val
|
@@ -1301,7 +1387,6 @@ rule
|
|
1301
1387
|
}
|
1302
1388
|
cpath superclass
|
1303
1389
|
{
|
1304
|
-
self.comments.push self.lexer.comments
|
1305
1390
|
if (self.in_def || self.in_single > 0) then
|
1306
1391
|
yyerror "class definition in method body"
|
1307
1392
|
end
|
@@ -1311,7 +1396,7 @@ rule
|
|
1311
1396
|
{
|
1312
1397
|
result = new_class val
|
1313
1398
|
self.env.unextend
|
1314
|
-
self.lexer.
|
1399
|
+
self.lexer.ignore_body_comments
|
1315
1400
|
}
|
1316
1401
|
| k_class tLSHFT
|
1317
1402
|
{
|
@@ -1332,7 +1417,7 @@ rule
|
|
1332
1417
|
{
|
1333
1418
|
result = new_sclass val
|
1334
1419
|
self.env.unextend
|
1335
|
-
self.lexer.
|
1420
|
+
self.lexer.ignore_body_comments
|
1336
1421
|
}
|
1337
1422
|
| k_module
|
1338
1423
|
{
|
@@ -1340,7 +1425,6 @@ rule
|
|
1340
1425
|
}
|
1341
1426
|
cpath
|
1342
1427
|
{
|
1343
|
-
self.comments.push self.lexer.comments
|
1344
1428
|
yyerror "module definition in method body" if
|
1345
1429
|
self.in_def or self.in_single > 0
|
1346
1430
|
|
@@ -1350,7 +1434,7 @@ rule
|
|
1350
1434
|
{
|
1351
1435
|
result = new_module val
|
1352
1436
|
self.env.unextend
|
1353
|
-
self.lexer.
|
1437
|
+
self.lexer.ignore_body_comments
|
1354
1438
|
}
|
1355
1439
|
| k_def fname
|
1356
1440
|
{
|
@@ -1360,21 +1444,17 @@ rule
|
|
1360
1444
|
self.env.extend
|
1361
1445
|
lexer.cmdarg.push false
|
1362
1446
|
lexer.cond.push false
|
1363
|
-
|
1364
|
-
self.comments.push self.lexer.comments
|
1365
1447
|
}
|
1366
|
-
f_arglist bodystmt
|
1448
|
+
f_arglist bodystmt k_end
|
1367
1449
|
{
|
1368
|
-
in_def = val
|
1369
|
-
|
1370
|
-
result = new_defn val
|
1450
|
+
result, in_def = new_defn val
|
1371
1451
|
|
1372
1452
|
lexer.cond.pop # group = local_pop
|
1373
1453
|
lexer.cmdarg.pop
|
1374
1454
|
self.env.unextend
|
1375
1455
|
self.in_def = in_def
|
1376
1456
|
|
1377
|
-
self.lexer.
|
1457
|
+
self.lexer.ignore_body_comments
|
1378
1458
|
}
|
1379
1459
|
| k_def singleton dot_or_colon
|
1380
1460
|
{
|
@@ -1382,7 +1462,7 @@ rule
|
|
1382
1462
|
}
|
1383
1463
|
fname
|
1384
1464
|
{
|
1385
|
-
result =
|
1465
|
+
result = self.in_def
|
1386
1466
|
|
1387
1467
|
self.in_single += 1 # TODO: remove?
|
1388
1468
|
|
@@ -1392,13 +1472,18 @@ rule
|
|
1392
1472
|
lexer.cond.push false
|
1393
1473
|
|
1394
1474
|
lexer.lex_state = EXPR_ENDFN|EXPR_LABEL
|
1395
|
-
self.comments.push self.lexer.comments
|
1396
1475
|
}
|
1397
1476
|
f_arglist bodystmt k_end
|
1398
1477
|
{
|
1399
|
-
_, _recv, _, _, _name, (in_def, _lineno), _args, _body, _ = val
|
1400
1478
|
|
1401
|
-
|
1479
|
+
# [kdef, recv, _, _, (name, line), in_def, args, body, kend]
|
1480
|
+
# =>
|
1481
|
+
# [kdef, recv, (name, line), in_def, args, body, kend]
|
1482
|
+
|
1483
|
+
val.delete_at 3
|
1484
|
+
val.delete_at 2
|
1485
|
+
|
1486
|
+
result, in_def = new_defs val
|
1402
1487
|
|
1403
1488
|
lexer.cond.pop # group = local_pop
|
1404
1489
|
lexer.cmdarg.pop
|
@@ -1409,7 +1494,7 @@ rule
|
|
1409
1494
|
|
1410
1495
|
# TODO: restore cur_arg ? what's cur_arg?
|
1411
1496
|
|
1412
|
-
self.lexer.
|
1497
|
+
self.lexer.ignore_body_comments
|
1413
1498
|
}
|
1414
1499
|
| kBREAK
|
1415
1500
|
{
|
@@ -1446,8 +1531,17 @@ rule
|
|
1446
1531
|
k_case: kCASE
|
1447
1532
|
k_for: kFOR
|
1448
1533
|
k_class: kCLASS
|
1534
|
+
{
|
1535
|
+
self.comments.push self.lexer.comments
|
1536
|
+
}
|
1449
1537
|
k_module: kMODULE
|
1538
|
+
{
|
1539
|
+
self.comments.push self.lexer.comments
|
1540
|
+
}
|
1450
1541
|
k_def: kDEF
|
1542
|
+
{
|
1543
|
+
self.comments.push self.lexer.comments
|
1544
|
+
}
|
1451
1545
|
k_do: kDO
|
1452
1546
|
k_do_block: kDO_BLOCK
|
1453
1547
|
k_rescue: kRESCUE
|
@@ -1508,51 +1602,42 @@ rule
|
|
1508
1602
|
|
1509
1603
|
result = block_var args
|
1510
1604
|
}
|
1511
|
-
| f_marg_list tCOMMA
|
1605
|
+
| f_marg_list tCOMMA f_rest_marg
|
1512
1606
|
{
|
1513
|
-
args, _,
|
1607
|
+
args, _, rest = val
|
1514
1608
|
|
1515
|
-
result = block_var args,
|
1609
|
+
result = block_var args, rest
|
1516
1610
|
}
|
1517
|
-
| f_marg_list tCOMMA
|
1611
|
+
| f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list
|
1518
1612
|
{
|
1519
|
-
|
1613
|
+
lhs, _, splat, _, rhs = val
|
1520
1614
|
|
1521
|
-
result = block_var
|
1615
|
+
result = block_var lhs, splat, rhs
|
1522
1616
|
}
|
1523
|
-
|
|
1617
|
+
| f_rest_marg
|
1524
1618
|
{
|
1525
|
-
|
1619
|
+
rest, = val
|
1526
1620
|
|
1527
|
-
result = block_var
|
1621
|
+
result = block_var rest
|
1528
1622
|
}
|
1529
|
-
|
|
1623
|
+
| f_rest_marg tCOMMA f_marg_list
|
1530
1624
|
{
|
1531
|
-
|
1625
|
+
splat, _, rest = val
|
1532
1626
|
|
1533
|
-
result = block_var
|
1627
|
+
result = block_var splat, rest
|
1534
1628
|
}
|
1535
|
-
| tSTAR f_norm_arg
|
1536
|
-
{
|
1537
|
-
_, splat = val
|
1538
1629
|
|
1539
|
-
|
1540
|
-
}
|
1541
|
-
| tSTAR f_norm_arg tCOMMA f_marg_list
|
1630
|
+
f_rest_marg: tSTAR f_norm_arg
|
1542
1631
|
{
|
1543
|
-
_,
|
1632
|
+
_, (id, line) = val
|
1544
1633
|
|
1545
|
-
result =
|
1634
|
+
result = args ["*#{id}".to_sym]
|
1635
|
+
result.line line
|
1546
1636
|
}
|
1547
1637
|
| tSTAR
|
1548
1638
|
{
|
1549
|
-
result =
|
1550
|
-
|
1551
|
-
| tSTAR tCOMMA f_marg_list
|
1552
|
-
{
|
1553
|
-
_, _, args = val
|
1554
|
-
|
1555
|
-
result = block_var :*, args
|
1639
|
+
result = args [:*]
|
1640
|
+
result.line lexer.lineno # FIX: tSTAR -> line
|
1556
1641
|
}
|
1557
1642
|
|
1558
1643
|
block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg
|
@@ -1567,10 +1652,14 @@ rule
|
|
1567
1652
|
{
|
1568
1653
|
result = call_args val
|
1569
1654
|
}
|
1655
|
+
| f_no_kwarg opt_f_block_arg
|
1656
|
+
{
|
1657
|
+
result = args val
|
1658
|
+
}
|
1570
1659
|
| f_block_arg
|
1571
1660
|
{
|
1572
|
-
line =
|
1573
|
-
result = call_args
|
1661
|
+
(id, line), = val
|
1662
|
+
result = call_args [id]
|
1574
1663
|
result.line line
|
1575
1664
|
}
|
1576
1665
|
|
@@ -1679,13 +1768,13 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1679
1768
|
|
1680
1769
|
bvar: tIDENTIFIER
|
1681
1770
|
{
|
1682
|
-
id, = val
|
1683
|
-
line = lexer.lineno
|
1771
|
+
(id, line), = val
|
1684
1772
|
result = s(:shadow, id.to_sym).line line
|
1685
1773
|
}
|
1686
1774
|
| f_bad_arg
|
1687
1775
|
|
1688
|
-
lambda:
|
1776
|
+
lambda: tLAMBDA
|
1777
|
+
{
|
1689
1778
|
self.env.extend :dynamic
|
1690
1779
|
result = [lexer.lineno, lexer.lpar_beg]
|
1691
1780
|
lexer.paren_nest += 1
|
@@ -1697,14 +1786,14 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1697
1786
|
}
|
1698
1787
|
lambda_body
|
1699
1788
|
{
|
1700
|
-
(line, lpar), args, _cmdarg, body = val
|
1789
|
+
_, (line, lpar), args, _cmdarg, body = val
|
1701
1790
|
lexer.lpar_beg = lpar
|
1702
1791
|
|
1703
1792
|
lexer.cmdarg.pop
|
1704
1793
|
|
1705
1794
|
call = s(:lambda).line line
|
1706
1795
|
result = new_iter call, args, body
|
1707
|
-
result.line
|
1796
|
+
result.line line
|
1708
1797
|
self.env.unextend # TODO: dynapush & dynapop
|
1709
1798
|
}
|
1710
1799
|
|
@@ -1739,23 +1828,28 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1739
1828
|
## if (nd_type($1) == NODE_YIELD) {
|
1740
1829
|
## compile_error(PARSER_ARG "block given to yield");
|
1741
1830
|
|
1742
|
-
|
1743
|
-
val[0].block_pass?
|
1831
|
+
cmd, blk = val
|
1744
1832
|
|
1745
|
-
|
1833
|
+
syntax_error "Both block arg and actual block given." if
|
1834
|
+
cmd.block_pass?
|
1746
1835
|
|
1747
|
-
|
1836
|
+
if inverted? val then
|
1837
|
+
val = invert_block_call val
|
1838
|
+
cmd, blk = val
|
1839
|
+
end
|
1748
1840
|
|
1749
1841
|
result = blk
|
1750
1842
|
result.insert 1, cmd
|
1751
1843
|
}
|
1752
1844
|
| block_call call_op2 operation2 opt_paren_args
|
1753
1845
|
{
|
1754
|
-
|
1846
|
+
lhs, _, (id, _line), args = val
|
1847
|
+
|
1848
|
+
result = new_call lhs, id.to_sym, args
|
1755
1849
|
}
|
1756
1850
|
| block_call call_op2 operation2 opt_paren_args brace_block
|
1757
1851
|
{
|
1758
|
-
iter1, _, name, args, iter2 = val
|
1852
|
+
iter1, _, (name, _line), args, iter2 = val
|
1759
1853
|
|
1760
1854
|
call = new_call iter1, name.to_sym, args
|
1761
1855
|
iter2.insert 1, call
|
@@ -1764,7 +1858,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1764
1858
|
}
|
1765
1859
|
| block_call call_op2 operation2 command_args do_block
|
1766
1860
|
{
|
1767
|
-
iter1, _, name, args, iter2 = val
|
1861
|
+
iter1, _, (name, _line), args, iter2 = val
|
1768
1862
|
|
1769
1863
|
call = new_call iter1, name.to_sym, args
|
1770
1864
|
iter2.insert 1, call
|
@@ -1772,28 +1866,29 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1772
1866
|
result = iter2
|
1773
1867
|
}
|
1774
1868
|
|
1775
|
-
method_call: fcall
|
1776
|
-
{
|
1777
|
-
result = self.lexer.lineno
|
1778
|
-
}
|
1779
|
-
paren_args
|
1869
|
+
method_call: fcall paren_args
|
1780
1870
|
{
|
1781
|
-
call,
|
1871
|
+
call, args = val
|
1782
1872
|
|
1783
1873
|
result = call.concat args.sexp_body if args
|
1784
|
-
result.line lineno
|
1785
1874
|
}
|
1786
1875
|
| primary_value call_op operation2 opt_paren_args
|
1787
1876
|
{
|
1788
|
-
|
1877
|
+
recv, call_op, (op, _line), args = val
|
1878
|
+
|
1879
|
+
result = new_call recv, op.to_sym, args, call_op
|
1789
1880
|
}
|
1790
1881
|
| primary_value tCOLON2 operation2 paren_args
|
1791
1882
|
{
|
1792
|
-
|
1883
|
+
recv, _, (op, _line), args = val
|
1884
|
+
|
1885
|
+
result = new_call recv, op.to_sym, args
|
1793
1886
|
}
|
1794
1887
|
| primary_value tCOLON2 operation3
|
1795
1888
|
{
|
1796
|
-
|
1889
|
+
lhs, _, (id, _line) = val
|
1890
|
+
|
1891
|
+
result = new_call lhs, id.to_sym
|
1797
1892
|
}
|
1798
1893
|
| primary_value call_op paren_args
|
1799
1894
|
{
|
@@ -1826,7 +1921,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1826
1921
|
_, line, body, _ = val
|
1827
1922
|
|
1828
1923
|
result = body
|
1829
|
-
result.line
|
1924
|
+
result.line line
|
1830
1925
|
|
1831
1926
|
self.env.unextend
|
1832
1927
|
}
|
@@ -1840,7 +1935,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1840
1935
|
_, line, body, _ = val
|
1841
1936
|
|
1842
1937
|
result = body
|
1843
|
-
result.line
|
1938
|
+
result.line line
|
1844
1939
|
|
1845
1940
|
self.env.unextend
|
1846
1941
|
}
|
@@ -1869,18 +1964,546 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1869
1964
|
self.env.unextend
|
1870
1965
|
}
|
1871
1966
|
|
1967
|
+
case_args: arg_value
|
1968
|
+
{
|
1969
|
+
arg, = val
|
1970
|
+
|
1971
|
+
result = s(:array, arg).line arg.line
|
1972
|
+
}
|
1973
|
+
| tSTAR arg_value
|
1974
|
+
{
|
1975
|
+
_, arg = val
|
1976
|
+
|
1977
|
+
result = s(:array, s(:splat, arg).line(arg.line)).line arg.line
|
1978
|
+
}
|
1979
|
+
| case_args tCOMMA arg_value
|
1980
|
+
{
|
1981
|
+
args, _, id = val
|
1982
|
+
|
1983
|
+
result = self.list_append args, id
|
1984
|
+
}
|
1985
|
+
| case_args tCOMMA tSTAR arg_value
|
1986
|
+
{
|
1987
|
+
args, _, _, id = val
|
1988
|
+
|
1989
|
+
result = self.list_append args, s(:splat, id).line(id.line)
|
1990
|
+
}
|
1991
|
+
|
1872
1992
|
case_body: k_when
|
1873
1993
|
{
|
1874
1994
|
result = self.lexer.lineno
|
1875
1995
|
}
|
1876
|
-
|
1996
|
+
case_args then compstmt cases
|
1877
1997
|
{
|
1878
1998
|
result = new_when(val[2], val[4])
|
1879
|
-
result.line
|
1999
|
+
result.line val[1]
|
1880
2000
|
result << val[5] if val[5]
|
1881
2001
|
}
|
1882
2002
|
|
1883
2003
|
cases: opt_else | case_body
|
2004
|
+
######################################################################
|
2005
|
+
|
2006
|
+
p_case_body: kIN
|
2007
|
+
{
|
2008
|
+
self.lexer.lex_state = EXPR_BEG|EXPR_LABEL
|
2009
|
+
self.lexer.command_start = false
|
2010
|
+
result = self.in_kwarg
|
2011
|
+
self.in_kwarg = true
|
2012
|
+
push_pvtbl
|
2013
|
+
push_pktbl
|
2014
|
+
}
|
2015
|
+
p_top_expr then
|
2016
|
+
{
|
2017
|
+
pop_pktbl
|
2018
|
+
pop_pvtbl
|
2019
|
+
old_kwargs = _values[-3]
|
2020
|
+
self.in_kwarg = old_kwargs
|
2021
|
+
}
|
2022
|
+
compstmt
|
2023
|
+
p_cases
|
2024
|
+
{
|
2025
|
+
(_, line), _, pat, _, _, body, cases = val
|
2026
|
+
|
2027
|
+
result = new_in pat, body, cases, line
|
2028
|
+
}
|
2029
|
+
|
2030
|
+
p_cases: opt_else
|
2031
|
+
| p_case_body
|
2032
|
+
|
2033
|
+
p_top_expr: p_top_expr_body
|
2034
|
+
| p_top_expr_body kIF_MOD expr_value
|
2035
|
+
{
|
2036
|
+
body, _, cond = val
|
2037
|
+
body = remove_begin body
|
2038
|
+
|
2039
|
+
result = s(:if, cond, body, nil).line body.line
|
2040
|
+
}
|
2041
|
+
| p_top_expr_body kUNLESS_MOD expr_value
|
2042
|
+
{
|
2043
|
+
body, _, cond = val
|
2044
|
+
body = remove_begin body
|
2045
|
+
|
2046
|
+
result = s(:if, cond, nil, body).line body.line
|
2047
|
+
}
|
2048
|
+
|
2049
|
+
p_top_expr_body: p_expr
|
2050
|
+
| p_expr tCOMMA
|
2051
|
+
{
|
2052
|
+
expr, _ = val
|
2053
|
+
|
2054
|
+
tail = new_array_pattern_tail nil, true, nil, nil
|
2055
|
+
result = new_array_pattern nil, expr, tail, expr.line
|
2056
|
+
}
|
2057
|
+
| p_expr tCOMMA p_args
|
2058
|
+
{
|
2059
|
+
expr, _, args = val
|
2060
|
+
|
2061
|
+
result = new_array_pattern nil, expr, args, expr.line
|
2062
|
+
}
|
2063
|
+
| p_args_tail
|
2064
|
+
{
|
2065
|
+
args, = val
|
2066
|
+
result = new_array_pattern nil, nil, args, args.line
|
2067
|
+
}
|
2068
|
+
| p_kwargs
|
2069
|
+
{
|
2070
|
+
kwargs, = val
|
2071
|
+
result = new_hash_pattern nil, kwargs, kwargs.line
|
2072
|
+
}
|
2073
|
+
|
2074
|
+
p_expr: p_as
|
2075
|
+
|
2076
|
+
p_as: p_expr tASSOC p_variable
|
2077
|
+
{
|
2078
|
+
# NODE *n = NEW_LIST($1, &@$);
|
2079
|
+
# n = list_append(p, n, $3);
|
2080
|
+
# $$ = new_hash(p, n, &@$);
|
2081
|
+
|
2082
|
+
expr, _, var = val
|
2083
|
+
|
2084
|
+
id = var.last
|
2085
|
+
|
2086
|
+
self.env[id] = :lvar # HACK: need to extend env
|
2087
|
+
lhs = s(:lasgn, id).line var.line
|
2088
|
+
|
2089
|
+
result = new_assign lhs, expr
|
2090
|
+
}
|
2091
|
+
| p_alt
|
2092
|
+
|
2093
|
+
p_alt: p_alt tPIPE p_expr_basic
|
2094
|
+
{
|
2095
|
+
lhs, _, rhs = val
|
2096
|
+
|
2097
|
+
result = s(:or, lhs, rhs).line lhs.line
|
2098
|
+
}
|
2099
|
+
| p_expr_basic
|
2100
|
+
|
2101
|
+
p_lparen: tLPAREN2 { push_pktbl }
|
2102
|
+
p_lbracket: tLBRACK2 { push_pktbl }
|
2103
|
+
|
2104
|
+
p_expr_basic: p_value
|
2105
|
+
| p_const p_lparen p_args tRPAREN
|
2106
|
+
{
|
2107
|
+
lhs, _, args, _ = val
|
2108
|
+
|
2109
|
+
pop_pktbl
|
2110
|
+
result = new_array_pattern(lhs, nil, args, lhs.line)
|
2111
|
+
}
|
2112
|
+
| p_const p_lparen p_kwargs tRPAREN
|
2113
|
+
{
|
2114
|
+
lhs, _, kwargs, _ = val
|
2115
|
+
|
2116
|
+
pop_pktbl
|
2117
|
+
result = new_hash_pattern(lhs, kwargs, lhs.line)
|
2118
|
+
}
|
2119
|
+
| p_const tLPAREN2 tRPAREN
|
2120
|
+
{
|
2121
|
+
const, _, _ = val
|
2122
|
+
|
2123
|
+
tail = new_array_pattern_tail nil, nil, nil, nil
|
2124
|
+
result = new_array_pattern const, nil, tail, const.line
|
2125
|
+
}
|
2126
|
+
| p_const p_lbracket p_args rbracket
|
2127
|
+
{
|
2128
|
+
const, _, pre_arg, _ = val
|
2129
|
+
|
2130
|
+
pop_pktbl
|
2131
|
+
result = new_array_pattern const, nil, pre_arg, const.line
|
2132
|
+
}
|
2133
|
+
| p_const p_lbracket p_kwargs rbracket
|
2134
|
+
{
|
2135
|
+
const, _, kwargs, _ = val
|
2136
|
+
|
2137
|
+
result = new_hash_pattern const, kwargs, const.line
|
2138
|
+
}
|
2139
|
+
| p_const tLBRACK2 rbracket
|
2140
|
+
{
|
2141
|
+
const, _, _ = val
|
2142
|
+
|
2143
|
+
tail = new_array_pattern_tail nil, nil, nil, nil
|
2144
|
+
result = new_array_pattern const, nil, tail, const.line
|
2145
|
+
}
|
2146
|
+
| tLBRACK { push_pktbl } p_args rbracket
|
2147
|
+
{
|
2148
|
+
_, _, pat, _ = val
|
2149
|
+
|
2150
|
+
pop_pktbl
|
2151
|
+
result = new_array_pattern nil, nil, pat, pat.line
|
2152
|
+
}
|
2153
|
+
| tLBRACK rbracket
|
2154
|
+
{
|
2155
|
+
(_, line), _ = val
|
2156
|
+
|
2157
|
+
result = s(:array_pat).line line
|
2158
|
+
}
|
2159
|
+
| tLBRACE
|
2160
|
+
{
|
2161
|
+
push_pktbl
|
2162
|
+
result = self.in_kwarg
|
2163
|
+
self.in_kwarg = false
|
2164
|
+
}
|
2165
|
+
p_kwargs rbrace
|
2166
|
+
{
|
2167
|
+
_, in_kwarg, kwargs, _ = val
|
2168
|
+
|
2169
|
+
pop_pktbl
|
2170
|
+
self.in_kwarg = in_kwarg
|
2171
|
+
|
2172
|
+
result = new_hash_pattern(nil, kwargs, kwargs.line)
|
2173
|
+
}
|
2174
|
+
| tLBRACE rbrace
|
2175
|
+
{
|
2176
|
+
(_, line), _ = val
|
2177
|
+
|
2178
|
+
tail = new_hash_pattern_tail nil, nil, line
|
2179
|
+
result = new_hash_pattern nil, tail, line
|
2180
|
+
}
|
2181
|
+
| tLPAREN { push_pktbl } p_expr tRPAREN
|
2182
|
+
{
|
2183
|
+
_, _, expr, _ = val
|
2184
|
+
|
2185
|
+
pop_pktbl
|
2186
|
+
result = expr
|
2187
|
+
}
|
2188
|
+
|
2189
|
+
p_args: p_expr
|
2190
|
+
{
|
2191
|
+
expr, = val
|
2192
|
+
|
2193
|
+
ary = s(:array_TAIL, expr).line expr.line
|
2194
|
+
result = new_array_pattern_tail(ary, nil, nil, nil).line expr.line
|
2195
|
+
}
|
2196
|
+
| p_args_head
|
2197
|
+
{
|
2198
|
+
head, = val
|
2199
|
+
|
2200
|
+
result = new_array_pattern_tail head, true, nil, nil
|
2201
|
+
}
|
2202
|
+
| p_args_head p_arg
|
2203
|
+
{
|
2204
|
+
head, tail = val
|
2205
|
+
|
2206
|
+
both = array_pat_concat head, tail
|
2207
|
+
|
2208
|
+
result = new_array_pattern_tail both, nil, nil, nil
|
2209
|
+
result.line head.line
|
2210
|
+
}
|
2211
|
+
| p_args_head tSTAR tIDENTIFIER
|
2212
|
+
{
|
2213
|
+
head, _, (id, _line) = val
|
2214
|
+
|
2215
|
+
result = new_array_pattern_tail head, true, id.to_sym, nil
|
2216
|
+
result.line head.line
|
2217
|
+
}
|
2218
|
+
| p_args_head tSTAR tIDENTIFIER tCOMMA p_args_post
|
2219
|
+
{
|
2220
|
+
head, _, (id, _line), _, post = val
|
2221
|
+
|
2222
|
+
result = new_array_pattern_tail head, true, id.to_sym, post
|
2223
|
+
result.line head.line
|
2224
|
+
}
|
2225
|
+
| p_args_head tSTAR
|
2226
|
+
{
|
2227
|
+
expr, _ = val
|
2228
|
+
|
2229
|
+
result = new_array_pattern_tail(expr, true, nil, nil).line expr.line
|
2230
|
+
}
|
2231
|
+
| p_args_head tSTAR tCOMMA p_args_post
|
2232
|
+
{
|
2233
|
+
head, _, _, post = val
|
2234
|
+
|
2235
|
+
result = new_array_pattern_tail(head, true, nil, post).line head.line
|
2236
|
+
}
|
2237
|
+
| p_args_tail
|
2238
|
+
|
2239
|
+
p_args_head: p_arg tCOMMA
|
2240
|
+
{
|
2241
|
+
arg, _ = val
|
2242
|
+
result = arg
|
2243
|
+
}
|
2244
|
+
| p_args_head p_arg tCOMMA
|
2245
|
+
{
|
2246
|
+
head, tail, _ = val
|
2247
|
+
|
2248
|
+
result = s(:PATTERN, *head.sexp_body, *tail.sexp_body)
|
2249
|
+
result.line head.line
|
2250
|
+
}
|
2251
|
+
|
2252
|
+
p_args_tail: tSTAR tIDENTIFIER
|
2253
|
+
{
|
2254
|
+
_, (id, line) = val
|
2255
|
+
|
2256
|
+
result = new_array_pattern_tail nil, true, id.to_sym, nil
|
2257
|
+
result.line line
|
2258
|
+
}
|
2259
|
+
| tSTAR tIDENTIFIER tCOMMA p_args_post
|
2260
|
+
{
|
2261
|
+
_, (id, line), _, rhs = val
|
2262
|
+
|
2263
|
+
result = new_array_pattern_tail nil, true, id.to_sym, rhs
|
2264
|
+
result.line line
|
2265
|
+
}
|
2266
|
+
| tSTAR
|
2267
|
+
{
|
2268
|
+
(_, line), = val
|
2269
|
+
|
2270
|
+
result = new_array_pattern_tail nil, true, nil, nil
|
2271
|
+
result.line line
|
2272
|
+
}
|
2273
|
+
| tSTAR tCOMMA p_args_post
|
2274
|
+
{
|
2275
|
+
(_, line), _, args = val
|
2276
|
+
|
2277
|
+
result = new_array_pattern_tail nil, true, nil, args
|
2278
|
+
result.line line
|
2279
|
+
}
|
2280
|
+
|
2281
|
+
p_args_post: p_arg
|
2282
|
+
| p_args_post tCOMMA p_arg
|
2283
|
+
{
|
2284
|
+
lhs, _, rhs = val
|
2285
|
+
|
2286
|
+
result = array_pat_concat lhs, rhs
|
2287
|
+
}
|
2288
|
+
|
2289
|
+
p_arg: p_expr
|
2290
|
+
{
|
2291
|
+
expr, = val
|
2292
|
+
expr = s(:array_TAIL, expr).line expr.line unless
|
2293
|
+
expr.sexp_type == :array_TAIL
|
2294
|
+
result = expr
|
2295
|
+
}
|
2296
|
+
|
2297
|
+
p_kwargs: p_kwarg tCOMMA p_kwrest
|
2298
|
+
{
|
2299
|
+
kw_arg, _, rest = val
|
2300
|
+
# TODO? new_unique_key_hash(p, $1, &@$)
|
2301
|
+
result = new_hash_pattern_tail kw_arg, rest, kw_arg.line
|
2302
|
+
}
|
2303
|
+
| p_kwarg
|
2304
|
+
{
|
2305
|
+
kwarg, = val
|
2306
|
+
# TODO? new_unique_key_hash(p, $1, &@$)
|
2307
|
+
result = new_hash_pattern_tail kwarg, nil, kwarg.line
|
2308
|
+
}
|
2309
|
+
| p_kwarg tCOMMA
|
2310
|
+
{
|
2311
|
+
kwarg, _ = val
|
2312
|
+
# TODO? new_unique_key_hash(p, $1, &@$)
|
2313
|
+
result = new_hash_pattern_tail kwarg, nil, kwarg.line
|
2314
|
+
}
|
2315
|
+
| p_kwrest
|
2316
|
+
{
|
2317
|
+
rest, = val
|
2318
|
+
|
2319
|
+
result = new_hash_pattern_tail nil, rest, rest.line
|
2320
|
+
}
|
2321
|
+
| p_kwarg tCOMMA p_kwnorest
|
2322
|
+
{
|
2323
|
+
kwarg, _, norest = val
|
2324
|
+
|
2325
|
+
# TODO? new_unique_key_hash(p, $1, &@$)
|
2326
|
+
result = new_hash_pattern_tail kwarg, norest, kwarg.line
|
2327
|
+
}
|
2328
|
+
| p_kwnorest
|
2329
|
+
{
|
2330
|
+
norest, = val
|
2331
|
+
|
2332
|
+
result = new_hash_pattern_tail nil, norest, norest.line
|
2333
|
+
}
|
2334
|
+
|
2335
|
+
p_kwarg: p_kw # TODO? rb_ary_new_from_args(1, $1)
|
2336
|
+
| p_kwarg tCOMMA p_kw
|
2337
|
+
{
|
2338
|
+
kwarg, _, kw = val
|
2339
|
+
kwarg.concat kw.sexp_body
|
2340
|
+
result = kwarg
|
2341
|
+
}
|
2342
|
+
|
2343
|
+
p_kw: p_kw_label p_expr
|
2344
|
+
{
|
2345
|
+
# TODO: error_duplicate_pattern_key(p, get_id($1), &@1);
|
2346
|
+
lhs, rhs = val
|
2347
|
+
|
2348
|
+
result = s(:PAIR, lhs, rhs).line lhs.line
|
2349
|
+
}
|
2350
|
+
| p_kw_label
|
2351
|
+
{
|
2352
|
+
lhs, = val
|
2353
|
+
|
2354
|
+
# TODO: error_duplicate_pattern_variable(p, get_id($1), &@1);
|
2355
|
+
|
2356
|
+
# TODO: if ($1 && !is_local_id(get_id($1))) {
|
2357
|
+
# yyerror1(&@1, "key must be valid as local variables");
|
2358
|
+
# }
|
2359
|
+
|
2360
|
+
# $$ = list_append(p, NEW_LIST(NEW_LIT(ID2SYM($1), &@$), &@$),
|
2361
|
+
# assignable(p, $1, 0, &@$));
|
2362
|
+
|
2363
|
+
|
2364
|
+
case lhs.sexp_type
|
2365
|
+
when :lit then
|
2366
|
+
assignable [lhs.value, lhs.line]
|
2367
|
+
else
|
2368
|
+
# TODO or done?
|
2369
|
+
debug 666
|
2370
|
+
end
|
2371
|
+
|
2372
|
+
# TODO PAIR -> LIST ?
|
2373
|
+
result = s(:PAIR, lhs, nil).line lhs.line
|
2374
|
+
}
|
2375
|
+
|
2376
|
+
p_kw_label: tLABEL
|
2377
|
+
{
|
2378
|
+
(id, line), = val
|
2379
|
+
|
2380
|
+
result = s(:lit, id.to_sym).line line
|
2381
|
+
}
|
2382
|
+
|
2383
|
+
p_kwrest: kwrest_mark tIDENTIFIER
|
2384
|
+
{
|
2385
|
+
_, (id, line) = val
|
2386
|
+
|
2387
|
+
name = id.to_sym
|
2388
|
+
self.assignable [name, line]
|
2389
|
+
result = s(:kwrest, :"**#{name}").line line
|
2390
|
+
}
|
2391
|
+
| kwrest_mark
|
2392
|
+
{
|
2393
|
+
(_, line), = val
|
2394
|
+
|
2395
|
+
result = s(:kwrest, :"**").line line
|
2396
|
+
}
|
2397
|
+
|
2398
|
+
p_kwnorest: kwrest_mark kNIL
|
2399
|
+
{
|
2400
|
+
(_, line), _ = val
|
2401
|
+
|
2402
|
+
# TODO: or s(:norest)? s(:**nil)?
|
2403
|
+
result = s(:kwrest, :"**nil").line line
|
2404
|
+
}
|
2405
|
+
|
2406
|
+
p_value: p_primitive
|
2407
|
+
| p_primitive tDOT2 p_primitive
|
2408
|
+
{
|
2409
|
+
lhs, _, rhs = val
|
2410
|
+
|
2411
|
+
lhs = value_expr lhs
|
2412
|
+
rhs = value_expr rhs
|
2413
|
+
|
2414
|
+
result = s(:dot2, lhs, rhs).line lhs.line
|
2415
|
+
}
|
2416
|
+
| p_primitive tDOT3 p_primitive
|
2417
|
+
{
|
2418
|
+
lhs, _, rhs = val
|
2419
|
+
|
2420
|
+
lhs = value_expr lhs
|
2421
|
+
rhs = value_expr rhs
|
2422
|
+
|
2423
|
+
result = s(:dot3, lhs, rhs).line lhs.line
|
2424
|
+
}
|
2425
|
+
| p_primitive tDOT2
|
2426
|
+
{
|
2427
|
+
v1, _ = val
|
2428
|
+
|
2429
|
+
result = s(:dot2, v1, nil).line v1.line
|
2430
|
+
}
|
2431
|
+
| p_primitive tDOT3
|
2432
|
+
{
|
2433
|
+
v1, _ = val
|
2434
|
+
|
2435
|
+
result = s(:dot3, v1, nil).line v1.line
|
2436
|
+
}
|
2437
|
+
| p_variable
|
2438
|
+
| p_var_ref
|
2439
|
+
| p_const
|
2440
|
+
| tBDOT2 p_primitive
|
2441
|
+
{
|
2442
|
+
_, v1 = val
|
2443
|
+
|
2444
|
+
result = s(:dot2, nil, v1).line v1.line
|
2445
|
+
}
|
2446
|
+
| tBDOT3 p_primitive
|
2447
|
+
{
|
2448
|
+
_, v1 = val
|
2449
|
+
|
2450
|
+
result = s(:dot3, nil, v1).line v1.line
|
2451
|
+
}
|
2452
|
+
|
2453
|
+
p_primitive: literal
|
2454
|
+
| strings
|
2455
|
+
| xstring
|
2456
|
+
| regexp
|
2457
|
+
| words
|
2458
|
+
| qwords
|
2459
|
+
| symbols
|
2460
|
+
| qsymbols
|
2461
|
+
| keyword_variable
|
2462
|
+
{
|
2463
|
+
# TODO? if (!($$ = gettable(p, $1, &@$))) $$ = NEW_BEGIN(0, &@$);
|
2464
|
+
var, = val
|
2465
|
+
|
2466
|
+
result = var
|
2467
|
+
}
|
2468
|
+
| lambda
|
2469
|
+
|
2470
|
+
p_variable: tIDENTIFIER
|
2471
|
+
{
|
2472
|
+
(id, line), = val
|
2473
|
+
|
2474
|
+
# TODO: error_duplicate_pattern_variable(p, $1, &@1);
|
2475
|
+
# TODO: assignable(p, $1, 0, &@$);
|
2476
|
+
result = s(:lvar, id.to_sym).line line
|
2477
|
+
}
|
2478
|
+
|
2479
|
+
p_var_ref: tCARET tIDENTIFIER
|
2480
|
+
{
|
2481
|
+
_, (id, line) = val
|
2482
|
+
|
2483
|
+
# TODO: check id against env for lvar or dvar
|
2484
|
+
|
2485
|
+
result = s(:lvar, id.to_sym).line line
|
2486
|
+
}
|
2487
|
+
|
2488
|
+
p_const: tCOLON3 cname
|
2489
|
+
{
|
2490
|
+
_, (id, line) = val
|
2491
|
+
result = s(:colon3, id.to_sym).line line
|
2492
|
+
}
|
2493
|
+
| p_const tCOLON2 cname
|
2494
|
+
{
|
2495
|
+
lhs, _, (id, _line) = val
|
2496
|
+
|
2497
|
+
l = lhs.line
|
2498
|
+
result = s(:const, s(:colon2, lhs, id.to_sym).line(l)).line l
|
2499
|
+
}
|
2500
|
+
| tCONSTANT
|
2501
|
+
{
|
2502
|
+
# TODO $$ = gettable(p, $1, &@$);
|
2503
|
+
(id, line), = val
|
2504
|
+
result = s(:const, id.to_sym).line line
|
2505
|
+
}
|
2506
|
+
######################################################################
|
1884
2507
|
|
1885
2508
|
opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue
|
1886
2509
|
{
|
@@ -1922,17 +2545,10 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1922
2545
|
|
1923
2546
|
literal: numeric
|
1924
2547
|
{
|
1925
|
-
line =
|
1926
|
-
result = s(:lit,
|
1927
|
-
result.line = line
|
2548
|
+
(lit, line), = val
|
2549
|
+
result = s(:lit, lit).line line
|
1928
2550
|
}
|
1929
2551
|
| symbol
|
1930
|
-
{
|
1931
|
-
line = lexer.lineno
|
1932
|
-
result = s(:lit, val[0])
|
1933
|
-
result.line = line
|
1934
|
-
}
|
1935
|
-
| dsym
|
1936
2552
|
|
1937
2553
|
strings: string
|
1938
2554
|
{
|
@@ -1943,7 +2559,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1943
2559
|
|
1944
2560
|
string: tCHAR
|
1945
2561
|
{
|
1946
|
-
|
2562
|
+
debug 37
|
1947
2563
|
}
|
1948
2564
|
| string1
|
1949
2565
|
| string string1
|
@@ -1953,11 +2569,11 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1953
2569
|
|
1954
2570
|
string1: tSTRING_BEG string_contents tSTRING_END
|
1955
2571
|
{
|
1956
|
-
_, str, (_, func) = val
|
2572
|
+
(_, line), str, (_, func) = val
|
1957
2573
|
|
1958
|
-
str = dedent str if func =~ RubyLexer::
|
2574
|
+
str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT
|
1959
2575
|
|
1960
|
-
result = str
|
2576
|
+
result = str.line line
|
1961
2577
|
}
|
1962
2578
|
| tSTRING
|
1963
2579
|
{
|
@@ -1977,11 +2593,15 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1977
2593
|
|
1978
2594
|
words: tWORDS_BEG tSPACE tSTRING_END
|
1979
2595
|
{
|
1980
|
-
|
2596
|
+
(_, line), _, _ = val
|
2597
|
+
|
2598
|
+
result = s(:array).line line
|
1981
2599
|
}
|
1982
2600
|
| tWORDS_BEG word_list tSTRING_END
|
1983
2601
|
{
|
1984
|
-
|
2602
|
+
(_, line), list, _ = val
|
2603
|
+
|
2604
|
+
result = list.line line
|
1985
2605
|
}
|
1986
2606
|
|
1987
2607
|
word_list: none
|
@@ -2001,18 +2621,20 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
2001
2621
|
|
2002
2622
|
symbols: tSYMBOLS_BEG tSPACE tSTRING_END
|
2003
2623
|
{
|
2004
|
-
|
2624
|
+
(_, line), _, _ = val
|
2625
|
+
|
2626
|
+
result = s(:array).line line
|
2005
2627
|
}
|
2006
|
-
| tSYMBOLS_BEG
|
2628
|
+
| tSYMBOLS_BEG symbol_list tSTRING_END
|
2007
2629
|
{
|
2008
|
-
_, line, list, _, = val
|
2009
|
-
list.line
|
2630
|
+
(_, line), list, _, = val
|
2631
|
+
list.line line
|
2010
2632
|
result = list
|
2011
2633
|
}
|
2012
2634
|
|
2013
2635
|
symbol_list: none
|
2014
2636
|
{
|
2015
|
-
result = new_symbol_list
|
2637
|
+
result = new_symbol_list
|
2016
2638
|
}
|
2017
2639
|
| symbol_list word tSPACE
|
2018
2640
|
{
|
@@ -2022,20 +2644,28 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
2022
2644
|
|
2023
2645
|
qwords: tQWORDS_BEG tSPACE tSTRING_END
|
2024
2646
|
{
|
2025
|
-
|
2647
|
+
(_, line), _, _ = val
|
2648
|
+
|
2649
|
+
result = s(:array).line line
|
2026
2650
|
}
|
2027
2651
|
| tQWORDS_BEG qword_list tSTRING_END
|
2028
2652
|
{
|
2029
|
-
|
2653
|
+
(_, line), list, _ = val
|
2654
|
+
|
2655
|
+
result = list.line line
|
2030
2656
|
}
|
2031
2657
|
|
2032
2658
|
qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END
|
2033
2659
|
{
|
2034
|
-
|
2660
|
+
(_, line), _, _ = val
|
2661
|
+
|
2662
|
+
result = s(:array).line line
|
2035
2663
|
}
|
2036
2664
|
| tQSYMBOLS_BEG qsym_list tSTRING_END
|
2037
2665
|
{
|
2038
|
-
|
2666
|
+
(_, line), list, _ = val
|
2667
|
+
|
2668
|
+
result = list.line line
|
2039
2669
|
}
|
2040
2670
|
|
2041
2671
|
qword_list: none
|
@@ -2058,7 +2688,8 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
2058
2688
|
|
2059
2689
|
string_contents: none
|
2060
2690
|
{
|
2061
|
-
|
2691
|
+
line = prev_value_to_lineno _values.last
|
2692
|
+
result = s(:str, +"").line line
|
2062
2693
|
}
|
2063
2694
|
| string_contents string_content
|
2064
2695
|
{
|
@@ -2133,8 +2764,8 @@ regexp_contents: none
|
|
2133
2764
|
lexer.brace_nest = brace_nest
|
2134
2765
|
lexer.string_nest = string_nest
|
2135
2766
|
|
2136
|
-
lexer.cmdarg.pop
|
2137
2767
|
lexer.cond.pop
|
2768
|
+
lexer.cmdarg.pop
|
2138
2769
|
|
2139
2770
|
lexer.lex_state = oldlex_state
|
2140
2771
|
|
@@ -2149,29 +2780,49 @@ regexp_contents: none
|
|
2149
2780
|
when nil then
|
2150
2781
|
result = s(:evstr).line line
|
2151
2782
|
else
|
2152
|
-
|
2783
|
+
debug 38
|
2153
2784
|
raise "unknown string body: #{stmt.inspect}"
|
2154
2785
|
end
|
2155
2786
|
}
|
2156
2787
|
|
2157
|
-
string_dvar: tGVAR
|
2158
|
-
|
2159
|
-
|
2788
|
+
string_dvar: tGVAR
|
2789
|
+
{
|
2790
|
+
(id, line), = val
|
2791
|
+
result = s(:gvar, id.to_sym).line line
|
2792
|
+
}
|
2793
|
+
| tIVAR
|
2794
|
+
{
|
2795
|
+
(id, line), = val
|
2796
|
+
result = s(:ivar, id.to_sym).line line
|
2797
|
+
}
|
2798
|
+
| tCVAR
|
2799
|
+
{
|
2800
|
+
(id, line), = val
|
2801
|
+
result = s(:cvar, id.to_sym).line line
|
2802
|
+
}
|
2160
2803
|
| backref
|
2161
2804
|
|
2162
|
-
symbol:
|
2805
|
+
symbol: ssym
|
2806
|
+
| dsym
|
2807
|
+
|
2808
|
+
ssym: tSYMBEG sym
|
2163
2809
|
{
|
2810
|
+
_, (id, line) = val
|
2811
|
+
|
2164
2812
|
lexer.lex_state = EXPR_END
|
2165
|
-
result =
|
2813
|
+
result = s(:lit, id.to_sym).line line
|
2166
2814
|
}
|
2167
2815
|
| tSYMBOL
|
2168
2816
|
{
|
2169
|
-
|
2817
|
+
(id, line), = val
|
2818
|
+
|
2819
|
+
lexer.lex_state = EXPR_END
|
2820
|
+
result = s(:lit, id.to_sym).line line
|
2170
2821
|
}
|
2171
2822
|
|
2172
2823
|
sym: fname | tIVAR | tGVAR | tCVAR
|
2173
2824
|
|
2174
|
-
dsym: tSYMBEG
|
2825
|
+
dsym: tSYMBEG string_contents tSTRING_END
|
2175
2826
|
{
|
2176
2827
|
_, result, _ = val
|
2177
2828
|
|
@@ -2187,14 +2838,15 @@ regexp_contents: none
|
|
2187
2838
|
when :evstr then
|
2188
2839
|
result = s(:dsym, "", result).line result.line
|
2189
2840
|
else
|
2190
|
-
|
2841
|
+
debug 39
|
2191
2842
|
end
|
2192
2843
|
}
|
2193
2844
|
|
2194
2845
|
numeric: simple_numeric
|
2195
|
-
| tUMINUS_NUM simple_numeric
|
2846
|
+
| tUMINUS_NUM simple_numeric =tLOWEST
|
2196
2847
|
{
|
2197
|
-
|
2848
|
+
_, (num, line) = val
|
2849
|
+
result = [-num, line]
|
2198
2850
|
}
|
2199
2851
|
|
2200
2852
|
simple_numeric: tINTEGER
|
@@ -2227,8 +2879,10 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2227
2879
|
|
2228
2880
|
var_ref: user_variable
|
2229
2881
|
{
|
2230
|
-
|
2882
|
+
raise "NO: #{val.inspect}" if Sexp === val.first
|
2883
|
+
(var, line), = val
|
2231
2884
|
result = Sexp === var ? var : self.gettable(var)
|
2885
|
+
result.line line
|
2232
2886
|
}
|
2233
2887
|
| keyword_variable
|
2234
2888
|
{
|
@@ -2243,11 +2897,19 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2243
2897
|
| keyword_variable
|
2244
2898
|
{
|
2245
2899
|
result = self.assignable val[0]
|
2246
|
-
|
2900
|
+
debug 40
|
2247
2901
|
}
|
2248
2902
|
|
2249
|
-
backref: tNTH_REF
|
2250
|
-
|
2903
|
+
backref: tNTH_REF
|
2904
|
+
{
|
2905
|
+
(ref, line), = val
|
2906
|
+
result = s(:nth_ref, ref).line line
|
2907
|
+
}
|
2908
|
+
| tBACK_REF
|
2909
|
+
{
|
2910
|
+
(ref, line), = val
|
2911
|
+
result = s(:back_ref, ref).line line
|
2912
|
+
}
|
2251
2913
|
|
2252
2914
|
superclass: tLT
|
2253
2915
|
{
|
@@ -2265,9 +2927,15 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2265
2927
|
|
2266
2928
|
f_arglist: tLPAREN2 f_args rparen
|
2267
2929
|
{
|
2268
|
-
result = val
|
2269
|
-
|
2270
|
-
|
2930
|
+
result = end_args val
|
2931
|
+
}
|
2932
|
+
| tLPAREN2 f_arg tCOMMA args_forward rparen
|
2933
|
+
{
|
2934
|
+
result = end_args val
|
2935
|
+
}
|
2936
|
+
| tLPAREN2 args_forward rparen
|
2937
|
+
{
|
2938
|
+
result = end_args val
|
2271
2939
|
}
|
2272
2940
|
| {
|
2273
2941
|
result = self.in_kwarg
|
@@ -2276,12 +2944,7 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2276
2944
|
}
|
2277
2945
|
f_args term
|
2278
2946
|
{
|
2279
|
-
|
2280
|
-
|
2281
|
-
self.in_kwarg = kwarg
|
2282
|
-
result = args
|
2283
|
-
lexer.lex_state = EXPR_BEG
|
2284
|
-
lexer.command_start = true
|
2947
|
+
result = end_args val
|
2285
2948
|
}
|
2286
2949
|
|
2287
2950
|
args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg
|
@@ -2296,6 +2959,10 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2296
2959
|
{
|
2297
2960
|
result = args val
|
2298
2961
|
}
|
2962
|
+
| f_no_kwarg opt_f_block_arg
|
2963
|
+
{
|
2964
|
+
result = args val
|
2965
|
+
}
|
2299
2966
|
| f_block_arg
|
2300
2967
|
|
2301
2968
|
opt_args_tail: tCOMMA args_tail
|
@@ -2366,6 +3033,12 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2366
3033
|
|
|
2367
3034
|
{
|
2368
3035
|
result = args val
|
3036
|
+
# result.line lexer.lineno
|
3037
|
+
}
|
3038
|
+
|
3039
|
+
args_forward: tBDOT3
|
3040
|
+
{
|
3041
|
+
result = s(:forward_args).line lexer.lineno
|
2369
3042
|
}
|
2370
3043
|
|
2371
3044
|
f_bad_arg: tCONSTANT
|
@@ -2388,10 +3061,11 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2388
3061
|
f_norm_arg: f_bad_arg
|
2389
3062
|
| tIDENTIFIER
|
2390
3063
|
{
|
2391
|
-
|
3064
|
+
(id, line), = val
|
3065
|
+
identifier = id.to_sym
|
2392
3066
|
self.env[identifier] = :lvar
|
2393
3067
|
|
2394
|
-
result = identifier
|
3068
|
+
result = [identifier, line]
|
2395
3069
|
}
|
2396
3070
|
|
2397
3071
|
f_arg_asgn: f_norm_arg
|
@@ -2399,22 +3073,14 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2399
3073
|
f_arg_item: f_arg_asgn
|
2400
3074
|
| tLPAREN f_margs rparen
|
2401
3075
|
{
|
2402
|
-
|
3076
|
+
_, margs, _ = val
|
3077
|
+
|
3078
|
+
result = margs
|
2403
3079
|
}
|
2404
3080
|
|
2405
3081
|
f_arg: f_arg_item
|
2406
3082
|
{
|
2407
|
-
|
2408
|
-
|
2409
|
-
case arg
|
2410
|
-
when Symbol then
|
2411
|
-
result = s(:args, arg).line lexer.lineno
|
2412
|
-
when Sexp then
|
2413
|
-
result = arg
|
2414
|
-
else
|
2415
|
-
debug20 32
|
2416
|
-
raise "Unknown f_arg type: #{val.inspect}"
|
2417
|
-
end
|
3083
|
+
result = new_arg val
|
2418
3084
|
}
|
2419
3085
|
| f_arg tCOMMA f_arg_item
|
2420
3086
|
{
|
@@ -2426,7 +3092,7 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2426
3092
|
result = s(:args, list).line list.line
|
2427
3093
|
end
|
2428
3094
|
|
2429
|
-
result << item
|
3095
|
+
result << (Sexp === item ? item : item.first)
|
2430
3096
|
}
|
2431
3097
|
|
2432
3098
|
f_label: tLABEL
|
@@ -2487,26 +3153,37 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2487
3153
|
kwrest_mark: tPOW
|
2488
3154
|
| tDSTAR
|
2489
3155
|
|
3156
|
+
f_no_kwarg: kwrest_mark kNIL
|
3157
|
+
{
|
3158
|
+
result = :"**nil"
|
3159
|
+
}
|
3160
|
+
|
2490
3161
|
f_kwrest: kwrest_mark tIDENTIFIER
|
2491
3162
|
{
|
2492
|
-
|
2493
|
-
|
2494
|
-
|
3163
|
+
_, (id, line) = val
|
3164
|
+
|
3165
|
+
name = id.to_sym
|
3166
|
+
self.assignable [name, line]
|
3167
|
+
result = [:"**#{name}", line]
|
2495
3168
|
}
|
2496
3169
|
| kwrest_mark
|
2497
3170
|
{
|
2498
|
-
|
3171
|
+
id = :"**"
|
3172
|
+
self.env[id] = :lvar # TODO: needed?!?
|
3173
|
+
result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno
|
2499
3174
|
}
|
2500
3175
|
|
2501
3176
|
f_opt: f_arg_asgn tEQL arg_value
|
2502
3177
|
{
|
2503
|
-
|
3178
|
+
lhs, _, rhs = val
|
3179
|
+
result = self.assignable lhs, rhs
|
2504
3180
|
# TODO: detect duplicate names
|
2505
3181
|
}
|
2506
3182
|
|
2507
3183
|
f_block_opt: f_arg_asgn tEQL primary_value
|
2508
3184
|
{
|
2509
|
-
|
3185
|
+
lhs, _, rhs = val
|
3186
|
+
result = self.assignable lhs, rhs
|
2510
3187
|
}
|
2511
3188
|
|
2512
3189
|
f_block_optarg: f_block_opt
|
@@ -2536,30 +3213,33 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2536
3213
|
f_rest_arg: restarg_mark tIDENTIFIER
|
2537
3214
|
{
|
2538
3215
|
# TODO: differs from parse.y - needs tests
|
2539
|
-
|
2540
|
-
|
2541
|
-
|
3216
|
+
_, (id, line) = val
|
3217
|
+
name = id.to_sym
|
3218
|
+
self.assignable [name, line]
|
3219
|
+
result = [:"*#{name}", line]
|
2542
3220
|
}
|
2543
3221
|
| restarg_mark
|
2544
3222
|
{
|
2545
3223
|
name = :"*"
|
2546
3224
|
self.env[name] = :lvar
|
2547
|
-
result = name
|
3225
|
+
result = [name, lexer.lineno] # FIX: tSTAR to include lineno
|
2548
3226
|
}
|
2549
3227
|
|
2550
3228
|
blkarg_mark: tAMPER2 | tAMPER
|
2551
3229
|
|
2552
3230
|
f_block_arg: blkarg_mark tIDENTIFIER
|
2553
3231
|
{
|
2554
|
-
|
3232
|
+
_, (id, line) = val
|
3233
|
+
identifier = id.to_sym
|
2555
3234
|
|
2556
3235
|
self.env[identifier] = :lvar
|
2557
|
-
result = "&#{identifier}".to_sym
|
3236
|
+
result = ["&#{identifier}".to_sym, line]
|
2558
3237
|
}
|
2559
3238
|
|
2560
3239
|
opt_f_block_arg: tCOMMA f_block_arg
|
2561
3240
|
{
|
2562
|
-
|
3241
|
+
_, arg = val
|
3242
|
+
result = arg
|
2563
3243
|
}
|
2564
3244
|
|
|
2565
3245
|
{
|
@@ -2608,9 +3288,11 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2608
3288
|
}
|
2609
3289
|
| tSTRING_BEG string_contents tLABEL_END arg_value
|
2610
3290
|
{
|
2611
|
-
_, sym, _, value = val
|
3291
|
+
(_, line), sym, _, value = val
|
3292
|
+
|
2612
3293
|
sym.sexp_type = :dsym
|
2613
|
-
|
3294
|
+
|
3295
|
+
result = s(:array, sym, value).line line
|
2614
3296
|
}
|
2615
3297
|
| tDSTAR arg_value
|
2616
3298
|
{
|
@@ -2633,6 +3315,7 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2633
3315
|
opt_nl: | tNL
|
2634
3316
|
rparen: opt_nl tRPAREN
|
2635
3317
|
rbracket: opt_nl tRBRACK
|
3318
|
+
rbrace: opt_nl tRCURLY
|
2636
3319
|
trailer: | tNL | tCOMMA
|
2637
3320
|
|
2638
3321
|
term: tSEMI { yyerrok }
|