ruby_parser 3.13.1 → 3.15.1
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 +97 -0
- data/Manifest.txt +2 -0
- data/README.rdoc +3 -3
- data/Rakefile +39 -21
- data/bin/ruby_parse +3 -1
- data/bin/ruby_parse_extract_error +8 -3
- data/compare/normalize.rb +43 -3
- data/debugging.md +39 -0
- data/lib/ruby20_parser.rb +3431 -3238
- data/lib/ruby20_parser.y +474 -300
- data/lib/ruby21_parser.rb +3491 -3295
- data/lib/ruby21_parser.y +482 -307
- data/lib/ruby22_parser.rb +3432 -3240
- data/lib/ruby22_parser.y +483 -308
- data/lib/ruby23_parser.rb +3338 -3150
- data/lib/ruby23_parser.y +483 -308
- data/lib/ruby24_parser.rb +3483 -3273
- data/lib/ruby24_parser.y +487 -310
- data/lib/ruby25_parser.rb +3482 -3272
- data/lib/ruby25_parser.y +487 -310
- data/lib/ruby26_parser.rb +3490 -3278
- data/lib/ruby26_parser.y +493 -314
- data/lib/ruby27_parser.rb +7224 -0
- data/lib/ruby27_parser.y +2657 -0
- data/lib/ruby_lexer.rb +483 -459
- data/lib/ruby_lexer.rex +5 -6
- data/lib/ruby_lexer.rex.rb +6 -8
- data/lib/ruby_parser.rb +29 -27
- data/lib/ruby_parser.yy +497 -315
- data/lib/ruby_parser_extras.rb +670 -420
- data/test/test_ruby_lexer.rb +1208 -1121
- data/test/test_ruby_parser.rb +2517 -1955
- data/test/test_ruby_parser_extras.rb +39 -4
- data/tools/munge.rb +10 -5
- data/tools/ripper.rb +13 -2
- metadata +28 -21
- 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
|
@@ -255,13 +257,15 @@ rule
|
|
255
257
|
}
|
256
258
|
| primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs
|
257
259
|
{
|
258
|
-
|
259
|
-
|
260
|
+
lhs1, _, lhs2, op, rhs = val
|
261
|
+
|
262
|
+
result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, op.to_sym)
|
260
263
|
}
|
261
264
|
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs
|
262
265
|
{
|
263
|
-
|
264
|
-
|
266
|
+
lhs1, _, lhs2, op, rhs = val
|
267
|
+
|
268
|
+
result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, op.to_sym)
|
265
269
|
}
|
266
270
|
| backref tOP_ASGN command_rhs
|
267
271
|
{
|
@@ -278,19 +282,26 @@ rule
|
|
278
282
|
expr: command_call
|
279
283
|
| expr kAND expr
|
280
284
|
{
|
281
|
-
|
285
|
+
lhs, _, rhs = val
|
286
|
+
result = logical_op :and, lhs, rhs
|
282
287
|
}
|
283
288
|
| expr kOR expr
|
284
289
|
{
|
285
|
-
|
290
|
+
lhs, _, rhs = val
|
291
|
+
result = logical_op :or, lhs, rhs
|
286
292
|
}
|
287
293
|
| kNOT opt_nl expr
|
288
294
|
{
|
289
|
-
|
295
|
+
(_, line), _, expr = val
|
296
|
+
result = new_call(expr, :"!").line line
|
297
|
+
# REFACTOR: call_uni_op
|
290
298
|
}
|
291
299
|
| tBANG command_call
|
292
300
|
{
|
293
|
-
|
301
|
+
_, cmd = val
|
302
|
+
result = new_call(cmd, :"!").line cmd.line
|
303
|
+
# TODO: fix line number to tBANG... but causes BAD shift/reduce conflict
|
304
|
+
# REFACTOR: call_uni_op -- see parse26.y
|
294
305
|
}
|
295
306
|
| arg
|
296
307
|
|
@@ -317,7 +328,8 @@ rule
|
|
317
328
|
block_command: block_call
|
318
329
|
| block_call call_op2 operation2 command_args
|
319
330
|
{
|
320
|
-
|
331
|
+
blk, _, msg, args = val
|
332
|
+
result = new_call(blk, msg.to_sym, args).line blk.line
|
321
333
|
}
|
322
334
|
|
323
335
|
cmd_brace_block: tLBRACE_ARG
|
@@ -337,26 +349,32 @@ rule
|
|
337
349
|
|
338
350
|
fcall: operation
|
339
351
|
{
|
340
|
-
|
352
|
+
msg, = val
|
353
|
+
result = new_call(nil, msg.to_sym).line lexer.lineno
|
341
354
|
}
|
342
355
|
|
343
356
|
command: fcall command_args =tLOWEST
|
344
357
|
{
|
345
|
-
|
358
|
+
call, args = val
|
359
|
+
result = call.concat args.sexp_body
|
346
360
|
}
|
347
361
|
| fcall command_args cmd_brace_block
|
348
362
|
{
|
349
|
-
|
350
|
-
|
351
|
-
|
363
|
+
call, args, block = val
|
364
|
+
|
365
|
+
result = call.concat args.sexp_body
|
366
|
+
|
367
|
+
if block then
|
368
|
+
block_dup_check result, block
|
352
369
|
|
353
|
-
result, operation =
|
370
|
+
result, operation = block, result
|
354
371
|
result.insert 1, operation
|
355
372
|
end
|
356
373
|
}
|
357
374
|
| primary_value call_op operation2 command_args =tLOWEST
|
358
375
|
{
|
359
|
-
|
376
|
+
lhs, callop, op, args = val
|
377
|
+
result = new_call lhs, op.to_sym, args, callop
|
360
378
|
}
|
361
379
|
| primary_value call_op operation2 command_args cmd_brace_block
|
362
380
|
{
|
@@ -388,7 +406,9 @@ rule
|
|
388
406
|
}
|
389
407
|
| kYIELD command_args
|
390
408
|
{
|
391
|
-
|
409
|
+
(_, line), args = val
|
410
|
+
result = new_yield args
|
411
|
+
result.line line # TODO: push to new_yield
|
392
412
|
}
|
393
413
|
| k_return call_args
|
394
414
|
{
|
@@ -397,8 +417,8 @@ rule
|
|
397
417
|
}
|
398
418
|
| kBREAK call_args
|
399
419
|
{
|
400
|
-
line = val
|
401
|
-
result = s(:break, ret_args(
|
420
|
+
(_, line), args = val
|
421
|
+
result = s(:break, ret_args(args)).line line
|
402
422
|
}
|
403
423
|
| kNEXT call_args
|
404
424
|
{
|
@@ -415,56 +435,79 @@ rule
|
|
415
435
|
mlhs_inner: mlhs_basic
|
416
436
|
| tLPAREN mlhs_inner rparen
|
417
437
|
{
|
418
|
-
|
438
|
+
_, arg, _ = val
|
439
|
+
l = arg.line
|
440
|
+
|
441
|
+
result = s(:masgn, s(:array, arg).line(l)).line l
|
419
442
|
}
|
420
443
|
|
421
444
|
mlhs_basic: mlhs_head
|
422
445
|
{
|
423
|
-
|
446
|
+
head, = val
|
447
|
+
result = s(:masgn, head).line head.line
|
424
448
|
}
|
425
449
|
| mlhs_head mlhs_item
|
426
450
|
{
|
427
|
-
|
451
|
+
lhs, rhs = val
|
452
|
+
result = s(:masgn, lhs << rhs.compact).line lhs.line
|
428
453
|
}
|
429
454
|
| mlhs_head tSTAR mlhs_node
|
430
455
|
{
|
431
|
-
|
456
|
+
head, _, tail = val
|
457
|
+
head << s(:splat, tail).line(tail.line)
|
458
|
+
result = s(:masgn, head).line head.line
|
432
459
|
}
|
433
460
|
| mlhs_head tSTAR mlhs_node tCOMMA mlhs_post
|
434
461
|
{
|
435
462
|
ary1, _, splat, _, ary2 = val
|
436
463
|
|
437
|
-
result = list_append ary1, s(:splat, splat)
|
464
|
+
result = list_append ary1, s(:splat, splat).line(splat.line)
|
438
465
|
result.concat ary2.sexp_body
|
439
|
-
result = s(:masgn, result)
|
466
|
+
result = s(:masgn, result).line result.line
|
440
467
|
}
|
441
468
|
| mlhs_head tSTAR
|
442
469
|
{
|
443
|
-
|
470
|
+
head, _ = val
|
471
|
+
l = head.line
|
472
|
+
result = s(:masgn, head << s(:splat).line(l)).line l
|
444
473
|
}
|
445
474
|
| mlhs_head tSTAR tCOMMA mlhs_post
|
446
475
|
{
|
447
|
-
|
448
|
-
ary
|
449
|
-
|
476
|
+
head, _, _, post = val
|
477
|
+
ary = list_append head, s(:splat).line(head.line)
|
478
|
+
ary.concat post.sexp_body
|
479
|
+
result = s(:masgn, ary).line ary.line
|
450
480
|
}
|
451
481
|
| tSTAR mlhs_node
|
452
482
|
{
|
453
|
-
|
483
|
+
_, node = val
|
484
|
+
l = node.line
|
485
|
+
splat = s(:splat, node).line l
|
486
|
+
ary = s(:array, splat).line l
|
487
|
+
result = s(:masgn, ary).line l
|
454
488
|
}
|
455
489
|
| tSTAR mlhs_node tCOMMA mlhs_post
|
456
490
|
{
|
457
|
-
|
458
|
-
|
459
|
-
|
491
|
+
_, node, _, post = val
|
492
|
+
|
493
|
+
splat = s(:splat, node).line node.line
|
494
|
+
ary = s(:array, splat).line splat.line
|
495
|
+
ary.concat post.sexp_body
|
496
|
+
result = s(:masgn, ary).line ary.line
|
460
497
|
}
|
461
498
|
| tSTAR
|
462
499
|
{
|
463
|
-
|
500
|
+
l = lexer.lineno
|
501
|
+
result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l
|
464
502
|
}
|
465
503
|
| tSTAR tCOMMA mlhs_post
|
466
504
|
{
|
467
|
-
|
505
|
+
_, _, post = val
|
506
|
+
l = post.line
|
507
|
+
|
508
|
+
splat = s(:splat).line l
|
509
|
+
ary = s(:array, splat, *post.sexp_body).line l
|
510
|
+
result = s(:masgn, ary).line l
|
468
511
|
}
|
469
512
|
|
470
513
|
mlhs_item: mlhs_node
|
@@ -475,7 +518,8 @@ rule
|
|
475
518
|
|
476
519
|
mlhs_head: mlhs_item tCOMMA
|
477
520
|
{
|
478
|
-
|
521
|
+
lhs, _ = val
|
522
|
+
result = s(:array, lhs).line lhs.line
|
479
523
|
}
|
480
524
|
| mlhs_head mlhs_item tCOMMA
|
481
525
|
{
|
@@ -484,7 +528,8 @@ rule
|
|
484
528
|
|
485
529
|
mlhs_post: mlhs_item
|
486
530
|
{
|
487
|
-
|
531
|
+
item, = val
|
532
|
+
result = s(:array, item).line item.line
|
488
533
|
}
|
489
534
|
| mlhs_post tCOMMA mlhs_item
|
490
535
|
{
|
@@ -509,7 +554,8 @@ rule
|
|
509
554
|
}
|
510
555
|
| primary_value tCOLON2 tIDENTIFIER
|
511
556
|
{
|
512
|
-
|
557
|
+
recv, _, id = val
|
558
|
+
result = new_attrasgn recv, id
|
513
559
|
}
|
514
560
|
| primary_value call_op tCONSTANT
|
515
561
|
{
|
@@ -522,7 +568,10 @@ rule
|
|
522
568
|
yyerror "dynamic constant assignment"
|
523
569
|
end
|
524
570
|
|
525
|
-
|
571
|
+
expr, _, id = val
|
572
|
+
l = expr.line
|
573
|
+
|
574
|
+
result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l
|
526
575
|
}
|
527
576
|
| tCOLON3 tCONSTANT
|
528
577
|
{
|
@@ -531,7 +580,10 @@ rule
|
|
531
580
|
yyerror "dynamic constant assignment"
|
532
581
|
end
|
533
582
|
|
534
|
-
|
583
|
+
_, id = val
|
584
|
+
l = lexer.lineno
|
585
|
+
|
586
|
+
result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l
|
535
587
|
}
|
536
588
|
| backref
|
537
589
|
{
|
@@ -540,24 +592,31 @@ rule
|
|
540
592
|
|
541
593
|
lhs: user_variable
|
542
594
|
{
|
595
|
+
line = lexer.lineno
|
543
596
|
result = self.assignable val[0]
|
597
|
+
result.line = line
|
544
598
|
}
|
545
599
|
| keyword_variable
|
546
600
|
{
|
601
|
+
line = lexer.lineno
|
547
602
|
result = self.assignable val[0]
|
603
|
+
result.line = line
|
548
604
|
debug20 9, val, result
|
549
605
|
}
|
550
606
|
| primary_value tLBRACK2 opt_call_args rbracket
|
551
607
|
{
|
552
|
-
|
608
|
+
lhs, _, args, _ = val
|
609
|
+
result = self.aryset lhs, args
|
553
610
|
}
|
554
611
|
| primary_value call_op tIDENTIFIER # REFACTOR
|
555
612
|
{
|
556
|
-
|
613
|
+
lhs, op, id = val
|
614
|
+
result = new_attrasgn lhs, id, op
|
557
615
|
}
|
558
616
|
| primary_value tCOLON2 tIDENTIFIER
|
559
617
|
{
|
560
|
-
|
618
|
+
lhs, _, id = val
|
619
|
+
result = new_attrasgn lhs, id
|
561
620
|
}
|
562
621
|
| primary_value call_op tCONSTANT # REFACTOR?
|
563
622
|
{
|
@@ -565,21 +624,27 @@ rule
|
|
565
624
|
}
|
566
625
|
| primary_value tCOLON2 tCONSTANT
|
567
626
|
{
|
627
|
+
expr, _, id = val
|
628
|
+
|
568
629
|
if (self.in_def || self.in_single > 0) then
|
569
630
|
debug20 10
|
570
631
|
yyerror "dynamic constant assignment"
|
571
632
|
end
|
572
633
|
|
573
|
-
|
634
|
+
l = expr.line
|
635
|
+
result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l
|
574
636
|
}
|
575
637
|
| tCOLON3 tCONSTANT
|
576
638
|
{
|
639
|
+
_, id = val
|
640
|
+
|
577
641
|
if (self.in_def || self.in_single > 0) then
|
578
642
|
debug20 11
|
579
643
|
yyerror "dynamic constant assignment"
|
580
644
|
end
|
581
645
|
|
582
|
-
|
646
|
+
l = lexer.lineno
|
647
|
+
result = s(:const, s(:colon3, id.to_sym).line(l)).line l
|
583
648
|
}
|
584
649
|
| backref
|
585
650
|
{
|
@@ -594,7 +659,8 @@ rule
|
|
594
659
|
|
595
660
|
cpath: tCOLON3 cname
|
596
661
|
{
|
597
|
-
|
662
|
+
_, name = val
|
663
|
+
result = s(:colon3, name.to_sym).line lexer.lineno
|
598
664
|
}
|
599
665
|
| cname
|
600
666
|
{
|
@@ -602,7 +668,10 @@ rule
|
|
602
668
|
}
|
603
669
|
| primary_value tCOLON2 cname
|
604
670
|
{
|
605
|
-
|
671
|
+
pval, _, name = val
|
672
|
+
|
673
|
+
result = s(:colon2, pval, name.to_sym)
|
674
|
+
result.line pval.line
|
606
675
|
}
|
607
676
|
|
608
677
|
fname: tIDENTIFIER | tCONSTANT | tFID
|
@@ -623,7 +692,8 @@ rule
|
|
623
692
|
|
624
693
|
fitem: fsym
|
625
694
|
{
|
626
|
-
|
695
|
+
id, = val
|
696
|
+
result = s(:lit, id.to_sym).line lexer.lineno
|
627
697
|
}
|
628
698
|
| dsym
|
629
699
|
|
@@ -646,6 +716,7 @@ rule
|
|
646
716
|
| tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
|
647
717
|
| tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE
|
648
718
|
| tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2
|
719
|
+
# TODO: tUBANG dead?
|
649
720
|
| tUBANG
|
650
721
|
|
651
722
|
reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND
|
@@ -668,8 +739,7 @@ rule
|
|
668
739
|
}
|
669
740
|
| primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs
|
670
741
|
{
|
671
|
-
|
672
|
-
result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
|
742
|
+
result = new_op_asgn1 val
|
673
743
|
}
|
674
744
|
| primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs
|
675
745
|
{
|
@@ -681,7 +751,9 @@ rule
|
|
681
751
|
}
|
682
752
|
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs
|
683
753
|
{
|
684
|
-
|
754
|
+
lhs, _, id, op, rhs = val
|
755
|
+
|
756
|
+
result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line
|
685
757
|
}
|
686
758
|
| primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs
|
687
759
|
{
|
@@ -711,18 +783,18 @@ rule
|
|
711
783
|
{
|
712
784
|
v1, v2 = val[0], val[2]
|
713
785
|
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))
|
786
|
+
result = s(:lit, (v1.last)..(v2.last)).line v1.line
|
715
787
|
else
|
716
|
-
result = s(:dot2, v1, v2)
|
788
|
+
result = s(:dot2, v1, v2).line v1.line
|
717
789
|
end
|
718
790
|
}
|
719
791
|
| arg tDOT3 arg
|
720
792
|
{
|
721
793
|
v1, v2 = val[0], val[2]
|
722
794
|
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))
|
795
|
+
result = s(:lit, (v1.last)...(v2.last)).line v1.line
|
724
796
|
else
|
725
|
-
result = s(:dot3, v1, v2)
|
797
|
+
result = s(:dot3, v1, v2).line v1.line
|
726
798
|
end
|
727
799
|
}
|
728
800
|
| arg tPLUS arg
|
@@ -751,11 +823,14 @@ rule
|
|
751
823
|
}
|
752
824
|
| tUMINUS_NUM tINTEGER tPOW arg
|
753
825
|
{
|
754
|
-
|
826
|
+
lit = s(:lit, val[1]).line lexer.lineno
|
827
|
+
result = new_call(new_call(lit, :"**", argl(val[3])), :"-@")
|
755
828
|
}
|
756
829
|
| tUMINUS_NUM tFLOAT tPOW arg
|
757
830
|
{
|
758
|
-
|
831
|
+
lit = s(:lit, val[1]).line lexer.lineno
|
832
|
+
result = new_call(new_call(lit, :"**", argl(val[3])), :"-@")
|
833
|
+
|
759
834
|
## TODO: why is this 2.0 only?
|
760
835
|
debug20 12, val, result
|
761
836
|
}
|
@@ -798,15 +873,19 @@ rule
|
|
798
873
|
}
|
799
874
|
| arg tMATCH arg
|
800
875
|
{
|
801
|
-
|
876
|
+
lhs, _, rhs = val
|
877
|
+
result = new_match lhs, rhs
|
802
878
|
}
|
803
879
|
| arg tNMATCH arg
|
804
880
|
{
|
805
|
-
|
881
|
+
lhs, _, rhs = val
|
882
|
+
result = s(:not, new_match(lhs, rhs)).line lhs.line
|
806
883
|
}
|
807
884
|
| tBANG arg
|
808
885
|
{
|
809
|
-
|
886
|
+
_, arg = val
|
887
|
+
result = new_call arg, :"!"
|
888
|
+
result.line arg.line
|
810
889
|
}
|
811
890
|
| tTILDE arg
|
812
891
|
{
|
@@ -834,11 +913,13 @@ rule
|
|
834
913
|
}
|
835
914
|
| kDEFINED opt_nl arg
|
836
915
|
{
|
837
|
-
|
916
|
+
(_, line), _, arg = val
|
917
|
+
result = s(:defined, arg).line line
|
838
918
|
}
|
839
919
|
| arg tEH arg opt_nl tCOLON arg
|
840
920
|
{
|
841
|
-
|
921
|
+
c, _, t, _, _, f = val
|
922
|
+
result = s(:if, c, t, f).line c.line
|
842
923
|
}
|
843
924
|
| primary
|
844
925
|
|
@@ -881,28 +962,25 @@ rule
|
|
881
962
|
arg_rhs: arg =tOP_ASGN
|
882
963
|
| arg kRESCUE_MOD arg
|
883
964
|
{
|
884
|
-
body, _, resbody = val
|
965
|
+
body, (_, line), resbody = val
|
885
966
|
body = value_expr body
|
886
967
|
resbody = remove_begin resbody
|
887
|
-
|
968
|
+
|
969
|
+
ary = s(:array).line line
|
970
|
+
result = new_rescue(body, new_resbody(ary, resbody))
|
888
971
|
}
|
889
972
|
|
890
973
|
paren_args: tLPAREN2 opt_call_args rparen
|
891
974
|
{
|
892
|
-
|
975
|
+
_, args, _ = val
|
976
|
+
result = args
|
893
977
|
}
|
894
978
|
|
895
979
|
opt_paren_args: none
|
896
980
|
| paren_args
|
897
981
|
|
898
982
|
opt_call_args: none
|
899
|
-
{
|
900
|
-
result = val[0]
|
901
|
-
}
|
902
983
|
| call_args
|
903
|
-
{
|
904
|
-
result = val[0]
|
905
|
-
}
|
906
984
|
| args tCOMMA
|
907
985
|
{
|
908
986
|
result = args val
|
@@ -924,17 +1002,14 @@ rule
|
|
924
1002
|
| args opt_block_arg
|
925
1003
|
{
|
926
1004
|
result = call_args val
|
927
|
-
result = self.arg_blk_pass val[0], val[1]
|
928
1005
|
}
|
929
1006
|
| assocs opt_block_arg
|
930
1007
|
{
|
931
|
-
result = call_args [array_to_hash(val[0])]
|
932
|
-
result = self.arg_blk_pass result, val[1]
|
1008
|
+
result = call_args [array_to_hash(val[0]), val[1]]
|
933
1009
|
}
|
934
1010
|
| args tCOMMA assocs opt_block_arg
|
935
1011
|
{
|
936
|
-
result = call_args [val[0], array_to_hash(val[2])]
|
937
|
-
result = self.arg_blk_pass result, val[3]
|
1012
|
+
result = call_args [val[0], array_to_hash(val[2]), val[3]]
|
938
1013
|
}
|
939
1014
|
| block_arg
|
940
1015
|
{
|
@@ -942,17 +1017,45 @@ rule
|
|
942
1017
|
}
|
943
1018
|
|
944
1019
|
command_args: {
|
945
|
-
|
1020
|
+
# parse26.y line 2200
|
1021
|
+
|
1022
|
+
# If call_args starts with a open paren '(' or
|
1023
|
+
# '[', look-ahead reading of the letters calls
|
1024
|
+
# CMDARG_PUSH(0), but the push must be done
|
1025
|
+
# after CMDARG_PUSH(1). So this code makes them
|
1026
|
+
# consistent by first cancelling the premature
|
1027
|
+
# CMDARG_PUSH(0), doing CMDARG_PUSH(1), and
|
1028
|
+
# finally redoing CMDARG_PUSH(0).
|
1029
|
+
|
1030
|
+
result = yychar = self.last_token_type.first
|
1031
|
+
lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar)
|
1032
|
+
lexer.cmdarg.pop if lookahead
|
1033
|
+
lexer.cmdarg.push true
|
1034
|
+
lexer.cmdarg.push false if lookahead
|
946
1035
|
}
|
947
1036
|
call_args
|
948
1037
|
{
|
949
|
-
|
950
|
-
|
1038
|
+
yychar, args = val
|
1039
|
+
|
1040
|
+
# call_args can be followed by tLBRACE_ARG (that
|
1041
|
+
# does CMDARG_PUSH(0) in the lexer) but the push
|
1042
|
+
# must be done after CMDARG_POP() in the parser.
|
1043
|
+
# So this code does CMDARG_POP() to pop 0 pushed
|
1044
|
+
# by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed
|
1045
|
+
# by command_args, and CMDARG_PUSH(0) to restore
|
1046
|
+
# back the flag set by tLBRACE_ARG.
|
1047
|
+
|
1048
|
+
lookahead = [:tLBRACE_ARG].include?(yychar)
|
1049
|
+
lexer.cmdarg.pop if lookahead
|
1050
|
+
lexer.cmdarg.pop
|
1051
|
+
lexer.cmdarg.push false if lookahead
|
1052
|
+
result = args
|
951
1053
|
}
|
952
1054
|
|
953
1055
|
block_arg: tAMPER arg_value
|
954
1056
|
{
|
955
|
-
|
1057
|
+
_, arg = val
|
1058
|
+
result = s(:block_pass, arg).line arg.line
|
956
1059
|
}
|
957
1060
|
|
958
1061
|
opt_block_arg: tCOMMA block_arg
|
@@ -963,19 +1066,27 @@ rule
|
|
963
1066
|
|
964
1067
|
args: arg_value
|
965
1068
|
{
|
966
|
-
|
1069
|
+
arg, = val
|
1070
|
+
lineno = arg.line || lexer.lineno # HACK
|
1071
|
+
|
1072
|
+
result = s(:array, arg).line lineno
|
967
1073
|
}
|
968
1074
|
| tSTAR arg_value
|
969
1075
|
{
|
970
|
-
|
1076
|
+
_, arg = val
|
1077
|
+
result = s(:array, s(:splat, arg).line(arg.line)).line arg.line
|
971
1078
|
}
|
972
1079
|
| args tCOMMA arg_value
|
973
1080
|
{
|
974
|
-
|
1081
|
+
args, _, id = val
|
1082
|
+
result = self.list_append args, id
|
975
1083
|
}
|
976
1084
|
| args tCOMMA tSTAR arg_value
|
977
1085
|
{
|
978
|
-
|
1086
|
+
# TODO: the line number from tSTAR has been dropped
|
1087
|
+
args, _, _, id = val
|
1088
|
+
line = lexer.lineno
|
1089
|
+
result = self.list_append args, s(:splat, id).line(line)
|
979
1090
|
}
|
980
1091
|
|
981
1092
|
mrhs: args tCOMMA arg_value
|
@@ -984,11 +1095,14 @@ rule
|
|
984
1095
|
}
|
985
1096
|
| args tCOMMA tSTAR arg_value
|
986
1097
|
{
|
987
|
-
|
1098
|
+
# TODO: make all tXXXX terminals include lexer.lineno
|
1099
|
+
arg, _, _, splat = val
|
1100
|
+
result = self.arg_concat arg, splat
|
988
1101
|
}
|
989
1102
|
| tSTAR arg_value
|
990
1103
|
{
|
991
|
-
|
1104
|
+
_, arg = val
|
1105
|
+
result = s(:splat, arg).line arg.line
|
992
1106
|
}
|
993
1107
|
|
994
1108
|
primary: literal
|
@@ -1003,65 +1117,65 @@ rule
|
|
1003
1117
|
| backref
|
1004
1118
|
| tFID
|
1005
1119
|
{
|
1006
|
-
|
1120
|
+
msg, = val
|
1121
|
+
result = new_call nil, msg.to_sym
|
1007
1122
|
}
|
1008
1123
|
| k_begin
|
1009
1124
|
{
|
1125
|
+
lexer.cmdarg.push false
|
1010
1126
|
result = self.lexer.lineno
|
1011
|
-
# TODO:
|
1012
|
-
# $<val>1 = cmdarg_stack;
|
1013
|
-
# CMDARG_SET(0);
|
1014
1127
|
}
|
1015
1128
|
bodystmt k_end
|
1016
1129
|
{
|
1017
|
-
|
1018
|
-
|
1019
|
-
result = s(:nil)
|
1020
|
-
else
|
1021
|
-
result = s(:begin, val[2])
|
1022
|
-
end
|
1023
|
-
|
1024
|
-
result.line = val[1]
|
1130
|
+
lexer.cmdarg.pop
|
1131
|
+
result = new_begin val
|
1025
1132
|
}
|
1026
|
-
| tLPAREN_ARG
|
1133
|
+
| tLPAREN_ARG
|
1027
1134
|
{
|
1028
|
-
|
1029
|
-
|
1135
|
+
lexer.lex_state = EXPR_ENDARG
|
1136
|
+
result = lexer.lineno
|
1030
1137
|
}
|
1031
|
-
|
1138
|
+
rparen
|
1032
1139
|
{
|
1033
|
-
|
1034
|
-
|
1035
|
-
# lexer.cmdarg.stack.replace [false] # TODO add api for these
|
1140
|
+
_, line, _ = val
|
1141
|
+
result = s(:begin).line line
|
1036
1142
|
}
|
1143
|
+
| tLPAREN_ARG
|
1037
1144
|
stmt
|
1038
1145
|
{
|
1039
1146
|
lexer.lex_state = EXPR_ENDARG
|
1040
1147
|
}
|
1041
1148
|
rparen
|
1042
1149
|
{
|
1043
|
-
_,
|
1044
|
-
warning "(...) interpreted as grouped expression"
|
1045
|
-
lexer.cmdarg.restore cmdarg
|
1150
|
+
_, stmt, _, _, = val
|
1151
|
+
# warning "(...) interpreted as grouped expression"
|
1046
1152
|
result = stmt
|
1047
1153
|
}
|
1048
1154
|
| tLPAREN compstmt tRPAREN
|
1049
1155
|
{
|
1050
|
-
|
1156
|
+
_, stmt, _ = val
|
1157
|
+
result = stmt
|
1158
|
+
result ||= s(:nil).line lexer.lineno
|
1051
1159
|
result.paren = true
|
1052
1160
|
}
|
1053
1161
|
| primary_value tCOLON2 tCONSTANT
|
1054
1162
|
{
|
1055
|
-
|
1163
|
+
expr, _, id = val
|
1164
|
+
|
1165
|
+
result = s(:colon2, expr, id.to_sym).line expr.line
|
1056
1166
|
}
|
1057
1167
|
| tCOLON3 tCONSTANT
|
1058
1168
|
{
|
1059
|
-
|
1169
|
+
_, id = val
|
1170
|
+
|
1171
|
+
result = s(:colon3, id.to_sym).line lexer.lineno
|
1060
1172
|
}
|
1061
|
-
| tLBRACK aref_args tRBRACK
|
1173
|
+
| tLBRACK { result = lexer.lineno } aref_args tRBRACK
|
1062
1174
|
{
|
1063
|
-
|
1175
|
+
_, line, args, _ = val
|
1176
|
+
result = args || s(:array)
|
1064
1177
|
result.sexp_type = :array # aref_args is :args
|
1178
|
+
result.line line
|
1065
1179
|
}
|
1066
1180
|
| tLBRACE
|
1067
1181
|
{
|
@@ -1073,7 +1187,8 @@ rule
|
|
1073
1187
|
}
|
1074
1188
|
| k_return
|
1075
1189
|
{
|
1076
|
-
|
1190
|
+
(_, line), = val
|
1191
|
+
result = s(:return).line line
|
1077
1192
|
}
|
1078
1193
|
| kYIELD tLPAREN2 call_args rparen
|
1079
1194
|
{
|
@@ -1089,11 +1204,14 @@ rule
|
|
1089
1204
|
}
|
1090
1205
|
| kDEFINED opt_nl tLPAREN2 expr rparen
|
1091
1206
|
{
|
1092
|
-
|
1207
|
+
(_, line), _, _, arg, _ = val
|
1208
|
+
|
1209
|
+
result = s(:defined, arg).line line
|
1093
1210
|
}
|
1094
1211
|
| kNOT tLPAREN2 expr rparen
|
1095
1212
|
{
|
1096
|
-
|
1213
|
+
_, _, lhs, _ = val
|
1214
|
+
result = new_call lhs, :"!"
|
1097
1215
|
}
|
1098
1216
|
| kNOT tLPAREN2 rparen
|
1099
1217
|
{
|
@@ -1101,11 +1219,11 @@ rule
|
|
1101
1219
|
}
|
1102
1220
|
| fcall brace_block
|
1103
1221
|
{
|
1104
|
-
|
1105
|
-
|
1222
|
+
call, iter = val
|
1223
|
+
|
1106
1224
|
iter.insert 1, call
|
1107
1225
|
result = iter
|
1108
|
-
call.line = iter.line
|
1226
|
+
# FIX: probably not: call.line = iter.line
|
1109
1227
|
}
|
1110
1228
|
| method_call
|
1111
1229
|
| method_call brace_block
|
@@ -1213,66 +1331,82 @@ rule
|
|
1213
1331
|
}
|
1214
1332
|
| k_def fname
|
1215
1333
|
{
|
1216
|
-
result =
|
1334
|
+
result = self.in_def
|
1217
1335
|
|
1218
|
-
self.
|
1219
|
-
self.in_def = true
|
1336
|
+
self.in_def = true # group = local_push
|
1220
1337
|
self.env.extend
|
1221
|
-
|
1222
|
-
|
1223
|
-
|
1338
|
+
lexer.cmdarg.push false
|
1339
|
+
lexer.cond.push false
|
1340
|
+
|
1341
|
+
self.comments.push self.lexer.comments
|
1224
1342
|
}
|
1225
|
-
f_arglist bodystmt k_end
|
1343
|
+
f_arglist bodystmt { result = lexer.lineno } k_end
|
1226
1344
|
{
|
1227
|
-
in_def
|
1345
|
+
in_def = val[2]
|
1228
1346
|
|
1229
1347
|
result = new_defn val
|
1230
1348
|
|
1231
|
-
lexer.
|
1349
|
+
lexer.cond.pop # group = local_pop
|
1350
|
+
lexer.cmdarg.pop
|
1232
1351
|
self.env.unextend
|
1233
1352
|
self.in_def = in_def
|
1353
|
+
|
1234
1354
|
self.lexer.comments # we don't care about comments in the body
|
1235
1355
|
}
|
1236
1356
|
| k_def singleton dot_or_colon
|
1237
1357
|
{
|
1238
|
-
self.comments.push self.lexer.comments
|
1239
1358
|
lexer.lex_state = EXPR_FNAME
|
1240
1359
|
}
|
1241
1360
|
fname
|
1242
1361
|
{
|
1243
|
-
self.
|
1362
|
+
result = [self.in_def, lexer.lineno]
|
1363
|
+
|
1364
|
+
self.in_single += 1 # TODO: remove?
|
1365
|
+
|
1366
|
+
self.in_def = true # local_push
|
1244
1367
|
self.env.extend
|
1245
|
-
lexer.
|
1246
|
-
|
1247
|
-
|
1368
|
+
lexer.cmdarg.push false
|
1369
|
+
lexer.cond.push false
|
1370
|
+
|
1371
|
+
lexer.lex_state = EXPR_ENDFN|EXPR_LABEL
|
1372
|
+
self.comments.push self.lexer.comments
|
1248
1373
|
}
|
1249
1374
|
f_arglist bodystmt k_end
|
1250
1375
|
{
|
1251
|
-
|
1252
|
-
result = new_defs val
|
1253
|
-
result[3].line line
|
1376
|
+
_, _recv, _, _, _name, (in_def, _lineno), _args, _body, _ = val
|
1254
1377
|
|
1255
|
-
|
1378
|
+
result = new_defs val
|
1256
1379
|
|
1380
|
+
lexer.cond.pop # group = local_pop
|
1381
|
+
lexer.cmdarg.pop
|
1257
1382
|
self.env.unextend
|
1383
|
+
self.in_def = in_def
|
1384
|
+
|
1258
1385
|
self.in_single -= 1
|
1386
|
+
|
1387
|
+
# TODO: restore cur_arg ? what's cur_arg?
|
1388
|
+
|
1259
1389
|
self.lexer.comments # we don't care about comments in the body
|
1260
1390
|
}
|
1261
1391
|
| kBREAK
|
1262
1392
|
{
|
1263
|
-
|
1393
|
+
(_, line), = val
|
1394
|
+
result = s(:break).line line
|
1264
1395
|
}
|
1265
1396
|
| kNEXT
|
1266
1397
|
{
|
1267
|
-
|
1398
|
+
(_, line), = val
|
1399
|
+
result = s(:next).line line
|
1268
1400
|
}
|
1269
1401
|
| kREDO
|
1270
1402
|
{
|
1271
|
-
|
1403
|
+
(_, line), = val
|
1404
|
+
result = s(:redo).line line
|
1272
1405
|
}
|
1273
1406
|
| kRETRY
|
1274
1407
|
{
|
1275
|
-
|
1408
|
+
(_, line), = val
|
1409
|
+
result = s(:retry).line line
|
1276
1410
|
}
|
1277
1411
|
|
1278
1412
|
primary_value: primary
|
@@ -1311,7 +1445,9 @@ rule
|
|
1311
1445
|
if_tail: opt_else
|
1312
1446
|
| k_elsif expr_value then compstmt if_tail
|
1313
1447
|
{
|
1314
|
-
|
1448
|
+
(_, line), c, _, t, rest = val
|
1449
|
+
|
1450
|
+
result = s(:if, c, t, rest).line line
|
1315
1451
|
}
|
1316
1452
|
|
1317
1453
|
opt_else: none
|
@@ -1334,7 +1470,9 @@ rule
|
|
1334
1470
|
|
1335
1471
|
f_marg_list: f_marg
|
1336
1472
|
{
|
1337
|
-
|
1473
|
+
sym, = val
|
1474
|
+
|
1475
|
+
result = s(:array, sym).line lexer.lineno
|
1338
1476
|
}
|
1339
1477
|
| f_marg_list tCOMMA f_marg
|
1340
1478
|
{
|
@@ -1408,7 +1546,9 @@ rule
|
|
1408
1546
|
}
|
1409
1547
|
| f_block_arg
|
1410
1548
|
{
|
1411
|
-
|
1549
|
+
line = lexer.lineno
|
1550
|
+
result = call_args val # TODO: push line down
|
1551
|
+
result.line line
|
1412
1552
|
}
|
1413
1553
|
|
1414
1554
|
opt_block_args_tail: tCOMMA block_args_tail
|
@@ -1439,7 +1579,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1439
1579
|
}
|
1440
1580
|
| f_arg tCOMMA
|
1441
1581
|
{
|
1442
|
-
result = args
|
1582
|
+
result = args(val) << nil
|
1443
1583
|
}
|
1444
1584
|
| f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
|
1445
1585
|
{
|
@@ -1491,7 +1631,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1491
1631
|
}
|
1492
1632
|
| tOROP
|
1493
1633
|
{
|
1494
|
-
result = s(:args)
|
1634
|
+
result = s(:args).line lexer.lineno
|
1495
1635
|
}
|
1496
1636
|
| tPIPE block_param opt_bv_decl tPIPE
|
1497
1637
|
{
|
@@ -1516,34 +1656,33 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1516
1656
|
|
1517
1657
|
bvar: tIDENTIFIER
|
1518
1658
|
{
|
1519
|
-
|
1659
|
+
id, = val
|
1660
|
+
line = lexer.lineno
|
1661
|
+
result = s(:shadow, id.to_sym).line line
|
1520
1662
|
}
|
1521
1663
|
| f_bad_arg
|
1522
1664
|
|
1523
1665
|
lambda: {
|
1524
1666
|
self.env.extend :dynamic
|
1525
|
-
result =
|
1526
|
-
|
1527
|
-
result = lexer.lpar_beg
|
1667
|
+
result = [lexer.lineno, lexer.lpar_beg]
|
1528
1668
|
lexer.paren_nest += 1
|
1529
1669
|
lexer.lpar_beg = lexer.paren_nest
|
1530
1670
|
}
|
1531
1671
|
f_larglist
|
1532
1672
|
{
|
1533
|
-
|
1673
|
+
lexer.cmdarg.push false
|
1534
1674
|
}
|
1535
1675
|
lambda_body
|
1536
1676
|
{
|
1537
|
-
lpar, args,
|
1677
|
+
(line, lpar), args, _cmdarg, body = val
|
1538
1678
|
lexer.lpar_beg = lpar
|
1539
1679
|
|
1540
|
-
lexer.cmdarg.
|
1541
|
-
lexer.cmdarg.lexpop
|
1680
|
+
lexer.cmdarg.pop
|
1542
1681
|
|
1543
|
-
call =
|
1682
|
+
call = s(:lambda).line line
|
1544
1683
|
result = new_iter call, args, body
|
1545
|
-
result.line =
|
1546
|
-
self.env.unextend
|
1684
|
+
result.line = line
|
1685
|
+
self.env.unextend # TODO: dynapush & dynapop
|
1547
1686
|
}
|
1548
1687
|
|
1549
1688
|
f_larglist: tLPAREN2 f_args opt_bv_decl rparen
|
@@ -1567,8 +1706,8 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1567
1706
|
|
1568
1707
|
do_block: k_do_block do_body kEND
|
1569
1708
|
{
|
1570
|
-
|
1571
|
-
result =
|
1709
|
+
(_, line), iter, _ = val
|
1710
|
+
result = iter.line line
|
1572
1711
|
}
|
1573
1712
|
|
1574
1713
|
block_call: command do_block
|
@@ -1582,8 +1721,10 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1582
1721
|
|
1583
1722
|
val = invert_block_call val if inverted? val
|
1584
1723
|
|
1585
|
-
|
1586
|
-
|
1724
|
+
cmd, blk = val
|
1725
|
+
|
1726
|
+
result = blk
|
1727
|
+
result.insert 1, cmd
|
1587
1728
|
}
|
1588
1729
|
| block_call call_op2 operation2 opt_paren_args
|
1589
1730
|
{
|
@@ -1614,8 +1755,10 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1614
1755
|
}
|
1615
1756
|
paren_args
|
1616
1757
|
{
|
1617
|
-
args =
|
1618
|
-
|
1758
|
+
call, lineno, args = val
|
1759
|
+
|
1760
|
+
result = call.concat args.sexp_body if args
|
1761
|
+
result.line lineno
|
1619
1762
|
}
|
1620
1763
|
| primary_value call_op operation2 opt_paren_args
|
1621
1764
|
{
|
@@ -1643,7 +1786,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1643
1786
|
}
|
1644
1787
|
| kSUPER
|
1645
1788
|
{
|
1646
|
-
result = s(:zsuper)
|
1789
|
+
result = s(:zsuper).line lexer.lineno
|
1647
1790
|
}
|
1648
1791
|
| primary_value tLBRACK2 opt_call_args rbracket
|
1649
1792
|
{
|
@@ -1692,15 +1835,15 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1692
1835
|
}
|
1693
1836
|
|
1694
1837
|
do_body: { self.env.extend :dynamic; result = self.lexer.lineno }
|
1695
|
-
{
|
1838
|
+
{ lexer.cmdarg.push false }
|
1696
1839
|
opt_block_param
|
1697
1840
|
compstmt
|
1698
1841
|
{
|
1699
|
-
line,
|
1842
|
+
line, _cmdarg, param, cmpstmt = val
|
1700
1843
|
|
1701
1844
|
result = new_do_body param, cmpstmt, line
|
1845
|
+
lexer.cmdarg.pop
|
1702
1846
|
self.env.unextend
|
1703
|
-
lexer.cmdarg.restore cmdarg
|
1704
1847
|
}
|
1705
1848
|
|
1706
1849
|
case_body: k_when
|
@@ -1721,7 +1864,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1721
1864
|
(_, line), klasses, var, _, body, rest = val
|
1722
1865
|
|
1723
1866
|
klasses ||= s(:array)
|
1724
|
-
klasses << new_assign(var, s(:gvar, :"$!")) if var
|
1867
|
+
klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var
|
1725
1868
|
klasses.line line
|
1726
1869
|
|
1727
1870
|
result = new_resbody(klasses, body)
|
@@ -1734,7 +1877,8 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1734
1877
|
|
1735
1878
|
exc_list: arg_value
|
1736
1879
|
{
|
1737
|
-
|
1880
|
+
arg, = val
|
1881
|
+
result = s(:array, arg).line arg.line
|
1738
1882
|
}
|
1739
1883
|
| mrhs
|
1740
1884
|
| none
|
@@ -1747,26 +1891,31 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1747
1891
|
|
1748
1892
|
opt_ensure: k_ensure compstmt
|
1749
1893
|
{
|
1750
|
-
_, body = val
|
1894
|
+
(_, line), body = val
|
1751
1895
|
|
1752
|
-
result = body || s(:nil)
|
1896
|
+
result = body || s(:nil).line(line)
|
1753
1897
|
}
|
1754
1898
|
| none
|
1755
1899
|
|
1756
1900
|
literal: numeric
|
1757
1901
|
{
|
1902
|
+
line = lexer.lineno
|
1758
1903
|
result = s(:lit, val[0])
|
1904
|
+
result.line = line
|
1759
1905
|
}
|
1760
1906
|
| symbol
|
1761
1907
|
{
|
1908
|
+
line = lexer.lineno
|
1762
1909
|
result = s(:lit, val[0])
|
1910
|
+
result.line = line
|
1763
1911
|
}
|
1764
1912
|
| dsym
|
1765
1913
|
|
1766
1914
|
strings: string
|
1767
1915
|
{
|
1768
|
-
|
1769
|
-
|
1916
|
+
str, = val
|
1917
|
+
str = s(:dstr, str.value) if str.sexp_type == :evstr
|
1918
|
+
result = str
|
1770
1919
|
}
|
1771
1920
|
|
1772
1921
|
string: tCHAR
|
@@ -1781,7 +1930,11 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1781
1930
|
|
1782
1931
|
string1: tSTRING_BEG string_contents tSTRING_END
|
1783
1932
|
{
|
1784
|
-
|
1933
|
+
_, str, (_, func) = val
|
1934
|
+
|
1935
|
+
str = dedent str if func =~ RubyLexer::STR_FUNC_ICNTNT
|
1936
|
+
|
1937
|
+
result = str
|
1785
1938
|
}
|
1786
1939
|
| tSTRING
|
1787
1940
|
{
|
@@ -1790,7 +1943,8 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1790
1943
|
|
1791
1944
|
xstring: tXSTRING_BEG xstring_contents tSTRING_END
|
1792
1945
|
{
|
1793
|
-
result = new_xstring val
|
1946
|
+
result = new_xstring val
|
1947
|
+
# TODO: dedent?!?! SERIOUSLY?!?
|
1794
1948
|
}
|
1795
1949
|
|
1796
1950
|
regexp: tREGEXP_BEG regexp_contents tREGEXP_END
|
@@ -1800,7 +1954,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1800
1954
|
|
1801
1955
|
words: tWORDS_BEG tSPACE tSTRING_END
|
1802
1956
|
{
|
1803
|
-
result = s(:array)
|
1957
|
+
result = s(:array).line lexer.lineno
|
1804
1958
|
}
|
1805
1959
|
| tWORDS_BEG word_list tSTRING_END
|
1806
1960
|
{
|
@@ -1824,25 +1978,28 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1824
1978
|
|
1825
1979
|
symbols: tSYMBOLS_BEG tSPACE tSTRING_END
|
1826
1980
|
{
|
1827
|
-
result = s(:array)
|
1981
|
+
result = s(:array).line lexer.lineno
|
1828
1982
|
}
|
1829
|
-
| tSYMBOLS_BEG symbol_list tSTRING_END
|
1983
|
+
| tSYMBOLS_BEG { result = lexer.lineno } symbol_list tSTRING_END
|
1830
1984
|
{
|
1831
|
-
|
1985
|
+
_, line, list, _, = val
|
1986
|
+
list.line = line
|
1987
|
+
result = list
|
1832
1988
|
}
|
1833
1989
|
|
1834
1990
|
symbol_list: none
|
1835
1991
|
{
|
1836
|
-
result = new_symbol_list
|
1992
|
+
result = new_symbol_list.line lexer.lineno
|
1837
1993
|
}
|
1838
1994
|
| symbol_list word tSPACE
|
1839
1995
|
{
|
1840
|
-
|
1996
|
+
list, * = val
|
1997
|
+
result = list.dup << new_symbol_list_entry(val)
|
1841
1998
|
}
|
1842
1999
|
|
1843
2000
|
qwords: tQWORDS_BEG tSPACE tSTRING_END
|
1844
2001
|
{
|
1845
|
-
result = s(:array)
|
2002
|
+
result = s(:array).line lexer.lineno
|
1846
2003
|
}
|
1847
2004
|
| tQWORDS_BEG qword_list tSTRING_END
|
1848
2005
|
{
|
@@ -1851,7 +2008,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1851
2008
|
|
1852
2009
|
qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END
|
1853
2010
|
{
|
1854
|
-
result = s(:array)
|
2011
|
+
result = s(:array).line lexer.lineno # FIX
|
1855
2012
|
}
|
1856
2013
|
| tQSYMBOLS_BEG qsym_list tSTRING_END
|
1857
2014
|
{
|
@@ -1878,11 +2035,12 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1878
2035
|
|
1879
2036
|
string_contents: none
|
1880
2037
|
{
|
1881
|
-
result = s(:str, "")
|
2038
|
+
result = s(:str, "").line lexer.lineno
|
1882
2039
|
}
|
1883
2040
|
| string_contents string_content
|
1884
2041
|
{
|
1885
|
-
|
2042
|
+
v1, v2 = val
|
2043
|
+
result = literal_concat v1, v2
|
1886
2044
|
}
|
1887
2045
|
|
1888
2046
|
xstring_contents: none
|
@@ -1891,7 +2049,8 @@ xstring_contents: none
|
|
1891
2049
|
}
|
1892
2050
|
| xstring_contents string_content
|
1893
2051
|
{
|
1894
|
-
|
2052
|
+
v1, v2 = val
|
2053
|
+
result = literal_concat v1, v2
|
1895
2054
|
}
|
1896
2055
|
|
1897
2056
|
regexp_contents: none
|
@@ -1900,7 +2059,8 @@ regexp_contents: none
|
|
1900
2059
|
}
|
1901
2060
|
| regexp_contents string_content
|
1902
2061
|
{
|
1903
|
-
|
2062
|
+
v1, v2 = val
|
2063
|
+
result = literal_concat v1, v2
|
1904
2064
|
}
|
1905
2065
|
|
1906
2066
|
string_content: tSTRING_CONTENT
|
@@ -1916,19 +2076,22 @@ regexp_contents: none
|
|
1916
2076
|
}
|
1917
2077
|
string_dvar
|
1918
2078
|
{
|
1919
|
-
|
1920
|
-
|
2079
|
+
_, strterm, str = val
|
2080
|
+
lexer.lex_strterm = strterm
|
2081
|
+
result = s(:evstr, str).line str.line
|
1921
2082
|
}
|
1922
2083
|
| tSTRING_DBEG
|
1923
2084
|
{
|
1924
2085
|
result = [lexer.lex_strterm,
|
1925
2086
|
lexer.brace_nest,
|
1926
2087
|
lexer.string_nest, # TODO: remove
|
1927
|
-
lexer.cond.store,
|
1928
|
-
lexer.cmdarg.store,
|
1929
2088
|
lexer.lex_state,
|
2089
|
+
lexer.lineno,
|
1930
2090
|
]
|
1931
2091
|
|
2092
|
+
lexer.cmdarg.push false
|
2093
|
+
lexer.cond.push false
|
2094
|
+
|
1932
2095
|
lexer.lex_strterm = nil
|
1933
2096
|
lexer.brace_nest = 0
|
1934
2097
|
lexer.string_nest = 0
|
@@ -1940,14 +2103,15 @@ regexp_contents: none
|
|
1940
2103
|
{
|
1941
2104
|
_, memo, stmt, _ = val
|
1942
2105
|
|
1943
|
-
lex_strterm, brace_nest, string_nest,
|
2106
|
+
lex_strterm, brace_nest, string_nest, oldlex_state, line = memo
|
2107
|
+
# TODO: heredoc_indent
|
1944
2108
|
|
1945
2109
|
lexer.lex_strterm = lex_strterm
|
1946
2110
|
lexer.brace_nest = brace_nest
|
1947
2111
|
lexer.string_nest = string_nest
|
1948
2112
|
|
1949
|
-
lexer.
|
1950
|
-
lexer.
|
2113
|
+
lexer.cmdarg.pop
|
2114
|
+
lexer.cond.pop
|
1951
2115
|
|
1952
2116
|
lexer.lex_state = oldlex_state
|
1953
2117
|
|
@@ -1957,19 +2121,19 @@ regexp_contents: none
|
|
1957
2121
|
when :str, :dstr, :evstr then
|
1958
2122
|
result = stmt
|
1959
2123
|
else
|
1960
|
-
result = s(:evstr, stmt)
|
2124
|
+
result = s(:evstr, stmt).line line
|
1961
2125
|
end
|
1962
2126
|
when nil then
|
1963
|
-
result = s(:evstr)
|
2127
|
+
result = s(:evstr).line line
|
1964
2128
|
else
|
1965
2129
|
debug20 25
|
1966
2130
|
raise "unknown string body: #{stmt.inspect}"
|
1967
2131
|
end
|
1968
2132
|
}
|
1969
2133
|
|
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) }
|
2134
|
+
string_dvar: tGVAR { result = s(:gvar, val[0].to_sym).line lexer.lineno }
|
2135
|
+
| tIVAR { result = s(:ivar, val[0].to_sym).line lexer.lineno }
|
2136
|
+
| tCVAR { result = s(:cvar, val[0].to_sym).line lexer.lineno }
|
1973
2137
|
| backref
|
1974
2138
|
|
1975
2139
|
symbol: tSYMBEG sym
|
@@ -1986,18 +2150,19 @@ regexp_contents: none
|
|
1986
2150
|
|
1987
2151
|
dsym: tSYMBEG xstring_contents tSTRING_END
|
1988
2152
|
{
|
2153
|
+
_, result, _ = val
|
2154
|
+
|
1989
2155
|
lexer.lex_state = EXPR_END
|
1990
|
-
result = val[1]
|
1991
2156
|
|
1992
|
-
result ||= s(:str, "")
|
2157
|
+
result ||= s(:str, "").line lexer.lineno
|
1993
2158
|
|
1994
2159
|
case result.sexp_type
|
1995
2160
|
when :dstr then
|
1996
2161
|
result.sexp_type = :dsym
|
1997
2162
|
when :str then
|
1998
|
-
result = s(:lit, result.last.to_sym)
|
2163
|
+
result = s(:lit, result.last.to_sym).line result.line
|
1999
2164
|
when :evstr then
|
2000
|
-
result = s(:dsym, "", result)
|
2165
|
+
result = s(:dsym, "", result).line result.line
|
2001
2166
|
else
|
2002
2167
|
debug20 26, val, result
|
2003
2168
|
end
|
@@ -2020,19 +2185,20 @@ regexp_contents: none
|
|
2020
2185
|
| tCONSTANT
|
2021
2186
|
| tCVAR
|
2022
2187
|
|
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) }
|
2188
|
+
keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
|
2189
|
+
| kSELF { result = s(:self).line lexer.lineno }
|
2190
|
+
| kTRUE { result = s(:true).line lexer.lineno }
|
2191
|
+
| kFALSE { result = s(:false).line lexer.lineno }
|
2192
|
+
| k__FILE__ { result = s(:str, self.file).line lexer.lineno }
|
2193
|
+
| k__LINE__ { result = s(:lit, lexer.lineno).line lexer.lineno }
|
2029
2194
|
| k__ENCODING__
|
2030
2195
|
{
|
2196
|
+
l = lexer.lineno
|
2031
2197
|
result =
|
2032
2198
|
if defined? Encoding then
|
2033
|
-
s(:colon2, s(:const, :Encoding), :UTF_8)
|
2199
|
+
s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l
|
2034
2200
|
else
|
2035
|
-
s(:str, "Unsupported!")
|
2201
|
+
s(:str, "Unsupported!").line l
|
2036
2202
|
end
|
2037
2203
|
}
|
2038
2204
|
|
@@ -2057,8 +2223,8 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2057
2223
|
debug20 29, val, result
|
2058
2224
|
}
|
2059
2225
|
|
2060
|
-
backref: tNTH_REF { result = s(:nth_ref, val[0]) }
|
2061
|
-
| tBACK_REF { result = s(:back_ref, val[0]) }
|
2226
|
+
backref: tNTH_REF { result = s(:nth_ref, val[0]).line lexer.lineno }
|
2227
|
+
| tBACK_REF { result = s(:back_ref, val[0]).line lexer.lineno }
|
2062
2228
|
|
2063
2229
|
superclass: tLT
|
2064
2230
|
{
|
@@ -2213,12 +2379,13 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2213
2379
|
|
2214
2380
|
f_arg: f_arg_item
|
2215
2381
|
{
|
2216
|
-
|
2382
|
+
arg, = val
|
2383
|
+
|
2384
|
+
case arg
|
2217
2385
|
when Symbol then
|
2218
|
-
result = s(:args)
|
2219
|
-
result << val[0]
|
2386
|
+
result = s(:args, arg).line lexer.lineno
|
2220
2387
|
when Sexp then
|
2221
|
-
result =
|
2388
|
+
result = arg
|
2222
2389
|
else
|
2223
2390
|
debug20 32
|
2224
2391
|
raise "Unknown f_arg type: #{val.inspect}"
|
@@ -2231,7 +2398,7 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2231
2398
|
if list.sexp_type == :args then
|
2232
2399
|
result = list
|
2233
2400
|
else
|
2234
|
-
result = s(:args, list)
|
2401
|
+
result = s(:args, list).line list.line
|
2235
2402
|
end
|
2236
2403
|
|
2237
2404
|
result << item
|
@@ -2239,22 +2406,24 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2239
2406
|
|
2240
2407
|
f_kw: tLABEL arg_value
|
2241
2408
|
{
|
2242
|
-
# TODO:
|
2243
|
-
label,
|
2409
|
+
# TODO: new_kw_arg
|
2410
|
+
(label, line), arg = val
|
2411
|
+
|
2244
2412
|
identifier = label.to_sym
|
2245
2413
|
self.env[identifier] = :lvar
|
2246
2414
|
|
2247
|
-
|
2415
|
+
kwarg = s(:kwarg, identifier, arg).line line
|
2416
|
+
result = s(:array, kwarg).line line
|
2248
2417
|
}
|
2249
2418
|
|
2250
2419
|
f_block_kw: tLABEL primary_value
|
2251
2420
|
{
|
2252
|
-
# TODO:
|
2253
|
-
label,
|
2254
|
-
|
2255
|
-
self.env[
|
2421
|
+
# TODO: new_kw_arg
|
2422
|
+
(label, line), expr = val
|
2423
|
+
id = label.to_sym
|
2424
|
+
self.env[id] = :lvar
|
2256
2425
|
|
2257
|
-
result = s(:array, s(:kwarg,
|
2426
|
+
result = s(:array, s(:kwarg, id, expr).line(line)).line line
|
2258
2427
|
}
|
2259
2428
|
|
2260
2429
|
f_block_kwarg: f_block_kw
|
@@ -2297,17 +2466,20 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2297
2466
|
|
2298
2467
|
f_block_optarg: f_block_opt
|
2299
2468
|
{
|
2300
|
-
|
2469
|
+
optblk, = val
|
2470
|
+
result = s(:block, optblk).line optblk.line
|
2301
2471
|
}
|
2302
2472
|
| f_block_optarg tCOMMA f_block_opt
|
2303
2473
|
{
|
2304
|
-
|
2305
|
-
result
|
2474
|
+
optarg, _, optblk = val
|
2475
|
+
result = optarg
|
2476
|
+
result << optblk
|
2306
2477
|
}
|
2307
2478
|
|
2308
2479
|
f_optarg: f_opt
|
2309
2480
|
{
|
2310
|
-
|
2481
|
+
opt, = val
|
2482
|
+
result = s(:block, opt).line opt.line
|
2311
2483
|
}
|
2312
2484
|
| f_optarg tCOMMA f_opt
|
2313
2485
|
{
|
@@ -2361,14 +2533,11 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2361
2533
|
result.sexp_type == :lit
|
2362
2534
|
}
|
2363
2535
|
|
2364
|
-
assoc_list: none
|
2536
|
+
assoc_list: none
|
2365
2537
|
{
|
2366
|
-
result = s(:array)
|
2367
|
-
}
|
2368
|
-
| assocs trailer # [!nil]
|
2369
|
-
{
|
2370
|
-
result = val[0]
|
2538
|
+
result = s(:array).line lexer.lineno
|
2371
2539
|
}
|
2540
|
+
| assocs trailer
|
2372
2541
|
|
2373
2542
|
assocs: assoc
|
2374
2543
|
| assocs tCOMMA assoc
|
@@ -2382,16 +2551,21 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2382
2551
|
|
2383
2552
|
assoc: arg_value tASSOC arg_value
|
2384
2553
|
{
|
2385
|
-
|
2554
|
+
v1, _, v2 = val
|
2555
|
+
result = s(:array, v1, v2).line v1.line
|
2386
2556
|
}
|
2387
2557
|
| tLABEL arg_value
|
2388
2558
|
{
|
2389
|
-
(label,
|
2390
|
-
|
2559
|
+
(label, line), arg = val
|
2560
|
+
|
2561
|
+
lit = s(:lit, label.to_sym).line line
|
2562
|
+
result = s(:array, lit, arg).line line
|
2391
2563
|
}
|
2392
2564
|
| tDSTAR arg_value
|
2393
2565
|
{
|
2394
|
-
|
2566
|
+
_, arg = val
|
2567
|
+
line = arg.line
|
2568
|
+
result = s(:array, s(:kwsplat, arg).line(line)).line line
|
2395
2569
|
}
|
2396
2570
|
|
2397
2571
|
operation: tIDENTIFIER | tCONSTANT | tFID
|