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.
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 tUBANG
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
- debug20 1
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
- debug20 2, val, result
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
- debug20 3
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, opasgn, rhs = val
243
- result = s(:op_asgn, prim, rhs, id.to_sym, opasgn.to_sym)
244
- if val[1] == '&.'
245
- result.sexp_type = :safe_op_asgn
246
- end
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
- result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
252
- if val[1] == '&.'
253
- result.sexp_type = :safe_op_asgn
254
- end
255
- result.line = val[0].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, op, rhs = val
277
+ lhs1, _, (lhs2, line), (id, _), rhs = val
260
278
 
261
- result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, op.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, op, rhs = val
283
+ lhs1, _, (lhs2, line), (id, _), rhs = val
266
284
 
267
- result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, op.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 = 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 lexer.lineno
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
- result = new_call val[0], val[2].to_sym, val[3]
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
- result = new_attrasgn val[0], val[2], val[1]
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
- result = new_attrasgn val[0], val[2], val[1]
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
- debug20 7
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
- debug20 8
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
- self.backref_assign_error val[0]
645
+ ref, = val
646
+
647
+ self.backref_assign_error ref
598
648
  }
599
649
 
600
650
  lhs: user_variable
601
651
  {
602
- line = lexer.lineno
603
- result = self.assignable val[0]
604
- result.line = line
652
+ var, = val
653
+
654
+ result = self.assignable var
605
655
  }
606
656
  | keyword_variable
607
657
  {
608
- line = lexer.lineno
609
- result = self.assignable val[0]
610
- result.line = line
611
- debug20 9, val, result
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
- result = new_attrasgn val[0], val[2], val[1]
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
- debug20 10
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
- debug20 11
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 lexer.lineno
724
+ _, (name, line) = val
725
+ result = s(:colon3, name.to_sym).line line
671
726
  }
672
727
  | cname
673
728
  {
674
- result = val[0].to_sym
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
- fsym: fname | symbol
699
-
700
- fitem: fsym
748
+ fitem: fname
701
749
  {
702
- id, = val
703
- result = s(:lit, id.to_sym).line lexer.lineno
750
+ (id, line), = val
751
+
752
+ result = s(:lit, id.to_sym).line line
704
753
  }
705
- | dsym
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
- result = self.lexer.lineno
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.node_type == :lit and v2.node_type == :lit and Integer === v1.last and Integer === v2.last then
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.node_type == :lit and v2.node_type == :lit and Integer === v1.last and Integer === v2.last then
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
- lit = s(:lit, val[1]).line lexer.lineno
848
- result = new_call(new_call(lit, :"**", argl(val[3])), :"-@")
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 lexer.lineno
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
- debug20 14, val, result
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
- | tLAMBDA lambda
1338
+ | lambda
1260
1339
  {
1261
- result = val[1] # TODO: fix lineno
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.comments # we don't care about comments in the body
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.comments # we don't care about comments in the body
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.comments # we don't care about comments in the body
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 { result = lexer.lineno } k_end
1448
+ f_arglist bodystmt k_end
1367
1449
  {
1368
- in_def = val[2]
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.comments # we don't care about comments in the body
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 = [self.in_def, lexer.lineno]
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
- result = new_defs val
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.comments # we don't care about comments in the body
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 tSTAR f_norm_arg
1605
+ | f_marg_list tCOMMA f_rest_marg
1512
1606
  {
1513
- args, _, _, splat = val
1607
+ args, _, rest = val
1514
1608
 
1515
- result = block_var args, "*#{splat}".to_sym
1609
+ result = block_var args, rest
1516
1610
  }
1517
- | f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list
1611
+ | f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list
1518
1612
  {
1519
- args, _, _, splat, _, args2 = val
1613
+ lhs, _, splat, _, rhs = val
1520
1614
 
1521
- result = block_var args, "*#{splat}".to_sym, args2
1615
+ result = block_var lhs, splat, rhs
1522
1616
  }
1523
- | f_marg_list tCOMMA tSTAR
1617
+ | f_rest_marg
1524
1618
  {
1525
- args, _, _ = val
1619
+ rest, = val
1526
1620
 
1527
- result = block_var args, :*
1621
+ result = block_var rest
1528
1622
  }
1529
- | f_marg_list tCOMMA tSTAR tCOMMA f_marg_list
1623
+ | f_rest_marg tCOMMA f_marg_list
1530
1624
  {
1531
- args, _, _, _, args2 = val
1625
+ splat, _, rest = val
1532
1626
 
1533
- result = block_var args, :*, args2
1627
+ result = block_var splat, rest
1534
1628
  }
1535
- | tSTAR f_norm_arg
1536
- {
1537
- _, splat = val
1538
1629
 
1539
- result = block_var :"*#{splat}"
1540
- }
1541
- | tSTAR f_norm_arg tCOMMA f_marg_list
1630
+ f_rest_marg: tSTAR f_norm_arg
1542
1631
  {
1543
- _, splat, _, args = val
1632
+ _, (id, line) = val
1544
1633
 
1545
- result = block_var :"*#{splat}", args
1634
+ result = args ["*#{id}".to_sym]
1635
+ result.line line
1546
1636
  }
1547
1637
  | tSTAR
1548
1638
  {
1549
- result = block_var :*
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 = lexer.lineno
1573
- result = call_args val # TODO: push line down
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 = 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
- syntax_error "Both block arg and actual block given." if
1743
- val[0].block_pass?
1831
+ cmd, blk = val
1744
1832
 
1745
- val = invert_block_call val if inverted? val
1833
+ syntax_error "Both block arg and actual block given." if
1834
+ cmd.block_pass?
1746
1835
 
1747
- cmd, blk = val
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
- result = new_call val[0], val[2].to_sym, val[3]
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, lineno, args = val
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
- result = new_call val[0], val[2].to_sym, val[3], val[1]
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
- result = new_call val[0], val[2].to_sym, val[3]
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
- result = new_call val[0], val[2].to_sym
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 = 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 = 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
- args then compstmt cases
1996
+ case_args then compstmt cases
1877
1997
  {
1878
1998
  result = new_when(val[2], val[4])
1879
- result.line = val[1]
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 = lexer.lineno
1926
- result = s(:lit, val[0])
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
- debug20 23, val, result
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::STR_FUNC_ICNTNT
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
- result = s(:array).line lexer.lineno
2596
+ (_, line), _, _ = val
2597
+
2598
+ result = s(:array).line line
1981
2599
  }
1982
2600
  | tWORDS_BEG word_list tSTRING_END
1983
2601
  {
1984
- result = val[1]
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
- result = s(:array).line lexer.lineno
2624
+ (_, line), _, _ = val
2625
+
2626
+ result = s(:array).line line
2005
2627
  }
2006
- | tSYMBOLS_BEG { result = lexer.lineno } symbol_list tSTRING_END
2628
+ | tSYMBOLS_BEG symbol_list tSTRING_END
2007
2629
  {
2008
- _, line, list, _, = val
2009
- list.line = 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.line lexer.lineno
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
- result = s(:array).line lexer.lineno
2647
+ (_, line), _, _ = val
2648
+
2649
+ result = s(:array).line line
2026
2650
  }
2027
2651
  | tQWORDS_BEG qword_list tSTRING_END
2028
2652
  {
2029
- result = val[1]
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
- result = s(:array).line lexer.lineno # FIX
2660
+ (_, line), _, _ = val
2661
+
2662
+ result = s(:array).line line
2035
2663
  }
2036
2664
  | tQSYMBOLS_BEG qsym_list tSTRING_END
2037
2665
  {
2038
- result = val[1]
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
- result = s(:str, "").line lexer.lineno
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
- debug20 25
2783
+ debug 38
2153
2784
  raise "unknown string body: #{stmt.inspect}"
2154
2785
  end
2155
2786
  }
2156
2787
 
2157
- string_dvar: tGVAR { result = s(:gvar, val[0].to_sym).line lexer.lineno }
2158
- | tIVAR { result = s(:ivar, val[0].to_sym).line lexer.lineno }
2159
- | tCVAR { result = s(:cvar, val[0].to_sym).line lexer.lineno }
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: tSYMBEG sym
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 = val[1].to_sym
2813
+ result = s(:lit, id.to_sym).line line
2166
2814
  }
2167
2815
  | tSYMBOL
2168
2816
  {
2169
- result = val[0].to_sym
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 xstring_contents tSTRING_END
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
- debug20 26, val, result
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
- result = -val[1] # TODO: pt_testcase
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
- var = val[0]
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
- debug20 29, val, result
2900
+ debug 40
2247
2901
  }
2248
2902
 
2249
- backref: tNTH_REF { result = s(:nth_ref, val[0]).line lexer.lineno }
2250
- | tBACK_REF { result = s(:back_ref, val[0]).line lexer.lineno }
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[1]
2269
- self.lexer.lex_state = EXPR_BEG
2270
- self.lexer.command_start = true
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
- kwarg, args, _ = val
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
- identifier = val[0].to_sym
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
- result = val[1]
3076
+ _, margs, _ = val
3077
+
3078
+ result = margs
2403
3079
  }
2404
3080
 
2405
3081
  f_arg: f_arg_item
2406
3082
  {
2407
- arg, = val
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
- name = val[1].to_sym
2493
- self.assignable name
2494
- result = :"**#{name}"
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
- result = :"**"
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
- result = self.assignable val[0], val[2]
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
- result = self.assignable val[0], val[2]
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
- name = val[1].to_sym
2540
- self.assignable name
2541
- result = :"*#{name}"
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
- identifier = val[1].to_sym
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
- result = val[1]
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
- result = s(:array, sym, value).line sym.line
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 }