ruby_parser 3.13.1 → 3.14.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.
@@ -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