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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.autotest +18 -29
- data/History.rdoc +38 -0
- data/README.rdoc +3 -3
- data/Rakefile +10 -13
- data/bin/ruby_parse +3 -1
- data/lib/ruby20_parser.rb +3042 -2866
- data/lib/ruby20_parser.y +391 -247
- data/lib/ruby21_parser.rb +3088 -2916
- data/lib/ruby21_parser.y +399 -254
- data/lib/ruby22_parser.rb +3118 -2937
- data/lib/ruby22_parser.y +400 -255
- data/lib/ruby23_parser.rb +3119 -2940
- data/lib/ruby23_parser.y +400 -255
- data/lib/ruby24_parser.rb +3089 -2905
- data/lib/ruby24_parser.y +404 -257
- data/lib/ruby25_parser.rb +3089 -2905
- data/lib/ruby25_parser.y +404 -257
- data/lib/ruby26_parser.rb +3095 -2909
- data/lib/ruby26_parser.y +410 -261
- data/lib/ruby_lexer.rb +424 -432
- data/lib/ruby_lexer.rex.rb +1 -1
- data/lib/ruby_parser.rb +27 -27
- data/lib/ruby_parser.yy +412 -262
- data/lib/ruby_parser_extras.rb +627 -406
- data/test/test_ruby_lexer.rb +1148 -1093
- data/test/test_ruby_parser.rb +2259 -1915
- data/test/test_ruby_parser_extras.rb +39 -4
- data/tools/munge.rb +1 -1
- data/tools/ripper.rb +13 -2
- metadata +8 -8
- metadata.gz.sig +0 -0
data/lib/ruby20_parser.y
CHANGED
@@ -20,30 +20,30 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
|
|
20
20
|
tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA
|
21
21
|
tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND tUBANG
|
22
22
|
|
23
|
-
prechigh
|
24
|
-
right tBANG tTILDE tUPLUS
|
25
|
-
right tPOW
|
26
|
-
right tUMINUS_NUM tUMINUS
|
27
|
-
left tSTAR2 tDIVIDE tPERCENT
|
28
|
-
left tPLUS tMINUS
|
29
|
-
left tLSHFT tRSHFT
|
30
|
-
left tAMPER2
|
31
|
-
left tPIPE tCARET
|
32
|
-
left tGT tGEQ tLT tLEQ
|
33
|
-
nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
|
34
|
-
left tANDOP
|
35
|
-
left tOROP
|
36
|
-
nonassoc tDOT2 tDOT3
|
37
|
-
right tEH tCOLON
|
38
|
-
left kRESCUE_MOD
|
39
|
-
right tEQL tOP_ASGN
|
40
|
-
nonassoc kDEFINED
|
41
|
-
right kNOT
|
42
|
-
left kOR kAND
|
43
|
-
nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD
|
44
|
-
nonassoc tLBRACE_ARG
|
45
|
-
nonassoc tLOWEST
|
46
23
|
preclow
|
24
|
+
nonassoc tLOWEST
|
25
|
+
nonassoc tLBRACE_ARG
|
26
|
+
nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD
|
27
|
+
left kOR kAND
|
28
|
+
right kNOT
|
29
|
+
nonassoc kDEFINED
|
30
|
+
right tEQL tOP_ASGN
|
31
|
+
left kRESCUE_MOD
|
32
|
+
right tEH tCOLON
|
33
|
+
nonassoc tDOT2 tDOT3
|
34
|
+
left tOROP
|
35
|
+
left tANDOP
|
36
|
+
nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
|
37
|
+
left tGT tGEQ tLT tLEQ
|
38
|
+
left tPIPE tCARET
|
39
|
+
left tAMPER2
|
40
|
+
left tLSHFT tRSHFT
|
41
|
+
left tPLUS tMINUS
|
42
|
+
left tSTAR2 tDIVIDE tPERCENT # TODO: tSTAR2 -> tMULT
|
43
|
+
right tUMINUS_NUM tUMINUS
|
44
|
+
right tPOW
|
45
|
+
right tBANG tTILDE tUPLUS
|
46
|
+
prechigh
|
47
47
|
|
48
48
|
rule
|
49
49
|
|
@@ -57,7 +57,8 @@ rule
|
|
57
57
|
|
58
58
|
top_compstmt: top_stmts opt_terms
|
59
59
|
{
|
60
|
-
|
60
|
+
stmt, _ = val
|
61
|
+
result = stmt
|
61
62
|
}
|
62
63
|
|
63
64
|
top_stmts: none
|
@@ -69,14 +70,6 @@ rule
|
|
69
70
|
| error top_stmt
|
70
71
|
|
71
72
|
top_stmt: stmt
|
72
|
-
{
|
73
|
-
result = val[0]
|
74
|
-
|
75
|
-
# TODO: remove once I have more confidence this is fixed
|
76
|
-
# result.each_of_type :call_args do |s|
|
77
|
-
# debug20 666, s, result
|
78
|
-
# end
|
79
|
-
}
|
80
73
|
| klBEGIN
|
81
74
|
{
|
82
75
|
if (self.in_def || self.in_single > 0) then
|
@@ -87,14 +80,19 @@ rule
|
|
87
80
|
}
|
88
81
|
begin_block
|
89
82
|
{
|
90
|
-
_, _,
|
91
|
-
|
83
|
+
(_, lineno), _, iter = val
|
84
|
+
iter.line lineno
|
85
|
+
|
86
|
+
(_, preexe,) = iter
|
87
|
+
preexe.line lineno
|
88
|
+
|
89
|
+
result = iter
|
92
90
|
}
|
93
91
|
|
94
|
-
begin_block: tLCURLY top_compstmt tRCURLY
|
92
|
+
begin_block: tLCURLY { result = lexer.lineno } top_compstmt tRCURLY
|
95
93
|
{
|
96
|
-
_, stmt, _ = val
|
97
|
-
result = new_iter s(:preexe), 0, stmt
|
94
|
+
_, line, stmt, _ = val
|
95
|
+
result = new_iter s(:preexe).line(line), 0, stmt
|
98
96
|
}
|
99
97
|
|
100
98
|
bodystmt: compstmt opt_rescue k_else
|
@@ -136,34 +134,27 @@ rule
|
|
136
134
|
stmt_or_begin: stmt
|
137
135
|
| klBEGIN
|
138
136
|
{
|
139
|
-
|
140
|
-
debug20 1
|
141
|
-
yyerror "BEGIN in method"
|
142
|
-
end
|
143
|
-
self.env.extend
|
144
|
-
}
|
145
|
-
begin_block
|
146
|
-
{
|
147
|
-
_, _, stmt = val
|
148
|
-
result = stmt
|
137
|
+
yyerror "BEGIN is permitted only at toplevel"
|
149
138
|
}
|
150
139
|
|
151
140
|
stmt: kALIAS fitem
|
152
141
|
{
|
153
142
|
lexer.lex_state = EXPR_FNAME
|
154
|
-
result = self.lexer.lineno
|
155
143
|
}
|
156
144
|
fitem
|
157
145
|
{
|
158
|
-
|
146
|
+
(_, line), lhs, _, rhs = val
|
147
|
+
result = s(:alias, lhs, rhs).line(line).line line
|
159
148
|
}
|
160
149
|
| kALIAS tGVAR tGVAR
|
161
150
|
{
|
162
|
-
|
151
|
+
(_, line), lhs, rhs = val
|
152
|
+
result = s(:valias, lhs.to_sym, rhs.to_sym).line line
|
163
153
|
}
|
164
154
|
| kALIAS tGVAR tBACK_REF
|
165
155
|
{
|
166
|
-
|
156
|
+
(_, line), lhs, rhs = val
|
157
|
+
result = s(:valias, lhs.to_sym, :"$#{rhs}").line line
|
167
158
|
}
|
168
159
|
| kALIAS tGVAR tNTH_REF
|
169
160
|
{
|
@@ -175,32 +166,41 @@ rule
|
|
175
166
|
}
|
176
167
|
| stmt kIF_MOD expr_value
|
177
168
|
{
|
178
|
-
|
169
|
+
t, _, c = val
|
170
|
+
result = new_if c, t, nil
|
179
171
|
}
|
180
172
|
| stmt kUNLESS_MOD expr_value
|
181
173
|
{
|
182
|
-
|
174
|
+
f, _, c = val
|
175
|
+
result = new_if c, nil, f
|
183
176
|
}
|
184
177
|
| stmt kWHILE_MOD expr_value
|
185
178
|
{
|
186
|
-
|
179
|
+
e, _, c = val
|
180
|
+
result = new_while e, c, true
|
187
181
|
}
|
188
182
|
| stmt kUNTIL_MOD expr_value
|
189
183
|
{
|
190
|
-
|
184
|
+
e, _, c = val
|
185
|
+
result = new_until e, c, true
|
191
186
|
}
|
192
187
|
| stmt kRESCUE_MOD stmt
|
193
188
|
{
|
194
189
|
body, _, resbody = val
|
195
|
-
|
190
|
+
|
191
|
+
resbody = new_resbody s(:array).line(resbody.line), resbody
|
192
|
+
result = new_rescue body, resbody
|
196
193
|
}
|
197
194
|
| klEND tLCURLY compstmt tRCURLY
|
198
195
|
{
|
196
|
+
(_, line), _, stmt, _ = val
|
197
|
+
|
199
198
|
if (self.in_def || self.in_single > 0) then
|
200
199
|
debug20 3
|
201
200
|
yyerror "END in method; use at_exit"
|
202
201
|
end
|
203
|
-
|
202
|
+
|
203
|
+
result = new_iter s(:postexe).line(line), 0, stmt
|
204
204
|
}
|
205
205
|
| command_asgn
|
206
206
|
| mlhs tEQL command_call
|
@@ -209,7 +209,8 @@ rule
|
|
209
209
|
}
|
210
210
|
| lhs tEQL mrhs
|
211
211
|
{
|
212
|
-
|
212
|
+
lhs, _, rhs = val
|
213
|
+
result = new_assign lhs, s(:svalue, rhs).line(rhs.line)
|
213
214
|
}
|
214
215
|
| mlhs tEQL arg_value
|
215
216
|
{
|
@@ -235,11 +236,12 @@ rule
|
|
235
236
|
}
|
236
237
|
| primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs
|
237
238
|
{
|
238
|
-
result =
|
239
|
+
result = new_op_asgn1 val
|
239
240
|
}
|
240
241
|
| primary_value call_op tIDENTIFIER tOP_ASGN command_rhs
|
241
242
|
{
|
242
|
-
|
243
|
+
prim, _, id, opasgn, rhs = val
|
244
|
+
result = s(:op_asgn, prim, rhs, id.to_sym, opasgn.to_sym)
|
243
245
|
if val[1] == '&.'
|
244
246
|
result.sexp_type = :safe_op_asgn
|
245
247
|
end
|
@@ -278,19 +280,26 @@ rule
|
|
278
280
|
expr: command_call
|
279
281
|
| expr kAND expr
|
280
282
|
{
|
281
|
-
|
283
|
+
lhs, _, rhs = val
|
284
|
+
result = logical_op :and, lhs, rhs
|
282
285
|
}
|
283
286
|
| expr kOR expr
|
284
287
|
{
|
285
|
-
|
288
|
+
lhs, _, rhs = val
|
289
|
+
result = logical_op :or, lhs, rhs
|
286
290
|
}
|
287
291
|
| kNOT opt_nl expr
|
288
292
|
{
|
289
|
-
|
293
|
+
(_, line), _, expr = val
|
294
|
+
result = new_call(expr, :"!").line line
|
295
|
+
# REFACTOR: call_uni_op
|
290
296
|
}
|
291
297
|
| tBANG command_call
|
292
298
|
{
|
293
|
-
|
299
|
+
_, cmd = val
|
300
|
+
result = new_call(cmd, :"!").line cmd.line
|
301
|
+
# TODO: fix line number to tBANG... but causes BAD shift/reduce conflict
|
302
|
+
# REFACTOR: call_uni_op -- see parse26.y
|
294
303
|
}
|
295
304
|
| arg
|
296
305
|
|
@@ -317,7 +326,8 @@ rule
|
|
317
326
|
block_command: block_call
|
318
327
|
| block_call call_op2 operation2 command_args
|
319
328
|
{
|
320
|
-
|
329
|
+
blk, _, msg, args = val
|
330
|
+
result = new_call(blk, msg.to_sym, args).line blk.line
|
321
331
|
}
|
322
332
|
|
323
333
|
cmd_brace_block: tLBRACE_ARG
|
@@ -337,26 +347,32 @@ rule
|
|
337
347
|
|
338
348
|
fcall: operation
|
339
349
|
{
|
340
|
-
|
350
|
+
msg, = val
|
351
|
+
result = new_call(nil, msg.to_sym).line lexer.lineno
|
341
352
|
}
|
342
353
|
|
343
354
|
command: fcall command_args =tLOWEST
|
344
355
|
{
|
345
|
-
|
356
|
+
call, args = val
|
357
|
+
result = call.concat args.sexp_body
|
346
358
|
}
|
347
359
|
| fcall command_args cmd_brace_block
|
348
360
|
{
|
349
|
-
|
350
|
-
|
351
|
-
|
361
|
+
call, args, block = val
|
362
|
+
|
363
|
+
result = call.concat args.sexp_body
|
352
364
|
|
353
|
-
|
365
|
+
if block then
|
366
|
+
block_dup_check result, block
|
367
|
+
|
368
|
+
result, operation = block, result
|
354
369
|
result.insert 1, operation
|
355
370
|
end
|
356
371
|
}
|
357
372
|
| primary_value call_op operation2 command_args =tLOWEST
|
358
373
|
{
|
359
|
-
|
374
|
+
lhs, callop, op, args = val
|
375
|
+
result = new_call lhs, op.to_sym, args, callop
|
360
376
|
}
|
361
377
|
| primary_value call_op operation2 command_args cmd_brace_block
|
362
378
|
{
|
@@ -388,7 +404,9 @@ rule
|
|
388
404
|
}
|
389
405
|
| kYIELD command_args
|
390
406
|
{
|
391
|
-
|
407
|
+
(_, line), args = val
|
408
|
+
result = new_yield args
|
409
|
+
result.line line # TODO: push to new_yield
|
392
410
|
}
|
393
411
|
| k_return call_args
|
394
412
|
{
|
@@ -397,8 +415,8 @@ rule
|
|
397
415
|
}
|
398
416
|
| kBREAK call_args
|
399
417
|
{
|
400
|
-
line = val
|
401
|
-
result = s(:break, ret_args(
|
418
|
+
(_, line), args = val
|
419
|
+
result = s(:break, ret_args(args)).line line
|
402
420
|
}
|
403
421
|
| kNEXT call_args
|
404
422
|
{
|
@@ -415,56 +433,79 @@ rule
|
|
415
433
|
mlhs_inner: mlhs_basic
|
416
434
|
| tLPAREN mlhs_inner rparen
|
417
435
|
{
|
418
|
-
|
436
|
+
_, arg, _ = val
|
437
|
+
l = arg.line
|
438
|
+
|
439
|
+
result = s(:masgn, s(:array, arg).line(l)).line l
|
419
440
|
}
|
420
441
|
|
421
442
|
mlhs_basic: mlhs_head
|
422
443
|
{
|
423
|
-
|
444
|
+
head, = val
|
445
|
+
result = s(:masgn, head).line head.line
|
424
446
|
}
|
425
447
|
| mlhs_head mlhs_item
|
426
448
|
{
|
427
|
-
|
449
|
+
lhs, rhs = val
|
450
|
+
result = s(:masgn, lhs << rhs.compact).line lhs.line
|
428
451
|
}
|
429
452
|
| mlhs_head tSTAR mlhs_node
|
430
453
|
{
|
431
|
-
|
454
|
+
head, _, tail = val
|
455
|
+
head << s(:splat, tail).line(tail.line)
|
456
|
+
result = s(:masgn, head).line head.line
|
432
457
|
}
|
433
458
|
| mlhs_head tSTAR mlhs_node tCOMMA mlhs_post
|
434
459
|
{
|
435
460
|
ary1, _, splat, _, ary2 = val
|
436
461
|
|
437
|
-
result = list_append ary1, s(:splat, splat)
|
462
|
+
result = list_append ary1, s(:splat, splat).line(splat.line)
|
438
463
|
result.concat ary2.sexp_body
|
439
|
-
result = s(:masgn, result)
|
464
|
+
result = s(:masgn, result).line result.line
|
440
465
|
}
|
441
466
|
| mlhs_head tSTAR
|
442
467
|
{
|
443
|
-
|
468
|
+
head, _ = val
|
469
|
+
l = head.line
|
470
|
+
result = s(:masgn, head << s(:splat).line(l)).line l
|
444
471
|
}
|
445
472
|
| mlhs_head tSTAR tCOMMA mlhs_post
|
446
473
|
{
|
447
|
-
|
448
|
-
ary
|
449
|
-
|
474
|
+
head, _, _, post = val
|
475
|
+
ary = list_append head, s(:splat).line(head.line)
|
476
|
+
ary.concat post.sexp_body
|
477
|
+
result = s(:masgn, ary).line ary.line
|
450
478
|
}
|
451
479
|
| tSTAR mlhs_node
|
452
480
|
{
|
453
|
-
|
481
|
+
_, node = val
|
482
|
+
l = node.line
|
483
|
+
splat = s(:splat, node).line l
|
484
|
+
ary = s(:array, splat).line l
|
485
|
+
result = s(:masgn, ary).line l
|
454
486
|
}
|
455
487
|
| tSTAR mlhs_node tCOMMA mlhs_post
|
456
488
|
{
|
457
|
-
|
458
|
-
|
459
|
-
|
489
|
+
_, node, _, post = val
|
490
|
+
|
491
|
+
splat = s(:splat, node).line node.line
|
492
|
+
ary = s(:array, splat).line splat.line
|
493
|
+
ary.concat post.sexp_body
|
494
|
+
result = s(:masgn, ary).line ary.line
|
460
495
|
}
|
461
496
|
| tSTAR
|
462
497
|
{
|
463
|
-
|
498
|
+
l = lexer.lineno
|
499
|
+
result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l
|
464
500
|
}
|
465
501
|
| tSTAR tCOMMA mlhs_post
|
466
502
|
{
|
467
|
-
|
503
|
+
_, _, post = val
|
504
|
+
l = post.line
|
505
|
+
|
506
|
+
splat = s(:splat).line l
|
507
|
+
ary = s(:array, splat, *post.sexp_body).line l
|
508
|
+
result = s(:masgn, ary).line l
|
468
509
|
}
|
469
510
|
|
470
511
|
mlhs_item: mlhs_node
|
@@ -475,7 +516,8 @@ rule
|
|
475
516
|
|
476
517
|
mlhs_head: mlhs_item tCOMMA
|
477
518
|
{
|
478
|
-
|
519
|
+
lhs, _ = val
|
520
|
+
result = s(:array, lhs).line lhs.line
|
479
521
|
}
|
480
522
|
| mlhs_head mlhs_item tCOMMA
|
481
523
|
{
|
@@ -484,7 +526,8 @@ rule
|
|
484
526
|
|
485
527
|
mlhs_post: mlhs_item
|
486
528
|
{
|
487
|
-
|
529
|
+
item, = val
|
530
|
+
result = s(:array, item).line item.line
|
488
531
|
}
|
489
532
|
| mlhs_post tCOMMA mlhs_item
|
490
533
|
{
|
@@ -509,7 +552,8 @@ rule
|
|
509
552
|
}
|
510
553
|
| primary_value tCOLON2 tIDENTIFIER
|
511
554
|
{
|
512
|
-
|
555
|
+
recv, _, id = val
|
556
|
+
result = new_attrasgn recv, id
|
513
557
|
}
|
514
558
|
| primary_value call_op tCONSTANT
|
515
559
|
{
|
@@ -522,7 +566,10 @@ rule
|
|
522
566
|
yyerror "dynamic constant assignment"
|
523
567
|
end
|
524
568
|
|
525
|
-
|
569
|
+
expr, _, id = val
|
570
|
+
l = expr.line
|
571
|
+
|
572
|
+
result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l
|
526
573
|
}
|
527
574
|
| tCOLON3 tCONSTANT
|
528
575
|
{
|
@@ -531,7 +578,10 @@ rule
|
|
531
578
|
yyerror "dynamic constant assignment"
|
532
579
|
end
|
533
580
|
|
534
|
-
|
581
|
+
_, id = val
|
582
|
+
l = lexer.lineno
|
583
|
+
|
584
|
+
result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l
|
535
585
|
}
|
536
586
|
| backref
|
537
587
|
{
|
@@ -540,24 +590,31 @@ rule
|
|
540
590
|
|
541
591
|
lhs: user_variable
|
542
592
|
{
|
593
|
+
line = lexer.lineno
|
543
594
|
result = self.assignable val[0]
|
595
|
+
result.line = line
|
544
596
|
}
|
545
597
|
| keyword_variable
|
546
598
|
{
|
599
|
+
line = lexer.lineno
|
547
600
|
result = self.assignable val[0]
|
601
|
+
result.line = line
|
548
602
|
debug20 9, val, result
|
549
603
|
}
|
550
604
|
| primary_value tLBRACK2 opt_call_args rbracket
|
551
605
|
{
|
552
|
-
|
606
|
+
lhs, _, args, _ = val
|
607
|
+
result = self.aryset lhs, args
|
553
608
|
}
|
554
609
|
| primary_value call_op tIDENTIFIER # REFACTOR
|
555
610
|
{
|
556
|
-
|
611
|
+
lhs, op, id = val
|
612
|
+
result = new_attrasgn lhs, id, op
|
557
613
|
}
|
558
614
|
| primary_value tCOLON2 tIDENTIFIER
|
559
615
|
{
|
560
|
-
|
616
|
+
lhs, _, id = val
|
617
|
+
result = new_attrasgn lhs, id
|
561
618
|
}
|
562
619
|
| primary_value call_op tCONSTANT # REFACTOR?
|
563
620
|
{
|
@@ -565,21 +622,27 @@ rule
|
|
565
622
|
}
|
566
623
|
| primary_value tCOLON2 tCONSTANT
|
567
624
|
{
|
625
|
+
expr, _, id = val
|
626
|
+
|
568
627
|
if (self.in_def || self.in_single > 0) then
|
569
628
|
debug20 10
|
570
629
|
yyerror "dynamic constant assignment"
|
571
630
|
end
|
572
631
|
|
573
|
-
|
632
|
+
l = expr.line
|
633
|
+
result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l
|
574
634
|
}
|
575
635
|
| tCOLON3 tCONSTANT
|
576
636
|
{
|
637
|
+
_, id = val
|
638
|
+
|
577
639
|
if (self.in_def || self.in_single > 0) then
|
578
640
|
debug20 11
|
579
641
|
yyerror "dynamic constant assignment"
|
580
642
|
end
|
581
643
|
|
582
|
-
|
644
|
+
l = lexer.lineno
|
645
|
+
result = s(:const, s(:colon3, id.to_sym).line(l)).line l
|
583
646
|
}
|
584
647
|
| backref
|
585
648
|
{
|
@@ -594,7 +657,8 @@ rule
|
|
594
657
|
|
595
658
|
cpath: tCOLON3 cname
|
596
659
|
{
|
597
|
-
|
660
|
+
_, name = val
|
661
|
+
result = s(:colon3, name.to_sym).line lexer.lineno
|
598
662
|
}
|
599
663
|
| cname
|
600
664
|
{
|
@@ -602,7 +666,10 @@ rule
|
|
602
666
|
}
|
603
667
|
| primary_value tCOLON2 cname
|
604
668
|
{
|
605
|
-
|
669
|
+
pval, _, name = val
|
670
|
+
|
671
|
+
result = s(:colon2, pval, name.to_sym)
|
672
|
+
result.line pval.line
|
606
673
|
}
|
607
674
|
|
608
675
|
fname: tIDENTIFIER | tCONSTANT | tFID
|
@@ -623,7 +690,8 @@ rule
|
|
623
690
|
|
624
691
|
fitem: fsym
|
625
692
|
{
|
626
|
-
|
693
|
+
id, = val
|
694
|
+
result = s(:lit, id.to_sym).line lexer.lineno
|
627
695
|
}
|
628
696
|
| dsym
|
629
697
|
|
@@ -646,6 +714,7 @@ rule
|
|
646
714
|
| tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
|
647
715
|
| tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE
|
648
716
|
| tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2
|
717
|
+
# TODO: tUBANG dead?
|
649
718
|
| tUBANG
|
650
719
|
|
651
720
|
reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND
|
@@ -668,8 +737,7 @@ rule
|
|
668
737
|
}
|
669
738
|
| primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs
|
670
739
|
{
|
671
|
-
|
672
|
-
result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
|
740
|
+
result = new_op_asgn1 val
|
673
741
|
}
|
674
742
|
| primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs
|
675
743
|
{
|
@@ -681,7 +749,9 @@ rule
|
|
681
749
|
}
|
682
750
|
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs
|
683
751
|
{
|
684
|
-
|
752
|
+
lhs, _, id, op, rhs = val
|
753
|
+
|
754
|
+
result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line
|
685
755
|
}
|
686
756
|
| primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs
|
687
757
|
{
|
@@ -711,18 +781,18 @@ rule
|
|
711
781
|
{
|
712
782
|
v1, v2 = val[0], val[2]
|
713
783
|
if v1.node_type == :lit and v2.node_type == :lit and Integer === v1.last and Integer === v2.last then
|
714
|
-
result = s(:lit, (v1.last)..(v2.last))
|
784
|
+
result = s(:lit, (v1.last)..(v2.last)).line v1.line
|
715
785
|
else
|
716
|
-
result = s(:dot2, v1, v2)
|
786
|
+
result = s(:dot2, v1, v2).line v1.line
|
717
787
|
end
|
718
788
|
}
|
719
789
|
| arg tDOT3 arg
|
720
790
|
{
|
721
791
|
v1, v2 = val[0], val[2]
|
722
792
|
if v1.node_type == :lit and v2.node_type == :lit and Integer === v1.last and Integer === v2.last then
|
723
|
-
result = s(:lit, (v1.last)...(v2.last))
|
793
|
+
result = s(:lit, (v1.last)...(v2.last)).line v1.line
|
724
794
|
else
|
725
|
-
result = s(:dot3, v1, v2)
|
795
|
+
result = s(:dot3, v1, v2).line v1.line
|
726
796
|
end
|
727
797
|
}
|
728
798
|
| arg tPLUS arg
|
@@ -751,11 +821,14 @@ rule
|
|
751
821
|
}
|
752
822
|
| tUMINUS_NUM tINTEGER tPOW arg
|
753
823
|
{
|
754
|
-
|
824
|
+
lit = s(:lit, val[1]).line lexer.lineno
|
825
|
+
result = new_call(new_call(lit, :"**", argl(val[3])), :"-@")
|
755
826
|
}
|
756
827
|
| tUMINUS_NUM tFLOAT tPOW arg
|
757
828
|
{
|
758
|
-
|
829
|
+
lit = s(:lit, val[1]).line lexer.lineno
|
830
|
+
result = new_call(new_call(lit, :"**", argl(val[3])), :"-@")
|
831
|
+
|
759
832
|
## TODO: why is this 2.0 only?
|
760
833
|
debug20 12, val, result
|
761
834
|
}
|
@@ -798,15 +871,19 @@ rule
|
|
798
871
|
}
|
799
872
|
| arg tMATCH arg
|
800
873
|
{
|
801
|
-
|
874
|
+
lhs, _, rhs = val
|
875
|
+
result = new_match lhs, rhs
|
802
876
|
}
|
803
877
|
| arg tNMATCH arg
|
804
878
|
{
|
805
|
-
|
879
|
+
lhs, _, rhs = val
|
880
|
+
result = s(:not, new_match(lhs, rhs)).line lhs.line
|
806
881
|
}
|
807
882
|
| tBANG arg
|
808
883
|
{
|
809
|
-
|
884
|
+
_, arg = val
|
885
|
+
result = new_call arg, :"!"
|
886
|
+
result.line arg.line
|
810
887
|
}
|
811
888
|
| tTILDE arg
|
812
889
|
{
|
@@ -834,11 +911,13 @@ rule
|
|
834
911
|
}
|
835
912
|
| kDEFINED opt_nl arg
|
836
913
|
{
|
837
|
-
|
914
|
+
(_, line), _, arg = val
|
915
|
+
result = s(:defined, arg).line line
|
838
916
|
}
|
839
917
|
| arg tEH arg opt_nl tCOLON arg
|
840
918
|
{
|
841
|
-
|
919
|
+
c, _, t, _, _, f = val
|
920
|
+
result = s(:if, c, t, f).line c.line
|
842
921
|
}
|
843
922
|
| primary
|
844
923
|
|
@@ -881,28 +960,25 @@ rule
|
|
881
960
|
arg_rhs: arg =tOP_ASGN
|
882
961
|
| arg kRESCUE_MOD arg
|
883
962
|
{
|
884
|
-
body, _, resbody = val
|
963
|
+
body, (_, line), resbody = val
|
885
964
|
body = value_expr body
|
886
965
|
resbody = remove_begin resbody
|
887
|
-
|
966
|
+
|
967
|
+
ary = s(:array).line line
|
968
|
+
result = new_rescue(body, new_resbody(ary, resbody))
|
888
969
|
}
|
889
970
|
|
890
971
|
paren_args: tLPAREN2 opt_call_args rparen
|
891
972
|
{
|
892
|
-
|
973
|
+
_, args, _ = val
|
974
|
+
result = args
|
893
975
|
}
|
894
976
|
|
895
977
|
opt_paren_args: none
|
896
978
|
| paren_args
|
897
979
|
|
898
980
|
opt_call_args: none
|
899
|
-
{
|
900
|
-
result = val[0]
|
901
|
-
}
|
902
981
|
| call_args
|
903
|
-
{
|
904
|
-
result = val[0]
|
905
|
-
}
|
906
982
|
| args tCOMMA
|
907
983
|
{
|
908
984
|
result = args val
|
@@ -952,7 +1028,8 @@ rule
|
|
952
1028
|
|
953
1029
|
block_arg: tAMPER arg_value
|
954
1030
|
{
|
955
|
-
|
1031
|
+
_, arg = val
|
1032
|
+
result = s(:block_pass, arg).line arg.line
|
956
1033
|
}
|
957
1034
|
|
958
1035
|
opt_block_arg: tCOMMA block_arg
|
@@ -963,19 +1040,24 @@ rule
|
|
963
1040
|
|
964
1041
|
args: arg_value
|
965
1042
|
{
|
966
|
-
|
1043
|
+
arg, = val
|
1044
|
+
|
1045
|
+
result = s(:array, arg).line arg.line
|
967
1046
|
}
|
968
1047
|
| tSTAR arg_value
|
969
1048
|
{
|
970
|
-
|
1049
|
+
_, arg = val
|
1050
|
+
result = s(:array, s(:splat, arg).line(arg.line)).line arg.line
|
971
1051
|
}
|
972
1052
|
| args tCOMMA arg_value
|
973
1053
|
{
|
974
|
-
|
1054
|
+
args, _, id = val
|
1055
|
+
result = self.list_append args, id
|
975
1056
|
}
|
976
|
-
| args tCOMMA tSTAR arg_value
|
1057
|
+
| args tCOMMA tSTAR { result = lexer.lineno } arg_value
|
977
1058
|
{
|
978
|
-
|
1059
|
+
args, _, _, line, id = val
|
1060
|
+
result = self.list_append args, s(:splat, id).line(line)
|
979
1061
|
}
|
980
1062
|
|
981
1063
|
mrhs: args tCOMMA arg_value
|
@@ -984,11 +1066,15 @@ rule
|
|
984
1066
|
}
|
985
1067
|
| args tCOMMA tSTAR arg_value
|
986
1068
|
{
|
987
|
-
|
1069
|
+
# FIX: bad shift/reduce conflict with rhs' comma star prod
|
1070
|
+
# TODO: make all tXXXX terminals include lexer.lineno
|
1071
|
+
arg, _, _, splat = val
|
1072
|
+
result = self.arg_concat arg, splat
|
988
1073
|
}
|
989
1074
|
| tSTAR arg_value
|
990
1075
|
{
|
991
|
-
|
1076
|
+
_, arg = val
|
1077
|
+
result = s(:splat, arg).line arg.line
|
992
1078
|
}
|
993
1079
|
|
994
1080
|
primary: literal
|
@@ -1003,7 +1089,8 @@ rule
|
|
1003
1089
|
| backref
|
1004
1090
|
| tFID
|
1005
1091
|
{
|
1006
|
-
|
1092
|
+
msg, = val
|
1093
|
+
result = new_call nil, msg.to_sym
|
1007
1094
|
}
|
1008
1095
|
| k_begin
|
1009
1096
|
{
|
@@ -1023,16 +1110,19 @@ rule
|
|
1023
1110
|
|
1024
1111
|
result.line = val[1]
|
1025
1112
|
}
|
1026
|
-
| tLPAREN_ARG
|
1113
|
+
| tLPAREN_ARG
|
1027
1114
|
{
|
1028
|
-
|
1029
|
-
|
1115
|
+
lexer.lex_state = EXPR_ENDARG
|
1116
|
+
result = lexer.lineno
|
1117
|
+
}
|
1118
|
+
rparen
|
1119
|
+
{
|
1120
|
+
_, line, _ = val
|
1121
|
+
result = s(:begin).line line
|
1030
1122
|
}
|
1031
1123
|
| tLPAREN_ARG
|
1032
1124
|
{
|
1033
1125
|
result = lexer.cmdarg.store false
|
1034
|
-
# result = self.lexer.cmdarg.stack.dup
|
1035
|
-
# lexer.cmdarg.stack.replace [false] # TODO add api for these
|
1036
1126
|
}
|
1037
1127
|
stmt
|
1038
1128
|
{
|
@@ -1047,21 +1137,29 @@ rule
|
|
1047
1137
|
}
|
1048
1138
|
| tLPAREN compstmt tRPAREN
|
1049
1139
|
{
|
1050
|
-
|
1140
|
+
_, stmt, _ = val
|
1141
|
+
result = stmt
|
1142
|
+
result ||= s(:nil).line lexer.lineno
|
1051
1143
|
result.paren = true
|
1052
1144
|
}
|
1053
1145
|
| primary_value tCOLON2 tCONSTANT
|
1054
1146
|
{
|
1055
|
-
|
1147
|
+
expr, _, id = val
|
1148
|
+
|
1149
|
+
result = s(:colon2, expr, id.to_sym).line expr.line
|
1056
1150
|
}
|
1057
1151
|
| tCOLON3 tCONSTANT
|
1058
1152
|
{
|
1059
|
-
|
1153
|
+
_, id = val
|
1154
|
+
|
1155
|
+
result = s(:colon3, id.to_sym).line lexer.lineno
|
1060
1156
|
}
|
1061
|
-
| tLBRACK aref_args tRBRACK
|
1157
|
+
| tLBRACK { result = lexer.lineno } aref_args tRBRACK
|
1062
1158
|
{
|
1063
|
-
|
1159
|
+
_, line, args, _ = val
|
1160
|
+
result = args || s(:array)
|
1064
1161
|
result.sexp_type = :array # aref_args is :args
|
1162
|
+
result.line line
|
1065
1163
|
}
|
1066
1164
|
| tLBRACE
|
1067
1165
|
{
|
@@ -1073,7 +1171,8 @@ rule
|
|
1073
1171
|
}
|
1074
1172
|
| k_return
|
1075
1173
|
{
|
1076
|
-
|
1174
|
+
(_, line), = val
|
1175
|
+
result = s(:return).line line
|
1077
1176
|
}
|
1078
1177
|
| kYIELD tLPAREN2 call_args rparen
|
1079
1178
|
{
|
@@ -1089,11 +1188,14 @@ rule
|
|
1089
1188
|
}
|
1090
1189
|
| kDEFINED opt_nl tLPAREN2 expr rparen
|
1091
1190
|
{
|
1092
|
-
|
1191
|
+
(_, line), _, _, arg, _ = val
|
1192
|
+
|
1193
|
+
result = s(:defined, arg).line line
|
1093
1194
|
}
|
1094
1195
|
| kNOT tLPAREN2 expr rparen
|
1095
1196
|
{
|
1096
|
-
|
1197
|
+
_, _, lhs, _ = val
|
1198
|
+
result = new_call lhs, :"!"
|
1097
1199
|
}
|
1098
1200
|
| kNOT tLPAREN2 rparen
|
1099
1201
|
{
|
@@ -1101,11 +1203,11 @@ rule
|
|
1101
1203
|
}
|
1102
1204
|
| fcall brace_block
|
1103
1205
|
{
|
1104
|
-
|
1105
|
-
|
1206
|
+
call, iter = val
|
1207
|
+
|
1106
1208
|
iter.insert 1, call
|
1107
1209
|
result = iter
|
1108
|
-
call.line = iter.line
|
1210
|
+
# FIX: probably not: call.line = iter.line
|
1109
1211
|
}
|
1110
1212
|
| method_call
|
1111
1213
|
| method_call brace_block
|
@@ -1222,7 +1324,7 @@ rule
|
|
1222
1324
|
# TODO: port local_push_gen and local_pop_gen
|
1223
1325
|
lexer.cmdarg.stack.replace [false]
|
1224
1326
|
}
|
1225
|
-
f_arglist bodystmt k_end
|
1327
|
+
f_arglist bodystmt { result = lexer.lineno } k_end
|
1226
1328
|
{
|
1227
1329
|
in_def, cmdarg = val[2]
|
1228
1330
|
|
@@ -1248,9 +1350,8 @@ rule
|
|
1248
1350
|
}
|
1249
1351
|
f_arglist bodystmt k_end
|
1250
1352
|
{
|
1251
|
-
|
1353
|
+
_, cmdarg = val[5]
|
1252
1354
|
result = new_defs val
|
1253
|
-
result[3].line line
|
1254
1355
|
|
1255
1356
|
lexer.cmdarg.stack.replace cmdarg
|
1256
1357
|
|
@@ -1260,19 +1361,23 @@ rule
|
|
1260
1361
|
}
|
1261
1362
|
| kBREAK
|
1262
1363
|
{
|
1263
|
-
|
1364
|
+
(_, line), = val
|
1365
|
+
result = s(:break).line line
|
1264
1366
|
}
|
1265
1367
|
| kNEXT
|
1266
1368
|
{
|
1267
|
-
|
1369
|
+
(_, line), = val
|
1370
|
+
result = s(:next).line line
|
1268
1371
|
}
|
1269
1372
|
| kREDO
|
1270
1373
|
{
|
1271
|
-
|
1374
|
+
(_, line), = val
|
1375
|
+
result = s(:redo).line line
|
1272
1376
|
}
|
1273
1377
|
| kRETRY
|
1274
1378
|
{
|
1275
|
-
|
1379
|
+
(_, line), = val
|
1380
|
+
result = s(:retry).line line
|
1276
1381
|
}
|
1277
1382
|
|
1278
1383
|
primary_value: primary
|
@@ -1311,7 +1416,9 @@ rule
|
|
1311
1416
|
if_tail: opt_else
|
1312
1417
|
| k_elsif expr_value then compstmt if_tail
|
1313
1418
|
{
|
1314
|
-
|
1419
|
+
(_, line), c, _, t, rest = val
|
1420
|
+
|
1421
|
+
result = s(:if, c, t, rest).line line
|
1315
1422
|
}
|
1316
1423
|
|
1317
1424
|
opt_else: none
|
@@ -1334,7 +1441,9 @@ rule
|
|
1334
1441
|
|
1335
1442
|
f_marg_list: f_marg
|
1336
1443
|
{
|
1337
|
-
|
1444
|
+
sym, = val
|
1445
|
+
|
1446
|
+
result = s(:array, sym).line lexer.lineno
|
1338
1447
|
}
|
1339
1448
|
| f_marg_list tCOMMA f_marg
|
1340
1449
|
{
|
@@ -1408,7 +1517,9 @@ rule
|
|
1408
1517
|
}
|
1409
1518
|
| f_block_arg
|
1410
1519
|
{
|
1411
|
-
|
1520
|
+
line = lexer.lineno
|
1521
|
+
result = call_args val # TODO: push line down
|
1522
|
+
result.line line
|
1412
1523
|
}
|
1413
1524
|
|
1414
1525
|
opt_block_args_tail: tCOMMA block_args_tail
|
@@ -1439,7 +1550,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1439
1550
|
}
|
1440
1551
|
| f_arg tCOMMA
|
1441
1552
|
{
|
1442
|
-
result = args
|
1553
|
+
result = args(val) << nil
|
1443
1554
|
}
|
1444
1555
|
| f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
|
1445
1556
|
{
|
@@ -1491,7 +1602,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1491
1602
|
}
|
1492
1603
|
| tOROP
|
1493
1604
|
{
|
1494
|
-
result = s(:args)
|
1605
|
+
result = s(:args).line lexer.lineno
|
1495
1606
|
}
|
1496
1607
|
| tPIPE block_param opt_bv_decl tPIPE
|
1497
1608
|
{
|
@@ -1516,33 +1627,33 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1516
1627
|
|
1517
1628
|
bvar: tIDENTIFIER
|
1518
1629
|
{
|
1519
|
-
|
1630
|
+
id, = val
|
1631
|
+
line = lexer.lineno
|
1632
|
+
result = s(:shadow, id.to_sym).line line
|
1520
1633
|
}
|
1521
1634
|
| f_bad_arg
|
1522
1635
|
|
1523
1636
|
lambda: {
|
1524
1637
|
self.env.extend :dynamic
|
1525
|
-
result =
|
1526
|
-
|
1527
|
-
result = lexer.lpar_beg
|
1638
|
+
result = [lexer.lineno, lexer.lpar_beg]
|
1528
1639
|
lexer.paren_nest += 1
|
1529
1640
|
lexer.lpar_beg = lexer.paren_nest
|
1530
1641
|
}
|
1531
1642
|
f_larglist
|
1532
1643
|
{
|
1533
|
-
result =
|
1644
|
+
result = lexer.cmdarg.store(false)
|
1534
1645
|
}
|
1535
1646
|
lambda_body
|
1536
1647
|
{
|
1537
|
-
lpar, args,
|
1648
|
+
(line, lpar), args, cmdarg, body = val
|
1538
1649
|
lexer.lpar_beg = lpar
|
1539
1650
|
|
1540
1651
|
lexer.cmdarg.restore cmdarg
|
1541
1652
|
lexer.cmdarg.lexpop
|
1542
1653
|
|
1543
|
-
call =
|
1654
|
+
call = s(:lambda).line line
|
1544
1655
|
result = new_iter call, args, body
|
1545
|
-
result.line =
|
1656
|
+
result.line = line
|
1546
1657
|
self.env.unextend
|
1547
1658
|
}
|
1548
1659
|
|
@@ -1567,8 +1678,8 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1567
1678
|
|
1568
1679
|
do_block: k_do_block do_body kEND
|
1569
1680
|
{
|
1570
|
-
|
1571
|
-
result =
|
1681
|
+
(_, line), iter, _ = val
|
1682
|
+
result = iter.line line
|
1572
1683
|
}
|
1573
1684
|
|
1574
1685
|
block_call: command do_block
|
@@ -1582,8 +1693,10 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1582
1693
|
|
1583
1694
|
val = invert_block_call val if inverted? val
|
1584
1695
|
|
1585
|
-
|
1586
|
-
|
1696
|
+
cmd, blk = val
|
1697
|
+
|
1698
|
+
result = blk
|
1699
|
+
result.insert 1, cmd
|
1587
1700
|
}
|
1588
1701
|
| block_call call_op2 operation2 opt_paren_args
|
1589
1702
|
{
|
@@ -1614,8 +1727,10 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1614
1727
|
}
|
1615
1728
|
paren_args
|
1616
1729
|
{
|
1617
|
-
args =
|
1618
|
-
|
1730
|
+
call, lineno, args = val
|
1731
|
+
|
1732
|
+
result = call.concat args.sexp_body if args
|
1733
|
+
result.line lineno
|
1619
1734
|
}
|
1620
1735
|
| primary_value call_op operation2 opt_paren_args
|
1621
1736
|
{
|
@@ -1643,7 +1758,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1643
1758
|
}
|
1644
1759
|
| kSUPER
|
1645
1760
|
{
|
1646
|
-
result = s(:zsuper)
|
1761
|
+
result = s(:zsuper).line lexer.lineno
|
1647
1762
|
}
|
1648
1763
|
| primary_value tLBRACK2 opt_call_args rbracket
|
1649
1764
|
{
|
@@ -1721,7 +1836,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1721
1836
|
(_, line), klasses, var, _, body, rest = val
|
1722
1837
|
|
1723
1838
|
klasses ||= s(:array)
|
1724
|
-
klasses << new_assign(var, s(:gvar, :"$!")) if var
|
1839
|
+
klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var
|
1725
1840
|
klasses.line line
|
1726
1841
|
|
1727
1842
|
result = new_resbody(klasses, body)
|
@@ -1734,7 +1849,8 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1734
1849
|
|
1735
1850
|
exc_list: arg_value
|
1736
1851
|
{
|
1737
|
-
|
1852
|
+
arg, = val
|
1853
|
+
result = s(:array, arg).line arg.line
|
1738
1854
|
}
|
1739
1855
|
| mrhs
|
1740
1856
|
| none
|
@@ -1747,26 +1863,31 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1747
1863
|
|
1748
1864
|
opt_ensure: k_ensure compstmt
|
1749
1865
|
{
|
1750
|
-
_, body = val
|
1866
|
+
(_, line), body = val
|
1751
1867
|
|
1752
|
-
result = body || s(:nil)
|
1868
|
+
result = body || s(:nil).line(line)
|
1753
1869
|
}
|
1754
1870
|
| none
|
1755
1871
|
|
1756
1872
|
literal: numeric
|
1757
1873
|
{
|
1874
|
+
line = lexer.lineno
|
1758
1875
|
result = s(:lit, val[0])
|
1876
|
+
result.line = line
|
1759
1877
|
}
|
1760
1878
|
| symbol
|
1761
1879
|
{
|
1880
|
+
line = lexer.lineno
|
1762
1881
|
result = s(:lit, val[0])
|
1882
|
+
result.line = line
|
1763
1883
|
}
|
1764
1884
|
| dsym
|
1765
1885
|
|
1766
1886
|
strings: string
|
1767
1887
|
{
|
1768
|
-
|
1769
|
-
|
1888
|
+
str, = val
|
1889
|
+
str = s(:dstr, str.value) if str.sexp_type == :evstr
|
1890
|
+
result = str
|
1770
1891
|
}
|
1771
1892
|
|
1772
1893
|
string: tCHAR
|
@@ -1781,7 +1902,11 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1781
1902
|
|
1782
1903
|
string1: tSTRING_BEG string_contents tSTRING_END
|
1783
1904
|
{
|
1784
|
-
|
1905
|
+
_, str, (_, func) = val
|
1906
|
+
|
1907
|
+
str = dedent str if func =~ RubyLexer::STR_FUNC_ICNTNT
|
1908
|
+
|
1909
|
+
result = str
|
1785
1910
|
}
|
1786
1911
|
| tSTRING
|
1787
1912
|
{
|
@@ -1791,6 +1916,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1791
1916
|
xstring: tXSTRING_BEG xstring_contents tSTRING_END
|
1792
1917
|
{
|
1793
1918
|
result = new_xstring val[1]
|
1919
|
+
# TODO: dedent?!?! SERIOUSLY?!?
|
1794
1920
|
}
|
1795
1921
|
|
1796
1922
|
regexp: tREGEXP_BEG regexp_contents tREGEXP_END
|
@@ -1800,7 +1926,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1800
1926
|
|
1801
1927
|
words: tWORDS_BEG tSPACE tSTRING_END
|
1802
1928
|
{
|
1803
|
-
result = s(:array)
|
1929
|
+
result = s(:array).line lexer.lineno
|
1804
1930
|
}
|
1805
1931
|
| tWORDS_BEG word_list tSTRING_END
|
1806
1932
|
{
|
@@ -1824,25 +1950,28 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1824
1950
|
|
1825
1951
|
symbols: tSYMBOLS_BEG tSPACE tSTRING_END
|
1826
1952
|
{
|
1827
|
-
result = s(:array)
|
1953
|
+
result = s(:array).line lexer.lineno
|
1828
1954
|
}
|
1829
|
-
| tSYMBOLS_BEG symbol_list tSTRING_END
|
1955
|
+
| tSYMBOLS_BEG { result = lexer.lineno } symbol_list tSTRING_END
|
1830
1956
|
{
|
1831
|
-
|
1957
|
+
_, line, list, _, = val
|
1958
|
+
list.line = line
|
1959
|
+
result = list
|
1832
1960
|
}
|
1833
1961
|
|
1834
1962
|
symbol_list: none
|
1835
1963
|
{
|
1836
|
-
result = new_symbol_list
|
1964
|
+
result = new_symbol_list.line lexer.lineno
|
1837
1965
|
}
|
1838
1966
|
| symbol_list word tSPACE
|
1839
1967
|
{
|
1840
|
-
|
1968
|
+
list, * = val
|
1969
|
+
result = list.dup << new_symbol_list_entry(val)
|
1841
1970
|
}
|
1842
1971
|
|
1843
1972
|
qwords: tQWORDS_BEG tSPACE tSTRING_END
|
1844
1973
|
{
|
1845
|
-
result = s(:array)
|
1974
|
+
result = s(:array).line lexer.lineno
|
1846
1975
|
}
|
1847
1976
|
| tQWORDS_BEG qword_list tSTRING_END
|
1848
1977
|
{
|
@@ -1851,7 +1980,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1851
1980
|
|
1852
1981
|
qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END
|
1853
1982
|
{
|
1854
|
-
result = s(:array)
|
1983
|
+
result = s(:array).line lexer.lineno # FIX
|
1855
1984
|
}
|
1856
1985
|
| tQSYMBOLS_BEG qsym_list tSTRING_END
|
1857
1986
|
{
|
@@ -1878,11 +2007,12 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1878
2007
|
|
1879
2008
|
string_contents: none
|
1880
2009
|
{
|
1881
|
-
result = s(:str, "")
|
2010
|
+
result = s(:str, "").line lexer.lineno
|
1882
2011
|
}
|
1883
2012
|
| string_contents string_content
|
1884
2013
|
{
|
1885
|
-
|
2014
|
+
v1, v2 = val
|
2015
|
+
result = literal_concat v1, v2
|
1886
2016
|
}
|
1887
2017
|
|
1888
2018
|
xstring_contents: none
|
@@ -1891,7 +2021,8 @@ xstring_contents: none
|
|
1891
2021
|
}
|
1892
2022
|
| xstring_contents string_content
|
1893
2023
|
{
|
1894
|
-
|
2024
|
+
v1, v2 = val
|
2025
|
+
result = literal_concat v1, v2
|
1895
2026
|
}
|
1896
2027
|
|
1897
2028
|
regexp_contents: none
|
@@ -1900,7 +2031,8 @@ regexp_contents: none
|
|
1900
2031
|
}
|
1901
2032
|
| regexp_contents string_content
|
1902
2033
|
{
|
1903
|
-
|
2034
|
+
v1, v2 = val
|
2035
|
+
result = literal_concat v1, v2
|
1904
2036
|
}
|
1905
2037
|
|
1906
2038
|
string_content: tSTRING_CONTENT
|
@@ -1916,8 +2048,9 @@ regexp_contents: none
|
|
1916
2048
|
}
|
1917
2049
|
string_dvar
|
1918
2050
|
{
|
1919
|
-
|
1920
|
-
|
2051
|
+
_, strterm, str = val
|
2052
|
+
lexer.lex_strterm = strterm
|
2053
|
+
result = s(:evstr, str).line str.line
|
1921
2054
|
}
|
1922
2055
|
| tSTRING_DBEG
|
1923
2056
|
{
|
@@ -1927,6 +2060,7 @@ regexp_contents: none
|
|
1927
2060
|
lexer.cond.store,
|
1928
2061
|
lexer.cmdarg.store,
|
1929
2062
|
lexer.lex_state,
|
2063
|
+
lexer.lineno,
|
1930
2064
|
]
|
1931
2065
|
|
1932
2066
|
lexer.lex_strterm = nil
|
@@ -1940,7 +2074,7 @@ regexp_contents: none
|
|
1940
2074
|
{
|
1941
2075
|
_, memo, stmt, _ = val
|
1942
2076
|
|
1943
|
-
lex_strterm, brace_nest, string_nest, oldcond, oldcmdarg, oldlex_state = memo
|
2077
|
+
lex_strterm, brace_nest, string_nest, oldcond, oldcmdarg, oldlex_state, line = memo
|
1944
2078
|
|
1945
2079
|
lexer.lex_strterm = lex_strterm
|
1946
2080
|
lexer.brace_nest = brace_nest
|
@@ -1957,19 +2091,19 @@ regexp_contents: none
|
|
1957
2091
|
when :str, :dstr, :evstr then
|
1958
2092
|
result = stmt
|
1959
2093
|
else
|
1960
|
-
result = s(:evstr, stmt)
|
2094
|
+
result = s(:evstr, stmt).line line
|
1961
2095
|
end
|
1962
2096
|
when nil then
|
1963
|
-
result = s(:evstr)
|
2097
|
+
result = s(:evstr).line line
|
1964
2098
|
else
|
1965
2099
|
debug20 25
|
1966
2100
|
raise "unknown string body: #{stmt.inspect}"
|
1967
2101
|
end
|
1968
2102
|
}
|
1969
2103
|
|
1970
|
-
string_dvar: tGVAR { result = s(:gvar, val[0].to_sym) }
|
1971
|
-
| tIVAR { result = s(:ivar, val[0].to_sym) }
|
1972
|
-
| tCVAR { result = s(:cvar, val[0].to_sym) }
|
2104
|
+
string_dvar: tGVAR { result = s(:gvar, val[0].to_sym).line lexer.lineno }
|
2105
|
+
| tIVAR { result = s(:ivar, val[0].to_sym).line lexer.lineno }
|
2106
|
+
| tCVAR { result = s(:cvar, val[0].to_sym).line lexer.lineno }
|
1973
2107
|
| backref
|
1974
2108
|
|
1975
2109
|
symbol: tSYMBEG sym
|
@@ -1986,18 +2120,19 @@ regexp_contents: none
|
|
1986
2120
|
|
1987
2121
|
dsym: tSYMBEG xstring_contents tSTRING_END
|
1988
2122
|
{
|
2123
|
+
_, result, _ = val
|
2124
|
+
|
1989
2125
|
lexer.lex_state = EXPR_END
|
1990
|
-
result = val[1]
|
1991
2126
|
|
1992
|
-
result ||= s(:str, "")
|
2127
|
+
result ||= s(:str, "").line lexer.lineno
|
1993
2128
|
|
1994
2129
|
case result.sexp_type
|
1995
2130
|
when :dstr then
|
1996
2131
|
result.sexp_type = :dsym
|
1997
2132
|
when :str then
|
1998
|
-
result = s(:lit, result.last.to_sym)
|
2133
|
+
result = s(:lit, result.last.to_sym).line result.line
|
1999
2134
|
when :evstr then
|
2000
|
-
result = s(:dsym, "", result)
|
2135
|
+
result = s(:dsym, "", result).line result.line
|
2001
2136
|
else
|
2002
2137
|
debug20 26, val, result
|
2003
2138
|
end
|
@@ -2020,19 +2155,20 @@ regexp_contents: none
|
|
2020
2155
|
| tCONSTANT
|
2021
2156
|
| tCVAR
|
2022
2157
|
|
2023
|
-
keyword_variable: kNIL { result = s(:nil)
|
2024
|
-
| kSELF { result = s(:self)
|
2025
|
-
| kTRUE { result = s(:true)
|
2026
|
-
| kFALSE { result = s(:false) }
|
2027
|
-
| k__FILE__ { result = s(:str, self.file) }
|
2028
|
-
| k__LINE__ { result = s(:lit, lexer.lineno) }
|
2158
|
+
keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
2159
|
+
| kSELF { result = s(:self).line lexer.lineno }
|
2160
|
+
| kTRUE { result = s(:true).line lexer.lineno }
|
2161
|
+
| kFALSE { result = s(:false).line lexer.lineno }
|
2162
|
+
| k__FILE__ { result = s(:str, self.file).line lexer.lineno }
|
2163
|
+
| k__LINE__ { result = s(:lit, lexer.lineno).line lexer.lineno }
|
2029
2164
|
| k__ENCODING__
|
2030
2165
|
{
|
2166
|
+
l = lexer.lineno
|
2031
2167
|
result =
|
2032
2168
|
if defined? Encoding then
|
2033
|
-
s(:colon2, s(:const, :Encoding), :UTF_8)
|
2169
|
+
s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l
|
2034
2170
|
else
|
2035
|
-
s(:str, "Unsupported!")
|
2171
|
+
s(:str, "Unsupported!").line l
|
2036
2172
|
end
|
2037
2173
|
}
|
2038
2174
|
|
@@ -2057,8 +2193,8 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2057
2193
|
debug20 29, val, result
|
2058
2194
|
}
|
2059
2195
|
|
2060
|
-
backref: tNTH_REF { result = s(:nth_ref, val[0]) }
|
2061
|
-
| tBACK_REF { result = s(:back_ref, val[0]) }
|
2196
|
+
backref: tNTH_REF { result = s(:nth_ref, val[0]).line lexer.lineno }
|
2197
|
+
| tBACK_REF { result = s(:back_ref, val[0]).line lexer.lineno }
|
2062
2198
|
|
2063
2199
|
superclass: tLT
|
2064
2200
|
{
|
@@ -2213,12 +2349,13 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2213
2349
|
|
2214
2350
|
f_arg: f_arg_item
|
2215
2351
|
{
|
2216
|
-
|
2352
|
+
arg, = val
|
2353
|
+
|
2354
|
+
case arg
|
2217
2355
|
when Symbol then
|
2218
|
-
result = s(:args)
|
2219
|
-
result << val[0]
|
2356
|
+
result = s(:args, arg).line lexer.lineno
|
2220
2357
|
when Sexp then
|
2221
|
-
result =
|
2358
|
+
result = arg
|
2222
2359
|
else
|
2223
2360
|
debug20 32
|
2224
2361
|
raise "Unknown f_arg type: #{val.inspect}"
|
@@ -2231,7 +2368,7 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2231
2368
|
if list.sexp_type == :args then
|
2232
2369
|
result = list
|
2233
2370
|
else
|
2234
|
-
result = s(:args, list)
|
2371
|
+
result = s(:args, list).line list.line
|
2235
2372
|
end
|
2236
2373
|
|
2237
2374
|
result << item
|
@@ -2239,22 +2376,24 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2239
2376
|
|
2240
2377
|
f_kw: tLABEL arg_value
|
2241
2378
|
{
|
2242
|
-
# TODO:
|
2243
|
-
label,
|
2379
|
+
# TODO: new_kw_arg
|
2380
|
+
(label, line), arg = val
|
2381
|
+
|
2244
2382
|
identifier = label.to_sym
|
2245
2383
|
self.env[identifier] = :lvar
|
2246
2384
|
|
2247
|
-
|
2385
|
+
kwarg = s(:kwarg, identifier, arg).line line
|
2386
|
+
result = s(:array, kwarg).line line
|
2248
2387
|
}
|
2249
2388
|
|
2250
2389
|
f_block_kw: tLABEL primary_value
|
2251
2390
|
{
|
2252
|
-
# TODO:
|
2253
|
-
label,
|
2254
|
-
|
2255
|
-
self.env[
|
2391
|
+
# TODO: new_kw_arg
|
2392
|
+
(label, line), expr = val
|
2393
|
+
id = label.to_sym
|
2394
|
+
self.env[id] = :lvar
|
2256
2395
|
|
2257
|
-
result = s(:array, s(:kwarg,
|
2396
|
+
result = s(:array, s(:kwarg, id, expr).line(line)).line line
|
2258
2397
|
}
|
2259
2398
|
|
2260
2399
|
f_block_kwarg: f_block_kw
|
@@ -2297,17 +2436,20 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2297
2436
|
|
2298
2437
|
f_block_optarg: f_block_opt
|
2299
2438
|
{
|
2300
|
-
|
2439
|
+
optblk, = val
|
2440
|
+
result = s(:block, optblk).line optblk.line
|
2301
2441
|
}
|
2302
2442
|
| f_block_optarg tCOMMA f_block_opt
|
2303
2443
|
{
|
2304
|
-
|
2305
|
-
result
|
2444
|
+
optarg, _, optblk = val
|
2445
|
+
result = optarg
|
2446
|
+
result << optblk
|
2306
2447
|
}
|
2307
2448
|
|
2308
2449
|
f_optarg: f_opt
|
2309
2450
|
{
|
2310
|
-
|
2451
|
+
opt, = val
|
2452
|
+
result = s(:block, opt).line opt.line
|
2311
2453
|
}
|
2312
2454
|
| f_optarg tCOMMA f_opt
|
2313
2455
|
{
|
@@ -2361,14 +2503,11 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2361
2503
|
result.sexp_type == :lit
|
2362
2504
|
}
|
2363
2505
|
|
2364
|
-
assoc_list: none
|
2506
|
+
assoc_list: none
|
2365
2507
|
{
|
2366
|
-
result = s(:array)
|
2367
|
-
}
|
2368
|
-
| assocs trailer # [!nil]
|
2369
|
-
{
|
2370
|
-
result = val[0]
|
2508
|
+
result = s(:array).line lexer.lineno
|
2371
2509
|
}
|
2510
|
+
| assocs trailer
|
2372
2511
|
|
2373
2512
|
assocs: assoc
|
2374
2513
|
| assocs tCOMMA assoc
|
@@ -2382,16 +2521,21 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2382
2521
|
|
2383
2522
|
assoc: arg_value tASSOC arg_value
|
2384
2523
|
{
|
2385
|
-
|
2524
|
+
v1, _, v2 = val
|
2525
|
+
result = s(:array, v1, v2).line v1.line
|
2386
2526
|
}
|
2387
2527
|
| tLABEL arg_value
|
2388
2528
|
{
|
2389
|
-
(label,
|
2390
|
-
|
2529
|
+
(label, line), arg = val
|
2530
|
+
|
2531
|
+
lit = s(:lit, label.to_sym).line line
|
2532
|
+
result = s(:array, lit, arg).line line
|
2391
2533
|
}
|
2392
2534
|
| tDSTAR arg_value
|
2393
2535
|
{
|
2394
|
-
|
2536
|
+
_, arg = val
|
2537
|
+
line = arg.line
|
2538
|
+
result = s(:array, s(:kwsplat, arg).line(line)).line line
|
2395
2539
|
}
|
2396
2540
|
|
2397
2541
|
operation: tIDENTIFIER | tCONSTANT | tFID
|