ruby_parser 3.12.0 → 3.13.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/History.rdoc +47 -0
- data/Manifest.txt +5 -4
- data/Rakefile +41 -28
- data/compare/normalize.rb +29 -2
- data/debugging.md +18 -0
- data/lib/rp_extensions.rb +0 -7
- data/lib/ruby20_parser.rb +3689 -3502
- data/lib/ruby20_parser.y +284 -201
- data/lib/ruby21_parser.rb +3755 -3570
- data/lib/ruby21_parser.y +281 -197
- data/lib/ruby22_parser.rb +3780 -3600
- data/lib/ruby22_parser.y +281 -202
- data/lib/ruby23_parser.rb +3755 -3591
- data/lib/ruby23_parser.y +282 -203
- data/lib/ruby24_parser.rb +3755 -3591
- data/lib/ruby24_parser.y +282 -203
- data/lib/ruby25_parser.rb +3754 -3591
- data/lib/ruby25_parser.y +282 -203
- data/lib/ruby26_parser.rb +6999 -0
- data/lib/{ruby19_parser.y → ruby26_parser.y} +658 -305
- data/lib/ruby_lexer.rb +116 -118
- data/lib/ruby_lexer.rex +10 -8
- data/lib/ruby_lexer.rex.rb +8 -8
- data/lib/ruby_parser.rb +5 -7
- data/lib/ruby_parser.yy +308 -218
- data/lib/ruby_parser_extras.rb +88 -106
- data/test/test_ruby_lexer.rb +68 -121
- data/test/test_ruby_parser.rb +173 -277
- data/tools/munge.rb +216 -0
- data/tools/ripper.rb +23 -0
- metadata +18 -17
- metadata.gz.sig +1 -1
- data/lib/ruby18_parser.rb +0 -5793
- data/lib/ruby18_parser.y +0 -1908
- data/lib/ruby19_parser.rb +0 -6185
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- racc -*-
|
2
2
|
|
3
|
-
class
|
3
|
+
class Ruby26Parser
|
4
4
|
|
5
5
|
token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
|
6
6
|
kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT
|
@@ -17,8 +17,11 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
|
|
17
17
|
tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY
|
18
18
|
tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG
|
19
19
|
tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END
|
20
|
-
tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI
|
21
|
-
|
20
|
+
tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA
|
21
|
+
tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND tUBANG
|
22
|
+
tRATIONAL tIMAGINARY
|
23
|
+
tLABEL_END
|
24
|
+
tLONELY
|
22
25
|
|
23
26
|
prechigh
|
24
27
|
right tBANG tTILDE tUPLUS
|
@@ -69,21 +72,51 @@ rule
|
|
69
72
|
| error top_stmt
|
70
73
|
|
71
74
|
top_stmt: stmt
|
75
|
+
{
|
76
|
+
result = val[0]
|
77
|
+
|
78
|
+
# TODO: remove once I have more confidence this is fixed
|
79
|
+
# result.each_of_type :call_args do |s|
|
80
|
+
# debug20 666, s, result
|
81
|
+
# end
|
82
|
+
}
|
72
83
|
| klBEGIN
|
73
84
|
{
|
74
85
|
if (self.in_def || self.in_single > 0) then
|
86
|
+
debug20 1
|
75
87
|
yyerror "BEGIN in method"
|
76
88
|
end
|
77
89
|
self.env.extend
|
78
90
|
}
|
79
|
-
|
91
|
+
begin_block
|
92
|
+
{
|
93
|
+
_, _, block = val
|
94
|
+
result = block
|
95
|
+
}
|
96
|
+
|
97
|
+
begin_block: tLCURLY top_compstmt tRCURLY
|
98
|
+
{
|
99
|
+
_, stmt, _ = val
|
100
|
+
result = new_iter s(:preexe), 0, stmt
|
101
|
+
}
|
102
|
+
|
103
|
+
bodystmt: compstmt opt_rescue k_else
|
80
104
|
{
|
81
|
-
|
105
|
+
res = _values[-2]
|
106
|
+
yyerror "else without rescue is useless" unless res
|
82
107
|
}
|
108
|
+
compstmt
|
109
|
+
opt_ensure
|
110
|
+
{
|
111
|
+
body, resc, _, _, els, ens = val
|
83
112
|
|
84
|
-
|
113
|
+
result = new_body [body, resc, els, ens]
|
114
|
+
}
|
115
|
+
| compstmt opt_rescue opt_ensure
|
85
116
|
{
|
86
|
-
|
117
|
+
body, resc, ens = val
|
118
|
+
|
119
|
+
result = new_body [body, resc, nil, ens]
|
87
120
|
}
|
88
121
|
|
89
122
|
compstmt: stmts opt_terms
|
@@ -92,14 +125,30 @@ rule
|
|
92
125
|
}
|
93
126
|
|
94
127
|
stmts: none
|
95
|
-
|
|
96
|
-
| stmts terms
|
128
|
+
| stmt_or_begin # TODO: newline_node ?
|
129
|
+
| stmts terms stmt_or_begin
|
97
130
|
{
|
98
131
|
result = self.block_append val[0], val[2]
|
99
132
|
}
|
100
133
|
| error stmt
|
101
134
|
{
|
102
135
|
result = val[1]
|
136
|
+
debug20 2, val, result
|
137
|
+
}
|
138
|
+
|
139
|
+
stmt_or_begin: stmt
|
140
|
+
| klBEGIN
|
141
|
+
{
|
142
|
+
if (self.in_def || self.in_single > 0) then
|
143
|
+
debug20 1
|
144
|
+
yyerror "BEGIN in method"
|
145
|
+
end
|
146
|
+
self.env.extend
|
147
|
+
}
|
148
|
+
begin_block
|
149
|
+
{
|
150
|
+
_, _, stmt = val
|
151
|
+
result = stmt
|
103
152
|
}
|
104
153
|
|
105
154
|
stmt: kALIAS fitem
|
@@ -145,11 +194,13 @@ rule
|
|
145
194
|
}
|
146
195
|
| stmt kRESCUE_MOD stmt
|
147
196
|
{
|
148
|
-
|
197
|
+
body, _, resbody = val
|
198
|
+
result = new_rescue body, new_resbody(s(:array), resbody)
|
149
199
|
}
|
150
200
|
| klEND tLCURLY compstmt tRCURLY
|
151
201
|
{
|
152
202
|
if (self.in_def || self.in_single > 0) then
|
203
|
+
debug20 3
|
153
204
|
yyerror "END in method; use at_exit"
|
154
205
|
end
|
155
206
|
result = new_iter s(:postexe), 0, val[2]
|
@@ -159,56 +210,75 @@ rule
|
|
159
210
|
{
|
160
211
|
result = new_masgn val[0], val[2], :wrap
|
161
212
|
}
|
162
|
-
|
|
213
|
+
| lhs tEQL mrhs
|
214
|
+
{
|
215
|
+
result = new_assign val[0], s(:svalue, val[2])
|
216
|
+
}
|
217
|
+
| mlhs tEQL mrhs_arg
|
218
|
+
{
|
219
|
+
result = new_masgn val[0], val[2]
|
220
|
+
}
|
221
|
+
| expr
|
222
|
+
|
223
|
+
command_asgn: lhs tEQL command_rhs
|
224
|
+
{
|
225
|
+
result = new_assign val[0], val[2]
|
226
|
+
}
|
227
|
+
# | lhs tEQL command_asgn
|
228
|
+
# {
|
229
|
+
# result = new_assign val[0], val[2]
|
230
|
+
# }
|
231
|
+
| var_lhs tOP_ASGN command_rhs
|
163
232
|
{
|
164
233
|
result = new_op_asgn val
|
165
234
|
}
|
166
|
-
| primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN
|
235
|
+
| primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs
|
167
236
|
{
|
168
237
|
result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
|
169
238
|
}
|
170
|
-
| primary_value
|
239
|
+
| primary_value call_op tIDENTIFIER tOP_ASGN command_rhs
|
171
240
|
{
|
172
241
|
result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
|
242
|
+
if val[1] == '&.'
|
243
|
+
result.sexp_type = :safe_op_asgn
|
244
|
+
end
|
245
|
+
result.line = val[0].line
|
173
246
|
}
|
174
|
-
| primary_value
|
247
|
+
| primary_value call_op tCONSTANT tOP_ASGN command_rhs
|
175
248
|
{
|
176
249
|
result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
|
250
|
+
if val[1] == '&.'
|
251
|
+
result.sexp_type = :safe_op_asgn
|
252
|
+
end
|
253
|
+
result.line = val[0].line
|
177
254
|
}
|
178
|
-
| primary_value tCOLON2 tCONSTANT tOP_ASGN
|
255
|
+
| primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs
|
179
256
|
{
|
180
257
|
result = s(:op_asgn, val[0], val[4], val[2], val[3])
|
258
|
+
debug20 4, val, result
|
181
259
|
}
|
182
|
-
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN
|
260
|
+
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs
|
183
261
|
{
|
184
262
|
result = s(:op_asgn, val[0], val[4], val[2], val[3])
|
263
|
+
debug20 5, val, result
|
185
264
|
}
|
186
|
-
| backref tOP_ASGN
|
265
|
+
| backref tOP_ASGN command_rhs
|
187
266
|
{
|
188
267
|
self.backref_assign_error val[0]
|
189
268
|
}
|
190
|
-
| lhs tEQL mrhs
|
191
|
-
{
|
192
|
-
result = new_assign val[0], s(:svalue, val[2])
|
193
|
-
}
|
194
|
-
| mlhs tEQL arg_value
|
195
|
-
{
|
196
|
-
result = new_masgn val[0], val[2], :wrap
|
197
|
-
}
|
198
|
-
| mlhs tEQL mrhs
|
199
|
-
{
|
200
|
-
result = new_masgn val[0], val[2]
|
201
|
-
}
|
202
|
-
| expr
|
203
269
|
|
204
|
-
|
270
|
+
command_rhs: command_call =tOP_ASGN
|
205
271
|
{
|
206
|
-
|
272
|
+
expr, = val
|
273
|
+
result = value_expr expr
|
207
274
|
}
|
208
|
-
|
|
275
|
+
| command_call kRESCUE_MOD stmt
|
209
276
|
{
|
210
|
-
|
277
|
+
expr, _, resbody = val
|
278
|
+
expr = value_expr expr
|
279
|
+
result = new_rescue(expr, new_resbody(s(:array), resbody))
|
211
280
|
}
|
281
|
+
| command_asgn
|
212
282
|
|
213
283
|
expr: command_call
|
214
284
|
| expr kAND expr
|
@@ -234,43 +304,54 @@ rule
|
|
234
304
|
result = value_expr(val[0])
|
235
305
|
}
|
236
306
|
|
307
|
+
expr_value_do: {
|
308
|
+
lexer.cond.push true
|
309
|
+
}
|
310
|
+
expr_value do
|
311
|
+
{
|
312
|
+
lexer.cond.pop
|
313
|
+
}
|
314
|
+
{
|
315
|
+
_, expr, _, _ = val
|
316
|
+
result = expr
|
317
|
+
}
|
318
|
+
|
237
319
|
command_call: command
|
238
320
|
| block_command
|
239
321
|
|
240
322
|
block_command: block_call
|
241
|
-
| block_call
|
242
|
-
{
|
243
|
-
result = new_call val[0], val[2].to_sym, val[3]
|
244
|
-
}
|
245
|
-
| block_call tCOLON2 operation2 command_args
|
323
|
+
| block_call call_op2 operation2 command_args
|
246
324
|
{
|
247
325
|
result = new_call val[0], val[2].to_sym, val[3]
|
248
326
|
}
|
249
327
|
|
250
328
|
cmd_brace_block: tLBRACE_ARG
|
251
329
|
{
|
252
|
-
self.env.extend(:dynamic)
|
330
|
+
# self.env.extend(:dynamic)
|
253
331
|
result = self.lexer.lineno
|
254
332
|
}
|
255
|
-
|
333
|
+
brace_body tRCURLY
|
256
334
|
{
|
257
|
-
|
335
|
+
_, line, body, _ = val
|
336
|
+
|
337
|
+
result = body
|
338
|
+
result.line = line
|
339
|
+
|
340
|
+
# self.env.unextend
|
258
341
|
}
|
259
|
-
compstmt tRCURLY
|
260
|
-
{
|
261
|
-
result = new_iter nil, val[2], val[4]
|
262
|
-
result.line = val[1]
|
263
342
|
|
264
|
-
|
343
|
+
fcall: operation
|
344
|
+
{
|
345
|
+
result = new_call nil, val[0].to_sym
|
265
346
|
}
|
266
347
|
|
267
|
-
command:
|
348
|
+
command: fcall command_args =tLOWEST
|
268
349
|
{
|
269
|
-
result =
|
350
|
+
result = val[0].concat val[1].sexp_body # REFACTOR pattern
|
270
351
|
}
|
271
|
-
|
|
352
|
+
| fcall command_args cmd_brace_block
|
272
353
|
{
|
273
|
-
result =
|
354
|
+
result = val[0].concat val[1].sexp_body
|
274
355
|
if val[2] then
|
275
356
|
block_dup_check result, val[2]
|
276
357
|
|
@@ -278,14 +359,14 @@ rule
|
|
278
359
|
result.insert 1, operation
|
279
360
|
end
|
280
361
|
}
|
281
|
-
| primary_value
|
362
|
+
| primary_value call_op operation2 command_args =tLOWEST
|
282
363
|
{
|
283
|
-
result = new_call val[0], val[2].to_sym, val[3]
|
364
|
+
result = new_call val[0], val[2].to_sym, val[3], val[1]
|
284
365
|
}
|
285
|
-
| primary_value
|
366
|
+
| primary_value call_op operation2 command_args cmd_brace_block
|
286
367
|
{
|
287
368
|
recv, _, msg, args, block = val
|
288
|
-
call = new_call recv, msg.to_sym, args
|
369
|
+
call = new_call recv, msg.to_sym, args, val[1]
|
289
370
|
|
290
371
|
block_dup_check call, block
|
291
372
|
|
@@ -314,7 +395,7 @@ rule
|
|
314
395
|
{
|
315
396
|
result = new_yield val[1]
|
316
397
|
}
|
317
|
-
|
|
398
|
+
| k_return call_args
|
318
399
|
{
|
319
400
|
line = val[0].last
|
320
401
|
result = s(:return, ret_args(val[1])).line(line)
|
@@ -356,9 +437,11 @@ rule
|
|
356
437
|
}
|
357
438
|
| mlhs_head tSTAR mlhs_node tCOMMA mlhs_post
|
358
439
|
{
|
359
|
-
|
360
|
-
|
361
|
-
result = s(:
|
440
|
+
ary1, _, splat, _, ary2 = val
|
441
|
+
|
442
|
+
result = list_append ary1, s(:splat, splat)
|
443
|
+
result.concat ary2.sexp_body
|
444
|
+
result = s(:masgn, result)
|
362
445
|
}
|
363
446
|
| mlhs_head tSTAR
|
364
447
|
{
|
@@ -386,9 +469,7 @@ rule
|
|
386
469
|
}
|
387
470
|
| tSTAR tCOMMA mlhs_post
|
388
471
|
{
|
389
|
-
|
390
|
-
ary.concat val[2].sexp_body
|
391
|
-
result = s(:masgn, ary)
|
472
|
+
result = s(:masgn, s(:array, s(:splat), *val[2].sexp_body))
|
392
473
|
}
|
393
474
|
|
394
475
|
mlhs_item: mlhs_node
|
@@ -427,21 +508,22 @@ rule
|
|
427
508
|
{
|
428
509
|
result = self.aryset val[0], val[2]
|
429
510
|
}
|
430
|
-
| primary_value
|
511
|
+
| primary_value call_op tIDENTIFIER
|
431
512
|
{
|
432
|
-
result =
|
513
|
+
result = new_attrasgn val[0], val[2], val[1]
|
433
514
|
}
|
434
515
|
| primary_value tCOLON2 tIDENTIFIER
|
435
516
|
{
|
436
517
|
result = s(:attrasgn, val[0], :"#{val[2]}=")
|
437
518
|
}
|
438
|
-
| primary_value
|
519
|
+
| primary_value call_op tCONSTANT
|
439
520
|
{
|
440
|
-
result =
|
521
|
+
result = new_attrasgn val[0], val[2], val[1]
|
441
522
|
}
|
442
523
|
| primary_value tCOLON2 tCONSTANT
|
443
524
|
{
|
444
525
|
if (self.in_def || self.in_single > 0) then
|
526
|
+
debug20 7
|
445
527
|
yyerror "dynamic constant assignment"
|
446
528
|
end
|
447
529
|
|
@@ -450,6 +532,7 @@ rule
|
|
450
532
|
| tCOLON3 tCONSTANT
|
451
533
|
{
|
452
534
|
if (self.in_def || self.in_single > 0) then
|
535
|
+
debug20 8
|
453
536
|
yyerror "dynamic constant assignment"
|
454
537
|
end
|
455
538
|
|
@@ -467,26 +550,28 @@ rule
|
|
467
550
|
| keyword_variable
|
468
551
|
{
|
469
552
|
result = self.assignable val[0]
|
553
|
+
debug20 9, val, result
|
470
554
|
}
|
471
555
|
| primary_value tLBRACK2 opt_call_args rbracket
|
472
556
|
{
|
473
557
|
result = self.aryset val[0], val[2]
|
474
558
|
}
|
475
|
-
| primary_value
|
559
|
+
| primary_value call_op tIDENTIFIER # REFACTOR
|
476
560
|
{
|
477
|
-
result =
|
561
|
+
result = new_attrasgn val[0], val[2], val[1]
|
478
562
|
}
|
479
563
|
| primary_value tCOLON2 tIDENTIFIER
|
480
564
|
{
|
481
565
|
result = s(:attrasgn, val[0], :"#{val[2]}=")
|
482
566
|
}
|
483
|
-
| primary_value
|
567
|
+
| primary_value call_op tCONSTANT # REFACTOR?
|
484
568
|
{
|
485
|
-
result =
|
569
|
+
result = new_attrasgn val[0], val[2], val[1]
|
486
570
|
}
|
487
571
|
| primary_value tCOLON2 tCONSTANT
|
488
572
|
{
|
489
573
|
if (self.in_def || self.in_single > 0) then
|
574
|
+
debug20 10
|
490
575
|
yyerror "dynamic constant assignment"
|
491
576
|
end
|
492
577
|
|
@@ -495,6 +580,7 @@ rule
|
|
495
580
|
| tCOLON3 tCONSTANT
|
496
581
|
{
|
497
582
|
if (self.in_def || self.in_single > 0) then
|
583
|
+
debug20 11
|
498
584
|
yyerror "dynamic constant assignment"
|
499
585
|
end
|
500
586
|
|
@@ -533,13 +619,17 @@ rule
|
|
533
619
|
|
534
620
|
| reswords
|
535
621
|
{
|
622
|
+
(sym, _line), = val
|
536
623
|
lexer.lex_state = :expr_end
|
537
|
-
result =
|
624
|
+
result = sym
|
538
625
|
}
|
539
626
|
|
540
627
|
fsym: fname | symbol
|
541
628
|
|
542
|
-
fitem: fsym
|
629
|
+
fitem: fsym
|
630
|
+
{
|
631
|
+
result = s(:lit, val[0].to_sym)
|
632
|
+
}
|
543
633
|
| dsym
|
544
634
|
|
545
635
|
undef_list: fitem
|
@@ -556,11 +646,12 @@ rule
|
|
556
646
|
result = new_undef val[0], val[3]
|
557
647
|
}
|
558
648
|
|
559
|
-
op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ
|
560
|
-
| tMATCH | tNMATCH | tGT | tGEQ | tLT
|
561
|
-
| tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS
|
562
|
-
| tSTAR | tDIVIDE | tPERCENT | tPOW | tBANG | tTILDE
|
649
|
+
op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ
|
650
|
+
| tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ
|
651
|
+
| tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
|
652
|
+
| tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE
|
563
653
|
| tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2
|
654
|
+
| tUBANG
|
564
655
|
|
565
656
|
reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND
|
566
657
|
| kALIAS | kAND | kBEGIN | kBREAK | kCASE
|
@@ -572,51 +663,46 @@ rule
|
|
572
663
|
| kWHEN | kYIELD | kIF | kUNLESS | kWHILE
|
573
664
|
| kUNTIL
|
574
665
|
|
575
|
-
arg: lhs tEQL
|
666
|
+
arg: lhs tEQL arg_rhs
|
576
667
|
{
|
577
668
|
result = new_assign val[0], val[2]
|
578
669
|
}
|
579
|
-
|
|
580
|
-
{
|
581
|
-
result = new_assign val[0], s(:rescue, val[2], new_resbody(s(:array), val[4]))
|
582
|
-
}
|
583
|
-
| var_lhs tOP_ASGN arg
|
584
|
-
{
|
585
|
-
result = new_op_asgn val
|
586
|
-
}
|
587
|
-
| var_lhs tOP_ASGN arg kRESCUE_MOD arg
|
670
|
+
| var_lhs tOP_ASGN arg_rhs
|
588
671
|
{
|
589
672
|
result = new_op_asgn val
|
590
|
-
result = s(:rescue, result, new_resbody(s(:array), val[4]))
|
591
673
|
}
|
592
|
-
| primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN
|
674
|
+
| primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs
|
593
675
|
{
|
594
676
|
val[2].sexp_type = :arglist if val[2]
|
595
677
|
result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
|
596
678
|
}
|
597
|
-
| primary_value
|
679
|
+
| primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs
|
598
680
|
{
|
599
|
-
result =
|
681
|
+
result = new_op_asgn2 val
|
600
682
|
}
|
601
|
-
| primary_value
|
683
|
+
| primary_value call_op tCONSTANT tOP_ASGN arg_rhs
|
602
684
|
{
|
603
|
-
result =
|
685
|
+
result = new_op_asgn2 val
|
604
686
|
}
|
605
|
-
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN
|
687
|
+
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs
|
606
688
|
{
|
607
689
|
result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
|
608
690
|
}
|
609
|
-
| primary_value tCOLON2 tCONSTANT tOP_ASGN
|
691
|
+
| primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs
|
610
692
|
{
|
611
|
-
|
693
|
+
# TODO: assignment
|
694
|
+
raise "not yet: %p" % [val]
|
612
695
|
}
|
613
|
-
| tCOLON3 tCONSTANT tOP_ASGN
|
696
|
+
| tCOLON3 tCONSTANT tOP_ASGN arg_rhs
|
614
697
|
{
|
615
|
-
|
698
|
+
# TODO: assignment
|
699
|
+
raise "not yet: %p" % [val]
|
616
700
|
}
|
617
|
-
| backref tOP_ASGN
|
701
|
+
| backref tOP_ASGN arg_rhs
|
618
702
|
{
|
619
|
-
|
703
|
+
# TODO: lhs = var_field val[0]
|
704
|
+
asgn = new_op_asgn val
|
705
|
+
result = self.backref_assign_error asgn
|
620
706
|
}
|
621
707
|
| arg tDOT2 arg
|
622
708
|
{
|
@@ -636,6 +722,18 @@ rule
|
|
636
722
|
result = s(:dot3, v1, v2)
|
637
723
|
end
|
638
724
|
}
|
725
|
+
| arg tDOT2
|
726
|
+
{
|
727
|
+
v1, v2 = val[0], nil
|
728
|
+
|
729
|
+
result = s(:dot2, v1, v2)
|
730
|
+
}
|
731
|
+
| arg tDOT3
|
732
|
+
{
|
733
|
+
v1, v2 = val[0], nil
|
734
|
+
|
735
|
+
result = s(:dot3, v1, v2)
|
736
|
+
}
|
639
737
|
| arg tPLUS arg
|
640
738
|
{
|
641
739
|
result = new_call val[0], :+, argl(val[2])
|
@@ -644,7 +742,7 @@ rule
|
|
644
742
|
{
|
645
743
|
result = new_call val[0], :-, argl(val[2])
|
646
744
|
}
|
647
|
-
| arg tSTAR2 arg
|
745
|
+
| arg tSTAR2 arg # TODO: rename
|
648
746
|
{
|
649
747
|
result = new_call val[0], :*, argl(val[2])
|
650
748
|
}
|
@@ -660,11 +758,7 @@ rule
|
|
660
758
|
{
|
661
759
|
result = new_call val[0], :**, argl(val[2])
|
662
760
|
}
|
663
|
-
| tUMINUS_NUM
|
664
|
-
{
|
665
|
-
result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@")
|
666
|
-
}
|
667
|
-
| tUMINUS_NUM tFLOAT tPOW arg
|
761
|
+
| tUMINUS_NUM simple_numeric tPOW arg
|
668
762
|
{
|
669
763
|
result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@")
|
670
764
|
}
|
@@ -692,22 +786,7 @@ rule
|
|
692
786
|
{
|
693
787
|
result = new_call val[0], :"<=>", argl(val[2])
|
694
788
|
}
|
695
|
-
|
|
696
|
-
{
|
697
|
-
result = new_call val[0], :">", argl(val[2])
|
698
|
-
}
|
699
|
-
| arg tGEQ arg
|
700
|
-
{
|
701
|
-
result = new_call val[0], :">=", argl(val[2])
|
702
|
-
}
|
703
|
-
| arg tLT arg
|
704
|
-
{
|
705
|
-
result = new_call val[0], :"<", argl(val[2])
|
706
|
-
}
|
707
|
-
| arg tLEQ arg
|
708
|
-
{
|
709
|
-
result = new_call val[0], :"<=", argl(val[2])
|
710
|
-
}
|
789
|
+
| rel_expr =tCMP
|
711
790
|
| arg tEQ arg
|
712
791
|
{
|
713
792
|
result = new_call val[0], :"==", argl(val[2])
|
@@ -734,8 +813,7 @@ rule
|
|
734
813
|
}
|
735
814
|
| tTILDE arg
|
736
815
|
{
|
737
|
-
|
738
|
-
result = new_call val[1], :"~"
|
816
|
+
result = new_call value_expr(val[1]), :"~"
|
739
817
|
}
|
740
818
|
| arg tLSHFT arg
|
741
819
|
{
|
@@ -767,6 +845,23 @@ rule
|
|
767
845
|
}
|
768
846
|
| primary
|
769
847
|
|
848
|
+
relop: tGT
|
849
|
+
| tLT
|
850
|
+
| tGEQ
|
851
|
+
| tLEQ
|
852
|
+
|
853
|
+
rel_expr: arg relop arg =tGT
|
854
|
+
{
|
855
|
+
lhs, op, rhs = val
|
856
|
+
result = new_call lhs, op.to_sym, argl(rhs)
|
857
|
+
}
|
858
|
+
| rel_expr relop arg =tGT
|
859
|
+
{
|
860
|
+
lhs, op, rhs = val
|
861
|
+
warn "comparison '%s' after comparison", op
|
862
|
+
result = new_call lhs, op.to_sym, argl(rhs)
|
863
|
+
}
|
864
|
+
|
770
865
|
arg_value: arg
|
771
866
|
{
|
772
867
|
result = value_expr(val[0])
|
@@ -775,15 +870,24 @@ rule
|
|
775
870
|
aref_args: none
|
776
871
|
| args trailer
|
777
872
|
{
|
778
|
-
result = val[0]
|
873
|
+
result = args [val[0]]
|
779
874
|
}
|
780
875
|
| args tCOMMA assocs trailer
|
781
876
|
{
|
782
|
-
result = val[0]
|
877
|
+
result = args [val[0], array_to_hash(val[2])]
|
783
878
|
}
|
784
879
|
| assocs trailer
|
785
880
|
{
|
786
|
-
result =
|
881
|
+
result = args [array_to_hash(val[0])]
|
882
|
+
}
|
883
|
+
|
884
|
+
arg_rhs: arg =tOP_ASGN
|
885
|
+
| arg kRESCUE_MOD arg
|
886
|
+
{
|
887
|
+
body, _, resbody = val
|
888
|
+
body = value_expr body
|
889
|
+
resbody = remove_begin resbody
|
890
|
+
result = new_rescue(body, new_resbody(s(:array), resbody))
|
787
891
|
}
|
788
892
|
|
789
893
|
paren_args: tLPAREN2 opt_call_args rparen
|
@@ -804,45 +908,48 @@ rule
|
|
804
908
|
}
|
805
909
|
| args tCOMMA
|
806
910
|
{
|
807
|
-
result = val
|
911
|
+
result = args val
|
808
912
|
}
|
809
913
|
| args tCOMMA assocs tCOMMA
|
810
914
|
{
|
811
|
-
result = val[0]
|
915
|
+
result = args [val[0], array_to_hash(val[2])]
|
812
916
|
}
|
813
917
|
| assocs tCOMMA
|
814
918
|
{
|
815
|
-
result =
|
919
|
+
result = args [array_to_hash(val[0])]
|
816
920
|
}
|
817
921
|
|
818
922
|
call_args: command
|
819
923
|
{
|
820
924
|
warning "parenthesize argument(s) for future version"
|
821
|
-
result =
|
925
|
+
result = call_args val
|
822
926
|
}
|
823
927
|
| args opt_block_arg
|
824
928
|
{
|
929
|
+
result = call_args val
|
825
930
|
result = self.arg_blk_pass val[0], val[1]
|
826
931
|
}
|
827
932
|
| assocs opt_block_arg
|
828
933
|
{
|
829
|
-
result =
|
934
|
+
result = call_args [array_to_hash(val[0])]
|
830
935
|
result = self.arg_blk_pass result, val[1]
|
831
936
|
}
|
832
937
|
| args tCOMMA assocs opt_block_arg
|
833
938
|
{
|
834
|
-
result = val[0]
|
939
|
+
result = call_args [val[0], array_to_hash(val[2])]
|
835
940
|
result = self.arg_blk_pass result, val[3]
|
836
941
|
}
|
837
942
|
| block_arg
|
943
|
+
{
|
944
|
+
result = call_args val
|
945
|
+
}
|
838
946
|
|
839
947
|
command_args: {
|
840
|
-
result = lexer.cmdarg.
|
841
|
-
lexer.cmdarg.push true
|
948
|
+
result = lexer.cmdarg.store true
|
842
949
|
}
|
843
950
|
call_args
|
844
951
|
{
|
845
|
-
lexer.cmdarg.
|
952
|
+
lexer.cmdarg.restore val[0]
|
846
953
|
result = val[1]
|
847
954
|
}
|
848
955
|
|
@@ -874,6 +981,15 @@ rule
|
|
874
981
|
result = self.list_append val[0], s(:splat, val[3])
|
875
982
|
}
|
876
983
|
|
984
|
+
mrhs_arg: mrhs
|
985
|
+
{
|
986
|
+
result = new_masgn_arg val[0]
|
987
|
+
}
|
988
|
+
| arg_value
|
989
|
+
{
|
990
|
+
result = new_masgn_arg val[0], :wrap
|
991
|
+
}
|
992
|
+
|
877
993
|
mrhs: args tCOMMA arg_value
|
878
994
|
{
|
879
995
|
result = val[0] << val[2]
|
@@ -893,18 +1009,24 @@ rule
|
|
893
1009
|
| regexp
|
894
1010
|
| words
|
895
1011
|
| qwords
|
1012
|
+
| symbols
|
1013
|
+
| qsymbols
|
896
1014
|
| var_ref
|
897
1015
|
| backref
|
898
1016
|
| tFID
|
899
1017
|
{
|
900
1018
|
result = new_call nil, val[0].to_sym
|
901
1019
|
}
|
902
|
-
|
|
1020
|
+
| k_begin
|
903
1021
|
{
|
904
1022
|
result = self.lexer.lineno
|
1023
|
+
# TODO:
|
1024
|
+
# $<val>1 = cmdarg_stack;
|
1025
|
+
# CMDARG_SET(0);
|
905
1026
|
}
|
906
|
-
bodystmt
|
1027
|
+
bodystmt k_end
|
907
1028
|
{
|
1029
|
+
# TODO: CMDARG_SET($<val>1);
|
908
1030
|
unless val[2] then
|
909
1031
|
result = s(:nil)
|
910
1032
|
else
|
@@ -913,14 +1035,27 @@ rule
|
|
913
1035
|
|
914
1036
|
result.line = val[1]
|
915
1037
|
}
|
916
|
-
| tLPAREN_ARG
|
1038
|
+
| tLPAREN_ARG rparen
|
1039
|
+
{
|
1040
|
+
# TODO: lex_state = :expr_endarg in between
|
1041
|
+
debug20 13, val, result
|
1042
|
+
}
|
1043
|
+
| tLPAREN_ARG
|
1044
|
+
{
|
1045
|
+
result = lexer.cmdarg.store false
|
1046
|
+
# result = self.lexer.cmdarg.stack.dup
|
1047
|
+
# lexer.cmdarg.stack.replace [false] # TODO add api for these
|
1048
|
+
}
|
1049
|
+
stmt
|
917
1050
|
{
|
918
1051
|
lexer.lex_state = :expr_endarg
|
919
1052
|
}
|
920
1053
|
rparen
|
921
1054
|
{
|
1055
|
+
_, cmdarg, stmt, _, _, = val
|
922
1056
|
warning "(...) interpreted as grouped expression"
|
923
|
-
|
1057
|
+
lexer.cmdarg.restore cmdarg
|
1058
|
+
result = stmt
|
924
1059
|
}
|
925
1060
|
| tLPAREN compstmt tRPAREN
|
926
1061
|
{
|
@@ -938,6 +1073,7 @@ rule
|
|
938
1073
|
| tLBRACK aref_args tRBRACK
|
939
1074
|
{
|
940
1075
|
result = val[1] || s(:array)
|
1076
|
+
result.sexp_type = :array # aref_args is :args
|
941
1077
|
}
|
942
1078
|
| tLBRACE
|
943
1079
|
{
|
@@ -947,7 +1083,7 @@ rule
|
|
947
1083
|
{
|
948
1084
|
result = new_hash val
|
949
1085
|
}
|
950
|
-
|
|
1086
|
+
| k_return
|
951
1087
|
{
|
952
1088
|
result = s(:return)
|
953
1089
|
}
|
@@ -973,12 +1109,12 @@ rule
|
|
973
1109
|
}
|
974
1110
|
| kNOT tLPAREN2 rparen
|
975
1111
|
{
|
976
|
-
|
1112
|
+
debug20 14, val, result
|
977
1113
|
}
|
978
|
-
|
|
1114
|
+
| fcall brace_block
|
979
1115
|
{
|
980
1116
|
oper, iter = val[0], val[1]
|
981
|
-
call =
|
1117
|
+
call = oper # FIX
|
982
1118
|
iter.insert 1, call
|
983
1119
|
result = iter
|
984
1120
|
call.line = iter.line
|
@@ -995,61 +1131,42 @@ rule
|
|
995
1131
|
{
|
996
1132
|
result = val[1] # TODO: fix lineno
|
997
1133
|
}
|
998
|
-
|
|
999
|
-
{
|
1000
|
-
result = new_if val[1], val[3], val[4]
|
1001
|
-
}
|
1002
|
-
| kUNLESS expr_value then compstmt opt_else kEND
|
1134
|
+
| k_if expr_value then compstmt if_tail k_end
|
1003
1135
|
{
|
1004
|
-
|
1136
|
+
_, c, _, t, f, _ = val
|
1137
|
+
result = new_if c, t, f
|
1005
1138
|
}
|
1006
|
-
|
|
1007
|
-
{
|
1008
|
-
lexer.cond.push true
|
1009
|
-
}
|
1010
|
-
expr_value do
|
1011
|
-
{
|
1012
|
-
lexer.cond.pop
|
1013
|
-
}
|
1014
|
-
compstmt kEND
|
1015
|
-
{
|
1016
|
-
result = new_while val[5], val[2], true
|
1017
|
-
}
|
1018
|
-
| kUNTIL
|
1139
|
+
| k_unless expr_value then compstmt opt_else k_end
|
1019
1140
|
{
|
1020
|
-
|
1141
|
+
_, c, _, t, f, _ = val
|
1142
|
+
result = new_if c, f, t
|
1021
1143
|
}
|
1022
|
-
|
1144
|
+
| k_while expr_value_do compstmt k_end
|
1023
1145
|
{
|
1024
|
-
|
1146
|
+
_, cond, body, _ = val
|
1147
|
+
result = new_while body, cond, true
|
1025
1148
|
}
|
1026
|
-
|
1149
|
+
| k_until expr_value_do compstmt k_end
|
1027
1150
|
{
|
1028
|
-
|
1151
|
+
_, cond, body, _ = val
|
1152
|
+
result = new_until body, cond, true
|
1029
1153
|
}
|
1030
|
-
|
|
1154
|
+
| k_case expr_value opt_terms case_body k_end
|
1031
1155
|
{
|
1032
1156
|
(_, line), expr, _, body, _ = val
|
1033
1157
|
result = new_case expr, body, line
|
1034
1158
|
}
|
1035
|
-
|
|
1159
|
+
| k_case opt_terms case_body k_end
|
1036
1160
|
{
|
1037
1161
|
(_, line), _, body, _ = val
|
1038
1162
|
result = new_case nil, body, line
|
1039
1163
|
}
|
1040
|
-
|
|
1164
|
+
| k_for for_var kIN expr_value_do compstmt k_end
|
1041
1165
|
{
|
1042
|
-
|
1166
|
+
_, var, _, iter, body, _ = val
|
1167
|
+
result = new_for iter, var, body
|
1043
1168
|
}
|
1044
|
-
|
1045
|
-
{
|
1046
|
-
lexer.cond.pop
|
1047
|
-
}
|
1048
|
-
compstmt kEND
|
1049
|
-
{
|
1050
|
-
result = new_for val[4], val[1], val[7]
|
1051
|
-
}
|
1052
|
-
| kCLASS
|
1169
|
+
| k_class
|
1053
1170
|
{
|
1054
1171
|
result = self.lexer.lineno
|
1055
1172
|
}
|
@@ -1061,13 +1178,13 @@ rule
|
|
1061
1178
|
end
|
1062
1179
|
self.env.extend
|
1063
1180
|
}
|
1064
|
-
bodystmt
|
1181
|
+
bodystmt k_end
|
1065
1182
|
{
|
1066
1183
|
result = new_class val
|
1067
1184
|
self.env.unextend
|
1068
1185
|
self.lexer.comments # we don't care about comments in the body
|
1069
1186
|
}
|
1070
|
-
|
|
1187
|
+
| k_class tLSHFT
|
1071
1188
|
{
|
1072
1189
|
result = self.lexer.lineno
|
1073
1190
|
}
|
@@ -1082,13 +1199,13 @@ rule
|
|
1082
1199
|
self.in_single = 0
|
1083
1200
|
self.env.extend
|
1084
1201
|
}
|
1085
|
-
bodystmt
|
1202
|
+
bodystmt k_end
|
1086
1203
|
{
|
1087
1204
|
result = new_sclass val
|
1088
1205
|
self.env.unextend
|
1089
1206
|
self.lexer.comments # we don't care about comments in the body
|
1090
1207
|
}
|
1091
|
-
|
|
1208
|
+
| k_module
|
1092
1209
|
{
|
1093
1210
|
result = self.lexer.lineno
|
1094
1211
|
}
|
@@ -1100,22 +1217,24 @@ rule
|
|
1100
1217
|
|
1101
1218
|
self.env.extend
|
1102
1219
|
}
|
1103
|
-
bodystmt
|
1220
|
+
bodystmt k_end
|
1104
1221
|
{
|
1105
1222
|
result = new_module val
|
1106
1223
|
self.env.unextend
|
1107
1224
|
self.lexer.comments # we don't care about comments in the body
|
1108
1225
|
}
|
1109
|
-
|
|
1226
|
+
| k_def fname
|
1110
1227
|
{
|
1111
1228
|
result = [self.in_def, self.lexer.cmdarg.stack.dup]
|
1112
1229
|
|
1113
1230
|
self.comments.push self.lexer.comments
|
1114
1231
|
self.in_def = true
|
1115
1232
|
self.env.extend
|
1233
|
+
# TODO: local->cmdargs = cmdarg_stack;
|
1234
|
+
# TODO: port local_push_gen and local_pop_gen
|
1116
1235
|
lexer.cmdarg.stack.replace [false]
|
1117
1236
|
}
|
1118
|
-
f_arglist bodystmt
|
1237
|
+
f_arglist bodystmt k_end
|
1119
1238
|
{
|
1120
1239
|
in_def, cmdarg = val[2]
|
1121
1240
|
|
@@ -1126,7 +1245,7 @@ rule
|
|
1126
1245
|
self.in_def = in_def
|
1127
1246
|
self.lexer.comments # we don't care about comments in the body
|
1128
1247
|
}
|
1129
|
-
|
|
1248
|
+
| k_def singleton dot_or_colon
|
1130
1249
|
{
|
1131
1250
|
self.comments.push self.lexer.comments
|
1132
1251
|
lexer.lex_state = :expr_fname
|
@@ -1135,17 +1254,18 @@ rule
|
|
1135
1254
|
{
|
1136
1255
|
self.in_single += 1
|
1137
1256
|
self.env.extend
|
1138
|
-
lexer.lex_state = :
|
1257
|
+
lexer.lex_state = :expr_endfn # force for args
|
1139
1258
|
result = [lexer.lineno, self.lexer.cmdarg.stack.dup]
|
1140
1259
|
lexer.cmdarg.stack.replace [false]
|
1141
1260
|
}
|
1142
|
-
f_arglist bodystmt
|
1261
|
+
f_arglist bodystmt k_end
|
1143
1262
|
{
|
1144
1263
|
line, cmdarg = val[5]
|
1145
1264
|
result = new_defs val
|
1146
1265
|
result[3].line line
|
1147
1266
|
|
1148
1267
|
lexer.cmdarg.stack.replace cmdarg
|
1268
|
+
|
1149
1269
|
self.env.unextend
|
1150
1270
|
self.in_single -= 1
|
1151
1271
|
self.lexer.comments # we don't care about comments in the body
|
@@ -1183,7 +1303,15 @@ rule
|
|
1183
1303
|
k_class: kCLASS
|
1184
1304
|
k_module: kMODULE
|
1185
1305
|
k_def: kDEF
|
1306
|
+
k_do: kDO
|
1307
|
+
k_do_block: kDO_BLOCK
|
1308
|
+
k_rescue: kRESCUE
|
1309
|
+
k_ensure: kENSURE
|
1310
|
+
k_when: kWHEN
|
1311
|
+
k_else: kELSE
|
1312
|
+
k_elsif: kELSIF
|
1186
1313
|
k_end: kEND
|
1314
|
+
k_return: kRETURN
|
1187
1315
|
|
1188
1316
|
then: term
|
1189
1317
|
| kTHEN
|
@@ -1193,7 +1321,7 @@ rule
|
|
1193
1321
|
| kDO_COND
|
1194
1322
|
|
1195
1323
|
if_tail: opt_else
|
1196
|
-
|
|
1324
|
+
| k_elsif expr_value then compstmt if_tail
|
1197
1325
|
{
|
1198
1326
|
result = s(:if, val[1], val[3], val[4])
|
1199
1327
|
}
|
@@ -1278,23 +1406,46 @@ rule
|
|
1278
1406
|
result = block_var :*, args
|
1279
1407
|
}
|
1280
1408
|
|
1281
|
-
|
1409
|
+
block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg
|
1410
|
+
{
|
1411
|
+
result = call_args val
|
1412
|
+
}
|
1413
|
+
| f_block_kwarg opt_f_block_arg
|
1414
|
+
{
|
1415
|
+
result = call_args val
|
1416
|
+
}
|
1417
|
+
| f_kwrest opt_f_block_arg
|
1418
|
+
{
|
1419
|
+
result = call_args val
|
1420
|
+
}
|
1421
|
+
| f_block_arg
|
1422
|
+
{
|
1423
|
+
result = call_args val
|
1424
|
+
}
|
1425
|
+
|
1426
|
+
opt_block_args_tail: tCOMMA block_args_tail
|
1282
1427
|
{
|
1283
1428
|
result = args val
|
1284
1429
|
}
|
1285
|
-
|
|
1430
|
+
| none
|
1431
|
+
|
1432
|
+
block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
|
1433
|
+
{
|
1434
|
+
result = args val
|
1435
|
+
}
|
1436
|
+
| f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
|
1286
1437
|
{
|
1287
1438
|
result = args val
|
1288
1439
|
}
|
1289
|
-
| f_arg tCOMMA f_block_optarg
|
1440
|
+
| f_arg tCOMMA f_block_optarg opt_block_args_tail
|
1290
1441
|
{
|
1291
1442
|
result = args val
|
1292
1443
|
}
|
1293
|
-
| f_arg tCOMMA f_block_optarg tCOMMA f_arg
|
1444
|
+
| f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail
|
1294
1445
|
{
|
1295
1446
|
result = args val
|
1296
1447
|
}
|
1297
|
-
| f_arg tCOMMA f_rest_arg
|
1448
|
+
| f_arg tCOMMA f_rest_arg opt_block_args_tail
|
1298
1449
|
{
|
1299
1450
|
result = args val
|
1300
1451
|
}
|
@@ -1302,64 +1453,68 @@ rule
|
|
1302
1453
|
{
|
1303
1454
|
result = args val
|
1304
1455
|
}
|
1305
|
-
| f_arg tCOMMA f_rest_arg tCOMMA f_arg
|
1456
|
+
| f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
|
1306
1457
|
{
|
1307
1458
|
result = args val
|
1308
1459
|
}
|
1309
|
-
| f_arg
|
1460
|
+
| f_arg opt_block_args_tail
|
1310
1461
|
{
|
1311
1462
|
result = args val
|
1312
1463
|
}
|
1313
|
-
| f_block_optarg tCOMMA f_rest_arg
|
1464
|
+
| f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
|
1314
1465
|
{
|
1315
1466
|
result = args val
|
1316
1467
|
}
|
1317
|
-
| f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg
|
1468
|
+
| f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
|
1318
1469
|
{
|
1319
1470
|
result = args val
|
1320
1471
|
}
|
1321
|
-
| f_block_optarg
|
1472
|
+
| f_block_optarg opt_block_args_tail
|
1322
1473
|
{
|
1323
1474
|
result = args val
|
1324
1475
|
}
|
1325
|
-
| f_block_optarg tCOMMA f_arg
|
1476
|
+
| f_block_optarg tCOMMA f_arg opt_block_args_tail
|
1326
1477
|
{
|
1327
1478
|
result = args val
|
1328
1479
|
}
|
1329
|
-
| f_rest_arg
|
1480
|
+
| f_rest_arg opt_block_args_tail
|
1330
1481
|
{
|
1331
1482
|
result = args val
|
1332
1483
|
}
|
1333
|
-
| f_rest_arg tCOMMA f_arg
|
1484
|
+
| f_rest_arg tCOMMA f_arg opt_block_args_tail
|
1334
1485
|
{
|
1335
1486
|
result = args val
|
1336
1487
|
}
|
1337
|
-
|
|
1488
|
+
| block_args_tail
|
1338
1489
|
{
|
1339
1490
|
result = args val
|
1340
1491
|
}
|
1341
1492
|
|
1342
1493
|
opt_block_param: none { result = 0 }
|
1343
1494
|
| block_param_def
|
1495
|
+
{
|
1496
|
+
self.lexer.command_start = true
|
1497
|
+
}
|
1344
1498
|
|
1345
1499
|
block_param_def: tPIPE opt_bv_decl tPIPE
|
1346
1500
|
{
|
1501
|
+
# TODO: current_arg = 0
|
1347
1502
|
result = args val
|
1348
1503
|
}
|
1349
1504
|
| tOROP
|
1350
1505
|
{
|
1351
1506
|
result = s(:args)
|
1352
|
-
self.lexer.command_start = true
|
1353
1507
|
}
|
1354
1508
|
| tPIPE block_param opt_bv_decl tPIPE
|
1355
1509
|
{
|
1510
|
+
# TODO: current_arg = 0
|
1356
1511
|
result = args val
|
1357
1512
|
}
|
1358
1513
|
|
1359
|
-
opt_bv_decl:
|
1360
|
-
| tSEMI bv_decls
|
1514
|
+
opt_bv_decl: opt_nl
|
1515
|
+
| opt_nl tSEMI bv_decls opt_nl
|
1361
1516
|
{
|
1362
|
-
result = val
|
1517
|
+
result = args val
|
1363
1518
|
}
|
1364
1519
|
|
1365
1520
|
bv_decls: bvar
|
@@ -1378,18 +1533,29 @@ rule
|
|
1378
1533
|
| f_bad_arg
|
1379
1534
|
|
1380
1535
|
lambda: {
|
1381
|
-
|
1536
|
+
self.env.extend :dynamic
|
1537
|
+
result = self.lexer.lineno
|
1538
|
+
|
1382
1539
|
result = lexer.lpar_beg
|
1383
1540
|
lexer.paren_nest += 1
|
1384
1541
|
lexer.lpar_beg = lexer.paren_nest
|
1385
1542
|
}
|
1386
|
-
f_larglist
|
1543
|
+
f_larglist
|
1544
|
+
{
|
1545
|
+
result = [lexer.cmdarg.store(false), self.lexer.lineno]
|
1546
|
+
}
|
1547
|
+
lambda_body
|
1387
1548
|
{
|
1388
|
-
lpar, args, body = val
|
1549
|
+
lpar, args, (cmdarg, lineno), body = val
|
1389
1550
|
lexer.lpar_beg = lpar
|
1390
1551
|
|
1552
|
+
lexer.cmdarg.restore cmdarg
|
1553
|
+
lexer.cmdarg.lexpop
|
1554
|
+
|
1391
1555
|
call = new_call nil, :lambda
|
1392
1556
|
result = new_iter call, args, body
|
1557
|
+
result.line = lineno
|
1558
|
+
self.env.unextend
|
1393
1559
|
}
|
1394
1560
|
|
1395
1561
|
f_larglist: tLPAREN2 f_args opt_bv_decl rparen
|
@@ -1406,35 +1572,22 @@ rule
|
|
1406
1572
|
{
|
1407
1573
|
result = val[1]
|
1408
1574
|
}
|
1409
|
-
| kDO_LAMBDA
|
1575
|
+
| kDO_LAMBDA bodystmt kEND
|
1410
1576
|
{
|
1411
1577
|
result = val[1]
|
1412
1578
|
}
|
1413
1579
|
|
1414
|
-
do_block:
|
1415
|
-
{
|
1416
|
-
self.env.extend :dynamic
|
1417
|
-
result = self.lexer.lineno
|
1418
|
-
}
|
1419
|
-
opt_block_param
|
1580
|
+
do_block: k_do_block do_body kEND
|
1420
1581
|
{
|
1421
|
-
|
1422
|
-
|
1423
|
-
compstmt kEND
|
1424
|
-
{
|
1425
|
-
args = val[2]
|
1426
|
-
body = val[4]
|
1427
|
-
result = new_iter nil, args, body
|
1428
|
-
result.line = val[1]
|
1429
|
-
|
1430
|
-
self.env.unextend
|
1582
|
+
# TODO: maybe fix lineno to kDO's lineno?
|
1583
|
+
result = val[1]
|
1431
1584
|
}
|
1432
1585
|
|
1433
1586
|
block_call: command do_block
|
1434
1587
|
{
|
1435
1588
|
# TODO:
|
1436
|
-
|
1437
|
-
|
1589
|
+
## if (nd_type($1) == NODE_YIELD) {
|
1590
|
+
## compile_error(PARSER_ARG "block given to yield");
|
1438
1591
|
|
1439
1592
|
syntax_error "Both block arg and actual block given." if
|
1440
1593
|
val[0].block_pass?
|
@@ -1444,26 +1597,41 @@ rule
|
|
1444
1597
|
result = val[1]
|
1445
1598
|
result.insert 1, val[0]
|
1446
1599
|
}
|
1447
|
-
| block_call
|
1600
|
+
| block_call call_op2 operation2 opt_paren_args
|
1448
1601
|
{
|
1449
1602
|
result = new_call val[0], val[2].to_sym, val[3]
|
1450
1603
|
}
|
1451
|
-
| block_call
|
1604
|
+
| block_call call_op2 operation2 opt_paren_args brace_block
|
1452
1605
|
{
|
1453
|
-
|
1606
|
+
iter1, _, name, args, iter2 = val
|
1607
|
+
|
1608
|
+
call = new_call iter1, name.to_sym, args
|
1609
|
+
iter2.insert 1, call
|
1610
|
+
|
1611
|
+
result = iter2
|
1612
|
+
}
|
1613
|
+
| block_call call_op2 operation2 command_args do_block
|
1614
|
+
{
|
1615
|
+
iter1, _, name, args, iter2 = val
|
1616
|
+
|
1617
|
+
call = new_call iter1, name.to_sym, args
|
1618
|
+
iter2.insert 1, call
|
1619
|
+
|
1620
|
+
result = iter2
|
1454
1621
|
}
|
1455
1622
|
|
1456
|
-
method_call:
|
1623
|
+
method_call: fcall
|
1457
1624
|
{
|
1458
1625
|
result = self.lexer.lineno
|
1459
1626
|
}
|
1460
1627
|
paren_args
|
1461
1628
|
{
|
1462
|
-
|
1629
|
+
args = self.call_args val[2..-1]
|
1630
|
+
result = val[0].concat args.sexp_body
|
1463
1631
|
}
|
1464
|
-
| primary_value
|
1632
|
+
| primary_value call_op operation2 opt_paren_args
|
1465
1633
|
{
|
1466
|
-
result = new_call val[0], val[2].to_sym, val[3]
|
1634
|
+
result = new_call val[0], val[2].to_sym, val[3], val[1]
|
1467
1635
|
}
|
1468
1636
|
| primary_value tCOLON2 operation2 paren_args
|
1469
1637
|
{
|
@@ -1473,9 +1641,9 @@ rule
|
|
1473
1641
|
{
|
1474
1642
|
result = new_call val[0], val[2].to_sym
|
1475
1643
|
}
|
1476
|
-
| primary_value
|
1644
|
+
| primary_value call_op paren_args
|
1477
1645
|
{
|
1478
|
-
result = new_call val[0], :call, val[2]
|
1646
|
+
result = new_call val[0], :call, val[2], val[1]
|
1479
1647
|
}
|
1480
1648
|
| primary_value tCOLON2 paren_args
|
1481
1649
|
{
|
@@ -1499,39 +1667,55 @@ rule
|
|
1499
1667
|
self.env.extend :dynamic
|
1500
1668
|
result = self.lexer.lineno
|
1501
1669
|
}
|
1502
|
-
|
1503
|
-
{
|
1504
|
-
result = nil # self.env.dynamic.keys
|
1505
|
-
}
|
1506
|
-
compstmt tRCURLY
|
1670
|
+
brace_body tRCURLY
|
1507
1671
|
{
|
1508
|
-
_, line,
|
1672
|
+
_, line, body, _ = val
|
1509
1673
|
|
1510
|
-
result =
|
1674
|
+
result = body
|
1511
1675
|
result.line = line
|
1512
1676
|
|
1513
1677
|
self.env.unextend
|
1514
1678
|
}
|
1515
|
-
|
|
1679
|
+
| k_do
|
1516
1680
|
{
|
1517
1681
|
self.env.extend :dynamic
|
1518
1682
|
result = self.lexer.lineno
|
1519
1683
|
}
|
1520
|
-
|
1684
|
+
do_body kEND
|
1521
1685
|
{
|
1522
|
-
|
1686
|
+
_, line, body, _ = val
|
1687
|
+
|
1688
|
+
result = body
|
1689
|
+
result.line = line
|
1690
|
+
|
1691
|
+
self.env.unextend
|
1523
1692
|
}
|
1524
|
-
|
1693
|
+
|
1694
|
+
brace_body: { self.env.extend :dynamic; result = self.lexer.lineno }
|
1695
|
+
{ result = lexer.cmdarg.store(false) }
|
1696
|
+
opt_block_param compstmt
|
1525
1697
|
{
|
1526
|
-
|
1698
|
+
line, cmdarg, param, cmpstmt = val
|
1527
1699
|
|
1528
|
-
result =
|
1529
|
-
|
1700
|
+
result = new_brace_body param, cmpstmt, line
|
1701
|
+
self.env.unextend
|
1702
|
+
lexer.cmdarg.restore cmdarg
|
1703
|
+
lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ?
|
1704
|
+
}
|
1705
|
+
|
1706
|
+
do_body: { self.env.extend :dynamic; result = self.lexer.lineno }
|
1707
|
+
{ result = lexer.cmdarg.store(false) }
|
1708
|
+
opt_block_param
|
1709
|
+
bodystmt
|
1710
|
+
{
|
1711
|
+
line, cmdarg, param, cmpstmt = val
|
1530
1712
|
|
1713
|
+
result = new_do_body param, cmpstmt, line
|
1531
1714
|
self.env.unextend
|
1715
|
+
lexer.cmdarg.restore cmdarg
|
1532
1716
|
}
|
1533
1717
|
|
1534
|
-
case_body:
|
1718
|
+
case_body: k_when
|
1535
1719
|
{
|
1536
1720
|
result = self.lexer.lineno
|
1537
1721
|
}
|
@@ -1544,7 +1728,7 @@ rule
|
|
1544
1728
|
|
1545
1729
|
cases: opt_else | case_body
|
1546
1730
|
|
1547
|
-
opt_rescue:
|
1731
|
+
opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue
|
1548
1732
|
{
|
1549
1733
|
(_, line), klasses, var, _, body, rest = val
|
1550
1734
|
|
@@ -1573,7 +1757,7 @@ rule
|
|
1573
1757
|
}
|
1574
1758
|
| none
|
1575
1759
|
|
1576
|
-
opt_ensure:
|
1760
|
+
opt_ensure: k_ensure compstmt
|
1577
1761
|
{
|
1578
1762
|
_, body = val
|
1579
1763
|
|
@@ -1581,8 +1765,14 @@ rule
|
|
1581
1765
|
}
|
1582
1766
|
| none
|
1583
1767
|
|
1584
|
-
literal: numeric
|
1585
|
-
|
1768
|
+
literal: numeric
|
1769
|
+
{
|
1770
|
+
result = s(:lit, val[0])
|
1771
|
+
}
|
1772
|
+
| symbol
|
1773
|
+
{
|
1774
|
+
result = s(:lit, val[0])
|
1775
|
+
}
|
1586
1776
|
| dsym
|
1587
1777
|
|
1588
1778
|
strings: string
|
@@ -1591,7 +1781,11 @@ rule
|
|
1591
1781
|
result = val[0]
|
1592
1782
|
}
|
1593
1783
|
|
1594
|
-
string:
|
1784
|
+
string: tCHAR
|
1785
|
+
{
|
1786
|
+
debug20 23, val, result
|
1787
|
+
}
|
1788
|
+
| string1
|
1595
1789
|
| string string1
|
1596
1790
|
{
|
1597
1791
|
result = self.literal_concat val[0], val[1]
|
@@ -1631,7 +1825,7 @@ rule
|
|
1631
1825
|
}
|
1632
1826
|
| word_list word tSPACE
|
1633
1827
|
{
|
1634
|
-
result = val[0] << new_word_list_entry(val)
|
1828
|
+
result = val[0].dup << new_word_list_entry(val)
|
1635
1829
|
}
|
1636
1830
|
|
1637
1831
|
word: string_content
|
@@ -1640,6 +1834,24 @@ rule
|
|
1640
1834
|
result = self.literal_concat val[0], val[1]
|
1641
1835
|
}
|
1642
1836
|
|
1837
|
+
symbols: tSYMBOLS_BEG tSPACE tSTRING_END
|
1838
|
+
{
|
1839
|
+
result = s(:array)
|
1840
|
+
}
|
1841
|
+
| tSYMBOLS_BEG symbol_list tSTRING_END
|
1842
|
+
{
|
1843
|
+
result = val[1]
|
1844
|
+
}
|
1845
|
+
|
1846
|
+
symbol_list: none
|
1847
|
+
{
|
1848
|
+
result = new_symbol_list
|
1849
|
+
}
|
1850
|
+
| symbol_list word tSPACE
|
1851
|
+
{
|
1852
|
+
result = val[0].dup << new_symbol_list_entry(val)
|
1853
|
+
}
|
1854
|
+
|
1643
1855
|
qwords: tQWORDS_BEG tSPACE tSTRING_END
|
1644
1856
|
{
|
1645
1857
|
result = s(:array)
|
@@ -1649,13 +1861,31 @@ rule
|
|
1649
1861
|
result = val[1]
|
1650
1862
|
}
|
1651
1863
|
|
1864
|
+
qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END
|
1865
|
+
{
|
1866
|
+
result = s(:array)
|
1867
|
+
}
|
1868
|
+
| tQSYMBOLS_BEG qsym_list tSTRING_END
|
1869
|
+
{
|
1870
|
+
result = val[1]
|
1871
|
+
}
|
1872
|
+
|
1652
1873
|
qword_list: none
|
1653
1874
|
{
|
1654
1875
|
result = new_qword_list
|
1655
1876
|
}
|
1656
1877
|
| qword_list tSTRING_CONTENT tSPACE
|
1657
1878
|
{
|
1658
|
-
result = val[0] << new_qword_list_entry(val)
|
1879
|
+
result = val[0].dup << new_qword_list_entry(val)
|
1880
|
+
}
|
1881
|
+
|
1882
|
+
qsym_list: none
|
1883
|
+
{
|
1884
|
+
result = new_qsym_list
|
1885
|
+
}
|
1886
|
+
| qsym_list tSTRING_CONTENT tSPACE
|
1887
|
+
{
|
1888
|
+
result = val[0].dup << new_qsym_list_entry(val)
|
1659
1889
|
}
|
1660
1890
|
|
1661
1891
|
string_contents: none
|
@@ -1707,7 +1937,9 @@ regexp_contents: none
|
|
1707
1937
|
lexer.brace_nest,
|
1708
1938
|
lexer.string_nest, # TODO: remove
|
1709
1939
|
lexer.cond.store,
|
1710
|
-
lexer.cmdarg.store
|
1940
|
+
lexer.cmdarg.store,
|
1941
|
+
lexer.lex_state,
|
1942
|
+
]
|
1711
1943
|
|
1712
1944
|
lexer.lex_strterm = nil
|
1713
1945
|
lexer.brace_nest = 0
|
@@ -1715,11 +1947,12 @@ regexp_contents: none
|
|
1715
1947
|
|
1716
1948
|
lexer.lex_state = :expr_beg
|
1717
1949
|
}
|
1718
|
-
compstmt
|
1950
|
+
compstmt
|
1951
|
+
tSTRING_DEND
|
1719
1952
|
{
|
1720
1953
|
_, memo, stmt, _ = val
|
1721
1954
|
|
1722
|
-
lex_strterm, brace_nest, string_nest, oldcond, oldcmdarg = memo
|
1955
|
+
lex_strterm, brace_nest, string_nest, oldcond, oldcmdarg, oldlex_state = memo
|
1723
1956
|
|
1724
1957
|
lexer.lex_strterm = lex_strterm
|
1725
1958
|
lexer.brace_nest = brace_nest
|
@@ -1728,6 +1961,8 @@ regexp_contents: none
|
|
1728
1961
|
lexer.cond.restore oldcond
|
1729
1962
|
lexer.cmdarg.restore oldcmdarg
|
1730
1963
|
|
1964
|
+
lexer.lex_state = oldlex_state
|
1965
|
+
|
1731
1966
|
case stmt
|
1732
1967
|
when Sexp then
|
1733
1968
|
case stmt.sexp_type
|
@@ -1739,6 +1974,7 @@ regexp_contents: none
|
|
1739
1974
|
when nil then
|
1740
1975
|
result = s(:evstr)
|
1741
1976
|
else
|
1977
|
+
debug20 25
|
1742
1978
|
raise "unknown string body: #{stmt.inspect}"
|
1743
1979
|
end
|
1744
1980
|
}
|
@@ -1771,23 +2007,25 @@ regexp_contents: none
|
|
1771
2007
|
when :dstr then
|
1772
2008
|
result.sexp_type = :dsym
|
1773
2009
|
when :str then
|
1774
|
-
result = s(:lit, result.last.
|
1775
|
-
|
2010
|
+
result = s(:lit, result.last.to_sym)
|
2011
|
+
when :evstr then
|
1776
2012
|
result = s(:dsym, "", result)
|
2013
|
+
else
|
2014
|
+
debug20 26, val, result
|
1777
2015
|
end
|
1778
2016
|
}
|
1779
2017
|
|
1780
|
-
numeric:
|
1781
|
-
|
|
1782
|
-
| tUMINUS_NUM tINTEGER =tLOWEST
|
1783
|
-
{
|
1784
|
-
result = -val[1] # TODO: pt_testcase
|
1785
|
-
}
|
1786
|
-
| tUMINUS_NUM tFLOAT =tLOWEST
|
2018
|
+
numeric: simple_numeric
|
2019
|
+
| tUMINUS_NUM simple_numeric
|
1787
2020
|
{
|
1788
2021
|
result = -val[1] # TODO: pt_testcase
|
1789
2022
|
}
|
1790
2023
|
|
2024
|
+
simple_numeric: tINTEGER
|
2025
|
+
| tFLOAT
|
2026
|
+
| tRATIONAL
|
2027
|
+
| tIMAGINARY
|
2028
|
+
|
1791
2029
|
user_variable: tIDENTIFIER
|
1792
2030
|
| tIVAR
|
1793
2031
|
| tGVAR
|
@@ -1828,93 +2066,123 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
1828
2066
|
| keyword_variable
|
1829
2067
|
{
|
1830
2068
|
result = self.assignable val[0]
|
2069
|
+
debug20 29, val, result
|
1831
2070
|
}
|
1832
2071
|
|
1833
2072
|
backref: tNTH_REF { result = s(:nth_ref, val[0]) }
|
1834
2073
|
| tBACK_REF { result = s(:back_ref, val[0]) }
|
1835
2074
|
|
1836
|
-
superclass:
|
1837
|
-
{
|
1838
|
-
result = nil
|
1839
|
-
}
|
1840
|
-
| tLT
|
2075
|
+
superclass: tLT
|
1841
2076
|
{
|
1842
2077
|
lexer.lex_state = :expr_beg
|
2078
|
+
lexer.command_start = true
|
1843
2079
|
}
|
1844
2080
|
expr_value term
|
1845
2081
|
{
|
1846
2082
|
result = val[2]
|
1847
2083
|
}
|
1848
|
-
|
|
2084
|
+
| none
|
1849
2085
|
{
|
1850
|
-
yyerrok
|
1851
2086
|
result = nil
|
1852
2087
|
}
|
1853
2088
|
|
1854
2089
|
f_arglist: tLPAREN2 f_args rparen
|
1855
2090
|
{
|
1856
2091
|
result = val[1]
|
1857
|
-
lexer.lex_state = :expr_beg
|
2092
|
+
self.lexer.lex_state = :expr_beg
|
1858
2093
|
self.lexer.command_start = true
|
1859
2094
|
}
|
1860
|
-
|
|
2095
|
+
| {
|
2096
|
+
result = self.in_kwarg
|
2097
|
+
self.in_kwarg = true
|
2098
|
+
# TODO: self.lexer.lex_state |= :expr_label
|
2099
|
+
}
|
2100
|
+
f_args term
|
1861
2101
|
{
|
1862
|
-
|
2102
|
+
kwarg, args, _ = val
|
2103
|
+
|
2104
|
+
self.in_kwarg = kwarg
|
2105
|
+
result = args
|
2106
|
+
lexer.lex_state = :expr_beg
|
2107
|
+
lexer.command_start = true
|
2108
|
+
}
|
2109
|
+
|
2110
|
+
args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg
|
2111
|
+
{
|
2112
|
+
result = args val
|
2113
|
+
}
|
2114
|
+
| f_kwarg opt_f_block_arg
|
2115
|
+
{
|
2116
|
+
result = args val
|
1863
2117
|
}
|
2118
|
+
| f_kwrest opt_f_block_arg
|
2119
|
+
{
|
2120
|
+
result = args val
|
2121
|
+
}
|
2122
|
+
| f_block_arg
|
1864
2123
|
|
1865
|
-
|
2124
|
+
opt_args_tail: tCOMMA args_tail
|
2125
|
+
{
|
2126
|
+
result = val[1]
|
2127
|
+
}
|
2128
|
+
|
|
2129
|
+
{
|
2130
|
+
result = nil
|
2131
|
+
}
|
2132
|
+
|
2133
|
+
f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail
|
1866
2134
|
{
|
1867
2135
|
result = args val
|
1868
2136
|
}
|
1869
|
-
| f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg
|
2137
|
+
| f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
|
1870
2138
|
{
|
1871
2139
|
result = args val
|
1872
2140
|
}
|
1873
|
-
| f_arg tCOMMA f_optarg
|
2141
|
+
| f_arg tCOMMA f_optarg opt_args_tail
|
1874
2142
|
{
|
1875
2143
|
result = args val
|
1876
2144
|
}
|
1877
|
-
| f_arg tCOMMA f_optarg tCOMMA f_arg
|
2145
|
+
| f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail
|
1878
2146
|
{
|
1879
2147
|
result = args val
|
1880
2148
|
}
|
1881
|
-
| f_arg tCOMMA f_rest_arg
|
2149
|
+
| f_arg tCOMMA f_rest_arg opt_args_tail
|
1882
2150
|
{
|
1883
2151
|
result = args val
|
1884
2152
|
}
|
1885
|
-
| f_arg tCOMMA f_rest_arg tCOMMA f_arg
|
2153
|
+
| f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
|
1886
2154
|
{
|
1887
2155
|
result = args val
|
1888
2156
|
}
|
1889
|
-
| f_arg
|
2157
|
+
| f_arg opt_args_tail
|
1890
2158
|
{
|
1891
2159
|
result = args val
|
1892
2160
|
}
|
1893
|
-
| f_optarg tCOMMA f_rest_arg
|
2161
|
+
| f_optarg tCOMMA f_rest_arg opt_args_tail
|
1894
2162
|
{
|
1895
2163
|
result = args val
|
1896
2164
|
}
|
1897
|
-
| f_optarg tCOMMA f_rest_arg tCOMMA f_arg
|
2165
|
+
| f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
|
1898
2166
|
{
|
1899
2167
|
result = args val
|
1900
2168
|
}
|
1901
|
-
| f_optarg
|
2169
|
+
| f_optarg opt_args_tail
|
1902
2170
|
{
|
1903
2171
|
result = args val
|
1904
2172
|
}
|
1905
|
-
| f_optarg tCOMMA f_arg
|
2173
|
+
| f_optarg tCOMMA f_arg opt_args_tail
|
1906
2174
|
{
|
1907
2175
|
result = args val
|
1908
2176
|
}
|
1909
|
-
| f_rest_arg
|
2177
|
+
| f_rest_arg opt_args_tail
|
1910
2178
|
{
|
1911
2179
|
result = args val
|
1912
2180
|
}
|
1913
|
-
| f_rest_arg tCOMMA f_arg
|
2181
|
+
| f_rest_arg tCOMMA f_arg opt_args_tail
|
1914
2182
|
{
|
1915
2183
|
result = args val
|
1916
2184
|
}
|
1917
|
-
|
|
2185
|
+
| args_tail
|
1918
2186
|
{
|
1919
2187
|
result = args val
|
1920
2188
|
}
|
@@ -1949,7 +2217,9 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
1949
2217
|
result = identifier
|
1950
2218
|
}
|
1951
2219
|
|
1952
|
-
|
2220
|
+
f_arg_asgn: f_norm_arg
|
2221
|
+
|
2222
|
+
f_arg_item: f_arg_asgn
|
1953
2223
|
| tLPAREN f_margs rparen
|
1954
2224
|
{
|
1955
2225
|
result = val[1]
|
@@ -1964,6 +2234,7 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
1964
2234
|
when Sexp then
|
1965
2235
|
result = val[0]
|
1966
2236
|
else
|
2237
|
+
debug20 32
|
1967
2238
|
raise "Unknown f_arg type: #{val.inspect}"
|
1968
2239
|
end
|
1969
2240
|
}
|
@@ -1980,13 +2251,78 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
1980
2251
|
result << item
|
1981
2252
|
}
|
1982
2253
|
|
1983
|
-
|
2254
|
+
f_label: tLABEL
|
2255
|
+
|
2256
|
+
f_kw: f_label arg_value
|
2257
|
+
{
|
2258
|
+
# TODO: call_args
|
2259
|
+
label, _ = val[0] # TODO: fix lineno?
|
2260
|
+
identifier = label.to_sym
|
2261
|
+
self.env[identifier] = :lvar
|
2262
|
+
|
2263
|
+
result = s(:array, s(:kwarg, identifier, val[1]))
|
2264
|
+
}
|
2265
|
+
| f_label
|
2266
|
+
{
|
2267
|
+
label, _ = val[0] # TODO: fix lineno?
|
2268
|
+
identifier = label.to_sym
|
2269
|
+
self.env[identifier] = :lvar
|
2270
|
+
|
2271
|
+
result = s(:array, s(:kwarg, identifier))
|
2272
|
+
}
|
2273
|
+
|
2274
|
+
f_block_kw: f_label primary_value
|
2275
|
+
{
|
2276
|
+
# TODO: call_args
|
2277
|
+
label, _ = val[0] # TODO: fix lineno?
|
2278
|
+
identifier = label.to_sym
|
2279
|
+
self.env[identifier] = :lvar
|
2280
|
+
|
2281
|
+
result = s(:array, s(:kwarg, identifier, val[1]))
|
2282
|
+
}
|
2283
|
+
| f_label
|
2284
|
+
{
|
2285
|
+
label, _ = val[0] # TODO: fix lineno?
|
2286
|
+
identifier = label.to_sym
|
2287
|
+
self.env[identifier] = :lvar
|
2288
|
+
|
2289
|
+
result = s(:array, s(:kwarg, identifier))
|
2290
|
+
}
|
2291
|
+
|
2292
|
+
f_block_kwarg: f_block_kw
|
2293
|
+
| f_block_kwarg tCOMMA f_block_kw
|
2294
|
+
{
|
2295
|
+
list, _, item = val
|
2296
|
+
result = list << item.last
|
2297
|
+
}
|
2298
|
+
|
2299
|
+
f_kwarg: f_kw
|
2300
|
+
| f_kwarg tCOMMA f_kw
|
2301
|
+
{
|
2302
|
+
result = args val
|
2303
|
+
}
|
2304
|
+
|
2305
|
+
kwrest_mark: tPOW
|
2306
|
+
| tDSTAR
|
2307
|
+
|
2308
|
+
f_kwrest: kwrest_mark tIDENTIFIER
|
2309
|
+
{
|
2310
|
+
name = val[1].to_sym
|
2311
|
+
self.assignable name
|
2312
|
+
result = :"**#{name}"
|
2313
|
+
}
|
2314
|
+
| kwrest_mark
|
2315
|
+
{
|
2316
|
+
result = :"**"
|
2317
|
+
}
|
2318
|
+
|
2319
|
+
f_opt: f_arg_asgn tEQL arg_value
|
1984
2320
|
{
|
1985
2321
|
result = self.assignable val[0], val[2]
|
1986
2322
|
# TODO: detect duplicate names
|
1987
2323
|
}
|
1988
2324
|
|
1989
|
-
f_block_opt:
|
2325
|
+
f_block_opt: f_arg_asgn tEQL primary_value
|
1990
2326
|
{
|
1991
2327
|
result = self.assignable val[0], val[2]
|
1992
2328
|
}
|
@@ -2073,22 +2409,39 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2073
2409
|
more = val[2].sexp_body
|
2074
2410
|
list.push(*more) unless more.empty?
|
2075
2411
|
result = list
|
2412
|
+
result.sexp_type = :hash
|
2076
2413
|
}
|
2077
2414
|
|
2078
2415
|
assoc: arg_value tASSOC arg_value
|
2079
2416
|
{
|
2080
2417
|
result = s(:array, val[0], val[2])
|
2081
2418
|
}
|
2082
|
-
| tLABEL
|
2419
|
+
| tLABEL arg_value
|
2083
2420
|
{
|
2084
|
-
label, _ = val
|
2085
|
-
result = s(:array, s(:lit, label.to_sym),
|
2421
|
+
(label, _), arg = val
|
2422
|
+
result = s(:array, s(:lit, label.to_sym), arg)
|
2423
|
+
}
|
2424
|
+
| tSTRING_BEG string_contents tLABEL_END arg_value
|
2425
|
+
{
|
2426
|
+
_, sym, _, value = val
|
2427
|
+
sym.sexp_type = :dsym
|
2428
|
+
result = s(:array, sym, value)
|
2429
|
+
}
|
2430
|
+
| tDSTAR arg_value
|
2431
|
+
{
|
2432
|
+
result = s(:array, s(:kwsplat, val[1]))
|
2086
2433
|
}
|
2087
2434
|
|
2088
2435
|
operation: tIDENTIFIER | tCONSTANT | tFID
|
2089
2436
|
operation2: tIDENTIFIER | tCONSTANT | tFID | op
|
2090
2437
|
operation3: tIDENTIFIER | tFID | op
|
2091
2438
|
dot_or_colon: tDOT | tCOLON2
|
2439
|
+
call_op: tDOT
|
2440
|
+
| tLONELY # TODO: rename tANDDOT?
|
2441
|
+
|
2442
|
+
call_op2: call_op
|
2443
|
+
| tCOLON2
|
2444
|
+
|
2092
2445
|
opt_terms: | terms
|
2093
2446
|
opt_nl: | tNL
|
2094
2447
|
rparen: opt_nl tRPAREN
|
@@ -2101,7 +2454,7 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2101
2454
|
terms: term
|
2102
2455
|
| terms tSEMI { yyerrok }
|
2103
2456
|
|
2104
|
-
none: { result = nil }
|
2457
|
+
none: { result = nil; }
|
2105
2458
|
end
|
2106
2459
|
|
2107
2460
|
---- inner
|