ruby_parser 3.13.1 → 3.14.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  # encoding: UTF-8
2
2
  #--
3
3
  # This file is automatically generated. Do not modify it.
4
- # Generated by: oedipus_lex version 2.5.0.
4
+ # Generated by: oedipus_lex version 2.5.1.
5
5
  # Source: lib/ruby_lexer.rex
6
6
  #++
7
7
 
data/lib/ruby_parser.rb CHANGED
@@ -11,23 +11,22 @@ class RubyParser
11
11
 
12
12
  attr_accessor :current
13
13
 
14
- class Parser < Racc::Parser
15
- include RubyParserStuff
16
-
17
- def self.inherited x
18
- RubyParser::VERSIONS << x
19
- end
20
-
21
- def self.version= v
22
- @version = v
23
- end
14
+ def self.for_current_ruby
15
+ name = "V#{RUBY_VERSION[/^\d+\.\d+/].delete "."}"
16
+ klass = if const_defined? name then
17
+ const_get name
18
+ else
19
+ latest = VERSIONS.first
20
+ warn "NOTE: RubyParser::#{name} undefined, using #{latest}."
21
+ latest
22
+ end
24
23
 
25
- def self.version
26
- @version ||= Parser > self && self.name[/(?:V|Ruby)(\d+)/, 1].to_i
27
- end
24
+ klass.new
28
25
  end
29
26
 
30
- class SyntaxError < RuntimeError; end
27
+ def self.latest
28
+ VERSIONS.first.new
29
+ end
31
30
 
32
31
  def process s, f = "(string)", t = 10
33
32
  e = nil
@@ -48,22 +47,23 @@ class RubyParser
48
47
  # do nothing
49
48
  end
50
49
 
51
- def self.latest
52
- VERSIONS.first.new
53
- end
50
+ class Parser < Racc::Parser
51
+ include RubyParserStuff
54
52
 
55
- def self.for_current_ruby
56
- name = "V#{RUBY_VERSION[/^\d+\.\d+/].delete "."}"
57
- klass = if const_defined? name then
58
- const_get name
59
- else
60
- latest = VERSIONS.first
61
- warn "NOTE: RubyParser::#{name} undefined, using #{latest}."
62
- latest
63
- end
53
+ def self.inherited x
54
+ RubyParser::VERSIONS << x
55
+ end
64
56
 
65
- klass.new
57
+ def self.version= v
58
+ @version = v
59
+ end
60
+
61
+ def self.version
62
+ @version ||= Parser > self && self.name[/(?:V|Ruby)(\d+)/, 1].to_i
63
+ end
66
64
  end
65
+
66
+ class SyntaxError < RuntimeError; end
67
67
  end
68
68
 
69
69
  ##
data/lib/ruby_parser.yy CHANGED
@@ -45,30 +45,30 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
45
45
  tLONELY
46
46
  #endif
47
47
 
48
- prechigh
49
- right tBANG tTILDE tUPLUS
50
- right tPOW
51
- right tUMINUS_NUM tUMINUS
52
- left tSTAR2 tDIVIDE tPERCENT
53
- left tPLUS tMINUS
54
- left tLSHFT tRSHFT
55
- left tAMPER2
56
- left tPIPE tCARET
57
- left tGT tGEQ tLT tLEQ
58
- nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
59
- left tANDOP
60
- left tOROP
61
- nonassoc tDOT2 tDOT3
62
- right tEH tCOLON
63
- left kRESCUE_MOD
64
- right tEQL tOP_ASGN
65
- nonassoc kDEFINED
66
- right kNOT
67
- left kOR kAND
68
- nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD
69
- nonassoc tLBRACE_ARG
70
- nonassoc tLOWEST
71
48
  preclow
49
+ nonassoc tLOWEST
50
+ nonassoc tLBRACE_ARG
51
+ nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD
52
+ left kOR kAND
53
+ right kNOT
54
+ nonassoc kDEFINED
55
+ right tEQL tOP_ASGN
56
+ left kRESCUE_MOD
57
+ right tEH tCOLON
58
+ nonassoc tDOT2 tDOT3
59
+ left tOROP
60
+ left tANDOP
61
+ nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
62
+ left tGT tGEQ tLT tLEQ
63
+ left tPIPE tCARET
64
+ left tAMPER2
65
+ left tLSHFT tRSHFT
66
+ left tPLUS tMINUS
67
+ left tSTAR2 tDIVIDE tPERCENT # TODO: tSTAR2 -> tMULT
68
+ right tUMINUS_NUM tUMINUS
69
+ right tPOW
70
+ right tBANG tTILDE tUPLUS
71
+ prechigh
72
72
 
73
73
  rule
74
74
 
@@ -82,7 +82,8 @@ rule
82
82
 
83
83
  top_compstmt: top_stmts opt_terms
84
84
  {
85
- result = val[0]
85
+ stmt, _ = val
86
+ result = stmt
86
87
  }
87
88
 
88
89
  top_stmts: none
@@ -94,14 +95,6 @@ rule
94
95
  | error top_stmt
95
96
 
96
97
  top_stmt: stmt
97
- {
98
- result = val[0]
99
-
100
- # TODO: remove once I have more confidence this is fixed
101
- # result.each_of_type :call_args do |s|
102
- # debug20 666, s, result
103
- # end
104
- }
105
98
  | klBEGIN
106
99
  {
107
100
  if (self.in_def || self.in_single > 0) then
@@ -112,14 +105,19 @@ rule
112
105
  }
113
106
  begin_block
114
107
  {
115
- _, _, block = val
116
- result = block
108
+ (_, lineno), _, iter = val
109
+ iter.line lineno
110
+
111
+ (_, preexe,) = iter
112
+ preexe.line lineno
113
+
114
+ result = iter
117
115
  }
118
116
 
119
- begin_block: tLCURLY top_compstmt tRCURLY
117
+ begin_block: tLCURLY { result = lexer.lineno } top_compstmt tRCURLY
120
118
  {
121
- _, stmt, _ = val
122
- result = new_iter s(:preexe), 0, stmt
119
+ _, line, stmt, _ = val
120
+ result = new_iter s(:preexe).line(line), 0, stmt
123
121
  }
124
122
 
125
123
  bodystmt: compstmt opt_rescue k_else
@@ -161,34 +159,27 @@ rule
161
159
  stmt_or_begin: stmt
162
160
  | klBEGIN
163
161
  {
164
- if (self.in_def || self.in_single > 0) then
165
- debug20 1
166
- yyerror "BEGIN in method"
167
- end
168
- self.env.extend
169
- }
170
- begin_block
171
- {
172
- _, _, stmt = val
173
- result = stmt
162
+ yyerror "BEGIN is permitted only at toplevel"
174
163
  }
175
164
 
176
165
  stmt: kALIAS fitem
177
166
  {
178
167
  lexer.lex_state = EXPR_FNAME
179
- result = self.lexer.lineno
180
168
  }
181
169
  fitem
182
170
  {
183
- result = s(:alias, val[1], val[3]).line(val[2])
171
+ (_, line), lhs, _, rhs = val
172
+ result = s(:alias, lhs, rhs).line(line).line line
184
173
  }
185
174
  | kALIAS tGVAR tGVAR
186
175
  {
187
- result = s(:valias, val[1].to_sym, val[2].to_sym)
176
+ (_, line), lhs, rhs = val
177
+ result = s(:valias, lhs.to_sym, rhs.to_sym).line line
188
178
  }
189
179
  | kALIAS tGVAR tBACK_REF
190
180
  {
191
- result = s(:valias, val[1].to_sym, :"$#{val[2]}")
181
+ (_, line), lhs, rhs = val
182
+ result = s(:valias, lhs.to_sym, :"$#{rhs}").line line
192
183
  }
193
184
  | kALIAS tGVAR tNTH_REF
194
185
  {
@@ -200,32 +191,41 @@ rule
200
191
  }
201
192
  | stmt kIF_MOD expr_value
202
193
  {
203
- result = new_if val[2], val[0], nil
194
+ t, _, c = val
195
+ result = new_if c, t, nil
204
196
  }
205
197
  | stmt kUNLESS_MOD expr_value
206
198
  {
207
- result = new_if val[2], nil, val[0]
199
+ f, _, c = val
200
+ result = new_if c, nil, f
208
201
  }
209
202
  | stmt kWHILE_MOD expr_value
210
203
  {
211
- result = new_while val[0], val[2], true
204
+ e, _, c = val
205
+ result = new_while e, c, true
212
206
  }
213
207
  | stmt kUNTIL_MOD expr_value
214
208
  {
215
- result = new_until val[0], val[2], true
209
+ e, _, c = val
210
+ result = new_until e, c, true
216
211
  }
217
212
  | stmt kRESCUE_MOD stmt
218
213
  {
219
214
  body, _, resbody = val
220
- result = new_rescue body, new_resbody(s(:array), resbody)
215
+
216
+ resbody = new_resbody s(:array).line(resbody.line), resbody
217
+ result = new_rescue body, resbody
221
218
  }
222
219
  | klEND tLCURLY compstmt tRCURLY
223
220
  {
221
+ (_, line), _, stmt, _ = val
222
+
224
223
  if (self.in_def || self.in_single > 0) then
225
224
  debug20 3
226
225
  yyerror "END in method; use at_exit"
227
226
  end
228
- result = new_iter s(:postexe), 0, val[2]
227
+
228
+ result = new_iter s(:postexe).line(line), 0, stmt
229
229
  }
230
230
  | command_asgn
231
231
  | mlhs tEQL command_call
@@ -234,7 +234,8 @@ rule
234
234
  }
235
235
  | lhs tEQL mrhs
236
236
  {
237
- result = new_assign val[0], s(:svalue, val[2])
237
+ lhs, _, rhs = val
238
+ result = new_assign lhs, s(:svalue, rhs).line(rhs.line)
238
239
  }
239
240
  #if V == 20
240
241
  | mlhs tEQL arg_value
@@ -264,11 +265,12 @@ rule
264
265
  }
265
266
  | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs
266
267
  {
267
- result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
268
+ result = new_op_asgn1 val
268
269
  }
269
270
  | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs
270
271
  {
271
- result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
272
+ prim, _, id, opasgn, rhs = val
273
+ result = s(:op_asgn, prim, rhs, id.to_sym, opasgn.to_sym)
272
274
  if val[1] == '&.'
273
275
  result.sexp_type = :safe_op_asgn
274
276
  end
@@ -305,9 +307,11 @@ rule
305
307
  #if V >= 24
306
308
  | command_call kRESCUE_MOD stmt
307
309
  {
308
- expr, _, resbody = val
310
+ expr, (_, line), resbody = val
311
+
309
312
  expr = value_expr expr
310
- result = new_rescue(expr, new_resbody(s(:array), resbody))
313
+ ary = s(:array).line line
314
+ result = new_rescue(expr, new_resbody(ary, resbody))
311
315
  }
312
316
  #endif
313
317
  | command_asgn
@@ -315,19 +319,26 @@ rule
315
319
  expr: command_call
316
320
  | expr kAND expr
317
321
  {
318
- result = logical_op :and, val[0], val[2]
322
+ lhs, _, rhs = val
323
+ result = logical_op :and, lhs, rhs
319
324
  }
320
325
  | expr kOR expr
321
326
  {
322
- result = logical_op :or, val[0], val[2]
327
+ lhs, _, rhs = val
328
+ result = logical_op :or, lhs, rhs
323
329
  }
324
330
  | kNOT opt_nl expr
325
331
  {
326
- result = s(:call, val[2], :"!")
332
+ (_, line), _, expr = val
333
+ result = new_call(expr, :"!").line line
334
+ # REFACTOR: call_uni_op
327
335
  }
328
336
  | tBANG command_call
329
337
  {
330
- result = s(:call, val[1], :"!")
338
+ _, cmd = val
339
+ result = new_call(cmd, :"!").line cmd.line
340
+ # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict
341
+ # REFACTOR: call_uni_op -- see parse26.y
331
342
  }
332
343
  | arg
333
344
 
@@ -354,7 +365,8 @@ rule
354
365
  block_command: block_call
355
366
  | block_call call_op2 operation2 command_args
356
367
  {
357
- result = new_call val[0], val[2].to_sym, val[3]
368
+ blk, _, msg, args = val
369
+ result = new_call(blk, msg.to_sym, args).line blk.line
358
370
  }
359
371
 
360
372
  cmd_brace_block: tLBRACE_ARG
@@ -374,26 +386,32 @@ rule
374
386
 
375
387
  fcall: operation
376
388
  {
377
- result = new_call nil, val[0].to_sym
389
+ msg, = val
390
+ result = new_call(nil, msg.to_sym).line lexer.lineno
378
391
  }
379
392
 
380
393
  command: fcall command_args =tLOWEST
381
394
  {
382
- result = val[0].concat val[1].sexp_body # REFACTOR pattern
395
+ call, args = val
396
+ result = call.concat args.sexp_body
383
397
  }
384
398
  | fcall command_args cmd_brace_block
385
399
  {
386
- result = val[0].concat val[1].sexp_body
387
- if val[2] then
388
- block_dup_check result, val[2]
400
+ call, args, block = val
401
+
402
+ result = call.concat args.sexp_body
389
403
 
390
- result, operation = val[2], result
404
+ if block then
405
+ block_dup_check result, block
406
+
407
+ result, operation = block, result
391
408
  result.insert 1, operation
392
409
  end
393
410
  }
394
411
  | primary_value call_op operation2 command_args =tLOWEST
395
412
  {
396
- result = new_call val[0], val[2].to_sym, val[3], val[1]
413
+ lhs, callop, op, args = val
414
+ result = new_call lhs, op.to_sym, args, callop
397
415
  }
398
416
  | primary_value call_op operation2 command_args cmd_brace_block
399
417
  {
@@ -425,7 +443,9 @@ rule
425
443
  }
426
444
  | kYIELD command_args
427
445
  {
428
- result = new_yield val[1]
446
+ (_, line), args = val
447
+ result = new_yield args
448
+ result.line line # TODO: push to new_yield
429
449
  }
430
450
  | k_return call_args
431
451
  {
@@ -434,8 +454,8 @@ rule
434
454
  }
435
455
  | kBREAK call_args
436
456
  {
437
- line = val[0].last
438
- result = s(:break, ret_args(val[1])).line(line)
457
+ (_, line), args = val
458
+ result = s(:break, ret_args(args)).line line
439
459
  }
440
460
  | kNEXT call_args
441
461
  {
@@ -452,56 +472,79 @@ rule
452
472
  mlhs_inner: mlhs_basic
453
473
  | tLPAREN mlhs_inner rparen
454
474
  {
455
- result = s(:masgn, s(:array, val[1]))
475
+ _, arg, _ = val
476
+ l = arg.line
477
+
478
+ result = s(:masgn, s(:array, arg).line(l)).line l
456
479
  }
457
480
 
458
481
  mlhs_basic: mlhs_head
459
482
  {
460
- result = s(:masgn, val[0])
483
+ head, = val
484
+ result = s(:masgn, head).line head.line
461
485
  }
462
486
  | mlhs_head mlhs_item
463
487
  {
464
- result = s(:masgn, val[0] << val[1].compact)
488
+ lhs, rhs = val
489
+ result = s(:masgn, lhs << rhs.compact).line lhs.line
465
490
  }
466
491
  | mlhs_head tSTAR mlhs_node
467
492
  {
468
- result = s(:masgn, val[0] << s(:splat, val[2]))
493
+ head, _, tail = val
494
+ head << s(:splat, tail).line(tail.line)
495
+ result = s(:masgn, head).line head.line
469
496
  }
470
497
  | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post
471
498
  {
472
499
  ary1, _, splat, _, ary2 = val
473
500
 
474
- result = list_append ary1, s(:splat, splat)
501
+ result = list_append ary1, s(:splat, splat).line(splat.line)
475
502
  result.concat ary2.sexp_body
476
- result = s(:masgn, result)
503
+ result = s(:masgn, result).line result.line
477
504
  }
478
505
  | mlhs_head tSTAR
479
506
  {
480
- result = s(:masgn, val[0] << s(:splat))
507
+ head, _ = val
508
+ l = head.line
509
+ result = s(:masgn, head << s(:splat).line(l)).line l
481
510
  }
482
511
  | mlhs_head tSTAR tCOMMA mlhs_post
483
512
  {
484
- ary = list_append val[0], s(:splat)
485
- ary.concat val[3].sexp_body
486
- result = s(:masgn, ary)
513
+ head, _, _, post = val
514
+ ary = list_append head, s(:splat).line(head.line)
515
+ ary.concat post.sexp_body
516
+ result = s(:masgn, ary).line ary.line
487
517
  }
488
518
  | tSTAR mlhs_node
489
519
  {
490
- result = s(:masgn, s(:array, s(:splat, val[1])))
520
+ _, node = val
521
+ l = node.line
522
+ splat = s(:splat, node).line l
523
+ ary = s(:array, splat).line l
524
+ result = s(:masgn, ary).line l
491
525
  }
492
526
  | tSTAR mlhs_node tCOMMA mlhs_post
493
527
  {
494
- ary = s(:array, s(:splat, val[1]))
495
- ary.concat val[3].sexp_body
496
- result = s(:masgn, ary)
528
+ _, node, _, post = val
529
+
530
+ splat = s(:splat, node).line node.line
531
+ ary = s(:array, splat).line splat.line
532
+ ary.concat post.sexp_body
533
+ result = s(:masgn, ary).line ary.line
497
534
  }
498
535
  | tSTAR
499
536
  {
500
- result = s(:masgn, s(:array, s(:splat)))
537
+ l = lexer.lineno
538
+ result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l
501
539
  }
502
540
  | tSTAR tCOMMA mlhs_post
503
541
  {
504
- result = s(:masgn, s(:array, s(:splat), *val[2].sexp_body))
542
+ _, _, post = val
543
+ l = post.line
544
+
545
+ splat = s(:splat).line l
546
+ ary = s(:array, splat, *post.sexp_body).line l
547
+ result = s(:masgn, ary).line l
505
548
  }
506
549
 
507
550
  mlhs_item: mlhs_node
@@ -512,7 +555,8 @@ rule
512
555
 
513
556
  mlhs_head: mlhs_item tCOMMA
514
557
  {
515
- result = s(:array, val[0])
558
+ lhs, _ = val
559
+ result = s(:array, lhs).line lhs.line
516
560
  }
517
561
  | mlhs_head mlhs_item tCOMMA
518
562
  {
@@ -521,7 +565,8 @@ rule
521
565
 
522
566
  mlhs_post: mlhs_item
523
567
  {
524
- result = s(:array, val[0])
568
+ item, = val
569
+ result = s(:array, item).line item.line
525
570
  }
526
571
  | mlhs_post tCOMMA mlhs_item
527
572
  {
@@ -546,7 +591,8 @@ rule
546
591
  }
547
592
  | primary_value tCOLON2 tIDENTIFIER
548
593
  {
549
- result = s(:attrasgn, val[0], :"#{val[2]}=")
594
+ recv, _, id = val
595
+ result = new_attrasgn recv, id
550
596
  }
551
597
  | primary_value call_op tCONSTANT
552
598
  {
@@ -559,7 +605,10 @@ rule
559
605
  yyerror "dynamic constant assignment"
560
606
  end
561
607
 
562
- result = s(:const, s(:colon2, val[0], val[2].to_sym), nil)
608
+ expr, _, id = val
609
+ l = expr.line
610
+
611
+ result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l
563
612
  }
564
613
  | tCOLON3 tCONSTANT
565
614
  {
@@ -568,7 +617,10 @@ rule
568
617
  yyerror "dynamic constant assignment"
569
618
  end
570
619
 
571
- result = s(:const, nil, s(:colon3, val[1].to_sym))
620
+ _, id = val
621
+ l = lexer.lineno
622
+
623
+ result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l
572
624
  }
573
625
  | backref
574
626
  {
@@ -577,24 +629,31 @@ rule
577
629
 
578
630
  lhs: user_variable
579
631
  {
632
+ line = lexer.lineno
580
633
  result = self.assignable val[0]
634
+ result.line = line
581
635
  }
582
636
  | keyword_variable
583
637
  {
638
+ line = lexer.lineno
584
639
  result = self.assignable val[0]
640
+ result.line = line
585
641
  debug20 9, val, result
586
642
  }
587
643
  | primary_value tLBRACK2 opt_call_args rbracket
588
644
  {
589
- result = self.aryset val[0], val[2]
645
+ lhs, _, args, _ = val
646
+ result = self.aryset lhs, args
590
647
  }
591
648
  | primary_value call_op tIDENTIFIER # REFACTOR
592
649
  {
593
- result = new_attrasgn val[0], val[2], val[1]
650
+ lhs, op, id = val
651
+ result = new_attrasgn lhs, id, op
594
652
  }
595
653
  | primary_value tCOLON2 tIDENTIFIER
596
654
  {
597
- result = s(:attrasgn, val[0], :"#{val[2]}=")
655
+ lhs, _, id = val
656
+ result = new_attrasgn lhs, id
598
657
  }
599
658
  | primary_value call_op tCONSTANT # REFACTOR?
600
659
  {
@@ -602,21 +661,27 @@ rule
602
661
  }
603
662
  | primary_value tCOLON2 tCONSTANT
604
663
  {
664
+ expr, _, id = val
665
+
605
666
  if (self.in_def || self.in_single > 0) then
606
667
  debug20 10
607
668
  yyerror "dynamic constant assignment"
608
669
  end
609
670
 
610
- result = s(:const, s(:colon2, val[0], val[2].to_sym))
671
+ l = expr.line
672
+ result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l
611
673
  }
612
674
  | tCOLON3 tCONSTANT
613
675
  {
676
+ _, id = val
677
+
614
678
  if (self.in_def || self.in_single > 0) then
615
679
  debug20 11
616
680
  yyerror "dynamic constant assignment"
617
681
  end
618
682
 
619
- result = s(:const, s(:colon3, val[1].to_sym))
683
+ l = lexer.lineno
684
+ result = s(:const, s(:colon3, id.to_sym).line(l)).line l
620
685
  }
621
686
  | backref
622
687
  {
@@ -631,7 +696,8 @@ rule
631
696
 
632
697
  cpath: tCOLON3 cname
633
698
  {
634
- result = s(:colon3, val[1].to_sym)
699
+ _, name = val
700
+ result = s(:colon3, name.to_sym).line lexer.lineno
635
701
  }
636
702
  | cname
637
703
  {
@@ -639,7 +705,10 @@ rule
639
705
  }
640
706
  | primary_value tCOLON2 cname
641
707
  {
642
- result = s(:colon2, val[0], val[2].to_sym)
708
+ pval, _, name = val
709
+
710
+ result = s(:colon2, pval, name.to_sym)
711
+ result.line pval.line
643
712
  }
644
713
 
645
714
  fname: tIDENTIFIER | tCONSTANT | tFID
@@ -660,7 +729,8 @@ rule
660
729
 
661
730
  fitem: fsym
662
731
  {
663
- result = s(:lit, val[0].to_sym)
732
+ id, = val
733
+ result = s(:lit, id.to_sym).line lexer.lineno
664
734
  }
665
735
  | dsym
666
736
 
@@ -684,6 +754,7 @@ rule
684
754
  | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE
685
755
  | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2
686
756
  #if V >= 20
757
+ # TODO: tUBANG dead?
687
758
  | tUBANG
688
759
  #endif
689
760
 
@@ -707,8 +778,7 @@ rule
707
778
  }
708
779
  | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs
709
780
  {
710
- val[2].sexp_type = :arglist if val[2]
711
- result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
781
+ result = new_op_asgn1 val
712
782
  }
713
783
  | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs
714
784
  {
@@ -720,7 +790,9 @@ rule
720
790
  }
721
791
  | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs
722
792
  {
723
- result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
793
+ lhs, _, id, op, rhs = val
794
+
795
+ result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line
724
796
  }
725
797
  | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs
726
798
  {
@@ -750,32 +822,34 @@ rule
750
822
  {
751
823
  v1, v2 = val[0], val[2]
752
824
  if v1.node_type == :lit and v2.node_type == :lit and Integer === v1.last and Integer === v2.last then
753
- result = s(:lit, (v1.last)..(v2.last))
825
+ result = s(:lit, (v1.last)..(v2.last)).line v1.line
754
826
  else
755
- result = s(:dot2, v1, v2)
827
+ result = s(:dot2, v1, v2).line v1.line
756
828
  end
757
829
  }
758
830
  | arg tDOT3 arg
759
831
  {
760
832
  v1, v2 = val[0], val[2]
761
833
  if v1.node_type == :lit and v2.node_type == :lit and Integer === v1.last and Integer === v2.last then
762
- result = s(:lit, (v1.last)...(v2.last))
834
+ result = s(:lit, (v1.last)...(v2.last)).line v1.line
763
835
  else
764
- result = s(:dot3, v1, v2)
836
+ result = s(:dot3, v1, v2).line v1.line
765
837
  end
766
838
  }
767
839
  #if V >= 26
768
840
  | arg tDOT2
769
841
  {
770
- v1, v2 = val[0], nil
842
+ v1, _ = val
843
+ v2 = nil
771
844
 
772
- result = s(:dot2, v1, v2)
845
+ result = s(:dot2, v1, v2).line v1.line
773
846
  }
774
847
  | arg tDOT3
775
848
  {
776
- v1, v2 = val[0], nil
849
+ v1, _ = val
850
+ v2 = nil
777
851
 
778
- result = s(:dot3, v1, v2)
852
+ result = s(:dot3, v1, v2).line v1.line
779
853
  }
780
854
  #endif
781
855
  | arg tPLUS arg
@@ -805,14 +879,17 @@ rule
805
879
  #if V == 20
806
880
  | tUMINUS_NUM tINTEGER tPOW arg
807
881
  {
808
- result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@")
882
+ lit = s(:lit, val[1]).line lexer.lineno
883
+ result = new_call(new_call(lit, :"**", argl(val[3])), :"-@")
809
884
  }
810
885
  | tUMINUS_NUM tFLOAT tPOW arg
811
886
  #else
812
887
  | tUMINUS_NUM simple_numeric tPOW arg
813
888
  #endif
814
889
  {
815
- result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@")
890
+ lit = s(:lit, val[1]).line lexer.lineno
891
+ result = new_call(new_call(lit, :"**", argl(val[3])), :"-@")
892
+
816
893
  #if V == 20
817
894
  ## TODO: why is this 2.0 only?
818
895
  debug20 12, val, result
@@ -857,15 +934,19 @@ rule
857
934
  }
858
935
  | arg tMATCH arg
859
936
  {
860
- result = new_match val[0], val[2]
937
+ lhs, _, rhs = val
938
+ result = new_match lhs, rhs
861
939
  }
862
940
  | arg tNMATCH arg
863
941
  {
864
- result = s(:not, new_match(val[0], val[2]))
942
+ lhs, _, rhs = val
943
+ result = s(:not, new_match(lhs, rhs)).line lhs.line
865
944
  }
866
945
  | tBANG arg
867
946
  {
868
- result = new_call val[1], :"!"
947
+ _, arg = val
948
+ result = new_call arg, :"!"
949
+ result.line arg.line
869
950
  }
870
951
  | tTILDE arg
871
952
  {
@@ -893,11 +974,13 @@ rule
893
974
  }
894
975
  | kDEFINED opt_nl arg
895
976
  {
896
- result = s(:defined, val[2])
977
+ (_, line), _, arg = val
978
+ result = s(:defined, arg).line line
897
979
  }
898
980
  | arg tEH arg opt_nl tCOLON arg
899
981
  {
900
- result = s(:if, val[0], val[2], val[5])
982
+ c, _, t, _, _, f = val
983
+ result = s(:if, c, t, f).line c.line
901
984
  }
902
985
  | primary
903
986
 
@@ -940,28 +1023,25 @@ rule
940
1023
  arg_rhs: arg =tOP_ASGN
941
1024
  | arg kRESCUE_MOD arg
942
1025
  {
943
- body, _, resbody = val
1026
+ body, (_, line), resbody = val
944
1027
  body = value_expr body
945
1028
  resbody = remove_begin resbody
946
- result = new_rescue(body, new_resbody(s(:array), resbody))
1029
+
1030
+ ary = s(:array).line line
1031
+ result = new_rescue(body, new_resbody(ary, resbody))
947
1032
  }
948
1033
 
949
1034
  paren_args: tLPAREN2 opt_call_args rparen
950
1035
  {
951
- result = val[1]
1036
+ _, args, _ = val
1037
+ result = args
952
1038
  }
953
1039
 
954
1040
  opt_paren_args: none
955
1041
  | paren_args
956
1042
 
957
1043
  opt_call_args: none
958
- {
959
- result = val[0]
960
- }
961
1044
  | call_args
962
- {
963
- result = val[0]
964
- }
965
1045
  | args tCOMMA
966
1046
  {
967
1047
  result = args val
@@ -1011,7 +1091,8 @@ rule
1011
1091
 
1012
1092
  block_arg: tAMPER arg_value
1013
1093
  {
1014
- result = s(:block_pass, val[1])
1094
+ _, arg = val
1095
+ result = s(:block_pass, arg).line arg.line
1015
1096
  }
1016
1097
 
1017
1098
  opt_block_arg: tCOMMA block_arg
@@ -1022,19 +1103,24 @@ rule
1022
1103
 
1023
1104
  args: arg_value
1024
1105
  {
1025
- result = s(:array, val[0])
1106
+ arg, = val
1107
+
1108
+ result = s(:array, arg).line arg.line
1026
1109
  }
1027
1110
  | tSTAR arg_value
1028
1111
  {
1029
- result = s(:array, s(:splat, val[1]))
1112
+ _, arg = val
1113
+ result = s(:array, s(:splat, arg).line(arg.line)).line arg.line
1030
1114
  }
1031
1115
  | args tCOMMA arg_value
1032
1116
  {
1033
- result = self.list_append val[0], val[2]
1117
+ args, _, id = val
1118
+ result = self.list_append args, id
1034
1119
  }
1035
- | args tCOMMA tSTAR arg_value
1120
+ | args tCOMMA tSTAR { result = lexer.lineno } arg_value
1036
1121
  {
1037
- result = self.list_append val[0], s(:splat, val[3])
1122
+ args, _, _, line, id = val
1123
+ result = self.list_append args, s(:splat, id).line(line)
1038
1124
  }
1039
1125
 
1040
1126
  #if V >= 21
@@ -1054,11 +1140,15 @@ rule
1054
1140
  }
1055
1141
  | args tCOMMA tSTAR arg_value
1056
1142
  {
1057
- result = self.arg_concat val[0], val[3]
1143
+ # FIX: bad shift/reduce conflict with rhs' comma star prod
1144
+ # TODO: make all tXXXX terminals include lexer.lineno
1145
+ arg, _, _, splat = val
1146
+ result = self.arg_concat arg, splat
1058
1147
  }
1059
1148
  | tSTAR arg_value
1060
1149
  {
1061
- result = s(:splat, val[1])
1150
+ _, arg = val
1151
+ result = s(:splat, arg).line arg.line
1062
1152
  }
1063
1153
 
1064
1154
  primary: literal
@@ -1073,7 +1163,8 @@ rule
1073
1163
  | backref
1074
1164
  | tFID
1075
1165
  {
1076
- result = new_call nil, val[0].to_sym
1166
+ msg, = val
1167
+ result = new_call nil, msg.to_sym
1077
1168
  }
1078
1169
  | k_begin
1079
1170
  {
@@ -1093,16 +1184,19 @@ rule
1093
1184
 
1094
1185
  result.line = val[1]
1095
1186
  }
1096
- | tLPAREN_ARG rparen
1187
+ | tLPAREN_ARG
1097
1188
  {
1098
- # TODO: lex_state = EXPR_ENDARG in between
1099
- debug20 13, val, result
1189
+ lexer.lex_state = EXPR_ENDARG
1190
+ result = lexer.lineno
1191
+ }
1192
+ rparen
1193
+ {
1194
+ _, line, _ = val
1195
+ result = s(:begin).line line
1100
1196
  }
1101
1197
  | tLPAREN_ARG
1102
1198
  {
1103
1199
  result = lexer.cmdarg.store false
1104
- # result = self.lexer.cmdarg.stack.dup
1105
- # lexer.cmdarg.stack.replace [false] # TODO add api for these
1106
1200
  }
1107
1201
  stmt
1108
1202
  {
@@ -1117,21 +1211,29 @@ rule
1117
1211
  }
1118
1212
  | tLPAREN compstmt tRPAREN
1119
1213
  {
1120
- result = val[1] || s(:nil)
1214
+ _, stmt, _ = val
1215
+ result = stmt
1216
+ result ||= s(:nil).line lexer.lineno
1121
1217
  result.paren = true
1122
1218
  }
1123
1219
  | primary_value tCOLON2 tCONSTANT
1124
1220
  {
1125
- result = s(:colon2, val[0], val[2].to_sym)
1221
+ expr, _, id = val
1222
+
1223
+ result = s(:colon2, expr, id.to_sym).line expr.line
1126
1224
  }
1127
1225
  | tCOLON3 tCONSTANT
1128
1226
  {
1129
- result = s(:colon3, val[1].to_sym)
1227
+ _, id = val
1228
+
1229
+ result = s(:colon3, id.to_sym).line lexer.lineno
1130
1230
  }
1131
- | tLBRACK aref_args tRBRACK
1231
+ | tLBRACK { result = lexer.lineno } aref_args tRBRACK
1132
1232
  {
1133
- result = val[1] || s(:array)
1233
+ _, line, args, _ = val
1234
+ result = args || s(:array)
1134
1235
  result.sexp_type = :array # aref_args is :args
1236
+ result.line line
1135
1237
  }
1136
1238
  | tLBRACE
1137
1239
  {
@@ -1143,7 +1245,8 @@ rule
1143
1245
  }
1144
1246
  | k_return
1145
1247
  {
1146
- result = s(:return)
1248
+ (_, line), = val
1249
+ result = s(:return).line line
1147
1250
  }
1148
1251
  | kYIELD tLPAREN2 call_args rparen
1149
1252
  {
@@ -1159,11 +1262,14 @@ rule
1159
1262
  }
1160
1263
  | kDEFINED opt_nl tLPAREN2 expr rparen
1161
1264
  {
1162
- result = s(:defined, val[3])
1265
+ (_, line), _, _, arg, _ = val
1266
+
1267
+ result = s(:defined, arg).line line
1163
1268
  }
1164
1269
  | kNOT tLPAREN2 expr rparen
1165
1270
  {
1166
- result = s(:call, val[2], :"!")
1271
+ _, _, lhs, _ = val
1272
+ result = new_call lhs, :"!"
1167
1273
  }
1168
1274
  | kNOT tLPAREN2 rparen
1169
1275
  {
@@ -1171,11 +1277,11 @@ rule
1171
1277
  }
1172
1278
  | fcall brace_block
1173
1279
  {
1174
- oper, iter = val[0], val[1]
1175
- call = oper # FIX
1280
+ call, iter = val
1281
+
1176
1282
  iter.insert 1, call
1177
1283
  result = iter
1178
- call.line = iter.line
1284
+ # FIX: probably not: call.line = iter.line
1179
1285
  }
1180
1286
  | method_call
1181
1287
  | method_call brace_block
@@ -1292,7 +1398,7 @@ rule
1292
1398
  # TODO: port local_push_gen and local_pop_gen
1293
1399
  lexer.cmdarg.stack.replace [false]
1294
1400
  }
1295
- f_arglist bodystmt k_end
1401
+ f_arglist bodystmt { result = lexer.lineno } k_end
1296
1402
  {
1297
1403
  in_def, cmdarg = val[2]
1298
1404
 
@@ -1318,9 +1424,8 @@ rule
1318
1424
  }
1319
1425
  f_arglist bodystmt k_end
1320
1426
  {
1321
- line, cmdarg = val[5]
1427
+ _, cmdarg = val[5]
1322
1428
  result = new_defs val
1323
- result[3].line line
1324
1429
 
1325
1430
  lexer.cmdarg.stack.replace cmdarg
1326
1431
 
@@ -1330,19 +1435,23 @@ rule
1330
1435
  }
1331
1436
  | kBREAK
1332
1437
  {
1333
- result = s(:break)
1438
+ (_, line), = val
1439
+ result = s(:break).line line
1334
1440
  }
1335
1441
  | kNEXT
1336
1442
  {
1337
- result = s(:next)
1443
+ (_, line), = val
1444
+ result = s(:next).line line
1338
1445
  }
1339
1446
  | kREDO
1340
1447
  {
1341
- result = s(:redo)
1448
+ (_, line), = val
1449
+ result = s(:redo).line line
1342
1450
  }
1343
1451
  | kRETRY
1344
1452
  {
1345
- result = s(:retry)
1453
+ (_, line), = val
1454
+ result = s(:retry).line line
1346
1455
  }
1347
1456
 
1348
1457
  primary_value: primary
@@ -1381,7 +1490,9 @@ rule
1381
1490
  if_tail: opt_else
1382
1491
  | k_elsif expr_value then compstmt if_tail
1383
1492
  {
1384
- result = s(:if, val[1], val[3], val[4])
1493
+ (_, line), c, _, t, rest = val
1494
+
1495
+ result = s(:if, c, t, rest).line line
1385
1496
  }
1386
1497
 
1387
1498
  opt_else: none
@@ -1404,7 +1515,9 @@ rule
1404
1515
 
1405
1516
  f_marg_list: f_marg
1406
1517
  {
1407
- result = s(:array, val[0])
1518
+ sym, = val
1519
+
1520
+ result = s(:array, sym).line lexer.lineno
1408
1521
  }
1409
1522
  | f_marg_list tCOMMA f_marg
1410
1523
  {
@@ -1478,7 +1591,9 @@ rule
1478
1591
  }
1479
1592
  | f_block_arg
1480
1593
  {
1481
- result = call_args val
1594
+ line = lexer.lineno
1595
+ result = call_args val # TODO: push line down
1596
+ result.line line
1482
1597
  }
1483
1598
 
1484
1599
  opt_block_args_tail: tCOMMA block_args_tail
@@ -1509,7 +1624,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1509
1624
  }
1510
1625
  | f_arg tCOMMA
1511
1626
  {
1512
- result = args val
1627
+ result = args(val) << nil
1513
1628
  }
1514
1629
  | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1515
1630
  {
@@ -1561,7 +1676,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1561
1676
  }
1562
1677
  | tOROP
1563
1678
  {
1564
- result = s(:args)
1679
+ result = s(:args).line lexer.lineno
1565
1680
  }
1566
1681
  | tPIPE block_param opt_bv_decl tPIPE
1567
1682
  {
@@ -1586,33 +1701,33 @@ opt_block_args_tail: tCOMMA block_args_tail
1586
1701
 
1587
1702
  bvar: tIDENTIFIER
1588
1703
  {
1589
- result = s(:shadow, val[0].to_sym)
1704
+ id, = val
1705
+ line = lexer.lineno
1706
+ result = s(:shadow, id.to_sym).line line
1590
1707
  }
1591
1708
  | f_bad_arg
1592
1709
 
1593
1710
  lambda: {
1594
1711
  self.env.extend :dynamic
1595
- result = self.lexer.lineno
1596
-
1597
- result = lexer.lpar_beg
1712
+ result = [lexer.lineno, lexer.lpar_beg]
1598
1713
  lexer.paren_nest += 1
1599
1714
  lexer.lpar_beg = lexer.paren_nest
1600
1715
  }
1601
1716
  f_larglist
1602
1717
  {
1603
- result = [lexer.cmdarg.store(false), self.lexer.lineno]
1718
+ result = lexer.cmdarg.store(false)
1604
1719
  }
1605
1720
  lambda_body
1606
1721
  {
1607
- lpar, args, (cmdarg, lineno), body = val
1722
+ (line, lpar), args, cmdarg, body = val
1608
1723
  lexer.lpar_beg = lpar
1609
1724
 
1610
1725
  lexer.cmdarg.restore cmdarg
1611
1726
  lexer.cmdarg.lexpop
1612
1727
 
1613
- call = new_call nil, :lambda
1728
+ call = s(:lambda).line line
1614
1729
  result = new_iter call, args, body
1615
- result.line = lineno
1730
+ result.line = line
1616
1731
  self.env.unextend
1617
1732
  }
1618
1733
 
@@ -1637,8 +1752,8 @@ opt_block_args_tail: tCOMMA block_args_tail
1637
1752
 
1638
1753
  do_block: k_do_block do_body kEND
1639
1754
  {
1640
- # TODO: maybe fix lineno to kDO's lineno?
1641
- result = val[1]
1755
+ (_, line), iter, _ = val
1756
+ result = iter.line line
1642
1757
  }
1643
1758
 
1644
1759
  block_call: command do_block
@@ -1652,8 +1767,10 @@ opt_block_args_tail: tCOMMA block_args_tail
1652
1767
 
1653
1768
  val = invert_block_call val if inverted? val
1654
1769
 
1655
- result = val[1]
1656
- result.insert 1, val[0]
1770
+ cmd, blk = val
1771
+
1772
+ result = blk
1773
+ result.insert 1, cmd
1657
1774
  }
1658
1775
  | block_call call_op2 operation2 opt_paren_args
1659
1776
  {
@@ -1684,8 +1801,10 @@ opt_block_args_tail: tCOMMA block_args_tail
1684
1801
  }
1685
1802
  paren_args
1686
1803
  {
1687
- args = self.call_args val[2..-1]
1688
- result = val[0].concat args.sexp_body
1804
+ call, lineno, args = val
1805
+
1806
+ result = call.concat args.sexp_body if args
1807
+ result.line lineno
1689
1808
  }
1690
1809
  | primary_value call_op operation2 opt_paren_args
1691
1810
  {
@@ -1713,7 +1832,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1713
1832
  }
1714
1833
  | kSUPER
1715
1834
  {
1716
- result = s(:zsuper)
1835
+ result = s(:zsuper).line lexer.lineno
1717
1836
  }
1718
1837
  | primary_value tLBRACK2 opt_call_args rbracket
1719
1838
  {
@@ -1795,7 +1914,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1795
1914
  (_, line), klasses, var, _, body, rest = val
1796
1915
 
1797
1916
  klasses ||= s(:array)
1798
- klasses << new_assign(var, s(:gvar, :"$!")) if var
1917
+ klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var
1799
1918
  klasses.line line
1800
1919
 
1801
1920
  result = new_resbody(klasses, body)
@@ -1808,7 +1927,8 @@ opt_block_args_tail: tCOMMA block_args_tail
1808
1927
 
1809
1928
  exc_list: arg_value
1810
1929
  {
1811
- result = s(:array, val[0])
1930
+ arg, = val
1931
+ result = s(:array, arg).line arg.line
1812
1932
  }
1813
1933
  | mrhs
1814
1934
  | none
@@ -1821,26 +1941,31 @@ opt_block_args_tail: tCOMMA block_args_tail
1821
1941
 
1822
1942
  opt_ensure: k_ensure compstmt
1823
1943
  {
1824
- _, body = val
1944
+ (_, line), body = val
1825
1945
 
1826
- result = body || s(:nil)
1946
+ result = body || s(:nil).line(line)
1827
1947
  }
1828
1948
  | none
1829
1949
 
1830
1950
  literal: numeric
1831
1951
  {
1952
+ line = lexer.lineno
1832
1953
  result = s(:lit, val[0])
1954
+ result.line = line
1833
1955
  }
1834
1956
  | symbol
1835
1957
  {
1958
+ line = lexer.lineno
1836
1959
  result = s(:lit, val[0])
1960
+ result.line = line
1837
1961
  }
1838
1962
  | dsym
1839
1963
 
1840
1964
  strings: string
1841
1965
  {
1842
- val[0] = s(:dstr, val[0].value) if val[0].sexp_type == :evstr
1843
- result = val[0]
1966
+ str, = val
1967
+ str = s(:dstr, str.value) if str.sexp_type == :evstr
1968
+ result = str
1844
1969
  }
1845
1970
 
1846
1971
  string: tCHAR
@@ -1855,7 +1980,11 @@ opt_block_args_tail: tCOMMA block_args_tail
1855
1980
 
1856
1981
  string1: tSTRING_BEG string_contents tSTRING_END
1857
1982
  {
1858
- result = val[1]
1983
+ _, str, (_, func) = val
1984
+
1985
+ str = dedent str if func =~ RubyLexer::STR_FUNC_ICNTNT
1986
+
1987
+ result = str
1859
1988
  }
1860
1989
  | tSTRING
1861
1990
  {
@@ -1865,6 +1994,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1865
1994
  xstring: tXSTRING_BEG xstring_contents tSTRING_END
1866
1995
  {
1867
1996
  result = new_xstring val[1]
1997
+ # TODO: dedent?!?! SERIOUSLY?!?
1868
1998
  }
1869
1999
 
1870
2000
  regexp: tREGEXP_BEG regexp_contents tREGEXP_END
@@ -1874,7 +2004,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1874
2004
 
1875
2005
  words: tWORDS_BEG tSPACE tSTRING_END
1876
2006
  {
1877
- result = s(:array)
2007
+ result = s(:array).line lexer.lineno
1878
2008
  }
1879
2009
  | tWORDS_BEG word_list tSTRING_END
1880
2010
  {
@@ -1898,25 +2028,28 @@ opt_block_args_tail: tCOMMA block_args_tail
1898
2028
 
1899
2029
  symbols: tSYMBOLS_BEG tSPACE tSTRING_END
1900
2030
  {
1901
- result = s(:array)
2031
+ result = s(:array).line lexer.lineno
1902
2032
  }
1903
- | tSYMBOLS_BEG symbol_list tSTRING_END
2033
+ | tSYMBOLS_BEG { result = lexer.lineno } symbol_list tSTRING_END
1904
2034
  {
1905
- result = val[1]
2035
+ _, line, list, _, = val
2036
+ list.line = line
2037
+ result = list
1906
2038
  }
1907
2039
 
1908
2040
  symbol_list: none
1909
2041
  {
1910
- result = new_symbol_list
2042
+ result = new_symbol_list.line lexer.lineno
1911
2043
  }
1912
2044
  | symbol_list word tSPACE
1913
2045
  {
1914
- result = val[0].dup << new_symbol_list_entry(val)
2046
+ list, * = val
2047
+ result = list.dup << new_symbol_list_entry(val)
1915
2048
  }
1916
2049
 
1917
2050
  qwords: tQWORDS_BEG tSPACE tSTRING_END
1918
2051
  {
1919
- result = s(:array)
2052
+ result = s(:array).line lexer.lineno
1920
2053
  }
1921
2054
  | tQWORDS_BEG qword_list tSTRING_END
1922
2055
  {
@@ -1925,7 +2058,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1925
2058
 
1926
2059
  qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END
1927
2060
  {
1928
- result = s(:array)
2061
+ result = s(:array).line lexer.lineno # FIX
1929
2062
  }
1930
2063
  | tQSYMBOLS_BEG qsym_list tSTRING_END
1931
2064
  {
@@ -1952,11 +2085,12 @@ opt_block_args_tail: tCOMMA block_args_tail
1952
2085
 
1953
2086
  string_contents: none
1954
2087
  {
1955
- result = s(:str, "")
2088
+ result = s(:str, "").line lexer.lineno
1956
2089
  }
1957
2090
  | string_contents string_content
1958
2091
  {
1959
- result = literal_concat(val[0], val[1])
2092
+ v1, v2 = val
2093
+ result = literal_concat v1, v2
1960
2094
  }
1961
2095
 
1962
2096
  xstring_contents: none
@@ -1965,7 +2099,8 @@ xstring_contents: none
1965
2099
  }
1966
2100
  | xstring_contents string_content
1967
2101
  {
1968
- result = literal_concat(val[0], val[1])
2102
+ v1, v2 = val
2103
+ result = literal_concat v1, v2
1969
2104
  }
1970
2105
 
1971
2106
  regexp_contents: none
@@ -1974,7 +2109,8 @@ regexp_contents: none
1974
2109
  }
1975
2110
  | regexp_contents string_content
1976
2111
  {
1977
- result = literal_concat(val[0], val[1])
2112
+ v1, v2 = val
2113
+ result = literal_concat v1, v2
1978
2114
  }
1979
2115
 
1980
2116
  string_content: tSTRING_CONTENT
@@ -1990,8 +2126,9 @@ regexp_contents: none
1990
2126
  }
1991
2127
  string_dvar
1992
2128
  {
1993
- lexer.lex_strterm = val[1]
1994
- result = s(:evstr, val[2])
2129
+ _, strterm, str = val
2130
+ lexer.lex_strterm = strterm
2131
+ result = s(:evstr, str).line str.line
1995
2132
  }
1996
2133
  | tSTRING_DBEG
1997
2134
  {
@@ -2001,6 +2138,7 @@ regexp_contents: none
2001
2138
  lexer.cond.store,
2002
2139
  lexer.cmdarg.store,
2003
2140
  lexer.lex_state,
2141
+ lexer.lineno,
2004
2142
  ]
2005
2143
 
2006
2144
  lexer.lex_strterm = nil
@@ -2014,7 +2152,7 @@ regexp_contents: none
2014
2152
  {
2015
2153
  _, memo, stmt, _ = val
2016
2154
 
2017
- lex_strterm, brace_nest, string_nest, oldcond, oldcmdarg, oldlex_state = memo
2155
+ lex_strterm, brace_nest, string_nest, oldcond, oldcmdarg, oldlex_state, line = memo
2018
2156
 
2019
2157
  lexer.lex_strterm = lex_strterm
2020
2158
  lexer.brace_nest = brace_nest
@@ -2031,19 +2169,19 @@ regexp_contents: none
2031
2169
  when :str, :dstr, :evstr then
2032
2170
  result = stmt
2033
2171
  else
2034
- result = s(:evstr, stmt)
2172
+ result = s(:evstr, stmt).line line
2035
2173
  end
2036
2174
  when nil then
2037
- result = s(:evstr)
2175
+ result = s(:evstr).line line
2038
2176
  else
2039
2177
  debug20 25
2040
2178
  raise "unknown string body: #{stmt.inspect}"
2041
2179
  end
2042
2180
  }
2043
2181
 
2044
- string_dvar: tGVAR { result = s(:gvar, val[0].to_sym) }
2045
- | tIVAR { result = s(:ivar, val[0].to_sym) }
2046
- | tCVAR { result = s(:cvar, val[0].to_sym) }
2182
+ string_dvar: tGVAR { result = s(:gvar, val[0].to_sym).line lexer.lineno }
2183
+ | tIVAR { result = s(:ivar, val[0].to_sym).line lexer.lineno }
2184
+ | tCVAR { result = s(:cvar, val[0].to_sym).line lexer.lineno }
2047
2185
  | backref
2048
2186
 
2049
2187
  symbol: tSYMBEG sym
@@ -2060,18 +2198,19 @@ regexp_contents: none
2060
2198
 
2061
2199
  dsym: tSYMBEG xstring_contents tSTRING_END
2062
2200
  {
2201
+ _, result, _ = val
2202
+
2063
2203
  lexer.lex_state = EXPR_END
2064
- result = val[1]
2065
2204
 
2066
- result ||= s(:str, "")
2205
+ result ||= s(:str, "").line lexer.lineno
2067
2206
 
2068
2207
  case result.sexp_type
2069
2208
  when :dstr then
2070
2209
  result.sexp_type = :dsym
2071
2210
  when :str then
2072
- result = s(:lit, result.last.to_sym)
2211
+ result = s(:lit, result.last.to_sym).line result.line
2073
2212
  when :evstr then
2074
- result = s(:dsym, "", result)
2213
+ result = s(:dsym, "", result).line result.line
2075
2214
  else
2076
2215
  debug20 26, val, result
2077
2216
  end
@@ -2108,19 +2247,20 @@ regexp_contents: none
2108
2247
  | tCONSTANT
2109
2248
  | tCVAR
2110
2249
 
2111
- keyword_variable: kNIL { result = s(:nil) }
2112
- | kSELF { result = s(:self) }
2113
- | kTRUE { result = s(:true) }
2114
- | kFALSE { result = s(:false) }
2115
- | k__FILE__ { result = s(:str, self.file) }
2116
- | k__LINE__ { result = s(:lit, lexer.lineno) }
2250
+ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
2251
+ | kSELF { result = s(:self).line lexer.lineno }
2252
+ | kTRUE { result = s(:true).line lexer.lineno }
2253
+ | kFALSE { result = s(:false).line lexer.lineno }
2254
+ | k__FILE__ { result = s(:str, self.file).line lexer.lineno }
2255
+ | k__LINE__ { result = s(:lit, lexer.lineno).line lexer.lineno }
2117
2256
  | k__ENCODING__
2118
2257
  {
2258
+ l = lexer.lineno
2119
2259
  result =
2120
2260
  if defined? Encoding then
2121
- s(:colon2, s(:const, :Encoding), :UTF_8)
2261
+ s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l
2122
2262
  else
2123
- s(:str, "Unsupported!")
2263
+ s(:str, "Unsupported!").line l
2124
2264
  end
2125
2265
  }
2126
2266
 
@@ -2145,8 +2285,8 @@ keyword_variable: kNIL { result = s(:nil) }
2145
2285
  debug20 29, val, result
2146
2286
  }
2147
2287
 
2148
- backref: tNTH_REF { result = s(:nth_ref, val[0]) }
2149
- | tBACK_REF { result = s(:back_ref, val[0]) }
2288
+ backref: tNTH_REF { result = s(:nth_ref, val[0]).line lexer.lineno }
2289
+ | tBACK_REF { result = s(:back_ref, val[0]).line lexer.lineno }
2150
2290
 
2151
2291
  superclass: tLT
2152
2292
  {
@@ -2311,12 +2451,13 @@ keyword_variable: kNIL { result = s(:nil) }
2311
2451
 
2312
2452
  f_arg: f_arg_item
2313
2453
  {
2314
- case val[0]
2454
+ arg, = val
2455
+
2456
+ case arg
2315
2457
  when Symbol then
2316
- result = s(:args)
2317
- result << val[0]
2458
+ result = s(:args, arg).line lexer.lineno
2318
2459
  when Sexp then
2319
- result = val[0]
2460
+ result = arg
2320
2461
  else
2321
2462
  debug20 32
2322
2463
  raise "Unknown f_arg type: #{val.inspect}"
@@ -2329,7 +2470,7 @@ keyword_variable: kNIL { result = s(:nil) }
2329
2470
  if list.sexp_type == :args then
2330
2471
  result = list
2331
2472
  else
2332
- result = s(:args, list)
2473
+ result = s(:args, list).line list.line
2333
2474
  end
2334
2475
 
2335
2476
  result << item
@@ -2343,21 +2484,24 @@ keyword_variable: kNIL { result = s(:nil) }
2343
2484
  f_kw: f_label arg_value
2344
2485
  #endif
2345
2486
  {
2346
- # TODO: call_args
2347
- label, _ = val[0] # TODO: fix lineno?
2487
+ # TODO: new_kw_arg
2488
+ (label, line), arg = val
2489
+
2348
2490
  identifier = label.to_sym
2349
2491
  self.env[identifier] = :lvar
2350
2492
 
2351
- result = s(:array, s(:kwarg, identifier, val[1]))
2493
+ kwarg = s(:kwarg, identifier, arg).line line
2494
+ result = s(:array, kwarg).line line
2352
2495
  }
2353
2496
  #if V >= 21
2354
2497
  | f_label
2355
2498
  {
2356
- label, _ = val[0] # TODO: fix lineno?
2357
- identifier = label.to_sym
2358
- self.env[identifier] = :lvar
2499
+ (label, line), = val
2359
2500
 
2360
- result = s(:array, s(:kwarg, identifier))
2501
+ id = label.to_sym
2502
+ self.env[id] = :lvar
2503
+
2504
+ result = s(:array, s(:kwarg, id).line(line)).line line
2361
2505
  }
2362
2506
  #endif
2363
2507
 
@@ -2367,21 +2511,22 @@ keyword_variable: kNIL { result = s(:nil) }
2367
2511
  f_block_kw: f_label primary_value
2368
2512
  #endif
2369
2513
  {
2370
- # TODO: call_args
2371
- label, _ = val[0] # TODO: fix lineno?
2372
- identifier = label.to_sym
2373
- self.env[identifier] = :lvar
2514
+ # TODO: new_kw_arg
2515
+ (label, line), expr = val
2516
+ id = label.to_sym
2517
+ self.env[id] = :lvar
2374
2518
 
2375
- result = s(:array, s(:kwarg, identifier, val[1]))
2519
+ result = s(:array, s(:kwarg, id, expr).line(line)).line line
2376
2520
  }
2377
2521
  #if V >= 21
2378
2522
  | f_label
2379
2523
  {
2380
- label, _ = val[0] # TODO: fix lineno?
2381
- identifier = label.to_sym
2382
- self.env[identifier] = :lvar
2524
+ # TODO: new_kw_arg
2525
+ (label, line), = val
2526
+ id = label.to_sym
2527
+ self.env[id] = :lvar
2383
2528
 
2384
- result = s(:array, s(:kwarg, identifier))
2529
+ result = s(:array, s(:kwarg, id).line(line)).line line
2385
2530
  }
2386
2531
  #endif
2387
2532
 
@@ -2437,17 +2582,20 @@ keyword_variable: kNIL { result = s(:nil) }
2437
2582
 
2438
2583
  f_block_optarg: f_block_opt
2439
2584
  {
2440
- result = s(:block, val[0])
2585
+ optblk, = val
2586
+ result = s(:block, optblk).line optblk.line
2441
2587
  }
2442
2588
  | f_block_optarg tCOMMA f_block_opt
2443
2589
  {
2444
- result = val[0]
2445
- result << val[2]
2590
+ optarg, _, optblk = val
2591
+ result = optarg
2592
+ result << optblk
2446
2593
  }
2447
2594
 
2448
2595
  f_optarg: f_opt
2449
2596
  {
2450
- result = s(:block, val[0])
2597
+ opt, = val
2598
+ result = s(:block, opt).line opt.line
2451
2599
  }
2452
2600
  | f_optarg tCOMMA f_opt
2453
2601
  {
@@ -2501,14 +2649,11 @@ keyword_variable: kNIL { result = s(:nil) }
2501
2649
  result.sexp_type == :lit
2502
2650
  }
2503
2651
 
2504
- assoc_list: none # [!nil]
2652
+ assoc_list: none
2505
2653
  {
2506
- result = s(:array)
2507
- }
2508
- | assocs trailer # [!nil]
2509
- {
2510
- result = val[0]
2654
+ result = s(:array).line lexer.lineno
2511
2655
  }
2656
+ | assocs trailer
2512
2657
 
2513
2658
  assocs: assoc
2514
2659
  | assocs tCOMMA assoc
@@ -2522,24 +2667,29 @@ keyword_variable: kNIL { result = s(:nil) }
2522
2667
 
2523
2668
  assoc: arg_value tASSOC arg_value
2524
2669
  {
2525
- result = s(:array, val[0], val[2])
2670
+ v1, _, v2 = val
2671
+ result = s(:array, v1, v2).line v1.line
2526
2672
  }
2527
2673
  | tLABEL arg_value
2528
2674
  {
2529
- (label, _), arg = val
2530
- result = s(:array, s(:lit, label.to_sym), arg)
2675
+ (label, line), arg = val
2676
+
2677
+ lit = s(:lit, label.to_sym).line line
2678
+ result = s(:array, lit, arg).line line
2531
2679
  }
2532
2680
  #if V >= 22
2533
2681
  | tSTRING_BEG string_contents tLABEL_END arg_value
2534
2682
  {
2535
2683
  _, sym, _, value = val
2536
2684
  sym.sexp_type = :dsym
2537
- result = s(:array, sym, value)
2685
+ result = s(:array, sym, value).line sym.line
2538
2686
  }
2539
2687
  #endif
2540
2688
  | tDSTAR arg_value
2541
2689
  {
2542
- result = s(:array, s(:kwsplat, val[1]))
2690
+ _, arg = val
2691
+ line = arg.line
2692
+ result = s(:array, s(:kwsplat, arg).line(line)).line line
2543
2693
  }
2544
2694
 
2545
2695
  operation: tIDENTIFIER | tCONSTANT | tFID