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/ruby_lexer.rex.rb
CHANGED
data/lib/ruby_parser.rb
CHANGED
@@ -11,23 +11,22 @@ class RubyParser
|
|
11
11
|
|
12
12
|
attr_accessor :current
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
-
|
26
|
-
@version ||= Parser > self && self.name[/(?:V|Ruby)(\d+)/, 1].to_i
|
27
|
-
end
|
24
|
+
klass.new
|
28
25
|
end
|
29
26
|
|
30
|
-
|
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
|
-
|
52
|
-
|
53
|
-
end
|
50
|
+
class Parser < Racc::Parser
|
51
|
+
include RubyParserStuff
|
54
52
|
|
55
|
-
|
56
|
-
|
57
|
-
|
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
|
-
|
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
|
-
|
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
|
-
_, _,
|
116
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
194
|
+
t, _, c = val
|
195
|
+
result = new_if c, t, nil
|
204
196
|
}
|
205
197
|
| stmt kUNLESS_MOD expr_value
|
206
198
|
{
|
207
|
-
|
199
|
+
f, _, c = val
|
200
|
+
result = new_if c, nil, f
|
208
201
|
}
|
209
202
|
| stmt kWHILE_MOD expr_value
|
210
203
|
{
|
211
|
-
|
204
|
+
e, _, c = val
|
205
|
+
result = new_while e, c, true
|
212
206
|
}
|
213
207
|
| stmt kUNTIL_MOD expr_value
|
214
208
|
{
|
215
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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 =
|
268
|
+
result = new_op_asgn1 val
|
268
269
|
}
|
269
270
|
| primary_value call_op tIDENTIFIER tOP_ASGN command_rhs
|
270
271
|
{
|
271
|
-
|
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
|
-
|
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
|
-
|
322
|
+
lhs, _, rhs = val
|
323
|
+
result = logical_op :and, lhs, rhs
|
319
324
|
}
|
320
325
|
| expr kOR expr
|
321
326
|
{
|
322
|
-
|
327
|
+
lhs, _, rhs = val
|
328
|
+
result = logical_op :or, lhs, rhs
|
323
329
|
}
|
324
330
|
| kNOT opt_nl expr
|
325
331
|
{
|
326
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
395
|
+
call, args = val
|
396
|
+
result = call.concat args.sexp_body
|
383
397
|
}
|
384
398
|
| fcall command_args cmd_brace_block
|
385
399
|
{
|
386
|
-
|
387
|
-
|
388
|
-
|
400
|
+
call, args, block = val
|
401
|
+
|
402
|
+
result = call.concat args.sexp_body
|
389
403
|
|
390
|
-
|
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
|
-
|
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
|
-
|
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
|
438
|
-
result = s(:break, ret_args(
|
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
|
-
|
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
|
-
|
483
|
+
head, = val
|
484
|
+
result = s(:masgn, head).line head.line
|
461
485
|
}
|
462
486
|
| mlhs_head mlhs_item
|
463
487
|
{
|
464
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
485
|
-
ary
|
486
|
-
|
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
|
-
|
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
|
-
|
495
|
-
|
496
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
645
|
+
lhs, _, args, _ = val
|
646
|
+
result = self.aryset lhs, args
|
590
647
|
}
|
591
648
|
| primary_value call_op tIDENTIFIER # REFACTOR
|
592
649
|
{
|
593
|
-
|
650
|
+
lhs, op, id = val
|
651
|
+
result = new_attrasgn lhs, id, op
|
594
652
|
}
|
595
653
|
| primary_value tCOLON2 tIDENTIFIER
|
596
654
|
{
|
597
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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,
|
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,
|
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
|
-
|
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
|
-
|
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
|
-
|
937
|
+
lhs, _, rhs = val
|
938
|
+
result = new_match lhs, rhs
|
861
939
|
}
|
862
940
|
| arg tNMATCH arg
|
863
941
|
{
|
864
|
-
|
942
|
+
lhs, _, rhs = val
|
943
|
+
result = s(:not, new_match(lhs, rhs)).line lhs.line
|
865
944
|
}
|
866
945
|
| tBANG arg
|
867
946
|
{
|
868
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
1106
|
+
arg, = val
|
1107
|
+
|
1108
|
+
result = s(:array, arg).line arg.line
|
1026
1109
|
}
|
1027
1110
|
| tSTAR arg_value
|
1028
1111
|
{
|
1029
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
1187
|
+
| tLPAREN_ARG
|
1097
1188
|
{
|
1098
|
-
|
1099
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
1265
|
+
(_, line), _, _, arg, _ = val
|
1266
|
+
|
1267
|
+
result = s(:defined, arg).line line
|
1163
1268
|
}
|
1164
1269
|
| kNOT tLPAREN2 expr rparen
|
1165
1270
|
{
|
1166
|
-
|
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
|
-
|
1175
|
-
|
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
|
-
|
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
|
-
|
1438
|
+
(_, line), = val
|
1439
|
+
result = s(:break).line line
|
1334
1440
|
}
|
1335
1441
|
| kNEXT
|
1336
1442
|
{
|
1337
|
-
|
1443
|
+
(_, line), = val
|
1444
|
+
result = s(:next).line line
|
1338
1445
|
}
|
1339
1446
|
| kREDO
|
1340
1447
|
{
|
1341
|
-
|
1448
|
+
(_, line), = val
|
1449
|
+
result = s(:redo).line line
|
1342
1450
|
}
|
1343
1451
|
| kRETRY
|
1344
1452
|
{
|
1345
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
-
|
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 =
|
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 =
|
1718
|
+
result = lexer.cmdarg.store(false)
|
1604
1719
|
}
|
1605
1720
|
lambda_body
|
1606
1721
|
{
|
1607
|
-
lpar, args,
|
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 =
|
1728
|
+
call = s(:lambda).line line
|
1614
1729
|
result = new_iter call, args, body
|
1615
|
-
result.line =
|
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
|
-
|
1641
|
-
result =
|
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
|
-
|
1656
|
-
|
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 =
|
1688
|
-
|
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
|
-
|
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
|
-
|
1843
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
1994
|
-
|
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
|
-
|
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 =
|
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:
|
2347
|
-
label,
|
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
|
-
|
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,
|
2357
|
-
identifier = label.to_sym
|
2358
|
-
self.env[identifier] = :lvar
|
2499
|
+
(label, line), = val
|
2359
2500
|
|
2360
|
-
|
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:
|
2371
|
-
label,
|
2372
|
-
|
2373
|
-
self.env[
|
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,
|
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
|
-
|
2381
|
-
|
2382
|
-
|
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,
|
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
|
-
|
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
|
-
|
2445
|
-
result
|
2590
|
+
optarg, _, optblk = val
|
2591
|
+
result = optarg
|
2592
|
+
result << optblk
|
2446
2593
|
}
|
2447
2594
|
|
2448
2595
|
f_optarg: f_opt
|
2449
2596
|
{
|
2450
|
-
|
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
|
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
|
-
|
2670
|
+
v1, _, v2 = val
|
2671
|
+
result = s(:array, v1, v2).line v1.line
|
2526
2672
|
}
|
2527
2673
|
| tLABEL arg_value
|
2528
2674
|
{
|
2529
|
-
(label,
|
2530
|
-
|
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
|
-
|
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
|