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.
@@ -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