ruby_parser 2.0.5 → 3.0.0.a1

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.
@@ -1,6 +1,6 @@
1
1
  # -*- racc -*-
2
2
 
3
- class RubyParser
3
+ class Ruby18Parser
4
4
 
5
5
  token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
6
6
  kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT
@@ -12,10 +12,10 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
12
12
  tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ tGEQ tLEQ tANDOP
13
13
  tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF tASET tLSHFT tRSHFT
14
14
  tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN tLPAREN2 tRPAREN tLPAREN_ARG
15
- tLBRACK tRBRACK tLBRACE tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2
15
+ tLBRACK tLBRACK2 tRBRACK tLBRACE tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2
16
16
  tTILDE tPERCENT tDIVIDE tPLUS tMINUS tLT tGT tPIPE tBANG tCARET
17
17
  tLCURLY tRCURLY tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG
18
- tWORDS_BEG tAWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END tSTRING
18
+ tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END tSTRING
19
19
  tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAST_TOKEN
20
20
 
21
21
  prechigh
@@ -67,7 +67,7 @@ rule
67
67
  | stmt
68
68
  | stmts terms stmt
69
69
  {
70
- result = self.block_append val[0], val[2]
70
+ result = block_append val[0], val[2]
71
71
  }
72
72
  | error stmt
73
73
  {
@@ -117,11 +117,11 @@ rule
117
117
  }
118
118
  | stmt kRESCUE_MOD stmt
119
119
  {
120
- result = s(:rescue, val[0], s(:resbody, s(:array), val[2]))
120
+ result = s(:rescue, val[0], new_resbody(s(:array), val[2]))
121
121
  }
122
122
  | klBEGIN
123
123
  {
124
- if (self.in_def || self.in_single > 0) then
124
+ if (in_def || in_single > 0) then
125
125
  yyerror "BEGIN in method"
126
126
  end
127
127
  self.env.extend
@@ -133,14 +133,14 @@ rule
133
133
  }
134
134
  | klEND tLCURLY compstmt tRCURLY
135
135
  {
136
- if (self.in_def || self.in_single > 0) then
136
+ if (in_def || in_single > 0) then
137
137
  yyerror "END in method; use at_exit"
138
138
  end
139
139
  result = new_iter s(:postexe), nil, val[2]
140
140
  }
141
141
  | lhs tEQL command_call
142
142
  {
143
- result = self.node_assign val[0], val[2]
143
+ result = node_assign val[0], val[2]
144
144
  }
145
145
  | mlhs tEQL command_call
146
146
  {
@@ -150,7 +150,7 @@ rule
150
150
  {
151
151
  result = new_op_asgn val
152
152
  }
153
- | primary_value "[" aref_args tRBRACK tOP_ASGN command_call
153
+ | primary_value tLBRACK2 aref_args tRBRACK tOP_ASGN command_call
154
154
  {
155
155
  result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
156
156
  }
@@ -168,11 +168,11 @@ rule
168
168
  }
169
169
  | backref tOP_ASGN command_call
170
170
  {
171
- self.backref_assign_error val[0]
171
+ backref_assign_error val[0]
172
172
  }
173
173
  | lhs tEQL mrhs
174
174
  {
175
- result = self.node_assign val[0], s(:svalue, val[2])
175
+ result = node_assign val[0], s(:svalue, val[2])
176
176
  }
177
177
  | mlhs tEQL arg_value
178
178
  {
@@ -212,15 +212,18 @@ rule
212
212
  | block_command
213
213
  | kRETURN call_args
214
214
  {
215
- result = s(:return, ret_args(val[1]))
215
+ line = val[0].last
216
+ result = s(:return, ret_args(val[1])).line(line)
216
217
  }
217
218
  | kBREAK call_args
218
219
  {
219
- result = s(:break, ret_args(val[1]))
220
+ line = val[0].last
221
+ result = s(:break, ret_args(val[1])).line(line)
220
222
  }
221
223
  | kNEXT call_args
222
224
  {
223
- result = s(:next, ret_args(val[1]))
225
+ line = val[0].last
226
+ result = s(:next, ret_args(val[1])).line(line)
224
227
  }
225
228
 
226
229
  block_command: block_call
@@ -349,27 +352,27 @@ rule
349
352
 
350
353
  mlhs_node: variable
351
354
  {
352
- result = self.assignable val[0]
355
+ result = assignable val[0]
353
356
  }
354
- | primary_value "[" aref_args tRBRACK
357
+ | primary_value tLBRACK2 aref_args tRBRACK
355
358
  {
356
- result = self.aryset val[0], val[2]
359
+ result = aryset val[0], val[2]
357
360
  }
358
361
  | primary_value tDOT tIDENTIFIER
359
362
  {
360
- result = s(:attrasgn, val[0], :"#{val[2]}=", s(:arglist))
363
+ result = s(:attrasgn, val[0], :"#{val[2]}=")
361
364
  }
362
365
  | primary_value tCOLON2 tIDENTIFIER
363
366
  {
364
- result = s(:attrasgn, val[0], :"#{val[2]}=", s(:arglist))
367
+ result = s(:attrasgn, val[0], :"#{val[2]}=")
365
368
  }
366
369
  | primary_value tDOT tCONSTANT
367
370
  {
368
- result = s(:attrasgn, val[0], :"#{val[2]}=", s(:arglist))
371
+ result = s(:attrasgn, val[0], :"#{val[2]}=")
369
372
  }
370
373
  | primary_value tCOLON2 tCONSTANT
371
374
  {
372
- if (self.in_def || self.in_single > 0) then
375
+ if (in_def || in_single > 0) then
373
376
  yyerror "dynamic constant assignment"
374
377
  end
375
378
 
@@ -377,7 +380,7 @@ rule
377
380
  }
378
381
  | tCOLON3 tCONSTANT
379
382
  {
380
- if (self.in_def || self.in_single > 0) then
383
+ if (in_def || in_single > 0) then
381
384
  yyerror "dynamic constant assignment"
382
385
  end
383
386
 
@@ -385,16 +388,16 @@ rule
385
388
  }
386
389
  | backref
387
390
  {
388
- self.backref_assign_error val[0]
391
+ backref_assign_error val[0]
389
392
  }
390
393
 
391
394
  lhs: variable
392
395
  {
393
- result = self.assignable val[0]
396
+ result = assignable val[0]
394
397
  }
395
- | primary_value "[" aref_args tRBRACK
398
+ | primary_value tLBRACK2 aref_args tRBRACK
396
399
  {
397
- result = self.aryset val[0], val[2]
400
+ result = aryset val[0], val[2]
398
401
  }
399
402
  | primary_value tDOT tIDENTIFIER
400
403
  {
@@ -410,7 +413,7 @@ rule
410
413
  }
411
414
  | primary_value tCOLON2 tCONSTANT
412
415
  {
413
- if (self.in_def || self.in_single > 0) then
416
+ if (in_def || in_single > 0) then
414
417
  yyerror "dynamic constant assignment"
415
418
  end
416
419
 
@@ -418,7 +421,7 @@ rule
418
421
  }
419
422
  | tCOLON3 tCONSTANT
420
423
  {
421
- if (self.in_def || self.in_single > 0) then
424
+ if (in_def || in_single > 0) then
422
425
  yyerror "dynamic constant assignment"
423
426
  end
424
427
 
@@ -426,7 +429,7 @@ rule
426
429
  }
427
430
  | backref
428
431
  {
429
- self.backref_assign_error val[0]
432
+ backref_assign_error val[0]
430
433
  }
431
434
 
432
435
  cname: tIDENTIFIER
@@ -461,9 +464,10 @@ rule
461
464
  result = val[0]
462
465
  }
463
466
 
464
- # TODO: cruby has fsym and dsym
465
- fitem: fname { result = s(:lit, val[0].to_sym) }
466
- | symbol { result = s(:lit, val[0]) }
467
+ fsym: fname | symbol
468
+
469
+ fitem: fsym { result = s(:lit, val[0].to_sym) }
470
+ | dsym
467
471
 
468
472
  undef_list: fitem
469
473
  {
@@ -491,22 +495,22 @@ rule
491
495
  | kFOR | kIN | kMODULE | kNEXT | kNIL | kNOT
492
496
  | kOR | kREDO | kRESCUE | kRETRY | kRETURN | kSELF
493
497
  | kSUPER | kTHEN | kTRUE | kUNDEF | kWHEN | kYIELD
494
- | kIF_MOD | kUNLESS_MOD | kWHILE_MOD | kUNTIL_MOD | kRESCUE_MOD
498
+ | kIF | kUNLESS | kWHILE | kUNTIL
495
499
 
496
500
  arg: lhs tEQL arg
497
501
  {
498
- result = self.node_assign val[0], val[2]
502
+ result = node_assign val[0], val[2]
499
503
  }
500
504
  | lhs tEQL arg kRESCUE_MOD arg
501
505
  {
502
- result = self.node_assign val[0], s(:rescue, val[2], s(:resbody, s(:array), val[4]))
506
+ result = node_assign val[0], s(:rescue, val[2], new_resbody(s(:array), val[4]))
503
507
  # result.line = val[0].line
504
508
  }
505
509
  | var_lhs tOP_ASGN arg
506
510
  {
507
511
  result = new_op_asgn val
508
512
  }
509
- | primary_value "[" aref_args tRBRACK tOP_ASGN arg
513
+ | primary_value tLBRACK2 aref_args tRBRACK tOP_ASGN arg
510
514
  {
511
515
  result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
512
516
  val[2][0] = :arglist
@@ -534,7 +538,7 @@ rule
534
538
  }
535
539
  | backref tOP_ASGN arg
536
540
  {
537
- self.backref_assign_error val[0]
541
+ backref_assign_error val[0]
538
542
  }
539
543
  | arg tDOT2 arg
540
544
  {
@@ -556,101 +560,101 @@ rule
556
560
  }
557
561
  | arg tPLUS arg
558
562
  {
559
- result = new_call val[0], :+, s(:arglist, val[2])
563
+ result = new_call val[0], :+, argl(val[2])
560
564
  }
561
565
  | arg tMINUS arg
562
566
  {
563
- result = new_call val[0], :-, s(:arglist, val[2])
567
+ result = new_call val[0], :-, argl(val[2])
564
568
  }
565
569
  | arg tSTAR2 arg
566
570
  {
567
- result = new_call val[0], :*, s(:arglist, val[2])
571
+ result = new_call val[0], :*, argl(val[2])
568
572
  }
569
573
  | arg tDIVIDE arg
570
574
  {
571
- result = new_call val[0], :"/", s(:arglist, val[2])
575
+ result = new_call val[0], :"/", argl(val[2])
572
576
  }
573
577
  | arg tPERCENT arg
574
578
  {
575
- result = new_call val[0], :%, s(:arglist, val[2])
579
+ result = new_call val[0], :"%", argl(val[2])
576
580
  }
577
581
  | arg tPOW arg
578
582
  {
579
- result = new_call val[0], :**, s(:arglist, val[2])
583
+ result = new_call val[0], :**, argl(val[2])
580
584
  }
581
585
  | tUMINUS_NUM tINTEGER tPOW arg
582
586
  {
583
- result = new_call(new_call(s(:lit, val[1]), :"**", s(:arglist, val[3])), :"-@", s(:arglist))
587
+ result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@")
584
588
  }
585
589
  | tUMINUS_NUM tFLOAT tPOW arg
586
590
  {
587
- result = new_call(new_call(s(:lit, val[1]), :"**", s(:arglist, val[3])), :"-@", s(:arglist))
591
+ result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@")
588
592
  }
589
593
  | tUPLUS arg
590
594
  {
591
595
  if val[1][0] == :lit then
592
596
  result = val[1]
593
597
  else
594
- result = new_call val[1], :"+@", s(:arglist)
598
+ result = new_call val[1], :"+@"
595
599
  end
596
600
  }
597
601
  | tUMINUS arg
598
602
  {
599
- result = new_call val[1], :"-@", s(:arglist)
603
+ result = new_call val[1], :"-@"
600
604
  }
601
605
  | arg tPIPE arg
602
606
  {
603
- result = new_call val[0], :"|", s(:arglist, val[2])
607
+ result = new_call val[0], :"|", argl(val[2])
604
608
  }
605
609
  | arg tCARET arg
606
610
  {
607
- result = new_call val[0], :"^", s(:arglist, val[2])
611
+ result = new_call val[0], :"^", argl(val[2])
608
612
  }
609
613
  | arg tAMPER2 arg
610
614
  {
611
- result = new_call val[0], :"&", s(:arglist, val[2])
615
+ result = new_call val[0], :"&", argl(val[2])
612
616
  }
613
617
  | arg tCMP arg
614
618
  {
615
- result = new_call val[0], :"<=>", s(:arglist, val[2])
619
+ result = new_call val[0], :"<=>", argl(val[2])
616
620
  }
617
621
  | arg tGT arg
618
622
  {
619
- result = new_call val[0], :">", s(:arglist, val[2])
623
+ result = new_call val[0], :">", argl(val[2])
620
624
  }
621
625
  | arg tGEQ arg
622
626
  {
623
- result = new_call val[0], :">=", s(:arglist, val[2])
627
+ result = new_call val[0], :">=", argl(val[2])
624
628
  }
625
629
  | arg tLT arg
626
630
  {
627
- result = new_call val[0], :"<", s(:arglist, val[2])
631
+ result = new_call val[0], :"<", argl(val[2])
628
632
  }
629
633
  | arg tLEQ arg
630
634
  {
631
- result = new_call val[0], :"<=", s(:arglist, val[2])
635
+ result = new_call val[0], :"<=", argl(val[2])
632
636
  }
633
637
  | arg tEQ arg
634
638
  {
635
- result = new_call val[0], :"==", s(:arglist, val[2])
639
+ result = new_call val[0], :"==", argl(val[2])
636
640
  }
637
641
  | arg tEQQ arg
638
642
  {
639
- result = new_call val[0], :"===", s(:arglist, val[2])
643
+ result = new_call val[0], :"===", argl(val[2])
640
644
  }
641
645
  | arg tNEQ arg
642
646
  {
643
647
  val[0] = value_expr val[0] # TODO: port call_op and clean these
644
648
  val[2] = value_expr val[2]
645
- result = s(:not, new_call(val[0], :"==", s(:arglist, val[2])))
649
+ result = s(:not, new_call(val[0], :"==", argl(val[2])))
646
650
  }
647
651
  | arg tMATCH arg
648
652
  {
649
- result = self.get_match_node val[0], val[2]
653
+ result = get_match_node val[0], val[2]
650
654
  }
651
655
  | arg tNMATCH arg
652
656
  {
653
- result = s(:not, self.get_match_node(val[0], val[2]))
657
+ result = s(:not, get_match_node(val[0], val[2]))
654
658
  }
655
659
  | tBANG arg
656
660
  {
@@ -659,19 +663,19 @@ rule
659
663
  | tTILDE arg
660
664
  {
661
665
  val[2] = value_expr val[2]
662
- result = new_call val[1], :"~", s(:arglist)
666
+ result = new_call val[1], :"~"
663
667
  }
664
668
  | arg tLSHFT arg
665
669
  {
666
670
  val[0] = value_expr val[0]
667
671
  val[2] = value_expr val[2]
668
- result = new_call val[0], :"\<\<", s(:arglist, val[2])
672
+ result = new_call val[0], :"\<\<", argl(val[2])
669
673
  }
670
674
  | arg tRSHFT arg
671
675
  {
672
676
  val[0] = value_expr val[0]
673
677
  val[2] = value_expr val[2]
674
- result = new_call val[0], :">>", s(:arglist, val[2])
678
+ result = new_call val[0], :">>", argl(val[2])
675
679
  }
676
680
  | arg tANDOP arg
677
681
  {
@@ -687,6 +691,7 @@ rule
687
691
  }
688
692
  | arg tEH arg tCOLON arg
689
693
  {
694
+ lexer.tern.pop
690
695
  result = s(:if, val[0], val[2], val[4])
691
696
  }
692
697
  | primary
@@ -708,7 +713,7 @@ rule
708
713
  }
709
714
  | args tCOMMA tSTAR arg opt_nl
710
715
  {
711
- result = self.arg_concat val[0], val[3]
716
+ result = arg_concat val[0], val[3]
712
717
  }
713
718
  | assocs trailer
714
719
  {
@@ -748,92 +753,92 @@ rule
748
753
  }
749
754
  | args opt_block_arg
750
755
  {
751
- result = self.arg_blk_pass val[0], val[1]
756
+ result = arg_blk_pass val[0], val[1]
752
757
  }
753
758
  | args tCOMMA tSTAR arg_value opt_block_arg
754
759
  {
755
- result = self.arg_concat val[0], val[3]
756
- result = self.arg_blk_pass result, val[4]
760
+ result = arg_concat val[0], val[3]
761
+ result = arg_blk_pass result, val[4]
757
762
  }
758
763
  | assocs opt_block_arg
759
764
  {
760
765
  result = s(:array, s(:hash, *val[0].values))
761
- result = self.arg_blk_pass result, val[1]
766
+ result = arg_blk_pass result, val[1]
762
767
  }
763
768
  | assocs tCOMMA tSTAR arg_value opt_block_arg
764
769
  {
765
- result = self.arg_concat s(:array, s(:hash, *val[0].values)), val[3]
766
- result = self.arg_blk_pass result, val[4]
770
+ result = arg_concat s(:array, s(:hash, *val[0].values)), val[3]
771
+ result = arg_blk_pass result, val[4]
767
772
  }
768
773
  | args tCOMMA assocs opt_block_arg
769
774
  {
770
775
  result = val[0] << s(:hash, *val[2].values)
771
- result = self.arg_blk_pass result, val[3]
776
+ result = arg_blk_pass result, val[3]
772
777
  }
773
778
  | args tCOMMA assocs tCOMMA tSTAR arg opt_block_arg
774
779
  {
775
780
  val[0] << s(:hash, *val[2].values)
776
- result = self.arg_concat val[0], val[5]
777
- result = self.arg_blk_pass result, val[6]
781
+ result = arg_concat val[0], val[5]
782
+ result = arg_blk_pass result, val[6]
778
783
  }
779
784
  | tSTAR arg_value opt_block_arg
780
785
  {
781
- result = self.arg_blk_pass s(:splat, val[1]), val[2]
786
+ result = arg_blk_pass s(:splat, val[1]), val[2]
782
787
  }
783
788
  | block_arg
784
789
 
785
790
  call_args2: arg_value tCOMMA args opt_block_arg
786
791
  {
787
- args = self.list_prepend val[0], val[2]
788
- result = self.arg_blk_pass args, val[3]
792
+ args = list_prepend val[0], val[2]
793
+ result = arg_blk_pass args, val[3]
789
794
  }
790
795
  | arg_value tCOMMA block_arg
791
796
  {
792
- result = self.arg_blk_pass val[0], val[2]
797
+ result = arg_blk_pass val[0], val[2]
793
798
  }
794
799
  | arg_value tCOMMA tSTAR arg_value opt_block_arg
795
800
  {
796
- result = self.arg_concat s(:array, val[0]), val[3]
797
- result = self.arg_blk_pass result, val[4]
801
+ result = arg_concat s(:array, val[0]), val[3]
802
+ result = arg_blk_pass result, val[4]
798
803
  }
799
804
  | arg_value tCOMMA args tCOMMA tSTAR arg_value opt_block_arg
800
805
  {
801
- result = self.arg_concat s(:array, val[0], s(:hash, *val[2].values)), val[5]
802
- result = self.arg_blk_pass result, val[6]
806
+ result = arg_concat s(:array, val[0], s(:hash, *val[2].values)), val[5]
807
+ result = arg_blk_pass result, val[6]
803
808
  }
804
809
  | assocs opt_block_arg
805
810
  {
806
811
  result = s(:array, s(:hash, *val[0].values))
807
- result = self.arg_blk_pass result, val[1]
812
+ result = arg_blk_pass result, val[1]
808
813
  }
809
814
  | assocs tCOMMA tSTAR arg_value opt_block_arg
810
815
  {
811
816
  result = s(:array, s(:hash, *val[0].values), val[3])
812
- result = self.arg_blk_pass result, val[4]
817
+ result = arg_blk_pass result, val[4]
813
818
  }
814
819
  | arg_value tCOMMA assocs opt_block_arg
815
820
  {
816
821
  result = s(:array, val[0], s(:hash, *val[2].values))
817
- result = self.arg_blk_pass result, val[3]
822
+ result = arg_blk_pass result, val[3]
818
823
  }
819
824
  | arg_value tCOMMA args tCOMMA assocs opt_block_arg
820
825
  {
821
826
  result = s(:array, val[0]).add_all(val[2]).add(s(:hash, *val[4].values))
822
- result = self.arg_blk_pass result, val[5]
827
+ result = arg_blk_pass result, val[5]
823
828
  }
824
829
  | arg_value tCOMMA assocs tCOMMA tSTAR arg_value opt_block_arg
825
830
  {
826
- result = self.arg_concat s(:array, val[0]).add(s(:hash, *val[2].values)), val[5]
827
- result = self.arg_blk_pass result, val[6]
831
+ result = arg_concat s(:array, val[0]).add(s(:hash, *val[2].values)), val[5]
832
+ result = arg_blk_pass result, val[6]
828
833
  }
829
834
  | arg_value tCOMMA args tCOMMA assocs tCOMMA tSTAR arg_value opt_block_arg
830
835
  {
831
- result = self.arg_concat s(:array, val[0]).add_all(val[2]).add(s(:hash, *val[4].values)), val[7]
832
- result = self.arg_blk_pass result, val[8]
836
+ result = arg_concat s(:array, val[0]).add_all(val[2]).add(s(:hash, *val[4].values)), val[7]
837
+ result = arg_blk_pass result, val[8]
833
838
  }
834
839
  | tSTAR arg_value opt_block_arg
835
840
  {
836
- result = self.arg_blk_pass s(:splat, val[1]), val[2]
841
+ result = arg_blk_pass s(:splat, val[1]), val[2]
837
842
  }
838
843
  | block_arg
839
844
 
@@ -876,7 +881,7 @@ rule
876
881
  {
877
882
  result = val[1]
878
883
  }
879
- | none_block_pass
884
+ | none
880
885
 
881
886
  args: arg_value
882
887
  {
@@ -884,7 +889,7 @@ rule
884
889
  }
885
890
  | args tCOMMA arg_value
886
891
  {
887
- result = self.list_append val[0], val[2]
892
+ result = list_append val[0], val[2]
888
893
  }
889
894
 
890
895
  mrhs: args tCOMMA arg_value
@@ -893,7 +898,7 @@ rule
893
898
  }
894
899
  | args tCOMMA tSTAR arg_value
895
900
  {
896
- result = self.arg_concat val[0], val[3]
901
+ result = arg_concat val[0], val[3]
897
902
  }
898
903
  | tSTAR arg_value
899
904
  {
@@ -905,7 +910,7 @@ rule
905
910
  | xstring
906
911
  | regexp
907
912
  | words
908
- | awords
913
+ | qwords
909
914
  | var_ref
910
915
  | backref
911
916
  | tFID
@@ -948,7 +953,7 @@ rule
948
953
  {
949
954
  result = s(:colon3, val[1].to_sym)
950
955
  }
951
- | primary_value "[" aref_args tRBRACK
956
+ | primary_value tLBRACK2 aref_args tRBRACK
952
957
  {
953
958
  result = new_aref val
954
959
  }
@@ -986,7 +991,7 @@ rule
986
991
  call = new_call(nil, oper.to_sym)
987
992
  iter.insert 1, call
988
993
  result = iter
989
- call.line ||= iter.line
994
+ call.line = iter.line
990
995
  }
991
996
  | method_call
992
997
  | method_call brace_block
@@ -1039,7 +1044,7 @@ rule
1039
1044
  {
1040
1045
  result = new_case nil, val[3]
1041
1046
  }
1042
- | kFOR block_var kIN
1047
+ | kFOR for_var kIN
1043
1048
  {
1044
1049
  lexer.cond.push true
1045
1050
  }
@@ -1058,7 +1063,7 @@ rule
1058
1063
  cpath superclass
1059
1064
  {
1060
1065
  self.comments.push self.lexer.comments
1061
- if (self.in_def || self.in_single > 0) then
1066
+ if (in_def || in_single > 0) then
1062
1067
  yyerror "class definition in method body"
1063
1068
  end
1064
1069
  self.env.extend
@@ -1074,12 +1079,12 @@ rule
1074
1079
  }
1075
1080
  expr
1076
1081
  {
1077
- result = self.in_def
1082
+ result = in_def
1078
1083
  self.in_def = false
1079
1084
  }
1080
1085
  term
1081
1086
  {
1082
- result = self.in_single
1087
+ result = in_single
1083
1088
  self.in_single = 0
1084
1089
  self.env.extend
1085
1090
  }
@@ -1096,7 +1101,7 @@ rule
1096
1101
  {
1097
1102
  self.comments.push self.lexer.comments
1098
1103
  yyerror "module definition in method body" if
1099
- self.in_def or self.in_single > 0
1104
+ in_def or in_single > 0
1100
1105
 
1101
1106
  self.env.extend
1102
1107
  }
@@ -1179,29 +1184,92 @@ rule
1179
1184
  result = val[1]
1180
1185
  }
1181
1186
 
1182
- block_var: lhs
1187
+ for_var: lhs
1183
1188
  | mlhs
1184
1189
  {
1185
1190
  val[0].delete_at 1 if val[0][1].nil? # HACK
1186
1191
  }
1187
1192
 
1193
+ block_par: mlhs_item
1194
+ {
1195
+ result = s(:array, val[0])
1196
+ }
1197
+ | block_par tCOMMA mlhs_item
1198
+ {
1199
+ result = list_append val[0], val[2]
1200
+ }
1201
+
1202
+ block_var: block_par
1203
+ {
1204
+ result = block_var val[0], nil, nil
1205
+ }
1206
+ | block_par tCOMMA
1207
+ {
1208
+ result = block_var val[0], nil, nil
1209
+ }
1210
+ | block_par tCOMMA tAMPER lhs
1211
+ {
1212
+ result = block_var val[0], nil, val[3]
1213
+ }
1214
+ | block_par tCOMMA tSTAR lhs tCOMMA tAMPER lhs
1215
+ {
1216
+ result = block_var val[0], val[3], val[6]
1217
+ }
1218
+ | block_par tCOMMA tSTAR tCOMMA tAMPER lhs
1219
+ {
1220
+ result = block_var val[0], s(:splat), val[5]
1221
+ }
1222
+ | block_par tCOMMA tSTAR lhs
1223
+ {
1224
+ result = block_var val[0], val[3], nil
1225
+ }
1226
+ | block_par tCOMMA tSTAR
1227
+ {
1228
+ result = block_var val[0], s(:splat), nil
1229
+ }
1230
+ | tSTAR lhs tCOMMA tAMPER lhs
1231
+ {
1232
+ result = block_var nil, val[1], val[4]
1233
+ }
1234
+ | tSTAR tCOMMA tAMPER lhs
1235
+ {
1236
+ result = block_var nil, s(:splat), val[3]
1237
+ }
1238
+ | tSTAR lhs
1239
+ {
1240
+ result = block_var nil, val[1], nil
1241
+ }
1242
+ | tSTAR
1243
+ {
1244
+ result = block_var nil, s(:splat), nil
1245
+ }
1246
+ | tAMPER lhs
1247
+ {
1248
+ result = block_var nil, nil, val[1]
1249
+ }
1250
+ ;
1251
+
1188
1252
  opt_block_var: none
1189
1253
  | tPIPE tPIPE
1190
1254
  {
1191
1255
  result = 0
1256
+ self.lexer.command_start = true
1192
1257
  }
1193
1258
  | tOROP
1194
1259
  {
1195
1260
  result = 0
1261
+ self.lexer.command_start = true
1196
1262
  }
1197
1263
  | tPIPE block_var tPIPE
1198
1264
  {
1199
1265
  result = val[1]
1266
+ self.lexer.command_start = true
1200
1267
  }
1201
1268
 
1202
1269
  do_block: kDO_BLOCK
1203
1270
  {
1204
1271
  self.env.extend :dynamic
1272
+ result = self.lexer.lineno
1205
1273
  }
1206
1274
  opt_block_var
1207
1275
  {
@@ -1212,6 +1280,7 @@ rule
1212
1280
  vars = val[2]
1213
1281
  body = val[4]
1214
1282
  result = new_iter nil, vars, body
1283
+ result.line = val[1]
1215
1284
 
1216
1285
  self.env.unextend
1217
1286
  }
@@ -1304,7 +1373,7 @@ rule
1304
1373
  }
1305
1374
  when_args then compstmt cases
1306
1375
  {
1307
- result = s(:when, val[2], val[4])
1376
+ result = new_when(val[2], val[4])
1308
1377
  result.line = val[1]
1309
1378
  result << val[5] if val[5]
1310
1379
  }
@@ -1312,11 +1381,11 @@ rule
1312
1381
  when_args: args
1313
1382
  | args tCOMMA tSTAR arg_value
1314
1383
  {
1315
- result = self.list_append val[0], s(:when, val[3], nil)
1384
+ result = list_append val[0], new_when(val[3], nil)
1316
1385
  }
1317
1386
  | tSTAR arg_value
1318
1387
  {
1319
- result = s(:array, s(:when, val[1], nil))
1388
+ result = s(:array, new_when(val[1], nil))
1320
1389
  }
1321
1390
 
1322
1391
  cases: opt_else | case_body
@@ -1328,7 +1397,7 @@ rule
1328
1397
  klasses ||= s(:array)
1329
1398
  klasses << node_assign(var, s(:gvar, :"$!")) if var
1330
1399
 
1331
- result = s(:resbody, klasses, body)
1400
+ result = new_resbody(klasses, body)
1332
1401
  result << rest if rest # UGH, rewritten above
1333
1402
  }
1334
1403
  |
@@ -1372,7 +1441,7 @@ rule
1372
1441
  string: string1
1373
1442
  | string string1
1374
1443
  {
1375
- result = self.literal_concat val[0], val[1]
1444
+ result = literal_concat val[0], val[1]
1376
1445
  }
1377
1446
 
1378
1447
  string1: tSTRING_BEG string_contents tSTRING_END
@@ -1416,14 +1485,14 @@ rule
1416
1485
  word: string_content
1417
1486
  | word string_content
1418
1487
  {
1419
- result = self.literal_concat val[0], val[1]
1488
+ result = literal_concat val[0], val[1]
1420
1489
  }
1421
1490
 
1422
- awords: tAWORDS_BEG tSPACE tSTRING_END
1491
+ qwords: tQWORDS_BEG tSPACE tSTRING_END
1423
1492
  {
1424
1493
  result = s(:array)
1425
1494
  }
1426
- | tAWORDS_BEG qword_list tSTRING_END
1495
+ | tQWORDS_BEG qword_list tSTRING_END
1427
1496
  {
1428
1497
  result = val[1]
1429
1498
  }
@@ -1551,21 +1620,22 @@ xstring_contents: none
1551
1620
  | tGVAR
1552
1621
  | tCONSTANT
1553
1622
  | tCVAR
1554
- | kNIL { result = :nil }
1555
- | kSELF { result = :self }
1556
- | kTRUE { result = :true }
1557
- | kFALSE { result = :false }
1558
- | k__FILE__ { result = :__FILE__ }
1559
- | k__LINE__ { result = :__LINE__ }
1623
+ | kNIL { result = s(:nil) }
1624
+ | kSELF { result = s(:self) }
1625
+ | kTRUE { result = s(:true) }
1626
+ | kFALSE { result = s(:false) }
1627
+ | k__FILE__ { result = s(:str, self.file) }
1628
+ | k__LINE__ { result = s(:lit, lexer.src.current_line) }
1560
1629
 
1561
1630
  var_ref: variable
1562
1631
  {
1563
- result = self.gettable val[0]
1632
+ var = val[0]
1633
+ result = Sexp === var ? var : self.gettable(var)
1564
1634
  }
1565
1635
 
1566
1636
  var_lhs: variable
1567
1637
  {
1568
- result = self.assignable val[0]
1638
+ result = assignable val[0]
1569
1639
  }
1570
1640
 
1571
1641
  backref: tNTH_REF { result = s(:nth_ref, val[0]) }
@@ -1593,6 +1663,7 @@ xstring_contents: none
1593
1663
  {
1594
1664
  result = val[1]
1595
1665
  lexer.lex_state = :expr_beg
1666
+ self.lexer.command_start = true
1596
1667
  }
1597
1668
  | f_args term
1598
1669
  {
@@ -1638,12 +1709,16 @@ xstring_contents: none
1638
1709
 
1639
1710
  f_norm_arg: tCONSTANT
1640
1711
  {
1641
- yyerror "formal argument cannot be a constant: #{val[0]}"
1712
+ yyerror "formal argument cannot be a constant"
1642
1713
  }
1643
1714
  | tIVAR
1644
1715
  {
1645
1716
  yyerror "formal argument cannot be an instance variable"
1646
1717
  }
1718
+ | tGVAR
1719
+ {
1720
+ yyerror "formal argument cannot be a global variable"
1721
+ }
1647
1722
  | tCVAR
1648
1723
  {
1649
1724
  yyerror "formal argument cannot be a class variable"
@@ -1669,7 +1744,7 @@ xstring_contents: none
1669
1744
 
1670
1745
  f_opt: tIDENTIFIER tEQL arg_value
1671
1746
  {
1672
- result = self.assignable val[0], val[2]
1747
+ result = assignable val[0], val[2]
1673
1748
  # TODO: detect duplicate names
1674
1749
  }
1675
1750
 
@@ -1679,7 +1754,7 @@ xstring_contents: none
1679
1754
  }
1680
1755
  | f_optarg tCOMMA f_opt
1681
1756
  {
1682
- result = self.append_to_block val[0], val[2]
1757
+ result = block_append val[0], val[2]
1683
1758
  }
1684
1759
 
1685
1760
  restarg_mark: tSTAR2 | tSTAR
@@ -1688,7 +1763,7 @@ xstring_contents: none
1688
1763
  {
1689
1764
  # TODO: differs from parse.y - needs tests
1690
1765
  name = val[1].to_sym
1691
- self.assignable name
1766
+ assignable name
1692
1767
  result = :"*#{name}"
1693
1768
  }
1694
1769
  | restarg_mark
@@ -1776,8 +1851,6 @@ xstring_contents: none
1776
1851
 
1777
1852
  none: { result = nil }
1778
1853
 
1779
- none_block_pass: { result = nil }
1780
-
1781
1854
  end
1782
1855
 
1783
1856
  ---- inner