ruby_parser 3.12.0 → 3.13.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  # -*- racc -*-
2
2
 
3
- class Ruby19Parser
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 tLAST_TOKEN
21
- tLAMBDA tLAMBEG
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
- tLCURLY top_compstmt tRCURLY
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
- result = new_iter s(:preexe), nil, val[3]
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
- bodystmt: compstmt opt_rescue opt_else opt_ensure
113
+ result = new_body [body, resc, els, ens]
114
+ }
115
+ | compstmt opt_rescue opt_ensure
85
116
  {
86
- result = new_body val
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
- | stmt
96
- | stmts terms stmt
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
- result = s(:rescue, val[0], new_resbody(s(:array), val[2]))
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
- | var_lhs tOP_ASGN command_call
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 command_call
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 tDOT tIDENTIFIER tOP_ASGN command_call
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 tDOT tCONSTANT tOP_ASGN command_call
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 command_call
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 command_call
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 command_call
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
- command_asgn: lhs tEQL command_call
270
+ command_rhs: command_call =tOP_ASGN
205
271
  {
206
- result = new_assign val[0], val[2]
272
+ expr, = val
273
+ result = value_expr expr
207
274
  }
208
- | lhs tEQL command_asgn
275
+ | command_call kRESCUE_MOD stmt
209
276
  {
210
- result = new_assign val[0], val[2]
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 tDOT operation2 command_args # TODO: dot_or_colon
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
- opt_block_param
333
+ brace_body tRCURLY
256
334
  {
257
- result = nil # self.env.dynamic.keys
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
- self.env.unextend
343
+ fcall: operation
344
+ {
345
+ result = new_call nil, val[0].to_sym
265
346
  }
266
347
 
267
- command: operation command_args =tLOWEST
348
+ command: fcall command_args =tLOWEST
268
349
  {
269
- result = new_call nil, val[0].to_sym, val[1]
350
+ result = val[0].concat val[1].sexp_body # REFACTOR pattern
270
351
  }
271
- | operation command_args cmd_brace_block
352
+ | fcall command_args cmd_brace_block
272
353
  {
273
- result = new_call nil, val[0].to_sym, val[1]
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 tDOT operation2 command_args =tLOWEST
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 tDOT operation2 command_args cmd_brace_block
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
- | kRETURN call_args
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
- ary = list_append val[0], s(:splat, val[2])
360
- ary.concat val[4].sexp_body
361
- result = s(:masgn, ary)
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
- ary = s(:array, s(:splat))
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 tDOT tIDENTIFIER
511
+ | primary_value call_op tIDENTIFIER
431
512
  {
432
- result = s(:attrasgn, val[0], :"#{val[2]}=")
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 tDOT tCONSTANT
519
+ | primary_value call_op tCONSTANT
439
520
  {
440
- result = s(:attrasgn, val[0], :"#{val[2]}=")
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 tDOT tIDENTIFIER
559
+ | primary_value call_op tIDENTIFIER # REFACTOR
476
560
  {
477
- result = s(:attrasgn, val[0], :"#{val[2]}=")
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 tDOT tCONSTANT
567
+ | primary_value call_op tCONSTANT # REFACTOR?
484
568
  {
485
- result = s(:attrasgn, val[0], :"#{val[2]}=")
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 = val[0]
624
+ result = sym
538
625
  }
539
626
 
540
627
  fsym: fname | symbol
541
628
 
542
- fitem: fsym { result = s(:lit, val[0].to_sym) }
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 | tEQQ
560
- | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ
561
- | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
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 arg
666
+ arg: lhs tEQL arg_rhs
576
667
  {
577
668
  result = new_assign val[0], val[2]
578
669
  }
579
- | lhs tEQL arg kRESCUE_MOD arg
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 arg
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 tDOT tIDENTIFIER tOP_ASGN arg
679
+ | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs
598
680
  {
599
- result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4])
681
+ result = new_op_asgn2 val
600
682
  }
601
- | primary_value tDOT tCONSTANT tOP_ASGN arg
683
+ | primary_value call_op tCONSTANT tOP_ASGN arg_rhs
602
684
  {
603
- result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4])
685
+ result = new_op_asgn2 val
604
686
  }
605
- | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg
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 arg
691
+ | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs
610
692
  {
611
- yyerror "constant re-assignment"
693
+ # TODO: assignment
694
+ raise "not yet: %p" % [val]
612
695
  }
613
- | tCOLON3 tCONSTANT tOP_ASGN arg
696
+ | tCOLON3 tCONSTANT tOP_ASGN arg_rhs
614
697
  {
615
- yyerror "constant re-assignment"
698
+ # TODO: assignment
699
+ raise "not yet: %p" % [val]
616
700
  }
617
- | backref tOP_ASGN arg
701
+ | backref tOP_ASGN arg_rhs
618
702
  {
619
- self.backref_assign_error val[0]
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 tINTEGER tPOW arg
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
- | arg tGT arg
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
- val[2] = value_expr val[2]
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] << s(:hash, *val[2].values)
877
+ result = args [val[0], array_to_hash(val[2])]
783
878
  }
784
879
  | assocs trailer
785
880
  {
786
- result = s(:array, s(:hash, *val[0].values))
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[0]
911
+ result = args val
808
912
  }
809
913
  | args tCOMMA assocs tCOMMA
810
914
  {
811
- result = val[0] << s(:hash, *val[2].sexp_body) # TODO: self.args
915
+ result = args [val[0], array_to_hash(val[2])]
812
916
  }
813
917
  | assocs tCOMMA
814
918
  {
815
- result = s(:hash, *val[0].values)
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 = s(:array, val[0])
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 = s(:array, s(:hash, *val[0].values))
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] << s(:hash, *val[2].values)
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.stack.dup # TODO: smell?
841
- lexer.cmdarg.push true
948
+ result = lexer.cmdarg.store true
842
949
  }
843
950
  call_args
844
951
  {
845
- lexer.cmdarg.stack.replace val[0]
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
- | kBEGIN
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 kEND
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 expr
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
- result = val[1]
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
- | kRETURN
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
- raise "no3\non#{val.inspect}"
1112
+ debug20 14, val, result
977
1113
  }
978
- | operation brace_block
1114
+ | fcall brace_block
979
1115
  {
980
1116
  oper, iter = val[0], val[1]
981
- call = new_call nil, oper.to_sym
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
- | kIF expr_value then compstmt if_tail kEND
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
- result = new_if val[1], val[4], val[3]
1136
+ _, c, _, t, f, _ = val
1137
+ result = new_if c, t, f
1005
1138
  }
1006
- | kWHILE
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
- lexer.cond.push true
1141
+ _, c, _, t, f, _ = val
1142
+ result = new_if c, f, t
1021
1143
  }
1022
- expr_value do
1144
+ | k_while expr_value_do compstmt k_end
1023
1145
  {
1024
- lexer.cond.pop
1146
+ _, cond, body, _ = val
1147
+ result = new_while body, cond, true
1025
1148
  }
1026
- compstmt kEND
1149
+ | k_until expr_value_do compstmt k_end
1027
1150
  {
1028
- result = new_until val[5], val[2], true
1151
+ _, cond, body, _ = val
1152
+ result = new_until body, cond, true
1029
1153
  }
1030
- | kCASE expr_value opt_terms case_body kEND
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
- | kCASE opt_terms case_body kEND
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
- | kFOR for_var kIN
1164
+ | k_for for_var kIN expr_value_do compstmt k_end
1041
1165
  {
1042
- lexer.cond.push true
1166
+ _, var, _, iter, body, _ = val
1167
+ result = new_for iter, var, body
1043
1168
  }
1044
- expr_value do
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 kEND
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
- | kCLASS tLSHFT
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 kEND
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
- | kMODULE
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 kEND
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
- | kDEF fname
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 kEND
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
- | kDEF singleton dot_or_colon
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 = :expr_end # force for args
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 kEND
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
- | kELSIF expr_value then compstmt if_tail
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
- block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_f_block_arg
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
- | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
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 opt_f_block_arg
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 opt_f_block_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 opt_f_block_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 opt_f_block_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 opt_f_block_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 opt_f_block_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 opt_f_block_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 opt_f_block_arg
1472
+ | f_block_optarg opt_block_args_tail
1322
1473
  {
1323
1474
  result = args val
1324
1475
  }
1325
- | f_block_optarg tCOMMA f_arg opt_f_block_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 opt_f_block_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 opt_f_block_arg
1484
+ | f_rest_arg tCOMMA f_arg opt_block_args_tail
1334
1485
  {
1335
1486
  result = args val
1336
1487
  }
1337
- | f_block_arg
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: none
1360
- | tSEMI bv_decls
1514
+ opt_bv_decl: opt_nl
1515
+ | opt_nl tSEMI bv_decls opt_nl
1361
1516
  {
1362
- result = val[1]
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
- # TODO: dyna_push ? hrm
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 lambda_body
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 compstmt kEND
1575
+ | kDO_LAMBDA bodystmt kEND
1410
1576
  {
1411
1577
  result = val[1]
1412
1578
  }
1413
1579
 
1414
- do_block: kDO_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
- result = nil # self.env.dynamic.keys
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
- # if (nd_type($1) == NODE_YIELD) {
1437
- # compile_error(PARSER_ARG "block given to yield");
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 tDOT operation2 opt_paren_args
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 tCOLON2 operation2 opt_paren_args
1604
+ | block_call call_op2 operation2 opt_paren_args brace_block
1452
1605
  {
1453
- result = new_call val[0], val[2].to_sym, val[3]
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: operation
1623
+ method_call: fcall
1457
1624
  {
1458
1625
  result = self.lexer.lineno
1459
1626
  }
1460
1627
  paren_args
1461
1628
  {
1462
- result = new_call nil, val[0].to_sym, val[2]
1629
+ args = self.call_args val[2..-1]
1630
+ result = val[0].concat args.sexp_body
1463
1631
  }
1464
- | primary_value tDOT operation2 opt_paren_args
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 tDOT paren_args
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
- opt_block_param
1503
- {
1504
- result = nil # self.env.dynamic.keys
1505
- }
1506
- compstmt tRCURLY
1670
+ brace_body tRCURLY
1507
1671
  {
1508
- _, line, args, _, body, _ = val
1672
+ _, line, body, _ = val
1509
1673
 
1510
- result = new_iter nil, args, body
1674
+ result = body
1511
1675
  result.line = line
1512
1676
 
1513
1677
  self.env.unextend
1514
1678
  }
1515
- | kDO
1679
+ | k_do
1516
1680
  {
1517
1681
  self.env.extend :dynamic
1518
1682
  result = self.lexer.lineno
1519
1683
  }
1520
- opt_block_param
1684
+ do_body kEND
1521
1685
  {
1522
- result = nil # self.env.dynamic.keys
1686
+ _, line, body, _ = val
1687
+
1688
+ result = body
1689
+ result.line = line
1690
+
1691
+ self.env.unextend
1523
1692
  }
1524
- compstmt kEND
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
- _, line, args, _, body, _ = val
1698
+ line, cmdarg, param, cmpstmt = val
1527
1699
 
1528
- result = new_iter nil, args, body
1529
- result.line = line
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: kWHEN
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: kRESCUE exc_list exc_var then compstmt 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: kENSURE compstmt
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 { result = s(:lit, val[0]) }
1585
- | symbol { result = s(:lit, val[0]) }
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: string1
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 tRCURLY
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.intern)
1775
- else
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: tINTEGER
1781
- | tFLOAT
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: term
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
- | error term
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
- | f_args term
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
- result = val[0]
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
- f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_f_block_arg
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 opt_f_block_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 opt_f_block_arg
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 opt_f_block_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 opt_f_block_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 opt_f_block_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 opt_f_block_arg
2157
+ | f_arg opt_args_tail
1890
2158
  {
1891
2159
  result = args val
1892
2160
  }
1893
- | f_optarg tCOMMA f_rest_arg opt_f_block_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 opt_f_block_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 opt_f_block_arg
2169
+ | f_optarg opt_args_tail
1902
2170
  {
1903
2171
  result = args val
1904
2172
  }
1905
- | f_optarg tCOMMA f_arg opt_f_block_arg
2173
+ | f_optarg tCOMMA f_arg opt_args_tail
1906
2174
  {
1907
2175
  result = args val
1908
2176
  }
1909
- | f_rest_arg opt_f_block_arg
2177
+ | f_rest_arg opt_args_tail
1910
2178
  {
1911
2179
  result = args val
1912
2180
  }
1913
- | f_rest_arg tCOMMA f_arg opt_f_block_arg
2181
+ | f_rest_arg tCOMMA f_arg opt_args_tail
1914
2182
  {
1915
2183
  result = args val
1916
2184
  }
1917
- | f_block_arg
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
- f_arg_item: f_norm_arg
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
- f_opt: tIDENTIFIER tEQL arg_value
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: tIDENTIFIER tEQL primary_value
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 opt_nl arg_value
2419
+ | tLABEL arg_value
2083
2420
  {
2084
- label, _ = val[0] # TODO: fix lineno?
2085
- result = s(:array, s(:lit, label.to_sym), val.last)
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