ruby_parser 3.17.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 +76 -0
- data/Manifest.txt +3 -0
- data/README.rdoc +1 -0
- data/Rakefile +68 -18
- data/bin/ruby_parse_extract_error +1 -1
- data/compare/normalize.rb +6 -1
- data/gauntlet.md +106 -0
- data/lib/rp_extensions.rb +15 -36
- data/lib/rp_stringscanner.rb +20 -51
- data/lib/ruby20_parser.rb +3445 -3394
- data/lib/ruby20_parser.y +326 -248
- data/lib/ruby21_parser.rb +3543 -3511
- data/lib/ruby21_parser.y +321 -245
- data/lib/ruby22_parser.rb +3553 -3512
- data/lib/ruby22_parser.y +325 -247
- data/lib/ruby23_parser.rb +3566 -3530
- data/lib/ruby23_parser.y +325 -247
- data/lib/ruby24_parser.rb +3595 -3548
- data/lib/ruby24_parser.y +325 -247
- data/lib/ruby25_parser.rb +3595 -3547
- data/lib/ruby25_parser.y +325 -247
- data/lib/ruby26_parser.rb +3605 -3560
- data/lib/ruby26_parser.y +324 -246
- data/lib/ruby27_parser.rb +4657 -3539
- data/lib/ruby27_parser.y +878 -253
- data/lib/ruby30_parser.rb +5230 -3882
- data/lib/ruby30_parser.y +1069 -321
- data/lib/ruby3_parser.yy +3467 -0
- data/lib/ruby_lexer.rb +261 -609
- data/lib/ruby_lexer.rex +27 -20
- data/lib/ruby_lexer.rex.rb +59 -23
- data/lib/ruby_lexer_strings.rb +638 -0
- data/lib/ruby_parser.yy +910 -263
- data/lib/ruby_parser_extras.rb +289 -114
- data/test/test_ruby_lexer.rb +181 -129
- data/test/test_ruby_parser.rb +1213 -108
- data/tools/munge.rb +34 -6
- data/tools/ripper.rb +15 -10
- data.tar.gz.sig +0 -0
- metadata +11 -12
- metadata.gz.sig +0 -0
data/lib/ruby21_parser.y
CHANGED
@@ -18,7 +18,7 @@ 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
|
|
24
24
|
preclow
|
@@ -77,7 +77,7 @@ rule
|
|
77
77
|
| klBEGIN
|
78
78
|
{
|
79
79
|
if (self.in_def || self.in_single > 0) then
|
80
|
-
|
80
|
+
debug 11
|
81
81
|
yyerror "BEGIN in method"
|
82
82
|
end
|
83
83
|
self.env.extend
|
@@ -102,7 +102,9 @@ rule
|
|
102
102
|
bodystmt: compstmt opt_rescue k_else
|
103
103
|
{
|
104
104
|
res = _values[-2]
|
105
|
-
|
105
|
+
# TODO: move down to main match so I can just use val
|
106
|
+
|
107
|
+
warn "else without rescue is useless" unless res
|
106
108
|
}
|
107
109
|
compstmt
|
108
110
|
opt_ensure
|
@@ -132,7 +134,7 @@ rule
|
|
132
134
|
| error stmt
|
133
135
|
{
|
134
136
|
result = val[1]
|
135
|
-
|
137
|
+
debug 12
|
136
138
|
}
|
137
139
|
|
138
140
|
stmt_or_begin: stmt
|
@@ -140,6 +142,10 @@ rule
|
|
140
142
|
{
|
141
143
|
yyerror "BEGIN is permitted only at toplevel"
|
142
144
|
}
|
145
|
+
begin_block
|
146
|
+
{
|
147
|
+
result = val[2] # wtf?
|
148
|
+
}
|
143
149
|
|
144
150
|
stmt: kALIAS fitem
|
145
151
|
{
|
@@ -152,12 +158,12 @@ rule
|
|
152
158
|
}
|
153
159
|
| kALIAS tGVAR tGVAR
|
154
160
|
{
|
155
|
-
(_, line), lhs, rhs = val
|
161
|
+
(_, line), (lhs, _), (rhs, _) = val
|
156
162
|
result = s(:valias, lhs.to_sym, rhs.to_sym).line line
|
157
163
|
}
|
158
164
|
| kALIAS tGVAR tBACK_REF
|
159
165
|
{
|
160
|
-
(_, line), lhs, rhs = val
|
166
|
+
(_, line), (lhs, _), (rhs, _) = val
|
161
167
|
result = s(:valias, lhs.to_sym, :"$#{rhs}").line line
|
162
168
|
}
|
163
169
|
| kALIAS tGVAR tNTH_REF
|
@@ -200,7 +206,7 @@ rule
|
|
200
206
|
(_, line), _, stmt, _ = val
|
201
207
|
|
202
208
|
if (self.in_def || self.in_single > 0) then
|
203
|
-
|
209
|
+
debug 13
|
204
210
|
yyerror "END in method; use at_exit"
|
205
211
|
end
|
206
212
|
|
@@ -240,32 +246,31 @@ rule
|
|
240
246
|
}
|
241
247
|
| primary_value call_op tIDENTIFIER tOP_ASGN command_rhs
|
242
248
|
{
|
243
|
-
prim, _, id,
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
result.line = val[0].line
|
249
|
+
prim, (call_op, _), (id, _), (op_asgn, _), rhs = val
|
250
|
+
|
251
|
+
result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym)
|
252
|
+
result.sexp_type = :safe_op_asgn if call_op == '&.'
|
253
|
+
result.line prim.line
|
249
254
|
}
|
250
255
|
| primary_value call_op tCONSTANT tOP_ASGN command_rhs
|
251
256
|
{
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
result.line
|
257
|
+
prim, (call_op, _), (id, _), (op_asgn, _), rhs = val
|
258
|
+
|
259
|
+
result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym)
|
260
|
+
result.sexp_type = :safe_op_asgn if call_op == '&.'
|
261
|
+
result.line prim.line
|
257
262
|
}
|
258
263
|
| primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs
|
259
264
|
{
|
260
|
-
lhs1, _, lhs2,
|
265
|
+
lhs1, _, (lhs2, line), (id, _), rhs = val
|
261
266
|
|
262
|
-
result = s(:op_asgn, lhs1, rhs, lhs2.to_sym,
|
267
|
+
result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line
|
263
268
|
}
|
264
269
|
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs
|
265
270
|
{
|
266
|
-
lhs1, _, lhs2,
|
271
|
+
lhs1, _, (lhs2, line), (id, _), rhs = val
|
267
272
|
|
268
|
-
result = s(:op_asgn, lhs1, rhs, lhs2.to_sym,
|
273
|
+
result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line
|
269
274
|
}
|
270
275
|
| backref tOP_ASGN command_rhs
|
271
276
|
{
|
@@ -303,7 +308,7 @@ rule
|
|
303
308
|
# TODO: fix line number to tBANG... but causes BAD shift/reduce conflict
|
304
309
|
# REFACTOR: call_uni_op -- see parse26.y
|
305
310
|
}
|
306
|
-
| arg
|
311
|
+
| arg =tLBRACE_ARG
|
307
312
|
|
308
313
|
expr_value: expr
|
309
314
|
{
|
@@ -328,7 +333,7 @@ rule
|
|
328
333
|
block_command: block_call
|
329
334
|
| block_call call_op2 operation2 command_args
|
330
335
|
{
|
331
|
-
blk, _, msg, args = val
|
336
|
+
blk, _, (msg, _line), args = val
|
332
337
|
result = new_call(blk, msg.to_sym, args).line blk.line
|
333
338
|
}
|
334
339
|
|
@@ -342,15 +347,15 @@ rule
|
|
342
347
|
_, line, body, _ = val
|
343
348
|
|
344
349
|
result = body
|
345
|
-
result.line
|
350
|
+
result.line line
|
346
351
|
|
347
352
|
# self.env.unextend
|
348
353
|
}
|
349
354
|
|
350
355
|
fcall: operation
|
351
356
|
{
|
352
|
-
msg, = val
|
353
|
-
result = new_call(nil, msg.to_sym).line
|
357
|
+
(msg, line), = val
|
358
|
+
result = new_call(nil, msg.to_sym).line line
|
354
359
|
}
|
355
360
|
|
356
361
|
command: fcall command_args =tLOWEST
|
@@ -373,12 +378,14 @@ rule
|
|
373
378
|
}
|
374
379
|
| primary_value call_op operation2 command_args =tLOWEST
|
375
380
|
{
|
376
|
-
lhs, callop, op, args = val
|
381
|
+
lhs, callop, (op, _), args = val
|
382
|
+
|
377
383
|
result = new_call lhs, op.to_sym, args, callop
|
384
|
+
result.line lhs.line
|
378
385
|
}
|
379
386
|
| primary_value call_op operation2 command_args cmd_brace_block
|
380
387
|
{
|
381
|
-
recv, _, msg, args, block = val
|
388
|
+
recv, _, (msg, _line), args, block = val
|
382
389
|
call = new_call recv, msg.to_sym, args, val[1]
|
383
390
|
|
384
391
|
block_dup_check call, block
|
@@ -388,11 +395,14 @@ rule
|
|
388
395
|
}
|
389
396
|
| primary_value tCOLON2 operation2 command_args =tLOWEST
|
390
397
|
{
|
391
|
-
|
398
|
+
lhs, _, (id, line), args = val
|
399
|
+
|
400
|
+
result = new_call lhs, id.to_sym, args
|
401
|
+
result.line line
|
392
402
|
}
|
393
403
|
| primary_value tCOLON2 operation2 command_args cmd_brace_block
|
394
404
|
{
|
395
|
-
recv, _, msg, args, block = val
|
405
|
+
recv, _, (msg, _line), args, block = val
|
396
406
|
call = new_call recv, msg.to_sym, args
|
397
407
|
|
398
408
|
block_dup_check call, block
|
@@ -550,25 +560,29 @@ rule
|
|
550
560
|
}
|
551
561
|
| primary_value call_op tIDENTIFIER
|
552
562
|
{
|
553
|
-
|
563
|
+
lhs, call_op, (id, _line) = val
|
564
|
+
|
565
|
+
result = new_attrasgn lhs, id, call_op
|
554
566
|
}
|
555
567
|
| primary_value tCOLON2 tIDENTIFIER
|
556
568
|
{
|
557
|
-
recv, _, id = val
|
569
|
+
recv, _, (id, _line) = val
|
558
570
|
result = new_attrasgn recv, id
|
559
571
|
}
|
560
572
|
| primary_value call_op tCONSTANT
|
561
573
|
{
|
562
|
-
|
574
|
+
lhs, call_op, (id, _line) = val
|
575
|
+
|
576
|
+
result = new_attrasgn lhs, id, call_op
|
563
577
|
}
|
564
578
|
| primary_value tCOLON2 tCONSTANT
|
565
579
|
{
|
566
580
|
if (self.in_def || self.in_single > 0) then
|
567
|
-
|
581
|
+
debug 14
|
568
582
|
yyerror "dynamic constant assignment"
|
569
583
|
end
|
570
584
|
|
571
|
-
expr, _, id = val
|
585
|
+
expr, _, (id, _line) = val
|
572
586
|
l = expr.line
|
573
587
|
|
574
588
|
result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l
|
@@ -576,58 +590,65 @@ rule
|
|
576
590
|
| tCOLON3 tCONSTANT
|
577
591
|
{
|
578
592
|
if (self.in_def || self.in_single > 0) then
|
579
|
-
|
593
|
+
debug 15
|
580
594
|
yyerror "dynamic constant assignment"
|
581
595
|
end
|
582
596
|
|
583
|
-
_, id = val
|
584
|
-
l = lexer.lineno
|
597
|
+
_, (id, l) = val
|
585
598
|
|
586
599
|
result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l
|
587
600
|
}
|
588
601
|
| backref
|
589
602
|
{
|
590
|
-
|
603
|
+
ref, = val
|
604
|
+
|
605
|
+
self.backref_assign_error ref
|
591
606
|
}
|
592
607
|
|
593
608
|
lhs: user_variable
|
594
609
|
{
|
595
|
-
|
596
|
-
|
597
|
-
result
|
610
|
+
var, = val
|
611
|
+
|
612
|
+
result = self.assignable var
|
598
613
|
}
|
599
614
|
| keyword_variable
|
600
615
|
{
|
601
|
-
|
602
|
-
|
603
|
-
result
|
604
|
-
|
616
|
+
var, = val
|
617
|
+
|
618
|
+
result = self.assignable var
|
619
|
+
|
620
|
+
debug 16
|
605
621
|
}
|
606
622
|
| primary_value tLBRACK2 opt_call_args rbracket
|
607
623
|
{
|
608
624
|
lhs, _, args, _ = val
|
625
|
+
|
609
626
|
result = self.aryset lhs, args
|
610
627
|
}
|
611
628
|
| primary_value call_op tIDENTIFIER # REFACTOR
|
612
629
|
{
|
613
|
-
lhs, op, id = val
|
630
|
+
lhs, op, (id, _line) = val
|
631
|
+
|
614
632
|
result = new_attrasgn lhs, id, op
|
615
633
|
}
|
616
634
|
| primary_value tCOLON2 tIDENTIFIER
|
617
635
|
{
|
618
|
-
lhs, _, id = val
|
636
|
+
lhs, _, (id, _line) = val
|
637
|
+
|
619
638
|
result = new_attrasgn lhs, id
|
620
639
|
}
|
621
640
|
| primary_value call_op tCONSTANT # REFACTOR?
|
622
641
|
{
|
623
|
-
|
642
|
+
lhs, call_op, (id, _line) = val
|
643
|
+
|
644
|
+
result = new_attrasgn lhs, id, call_op
|
624
645
|
}
|
625
646
|
| primary_value tCOLON2 tCONSTANT
|
626
647
|
{
|
627
|
-
expr, _, id = val
|
648
|
+
expr, _, (id, _line) = val
|
628
649
|
|
629
650
|
if (self.in_def || self.in_single > 0) then
|
630
|
-
|
651
|
+
debug 17
|
631
652
|
yyerror "dynamic constant assignment"
|
632
653
|
end
|
633
654
|
|
@@ -636,14 +657,13 @@ rule
|
|
636
657
|
}
|
637
658
|
| tCOLON3 tCONSTANT
|
638
659
|
{
|
639
|
-
_, id = val
|
660
|
+
_, (id, l) = val
|
640
661
|
|
641
662
|
if (self.in_def || self.in_single > 0) then
|
642
|
-
|
663
|
+
debug 18
|
643
664
|
yyerror "dynamic constant assignment"
|
644
665
|
end
|
645
666
|
|
646
|
-
l = lexer.lineno
|
647
667
|
result = s(:const, s(:colon3, id.to_sym).line(l)).line l
|
648
668
|
}
|
649
669
|
| backref
|
@@ -659,16 +679,17 @@ rule
|
|
659
679
|
|
660
680
|
cpath: tCOLON3 cname
|
661
681
|
{
|
662
|
-
_, name = val
|
663
|
-
result = s(:colon3, name.to_sym).line
|
682
|
+
_, (name, line) = val
|
683
|
+
result = s(:colon3, name.to_sym).line line
|
664
684
|
}
|
665
685
|
| cname
|
666
686
|
{
|
667
|
-
|
687
|
+
(id, line), = val
|
688
|
+
result = [id.to_sym, line] # TODO: sexp?
|
668
689
|
}
|
669
690
|
| primary_value tCOLON2 cname
|
670
691
|
{
|
671
|
-
pval, _, name = val
|
692
|
+
pval, _, (name, _line) = val
|
672
693
|
|
673
694
|
result = s(:colon2, pval, name.to_sym)
|
674
695
|
result.line pval.line
|
@@ -678,24 +699,17 @@ rule
|
|
678
699
|
| op
|
679
700
|
{
|
680
701
|
lexer.lex_state = EXPR_END
|
681
|
-
result = val[0]
|
682
702
|
}
|
683
703
|
|
684
704
|
| reswords
|
685
|
-
{
|
686
|
-
(sym, _line), = val
|
687
|
-
lexer.lex_state = EXPR_END
|
688
|
-
result = sym
|
689
|
-
}
|
690
705
|
|
691
|
-
|
692
|
-
|
693
|
-
fitem: fsym
|
706
|
+
fitem: fname
|
694
707
|
{
|
695
|
-
id, = val
|
696
|
-
|
708
|
+
(id, line), = val
|
709
|
+
|
710
|
+
result = s(:lit, id.to_sym).line line
|
697
711
|
}
|
698
|
-
|
|
712
|
+
| symbol
|
699
713
|
|
700
714
|
undef_list: fitem
|
701
715
|
{
|
@@ -716,8 +730,6 @@ rule
|
|
716
730
|
| tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
|
717
731
|
| tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE
|
718
732
|
| tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2
|
719
|
-
# TODO: tUBANG dead?
|
720
|
-
| tUBANG
|
721
733
|
|
722
734
|
reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND
|
723
735
|
| kALIAS | kAND | kBEGIN | kBREAK | kCASE
|
@@ -751,24 +763,20 @@ rule
|
|
751
763
|
}
|
752
764
|
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs
|
753
765
|
{
|
754
|
-
lhs, _, id, op, rhs = val
|
766
|
+
lhs, _, (id, _line), (op, _), rhs = val
|
755
767
|
|
756
768
|
result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line
|
757
769
|
}
|
758
770
|
| primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs
|
759
771
|
{
|
760
|
-
lhs1, _, lhs2, op, rhs = val
|
772
|
+
lhs1, _, (lhs2, _line), op, rhs = val
|
761
773
|
|
762
774
|
lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line
|
763
775
|
result = new_const_op_asgn [lhs, op, rhs]
|
764
776
|
}
|
765
|
-
| tCOLON3 tCONSTANT
|
766
|
-
{
|
767
|
-
result = self.lexer.lineno
|
768
|
-
}
|
769
|
-
tOP_ASGN arg_rhs
|
777
|
+
| tCOLON3 tCONSTANT tOP_ASGN arg_rhs
|
770
778
|
{
|
771
|
-
_, lhs, line, op, rhs = val
|
779
|
+
_, (lhs, line), op, rhs = val
|
772
780
|
|
773
781
|
lhs = s(:colon3, lhs.to_sym).line line
|
774
782
|
result = new_const_op_asgn [lhs, op, rhs]
|
@@ -782,7 +790,7 @@ rule
|
|
782
790
|
| arg tDOT2 arg
|
783
791
|
{
|
784
792
|
v1, v2 = val[0], val[2]
|
785
|
-
if v1.
|
793
|
+
if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then
|
786
794
|
result = s(:lit, (v1.last)..(v2.last)).line v1.line
|
787
795
|
else
|
788
796
|
result = s(:dot2, v1, v2).line v1.line
|
@@ -791,7 +799,7 @@ rule
|
|
791
799
|
| arg tDOT3 arg
|
792
800
|
{
|
793
801
|
v1, v2 = val[0], val[2]
|
794
|
-
if v1.
|
802
|
+
if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then
|
795
803
|
result = s(:lit, (v1.last)...(v2.last)).line v1.line
|
796
804
|
else
|
797
805
|
result = s(:dot3, v1, v2).line v1.line
|
@@ -825,8 +833,9 @@ rule
|
|
825
833
|
}
|
826
834
|
| tUMINUS_NUM simple_numeric tPOW arg
|
827
835
|
{
|
828
|
-
|
829
|
-
|
836
|
+
_, (num, line), _, arg = val
|
837
|
+
lit = s(:lit, num).line line
|
838
|
+
result = new_call(new_call(lit, :"**", argl(arg)), :"-@")
|
830
839
|
|
831
840
|
}
|
832
841
|
| tUPLUS arg
|
@@ -925,12 +934,12 @@ rule
|
|
925
934
|
|
926
935
|
rel_expr: arg relop arg =tGT
|
927
936
|
{
|
928
|
-
lhs, op, rhs = val
|
937
|
+
lhs, (op, _), rhs = val
|
929
938
|
result = new_call lhs, op.to_sym, argl(rhs)
|
930
939
|
}
|
931
940
|
| rel_expr relop arg =tGT
|
932
941
|
{
|
933
|
-
lhs, op, rhs = val
|
942
|
+
lhs, (op, _), rhs = val
|
934
943
|
warn "comparison '%s' after comparison", op
|
935
944
|
result = new_call lhs, op.to_sym, argl(rhs)
|
936
945
|
}
|
@@ -1121,8 +1130,9 @@ rule
|
|
1121
1130
|
| backref
|
1122
1131
|
| tFID
|
1123
1132
|
{
|
1124
|
-
msg, = val
|
1133
|
+
(msg, line), = val
|
1125
1134
|
result = new_call nil, msg.to_sym
|
1135
|
+
result.line line
|
1126
1136
|
}
|
1127
1137
|
| k_begin
|
1128
1138
|
{
|
@@ -1164,15 +1174,15 @@ rule
|
|
1164
1174
|
}
|
1165
1175
|
| primary_value tCOLON2 tCONSTANT
|
1166
1176
|
{
|
1167
|
-
expr, _, id = val
|
1177
|
+
expr, _, (id, _line) = val
|
1168
1178
|
|
1169
1179
|
result = s(:colon2, expr, id.to_sym).line expr.line
|
1170
1180
|
}
|
1171
1181
|
| tCOLON3 tCONSTANT
|
1172
1182
|
{
|
1173
|
-
_, id = val
|
1183
|
+
_, (id, line) = val
|
1174
1184
|
|
1175
|
-
result = s(:colon3, id.to_sym).line
|
1185
|
+
result = s(:colon3, id.to_sym).line line
|
1176
1186
|
}
|
1177
1187
|
| tLBRACK { result = lexer.lineno } aref_args tRBRACK
|
1178
1188
|
{
|
@@ -1219,7 +1229,7 @@ rule
|
|
1219
1229
|
}
|
1220
1230
|
| kNOT tLPAREN2 rparen
|
1221
1231
|
{
|
1222
|
-
|
1232
|
+
debug 20
|
1223
1233
|
}
|
1224
1234
|
| fcall brace_block
|
1225
1235
|
{
|
@@ -1237,9 +1247,10 @@ rule
|
|
1237
1247
|
iter.insert 1, call # FIX
|
1238
1248
|
result = iter
|
1239
1249
|
}
|
1240
|
-
|
|
1250
|
+
| lambda
|
1241
1251
|
{
|
1242
|
-
|
1252
|
+
expr, = val
|
1253
|
+
result = expr
|
1243
1254
|
}
|
1244
1255
|
| k_if expr_value then compstmt if_tail k_end
|
1245
1256
|
{
|
@@ -1282,7 +1293,6 @@ rule
|
|
1282
1293
|
}
|
1283
1294
|
cpath superclass
|
1284
1295
|
{
|
1285
|
-
self.comments.push self.lexer.comments
|
1286
1296
|
if (self.in_def || self.in_single > 0) then
|
1287
1297
|
yyerror "class definition in method body"
|
1288
1298
|
end
|
@@ -1292,7 +1302,7 @@ rule
|
|
1292
1302
|
{
|
1293
1303
|
result = new_class val
|
1294
1304
|
self.env.unextend
|
1295
|
-
self.lexer.
|
1305
|
+
self.lexer.ignore_body_comments
|
1296
1306
|
}
|
1297
1307
|
| k_class tLSHFT
|
1298
1308
|
{
|
@@ -1313,7 +1323,7 @@ rule
|
|
1313
1323
|
{
|
1314
1324
|
result = new_sclass val
|
1315
1325
|
self.env.unextend
|
1316
|
-
self.lexer.
|
1326
|
+
self.lexer.ignore_body_comments
|
1317
1327
|
}
|
1318
1328
|
| k_module
|
1319
1329
|
{
|
@@ -1321,7 +1331,6 @@ rule
|
|
1321
1331
|
}
|
1322
1332
|
cpath
|
1323
1333
|
{
|
1324
|
-
self.comments.push self.lexer.comments
|
1325
1334
|
yyerror "module definition in method body" if
|
1326
1335
|
self.in_def or self.in_single > 0
|
1327
1336
|
|
@@ -1331,7 +1340,7 @@ rule
|
|
1331
1340
|
{
|
1332
1341
|
result = new_module val
|
1333
1342
|
self.env.unextend
|
1334
|
-
self.lexer.
|
1343
|
+
self.lexer.ignore_body_comments
|
1335
1344
|
}
|
1336
1345
|
| k_def fname
|
1337
1346
|
{
|
@@ -1341,21 +1350,17 @@ rule
|
|
1341
1350
|
self.env.extend
|
1342
1351
|
lexer.cmdarg.push false
|
1343
1352
|
lexer.cond.push false
|
1344
|
-
|
1345
|
-
self.comments.push self.lexer.comments
|
1346
1353
|
}
|
1347
|
-
f_arglist bodystmt
|
1354
|
+
f_arglist bodystmt k_end
|
1348
1355
|
{
|
1349
|
-
in_def = val
|
1350
|
-
|
1351
|
-
result = new_defn val
|
1356
|
+
result, in_def = new_defn val
|
1352
1357
|
|
1353
1358
|
lexer.cond.pop # group = local_pop
|
1354
1359
|
lexer.cmdarg.pop
|
1355
1360
|
self.env.unextend
|
1356
1361
|
self.in_def = in_def
|
1357
1362
|
|
1358
|
-
self.lexer.
|
1363
|
+
self.lexer.ignore_body_comments
|
1359
1364
|
}
|
1360
1365
|
| k_def singleton dot_or_colon
|
1361
1366
|
{
|
@@ -1363,7 +1368,7 @@ rule
|
|
1363
1368
|
}
|
1364
1369
|
fname
|
1365
1370
|
{
|
1366
|
-
result =
|
1371
|
+
result = self.in_def
|
1367
1372
|
|
1368
1373
|
self.in_single += 1 # TODO: remove?
|
1369
1374
|
|
@@ -1373,13 +1378,18 @@ rule
|
|
1373
1378
|
lexer.cond.push false
|
1374
1379
|
|
1375
1380
|
lexer.lex_state = EXPR_ENDFN|EXPR_LABEL
|
1376
|
-
self.comments.push self.lexer.comments
|
1377
1381
|
}
|
1378
1382
|
f_arglist bodystmt k_end
|
1379
1383
|
{
|
1380
|
-
_, _recv, _, _, _name, (in_def, _lineno), _args, _body, _ = val
|
1381
1384
|
|
1382
|
-
|
1385
|
+
# [kdef, recv, _, _, (name, line), in_def, args, body, kend]
|
1386
|
+
# =>
|
1387
|
+
# [kdef, recv, (name, line), in_def, args, body, kend]
|
1388
|
+
|
1389
|
+
val.delete_at 3
|
1390
|
+
val.delete_at 2
|
1391
|
+
|
1392
|
+
result, in_def = new_defs val
|
1383
1393
|
|
1384
1394
|
lexer.cond.pop # group = local_pop
|
1385
1395
|
lexer.cmdarg.pop
|
@@ -1390,7 +1400,7 @@ rule
|
|
1390
1400
|
|
1391
1401
|
# TODO: restore cur_arg ? what's cur_arg?
|
1392
1402
|
|
1393
|
-
self.lexer.
|
1403
|
+
self.lexer.ignore_body_comments
|
1394
1404
|
}
|
1395
1405
|
| kBREAK
|
1396
1406
|
{
|
@@ -1427,8 +1437,17 @@ rule
|
|
1427
1437
|
k_case: kCASE
|
1428
1438
|
k_for: kFOR
|
1429
1439
|
k_class: kCLASS
|
1440
|
+
{
|
1441
|
+
self.comments.push self.lexer.comments
|
1442
|
+
}
|
1430
1443
|
k_module: kMODULE
|
1444
|
+
{
|
1445
|
+
self.comments.push self.lexer.comments
|
1446
|
+
}
|
1431
1447
|
k_def: kDEF
|
1448
|
+
{
|
1449
|
+
self.comments.push self.lexer.comments
|
1450
|
+
}
|
1432
1451
|
k_do: kDO
|
1433
1452
|
k_do_block: kDO_BLOCK
|
1434
1453
|
k_rescue: kRESCUE
|
@@ -1489,51 +1508,42 @@ rule
|
|
1489
1508
|
|
1490
1509
|
result = block_var args
|
1491
1510
|
}
|
1492
|
-
| f_marg_list tCOMMA
|
1511
|
+
| f_marg_list tCOMMA f_rest_marg
|
1493
1512
|
{
|
1494
|
-
args, _,
|
1513
|
+
args, _, rest = val
|
1495
1514
|
|
1496
|
-
result = block_var args,
|
1515
|
+
result = block_var args, rest
|
1497
1516
|
}
|
1498
|
-
| f_marg_list tCOMMA
|
1517
|
+
| f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list
|
1499
1518
|
{
|
1500
|
-
|
1519
|
+
lhs, _, splat, _, rhs = val
|
1501
1520
|
|
1502
|
-
result = block_var
|
1521
|
+
result = block_var lhs, splat, rhs
|
1503
1522
|
}
|
1504
|
-
|
|
1523
|
+
| f_rest_marg
|
1505
1524
|
{
|
1506
|
-
|
1525
|
+
rest, = val
|
1507
1526
|
|
1508
|
-
result = block_var
|
1527
|
+
result = block_var rest
|
1509
1528
|
}
|
1510
|
-
|
|
1529
|
+
| f_rest_marg tCOMMA f_marg_list
|
1511
1530
|
{
|
1512
|
-
|
1531
|
+
splat, _, rest = val
|
1513
1532
|
|
1514
|
-
result = block_var
|
1533
|
+
result = block_var splat, rest
|
1515
1534
|
}
|
1516
|
-
| tSTAR f_norm_arg
|
1517
|
-
{
|
1518
|
-
_, splat = val
|
1519
1535
|
|
1520
|
-
|
1521
|
-
}
|
1522
|
-
| tSTAR f_norm_arg tCOMMA f_marg_list
|
1536
|
+
f_rest_marg: tSTAR f_norm_arg
|
1523
1537
|
{
|
1524
|
-
_,
|
1538
|
+
_, (id, line) = val
|
1525
1539
|
|
1526
|
-
result =
|
1540
|
+
result = args ["*#{id}".to_sym]
|
1541
|
+
result.line line
|
1527
1542
|
}
|
1528
1543
|
| tSTAR
|
1529
1544
|
{
|
1530
|
-
result =
|
1531
|
-
|
1532
|
-
| tSTAR tCOMMA f_marg_list
|
1533
|
-
{
|
1534
|
-
_, _, args = val
|
1535
|
-
|
1536
|
-
result = block_var :*, args
|
1545
|
+
result = args [:*]
|
1546
|
+
result.line lexer.lineno # FIX: tSTAR -> line
|
1537
1547
|
}
|
1538
1548
|
|
1539
1549
|
block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg
|
@@ -1550,8 +1560,8 @@ rule
|
|
1550
1560
|
}
|
1551
1561
|
| f_block_arg
|
1552
1562
|
{
|
1553
|
-
line =
|
1554
|
-
result = call_args
|
1563
|
+
(id, line), = val
|
1564
|
+
result = call_args [id]
|
1555
1565
|
result.line line
|
1556
1566
|
}
|
1557
1567
|
|
@@ -1660,13 +1670,13 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1660
1670
|
|
1661
1671
|
bvar: tIDENTIFIER
|
1662
1672
|
{
|
1663
|
-
id, = val
|
1664
|
-
line = lexer.lineno
|
1673
|
+
(id, line), = val
|
1665
1674
|
result = s(:shadow, id.to_sym).line line
|
1666
1675
|
}
|
1667
1676
|
| f_bad_arg
|
1668
1677
|
|
1669
|
-
lambda:
|
1678
|
+
lambda: tLAMBDA
|
1679
|
+
{
|
1670
1680
|
self.env.extend :dynamic
|
1671
1681
|
result = [lexer.lineno, lexer.lpar_beg]
|
1672
1682
|
lexer.paren_nest += 1
|
@@ -1678,14 +1688,14 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1678
1688
|
}
|
1679
1689
|
lambda_body
|
1680
1690
|
{
|
1681
|
-
(line, lpar), args, _cmdarg, body = val
|
1691
|
+
_, (line, lpar), args, _cmdarg, body = val
|
1682
1692
|
lexer.lpar_beg = lpar
|
1683
1693
|
|
1684
1694
|
lexer.cmdarg.pop
|
1685
1695
|
|
1686
1696
|
call = s(:lambda).line line
|
1687
1697
|
result = new_iter call, args, body
|
1688
|
-
result.line
|
1698
|
+
result.line line
|
1689
1699
|
self.env.unextend # TODO: dynapush & dynapop
|
1690
1700
|
}
|
1691
1701
|
|
@@ -1720,23 +1730,28 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1720
1730
|
## if (nd_type($1) == NODE_YIELD) {
|
1721
1731
|
## compile_error(PARSER_ARG "block given to yield");
|
1722
1732
|
|
1723
|
-
|
1724
|
-
val[0].block_pass?
|
1733
|
+
cmd, blk = val
|
1725
1734
|
|
1726
|
-
|
1735
|
+
syntax_error "Both block arg and actual block given." if
|
1736
|
+
cmd.block_pass?
|
1727
1737
|
|
1728
|
-
|
1738
|
+
if inverted? val then
|
1739
|
+
val = invert_block_call val
|
1740
|
+
cmd, blk = val
|
1741
|
+
end
|
1729
1742
|
|
1730
1743
|
result = blk
|
1731
1744
|
result.insert 1, cmd
|
1732
1745
|
}
|
1733
1746
|
| block_call call_op2 operation2 opt_paren_args
|
1734
1747
|
{
|
1735
|
-
|
1748
|
+
lhs, _, (id, _line), args = val
|
1749
|
+
|
1750
|
+
result = new_call lhs, id.to_sym, args
|
1736
1751
|
}
|
1737
1752
|
| block_call call_op2 operation2 opt_paren_args brace_block
|
1738
1753
|
{
|
1739
|
-
iter1, _, name, args, iter2 = val
|
1754
|
+
iter1, _, (name, _line), args, iter2 = val
|
1740
1755
|
|
1741
1756
|
call = new_call iter1, name.to_sym, args
|
1742
1757
|
iter2.insert 1, call
|
@@ -1745,7 +1760,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1745
1760
|
}
|
1746
1761
|
| block_call call_op2 operation2 command_args do_block
|
1747
1762
|
{
|
1748
|
-
iter1, _, name, args, iter2 = val
|
1763
|
+
iter1, _, (name, _line), args, iter2 = val
|
1749
1764
|
|
1750
1765
|
call = new_call iter1, name.to_sym, args
|
1751
1766
|
iter2.insert 1, call
|
@@ -1753,28 +1768,29 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1753
1768
|
result = iter2
|
1754
1769
|
}
|
1755
1770
|
|
1756
|
-
method_call: fcall
|
1757
|
-
{
|
1758
|
-
result = self.lexer.lineno
|
1759
|
-
}
|
1760
|
-
paren_args
|
1771
|
+
method_call: fcall paren_args
|
1761
1772
|
{
|
1762
|
-
call,
|
1773
|
+
call, args = val
|
1763
1774
|
|
1764
1775
|
result = call.concat args.sexp_body if args
|
1765
|
-
result.line lineno
|
1766
1776
|
}
|
1767
1777
|
| primary_value call_op operation2 opt_paren_args
|
1768
1778
|
{
|
1769
|
-
|
1779
|
+
recv, call_op, (op, _line), args = val
|
1780
|
+
|
1781
|
+
result = new_call recv, op.to_sym, args, call_op
|
1770
1782
|
}
|
1771
1783
|
| primary_value tCOLON2 operation2 paren_args
|
1772
1784
|
{
|
1773
|
-
|
1785
|
+
recv, _, (op, _line), args = val
|
1786
|
+
|
1787
|
+
result = new_call recv, op.to_sym, args
|
1774
1788
|
}
|
1775
1789
|
| primary_value tCOLON2 operation3
|
1776
1790
|
{
|
1777
|
-
|
1791
|
+
lhs, _, (id, _line) = val
|
1792
|
+
|
1793
|
+
result = new_call lhs, id.to_sym
|
1778
1794
|
}
|
1779
1795
|
| primary_value call_op paren_args
|
1780
1796
|
{
|
@@ -1807,7 +1823,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1807
1823
|
_, line, body, _ = val
|
1808
1824
|
|
1809
1825
|
result = body
|
1810
|
-
result.line
|
1826
|
+
result.line line
|
1811
1827
|
|
1812
1828
|
self.env.unextend
|
1813
1829
|
}
|
@@ -1821,7 +1837,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1821
1837
|
_, line, body, _ = val
|
1822
1838
|
|
1823
1839
|
result = body
|
1824
|
-
result.line
|
1840
|
+
result.line line
|
1825
1841
|
|
1826
1842
|
self.env.unextend
|
1827
1843
|
}
|
@@ -1850,14 +1866,39 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1850
1866
|
self.env.unextend
|
1851
1867
|
}
|
1852
1868
|
|
1869
|
+
case_args: arg_value
|
1870
|
+
{
|
1871
|
+
arg, = val
|
1872
|
+
|
1873
|
+
result = s(:array, arg).line arg.line
|
1874
|
+
}
|
1875
|
+
| tSTAR arg_value
|
1876
|
+
{
|
1877
|
+
_, arg = val
|
1878
|
+
|
1879
|
+
result = s(:array, s(:splat, arg).line(arg.line)).line arg.line
|
1880
|
+
}
|
1881
|
+
| case_args tCOMMA arg_value
|
1882
|
+
{
|
1883
|
+
args, _, id = val
|
1884
|
+
|
1885
|
+
result = self.list_append args, id
|
1886
|
+
}
|
1887
|
+
| case_args tCOMMA tSTAR arg_value
|
1888
|
+
{
|
1889
|
+
args, _, _, id = val
|
1890
|
+
|
1891
|
+
result = self.list_append args, s(:splat, id).line(id.line)
|
1892
|
+
}
|
1893
|
+
|
1853
1894
|
case_body: k_when
|
1854
1895
|
{
|
1855
1896
|
result = self.lexer.lineno
|
1856
1897
|
}
|
1857
|
-
|
1898
|
+
case_args then compstmt cases
|
1858
1899
|
{
|
1859
1900
|
result = new_when(val[2], val[4])
|
1860
|
-
result.line
|
1901
|
+
result.line val[1]
|
1861
1902
|
result << val[5] if val[5]
|
1862
1903
|
}
|
1863
1904
|
|
@@ -1903,17 +1944,10 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1903
1944
|
|
1904
1945
|
literal: numeric
|
1905
1946
|
{
|
1906
|
-
line =
|
1907
|
-
result = s(:lit,
|
1908
|
-
result.line = line
|
1947
|
+
(lit, line), = val
|
1948
|
+
result = s(:lit, lit).line line
|
1909
1949
|
}
|
1910
1950
|
| symbol
|
1911
|
-
{
|
1912
|
-
line = lexer.lineno
|
1913
|
-
result = s(:lit, val[0])
|
1914
|
-
result.line = line
|
1915
|
-
}
|
1916
|
-
| dsym
|
1917
1951
|
|
1918
1952
|
strings: string
|
1919
1953
|
{
|
@@ -1924,7 +1958,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1924
1958
|
|
1925
1959
|
string: tCHAR
|
1926
1960
|
{
|
1927
|
-
|
1961
|
+
debug 37
|
1928
1962
|
}
|
1929
1963
|
| string1
|
1930
1964
|
| string string1
|
@@ -1934,11 +1968,11 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1934
1968
|
|
1935
1969
|
string1: tSTRING_BEG string_contents tSTRING_END
|
1936
1970
|
{
|
1937
|
-
_, str, (_, func) = val
|
1971
|
+
(_, line), str, (_, func) = val
|
1938
1972
|
|
1939
|
-
str = dedent str if func =~ RubyLexer::
|
1973
|
+
str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT
|
1940
1974
|
|
1941
|
-
result = str
|
1975
|
+
result = str.line line
|
1942
1976
|
}
|
1943
1977
|
| tSTRING
|
1944
1978
|
{
|
@@ -1958,11 +1992,15 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1958
1992
|
|
1959
1993
|
words: tWORDS_BEG tSPACE tSTRING_END
|
1960
1994
|
{
|
1961
|
-
|
1995
|
+
(_, line), _, _ = val
|
1996
|
+
|
1997
|
+
result = s(:array).line line
|
1962
1998
|
}
|
1963
1999
|
| tWORDS_BEG word_list tSTRING_END
|
1964
2000
|
{
|
1965
|
-
|
2001
|
+
(_, line), list, _ = val
|
2002
|
+
|
2003
|
+
result = list.line line
|
1966
2004
|
}
|
1967
2005
|
|
1968
2006
|
word_list: none
|
@@ -1982,18 +2020,20 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1982
2020
|
|
1983
2021
|
symbols: tSYMBOLS_BEG tSPACE tSTRING_END
|
1984
2022
|
{
|
1985
|
-
|
2023
|
+
(_, line), _, _ = val
|
2024
|
+
|
2025
|
+
result = s(:array).line line
|
1986
2026
|
}
|
1987
|
-
| tSYMBOLS_BEG
|
2027
|
+
| tSYMBOLS_BEG symbol_list tSTRING_END
|
1988
2028
|
{
|
1989
|
-
_, line, list, _, = val
|
1990
|
-
list.line
|
2029
|
+
(_, line), list, _, = val
|
2030
|
+
list.line line
|
1991
2031
|
result = list
|
1992
2032
|
}
|
1993
2033
|
|
1994
2034
|
symbol_list: none
|
1995
2035
|
{
|
1996
|
-
result = new_symbol_list
|
2036
|
+
result = new_symbol_list
|
1997
2037
|
}
|
1998
2038
|
| symbol_list word tSPACE
|
1999
2039
|
{
|
@@ -2003,20 +2043,28 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
2003
2043
|
|
2004
2044
|
qwords: tQWORDS_BEG tSPACE tSTRING_END
|
2005
2045
|
{
|
2006
|
-
|
2046
|
+
(_, line), _, _ = val
|
2047
|
+
|
2048
|
+
result = s(:array).line line
|
2007
2049
|
}
|
2008
2050
|
| tQWORDS_BEG qword_list tSTRING_END
|
2009
2051
|
{
|
2010
|
-
|
2052
|
+
(_, line), list, _ = val
|
2053
|
+
|
2054
|
+
result = list.line line
|
2011
2055
|
}
|
2012
2056
|
|
2013
2057
|
qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END
|
2014
2058
|
{
|
2015
|
-
|
2059
|
+
(_, line), _, _ = val
|
2060
|
+
|
2061
|
+
result = s(:array).line line
|
2016
2062
|
}
|
2017
2063
|
| tQSYMBOLS_BEG qsym_list tSTRING_END
|
2018
2064
|
{
|
2019
|
-
|
2065
|
+
(_, line), list, _ = val
|
2066
|
+
|
2067
|
+
result = list.line line
|
2020
2068
|
}
|
2021
2069
|
|
2022
2070
|
qword_list: none
|
@@ -2039,7 +2087,8 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
2039
2087
|
|
2040
2088
|
string_contents: none
|
2041
2089
|
{
|
2042
|
-
|
2090
|
+
line = prev_value_to_lineno _values.last
|
2091
|
+
result = s(:str, +"").line line
|
2043
2092
|
}
|
2044
2093
|
| string_contents string_content
|
2045
2094
|
{
|
@@ -2114,8 +2163,8 @@ regexp_contents: none
|
|
2114
2163
|
lexer.brace_nest = brace_nest
|
2115
2164
|
lexer.string_nest = string_nest
|
2116
2165
|
|
2117
|
-
lexer.cmdarg.pop
|
2118
2166
|
lexer.cond.pop
|
2167
|
+
lexer.cmdarg.pop
|
2119
2168
|
|
2120
2169
|
lexer.lex_state = oldlex_state
|
2121
2170
|
|
@@ -2130,29 +2179,49 @@ regexp_contents: none
|
|
2130
2179
|
when nil then
|
2131
2180
|
result = s(:evstr).line line
|
2132
2181
|
else
|
2133
|
-
|
2182
|
+
debug 38
|
2134
2183
|
raise "unknown string body: #{stmt.inspect}"
|
2135
2184
|
end
|
2136
2185
|
}
|
2137
2186
|
|
2138
|
-
string_dvar: tGVAR
|
2139
|
-
|
2140
|
-
|
2187
|
+
string_dvar: tGVAR
|
2188
|
+
{
|
2189
|
+
(id, line), = val
|
2190
|
+
result = s(:gvar, id.to_sym).line line
|
2191
|
+
}
|
2192
|
+
| tIVAR
|
2193
|
+
{
|
2194
|
+
(id, line), = val
|
2195
|
+
result = s(:ivar, id.to_sym).line line
|
2196
|
+
}
|
2197
|
+
| tCVAR
|
2198
|
+
{
|
2199
|
+
(id, line), = val
|
2200
|
+
result = s(:cvar, id.to_sym).line line
|
2201
|
+
}
|
2141
2202
|
| backref
|
2142
2203
|
|
2143
|
-
symbol:
|
2204
|
+
symbol: ssym
|
2205
|
+
| dsym
|
2206
|
+
|
2207
|
+
ssym: tSYMBEG sym
|
2144
2208
|
{
|
2209
|
+
_, (id, line) = val
|
2210
|
+
|
2145
2211
|
lexer.lex_state = EXPR_END
|
2146
|
-
result =
|
2212
|
+
result = s(:lit, id.to_sym).line line
|
2147
2213
|
}
|
2148
2214
|
| tSYMBOL
|
2149
2215
|
{
|
2150
|
-
|
2216
|
+
(id, line), = val
|
2217
|
+
|
2218
|
+
lexer.lex_state = EXPR_END
|
2219
|
+
result = s(:lit, id.to_sym).line line
|
2151
2220
|
}
|
2152
2221
|
|
2153
2222
|
sym: fname | tIVAR | tGVAR | tCVAR
|
2154
2223
|
|
2155
|
-
dsym: tSYMBEG
|
2224
|
+
dsym: tSYMBEG string_contents tSTRING_END
|
2156
2225
|
{
|
2157
2226
|
_, result, _ = val
|
2158
2227
|
|
@@ -2168,14 +2237,15 @@ regexp_contents: none
|
|
2168
2237
|
when :evstr then
|
2169
2238
|
result = s(:dsym, "", result).line result.line
|
2170
2239
|
else
|
2171
|
-
|
2240
|
+
debug 39
|
2172
2241
|
end
|
2173
2242
|
}
|
2174
2243
|
|
2175
2244
|
numeric: simple_numeric
|
2176
|
-
| tUMINUS_NUM simple_numeric
|
2245
|
+
| tUMINUS_NUM simple_numeric =tLOWEST
|
2177
2246
|
{
|
2178
|
-
|
2247
|
+
_, (num, line) = val
|
2248
|
+
result = [-num, line]
|
2179
2249
|
}
|
2180
2250
|
|
2181
2251
|
simple_numeric: tINTEGER
|
@@ -2208,8 +2278,10 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2208
2278
|
|
2209
2279
|
var_ref: user_variable
|
2210
2280
|
{
|
2211
|
-
|
2281
|
+
raise "NO: #{val.inspect}" if Sexp === val.first
|
2282
|
+
(var, line), = val
|
2212
2283
|
result = Sexp === var ? var : self.gettable(var)
|
2284
|
+
result.line line
|
2213
2285
|
}
|
2214
2286
|
| keyword_variable
|
2215
2287
|
{
|
@@ -2224,11 +2296,19 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2224
2296
|
| keyword_variable
|
2225
2297
|
{
|
2226
2298
|
result = self.assignable val[0]
|
2227
|
-
|
2299
|
+
debug 40
|
2228
2300
|
}
|
2229
2301
|
|
2230
|
-
backref: tNTH_REF
|
2231
|
-
|
2302
|
+
backref: tNTH_REF
|
2303
|
+
{
|
2304
|
+
(ref, line), = val
|
2305
|
+
result = s(:nth_ref, ref).line line
|
2306
|
+
}
|
2307
|
+
| tBACK_REF
|
2308
|
+
{
|
2309
|
+
(ref, line), = val
|
2310
|
+
result = s(:back_ref, ref).line line
|
2311
|
+
}
|
2232
2312
|
|
2233
2313
|
superclass: tLT
|
2234
2314
|
{
|
@@ -2246,9 +2326,7 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2246
2326
|
|
2247
2327
|
f_arglist: tLPAREN2 f_args rparen
|
2248
2328
|
{
|
2249
|
-
result = val
|
2250
|
-
self.lexer.lex_state = EXPR_BEG
|
2251
|
-
self.lexer.command_start = true
|
2329
|
+
result = end_args val
|
2252
2330
|
}
|
2253
2331
|
| {
|
2254
2332
|
result = self.in_kwarg
|
@@ -2257,12 +2335,7 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2257
2335
|
}
|
2258
2336
|
f_args term
|
2259
2337
|
{
|
2260
|
-
|
2261
|
-
|
2262
|
-
self.in_kwarg = kwarg
|
2263
|
-
result = args
|
2264
|
-
lexer.lex_state = EXPR_BEG
|
2265
|
-
lexer.command_start = true
|
2338
|
+
result = end_args val
|
2266
2339
|
}
|
2267
2340
|
|
2268
2341
|
args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg
|
@@ -2347,6 +2420,7 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2347
2420
|
|
|
2348
2421
|
{
|
2349
2422
|
result = args val
|
2423
|
+
# result.line lexer.lineno
|
2350
2424
|
}
|
2351
2425
|
|
2352
2426
|
|
@@ -2370,31 +2444,24 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2370
2444
|
f_norm_arg: f_bad_arg
|
2371
2445
|
| tIDENTIFIER
|
2372
2446
|
{
|
2373
|
-
|
2447
|
+
(id, line), = val
|
2448
|
+
identifier = id.to_sym
|
2374
2449
|
self.env[identifier] = :lvar
|
2375
2450
|
|
2376
|
-
result = identifier
|
2451
|
+
result = [identifier, line]
|
2377
2452
|
}
|
2378
2453
|
|
2379
2454
|
f_arg_item: f_norm_arg
|
2380
2455
|
| tLPAREN f_margs rparen
|
2381
2456
|
{
|
2382
|
-
|
2457
|
+
_, margs, _ = val
|
2458
|
+
|
2459
|
+
result = margs
|
2383
2460
|
}
|
2384
2461
|
|
2385
2462
|
f_arg: f_arg_item
|
2386
2463
|
{
|
2387
|
-
|
2388
|
-
|
2389
|
-
case arg
|
2390
|
-
when Symbol then
|
2391
|
-
result = s(:args, arg).line lexer.lineno
|
2392
|
-
when Sexp then
|
2393
|
-
result = arg
|
2394
|
-
else
|
2395
|
-
debug20 32
|
2396
|
-
raise "Unknown f_arg type: #{val.inspect}"
|
2397
|
-
end
|
2464
|
+
result = new_arg val
|
2398
2465
|
}
|
2399
2466
|
| f_arg tCOMMA f_arg_item
|
2400
2467
|
{
|
@@ -2406,7 +2473,7 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2406
2473
|
result = s(:args, list).line list.line
|
2407
2474
|
end
|
2408
2475
|
|
2409
|
-
result << item
|
2476
|
+
result << (Sexp === item ? item : item.first)
|
2410
2477
|
}
|
2411
2478
|
|
2412
2479
|
f_label: tLABEL
|
@@ -2467,27 +2534,33 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2467
2534
|
kwrest_mark: tPOW
|
2468
2535
|
| tDSTAR
|
2469
2536
|
|
2537
|
+
|
2470
2538
|
f_kwrest: kwrest_mark tIDENTIFIER
|
2471
2539
|
{
|
2472
|
-
|
2473
|
-
|
2474
|
-
|
2540
|
+
_, (id, line) = val
|
2541
|
+
|
2542
|
+
name = id.to_sym
|
2543
|
+
self.assignable [name, line]
|
2544
|
+
result = [:"**#{name}", line]
|
2475
2545
|
}
|
2476
2546
|
| kwrest_mark
|
2477
2547
|
{
|
2478
|
-
|
2479
|
-
self.env[
|
2548
|
+
id = :"**"
|
2549
|
+
self.env[id] = :lvar # TODO: needed?!?
|
2550
|
+
result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno
|
2480
2551
|
}
|
2481
2552
|
|
2482
2553
|
f_opt: f_norm_arg tEQL arg_value
|
2483
2554
|
{
|
2484
|
-
|
2555
|
+
lhs, _, rhs = val
|
2556
|
+
result = self.assignable lhs, rhs
|
2485
2557
|
# TODO: detect duplicate names
|
2486
2558
|
}
|
2487
2559
|
|
2488
2560
|
f_block_opt: f_norm_arg tEQL primary_value
|
2489
2561
|
{
|
2490
|
-
|
2562
|
+
lhs, _, rhs = val
|
2563
|
+
result = self.assignable lhs, rhs
|
2491
2564
|
}
|
2492
2565
|
|
2493
2566
|
f_block_optarg: f_block_opt
|
@@ -2517,30 +2590,33 @@ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
|
2517
2590
|
f_rest_arg: restarg_mark tIDENTIFIER
|
2518
2591
|
{
|
2519
2592
|
# TODO: differs from parse.y - needs tests
|
2520
|
-
|
2521
|
-
|
2522
|
-
|
2593
|
+
_, (id, line) = val
|
2594
|
+
name = id.to_sym
|
2595
|
+
self.assignable [name, line]
|
2596
|
+
result = [:"*#{name}", line]
|
2523
2597
|
}
|
2524
2598
|
| restarg_mark
|
2525
2599
|
{
|
2526
2600
|
name = :"*"
|
2527
2601
|
self.env[name] = :lvar
|
2528
|
-
result = name
|
2602
|
+
result = [name, lexer.lineno] # FIX: tSTAR to include lineno
|
2529
2603
|
}
|
2530
2604
|
|
2531
2605
|
blkarg_mark: tAMPER2 | tAMPER
|
2532
2606
|
|
2533
2607
|
f_block_arg: blkarg_mark tIDENTIFIER
|
2534
2608
|
{
|
2535
|
-
|
2609
|
+
_, (id, line) = val
|
2610
|
+
identifier = id.to_sym
|
2536
2611
|
|
2537
2612
|
self.env[identifier] = :lvar
|
2538
|
-
result = "&#{identifier}".to_sym
|
2613
|
+
result = ["&#{identifier}".to_sym, line]
|
2539
2614
|
}
|
2540
2615
|
|
2541
2616
|
opt_f_block_arg: tCOMMA f_block_arg
|
2542
2617
|
{
|
2543
|
-
|
2618
|
+
_, arg = val
|
2619
|
+
result = arg
|
2544
2620
|
}
|
2545
2621
|
|
|
2546
2622
|
{
|