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.
@@ -86,14 +86,35 @@ rule
86
86
  end
87
87
  self.env.extend
88
88
  }
89
- tLCURLY top_compstmt tRCURLY
89
+ begin_block
90
90
  {
91
- result = new_iter s(:preexe), nil, val[3]
91
+ _, _, block = val
92
+ result = block
93
+ }
94
+
95
+ begin_block: tLCURLY top_compstmt tRCURLY
96
+ {
97
+ _, stmt, _ = val
98
+ result = new_iter s(:preexe), 0, stmt
92
99
  }
93
100
 
94
- bodystmt: compstmt opt_rescue opt_else opt_ensure
101
+ bodystmt: compstmt opt_rescue k_else
95
102
  {
96
- result = new_body val
103
+ res = _values[-2]
104
+ yyerror "else without rescue is useless" unless res
105
+ }
106
+ compstmt
107
+ opt_ensure
108
+ {
109
+ body, resc, _, _, els, ens = val
110
+
111
+ result = new_body [body, resc, els, ens]
112
+ }
113
+ | compstmt opt_rescue opt_ensure
114
+ {
115
+ body, resc, ens = val
116
+
117
+ result = new_body [body, resc, nil, ens]
97
118
  }
98
119
 
99
120
  compstmt: stmts opt_terms
@@ -102,8 +123,8 @@ rule
102
123
  }
103
124
 
104
125
  stmts: none
105
- | stmt
106
- | stmts terms stmt
126
+ | stmt_or_begin # TODO: newline_node ?
127
+ | stmts terms stmt_or_begin
107
128
  {
108
129
  result = self.block_append val[0], val[2]
109
130
  }
@@ -113,6 +134,21 @@ rule
113
134
  debug20 2, val, result
114
135
  }
115
136
 
137
+ stmt_or_begin: stmt
138
+ | klBEGIN
139
+ {
140
+ if (self.in_def || self.in_single > 0) then
141
+ debug20 1
142
+ yyerror "BEGIN in method"
143
+ end
144
+ self.env.extend
145
+ }
146
+ begin_block
147
+ {
148
+ _, _, stmt = val
149
+ result = stmt
150
+ }
151
+
116
152
  stmt: kALIAS fitem
117
153
  {
118
154
  lexer.lex_state = :expr_fname
@@ -156,7 +192,8 @@ rule
156
192
  }
157
193
  | stmt kRESCUE_MOD stmt
158
194
  {
159
- result = s(:rescue, val[0], new_resbody(s(:array), val[2]))
195
+ body, _, resbody = val
196
+ result = new_rescue body, new_resbody(s(:array), resbody)
160
197
  }
161
198
  | klEND tLCURLY compstmt tRCURLY
162
199
  {
@@ -171,15 +208,33 @@ rule
171
208
  {
172
209
  result = new_masgn val[0], val[2], :wrap
173
210
  }
174
- | var_lhs tOP_ASGN command_call
211
+ | lhs tEQL mrhs
212
+ {
213
+ result = new_assign val[0], s(:svalue, val[2])
214
+ }
215
+ | mlhs tEQL mrhs_arg
216
+ {
217
+ result = new_masgn val[0], val[2]
218
+ }
219
+ | expr
220
+
221
+ command_asgn: lhs tEQL command_rhs
222
+ {
223
+ result = new_assign val[0], val[2]
224
+ }
225
+ # | lhs tEQL command_asgn
226
+ # {
227
+ # result = new_assign val[0], val[2]
228
+ # }
229
+ | var_lhs tOP_ASGN command_rhs
175
230
  {
176
231
  result = new_op_asgn val
177
232
  }
178
- | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_call
233
+ | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs
179
234
  {
180
235
  result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
181
236
  }
182
- | primary_value call_op tIDENTIFIER tOP_ASGN command_call
237
+ | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs
183
238
  {
184
239
  result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
185
240
  if val[1] == '&.'
@@ -187,7 +242,7 @@ rule
187
242
  end
188
243
  result.line = val[0].line
189
244
  }
190
- | primary_value call_op tCONSTANT tOP_ASGN command_call
245
+ | primary_value call_op tCONSTANT tOP_ASGN command_rhs
191
246
  {
192
247
  result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
193
248
  if val[1] == '&.'
@@ -195,38 +250,33 @@ rule
195
250
  end
196
251
  result.line = val[0].line
197
252
  }
198
- | primary_value tCOLON2 tCONSTANT tOP_ASGN command_call
253
+ | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs
199
254
  {
200
255
  result = s(:op_asgn, val[0], val[4], val[2], val[3])
201
256
  debug20 4, val, result
202
257
  }
203
- | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
258
+ | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs
204
259
  {
205
260
  result = s(:op_asgn, val[0], val[4], val[2], val[3])
206
261
  debug20 5, val, result
207
262
  }
208
- | backref tOP_ASGN command_call
263
+ | backref tOP_ASGN command_rhs
209
264
  {
210
265
  self.backref_assign_error val[0]
211
266
  }
212
- | lhs tEQL mrhs
213
- {
214
- result = new_assign val[0], s(:svalue, val[2])
215
- }
216
- | mlhs tEQL mrhs_arg
217
- {
218
- result = new_masgn val[0], val[2]
219
- }
220
- | expr
221
267
 
222
- command_asgn: lhs tEQL command_call
268
+ command_rhs: command_call =tOP_ASGN
223
269
  {
224
- result = new_assign val[0], val[2]
270
+ expr, = val
271
+ result = value_expr expr
225
272
  }
226
- | lhs tEQL command_asgn
273
+ | command_call kRESCUE_MOD stmt
227
274
  {
228
- result = new_assign val[0], val[2]
275
+ expr, _, resbody = val
276
+ expr = value_expr expr
277
+ result = new_rescue(expr, new_resbody(s(:array), resbody))
229
278
  }
279
+ | command_asgn
230
280
 
231
281
  expr: command_call
232
282
  | expr kAND expr
@@ -252,30 +302,40 @@ rule
252
302
  result = value_expr(val[0])
253
303
  }
254
304
 
305
+ expr_value_do: {
306
+ lexer.cond.push true
307
+ }
308
+ expr_value do
309
+ {
310
+ lexer.cond.pop
311
+ }
312
+ {
313
+ _, expr, _, _ = val
314
+ result = expr
315
+ }
316
+
255
317
  command_call: command
256
318
  | block_command
257
319
 
258
320
  block_command: block_call
259
- | block_call dot_or_colon operation2 command_args
321
+ | block_call call_op2 operation2 command_args
260
322
  {
261
323
  result = new_call val[0], val[2].to_sym, val[3]
262
324
  }
263
325
 
264
326
  cmd_brace_block: tLBRACE_ARG
265
327
  {
266
- self.env.extend(:dynamic)
328
+ # self.env.extend(:dynamic)
267
329
  result = self.lexer.lineno
268
330
  }
269
- opt_block_param
270
- {
271
- result = nil # self.env.dynamic.keys
272
- }
273
- compstmt tRCURLY
331
+ brace_body tRCURLY
274
332
  {
275
- result = new_iter nil, val[2], val[4]
276
- result.line = val[1]
333
+ _, line, body, _ = val
277
334
 
278
- self.env.unextend
335
+ result = body
336
+ result.line = line
337
+
338
+ # self.env.unextend
279
339
  }
280
340
 
281
341
  fcall: operation
@@ -333,7 +393,7 @@ rule
333
393
  {
334
394
  result = new_yield val[1]
335
395
  }
336
- | kRETURN call_args
396
+ | k_return call_args
337
397
  {
338
398
  line = val[0].last
339
399
  result = s(:return, ret_args(val[1])).line(line)
@@ -557,8 +617,9 @@ rule
557
617
 
558
618
  | reswords
559
619
  {
620
+ (sym, _line), = val
560
621
  lexer.lex_state = :expr_end
561
- result = val[0]
622
+ result = sym
562
623
  }
563
624
 
564
625
  fsym: fname | symbol
@@ -588,6 +649,7 @@ rule
588
649
  | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
589
650
  | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE
590
651
  | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2
652
+ | tUBANG
591
653
 
592
654
  reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND
593
655
  | kALIAS | kAND | kBEGIN | kBREAK | kCASE
@@ -599,51 +661,46 @@ rule
599
661
  | kWHEN | kYIELD | kIF | kUNLESS | kWHILE
600
662
  | kUNTIL
601
663
 
602
- arg: lhs tEQL arg
664
+ arg: lhs tEQL arg_rhs
603
665
  {
604
666
  result = new_assign val[0], val[2]
605
667
  }
606
- | lhs tEQL arg kRESCUE_MOD arg
607
- {
608
- result = new_assign val[0], s(:rescue, val[2], new_resbody(s(:array), val[4]))
609
- }
610
- | var_lhs tOP_ASGN arg
611
- {
612
- result = new_op_asgn val
613
- }
614
- | var_lhs tOP_ASGN arg kRESCUE_MOD arg
668
+ | var_lhs tOP_ASGN arg_rhs
615
669
  {
616
670
  result = new_op_asgn val
617
- result = s(:rescue, result, new_resbody(s(:array), val[4]))
618
671
  }
619
- | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg
672
+ | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs
620
673
  {
621
674
  val[2].sexp_type = :arglist if val[2]
622
675
  result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
623
676
  }
624
- | primary_value call_op tIDENTIFIER tOP_ASGN arg
677
+ | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs
625
678
  {
626
679
  result = new_op_asgn2 val
627
680
  }
628
- | primary_value call_op tCONSTANT tOP_ASGN arg
681
+ | primary_value call_op tCONSTANT tOP_ASGN arg_rhs
629
682
  {
630
683
  result = new_op_asgn2 val
631
684
  }
632
- | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg
685
+ | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs
633
686
  {
634
687
  result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
635
688
  }
636
- | primary_value tCOLON2 tCONSTANT tOP_ASGN arg
689
+ | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs
637
690
  {
638
- yyerror "constant re-assignment"
691
+ # TODO: assignment
692
+ raise "not yet: %p" % [val]
639
693
  }
640
- | tCOLON3 tCONSTANT tOP_ASGN arg
694
+ | tCOLON3 tCONSTANT tOP_ASGN arg_rhs
641
695
  {
642
- yyerror "constant re-assignment"
696
+ # TODO: assignment
697
+ raise "not yet: %p" % [val]
643
698
  }
644
- | backref tOP_ASGN arg
699
+ | backref tOP_ASGN arg_rhs
645
700
  {
646
- self.backref_assign_error val[0]
701
+ # TODO: lhs = var_field val[0]
702
+ asgn = new_op_asgn val
703
+ result = self.backref_assign_error asgn
647
704
  }
648
705
  | arg tDOT2 arg
649
706
  {
@@ -715,22 +772,7 @@ rule
715
772
  {
716
773
  result = new_call val[0], :"<=>", argl(val[2])
717
774
  }
718
- | arg tGT arg
719
- {
720
- result = new_call val[0], :">", argl(val[2])
721
- }
722
- | arg tGEQ arg
723
- {
724
- result = new_call val[0], :">=", argl(val[2])
725
- }
726
- | arg tLT arg
727
- {
728
- result = new_call val[0], :"<", argl(val[2])
729
- }
730
- | arg tLEQ arg
731
- {
732
- result = new_call val[0], :"<=", argl(val[2])
733
- }
775
+ | rel_expr =tCMP
734
776
  | arg tEQ arg
735
777
  {
736
778
  result = new_call val[0], :"==", argl(val[2])
@@ -789,6 +831,23 @@ rule
789
831
  }
790
832
  | primary
791
833
 
834
+ relop: tGT
835
+ | tLT
836
+ | tGEQ
837
+ | tLEQ
838
+
839
+ rel_expr: arg relop arg =tGT
840
+ {
841
+ lhs, op, rhs = val
842
+ result = new_call lhs, op.to_sym, argl(rhs)
843
+ }
844
+ | rel_expr relop arg =tGT
845
+ {
846
+ lhs, op, rhs = val
847
+ warn "comparison '%s' after comparison", op
848
+ result = new_call lhs, op.to_sym, argl(rhs)
849
+ }
850
+
792
851
  arg_value: arg
793
852
  {
794
853
  result = value_expr(val[0])
@@ -808,6 +867,15 @@ rule
808
867
  result = args [array_to_hash(val[0])]
809
868
  }
810
869
 
870
+ arg_rhs: arg =tOP_ASGN
871
+ | arg kRESCUE_MOD arg
872
+ {
873
+ body, _, resbody = val
874
+ body = value_expr body
875
+ resbody = remove_begin resbody
876
+ result = new_rescue(body, new_resbody(s(:array), resbody))
877
+ }
878
+
811
879
  paren_args: tLPAREN2 opt_call_args rparen
812
880
  {
813
881
  result = val[1]
@@ -863,12 +931,11 @@ rule
863
931
  }
864
932
 
865
933
  command_args: {
866
- result = lexer.cmdarg.stack.dup # TODO: smell?
867
- lexer.cmdarg.push true
934
+ result = lexer.cmdarg.store true
868
935
  }
869
936
  call_args
870
937
  {
871
- lexer.cmdarg.stack.replace val[0]
938
+ lexer.cmdarg.restore val[0]
872
939
  result = val[1]
873
940
  }
874
941
 
@@ -936,12 +1003,16 @@ rule
936
1003
  {
937
1004
  result = new_call nil, val[0].to_sym
938
1005
  }
939
- | kBEGIN
1006
+ | k_begin
940
1007
  {
941
1008
  result = self.lexer.lineno
1009
+ # TODO:
1010
+ # $<val>1 = cmdarg_stack;
1011
+ # CMDARG_SET(0);
942
1012
  }
943
- bodystmt kEND
1013
+ bodystmt k_end
944
1014
  {
1015
+ # TODO: CMDARG_SET($<val>1);
945
1016
  unless val[2] then
946
1017
  result = s(:nil)
947
1018
  else
@@ -952,22 +1023,25 @@ rule
952
1023
  }
953
1024
  | tLPAREN_ARG rparen
954
1025
  {
1026
+ # TODO: lex_state = :expr_endarg in between
955
1027
  debug20 13, val, result
956
1028
  }
957
1029
  | tLPAREN_ARG
958
1030
  {
959
- result = self.lexer.cmdarg.stack.dup
960
- lexer.cmdarg.stack.replace [false] # TODO add api for these
1031
+ result = lexer.cmdarg.store false
1032
+ # result = self.lexer.cmdarg.stack.dup
1033
+ # lexer.cmdarg.stack.replace [false] # TODO add api for these
961
1034
  }
962
- expr
1035
+ stmt
963
1036
  {
964
1037
  lexer.lex_state = :expr_endarg
965
1038
  }
966
1039
  rparen
967
1040
  {
1041
+ _, cmdarg, stmt, _, _, = val
968
1042
  warning "(...) interpreted as grouped expression"
969
- lexer.cmdarg.stack.replace val[1]
970
- result = val[2]
1043
+ lexer.cmdarg.restore cmdarg
1044
+ result = stmt
971
1045
  }
972
1046
  | tLPAREN compstmt tRPAREN
973
1047
  {
@@ -995,7 +1069,7 @@ rule
995
1069
  {
996
1070
  result = new_hash val
997
1071
  }
998
- | kRETURN
1072
+ | k_return
999
1073
  {
1000
1074
  result = s(:return)
1001
1075
  }
@@ -1043,61 +1117,42 @@ rule
1043
1117
  {
1044
1118
  result = val[1] # TODO: fix lineno
1045
1119
  }
1046
- | kIF expr_value then compstmt if_tail kEND
1047
- {
1048
- result = new_if val[1], val[3], val[4]
1049
- }
1050
- | kUNLESS expr_value then compstmt opt_else kEND
1051
- {
1052
- result = new_if val[1], val[4], val[3]
1053
- }
1054
- | kWHILE
1055
- {
1056
- lexer.cond.push true
1057
- }
1058
- expr_value do
1059
- {
1060
- lexer.cond.pop
1061
- }
1062
- compstmt kEND
1120
+ | k_if expr_value then compstmt if_tail k_end
1063
1121
  {
1064
- result = new_while val[5], val[2], true
1122
+ _, c, _, t, f, _ = val
1123
+ result = new_if c, t, f
1065
1124
  }
1066
- | kUNTIL
1125
+ | k_unless expr_value then compstmt opt_else k_end
1067
1126
  {
1068
- lexer.cond.push true
1127
+ _, c, _, t, f, _ = val
1128
+ result = new_if c, f, t
1069
1129
  }
1070
- expr_value do
1130
+ | k_while expr_value_do compstmt k_end
1071
1131
  {
1072
- lexer.cond.pop
1132
+ _, cond, body, _ = val
1133
+ result = new_while body, cond, true
1073
1134
  }
1074
- compstmt kEND
1135
+ | k_until expr_value_do compstmt k_end
1075
1136
  {
1076
- result = new_until val[5], val[2], true
1137
+ _, cond, body, _ = val
1138
+ result = new_until body, cond, true
1077
1139
  }
1078
- | kCASE expr_value opt_terms case_body kEND
1140
+ | k_case expr_value opt_terms case_body k_end
1079
1141
  {
1080
1142
  (_, line), expr, _, body, _ = val
1081
1143
  result = new_case expr, body, line
1082
1144
  }
1083
- | kCASE opt_terms case_body kEND
1145
+ | k_case opt_terms case_body k_end
1084
1146
  {
1085
1147
  (_, line), _, body, _ = val
1086
1148
  result = new_case nil, body, line
1087
1149
  }
1088
- | kFOR for_var kIN
1089
- {
1090
- lexer.cond.push true
1091
- }
1092
- expr_value do
1093
- {
1094
- lexer.cond.pop
1095
- }
1096
- compstmt kEND
1150
+ | k_for for_var kIN expr_value_do compstmt k_end
1097
1151
  {
1098
- result = new_for val[4], val[1], val[7]
1152
+ _, var, _, iter, body, _ = val
1153
+ result = new_for iter, var, body
1099
1154
  }
1100
- | kCLASS
1155
+ | k_class
1101
1156
  {
1102
1157
  result = self.lexer.lineno
1103
1158
  }
@@ -1109,13 +1164,13 @@ rule
1109
1164
  end
1110
1165
  self.env.extend
1111
1166
  }
1112
- bodystmt kEND
1167
+ bodystmt k_end
1113
1168
  {
1114
1169
  result = new_class val
1115
1170
  self.env.unextend
1116
1171
  self.lexer.comments # we don't care about comments in the body
1117
1172
  }
1118
- | kCLASS tLSHFT
1173
+ | k_class tLSHFT
1119
1174
  {
1120
1175
  result = self.lexer.lineno
1121
1176
  }
@@ -1130,13 +1185,13 @@ rule
1130
1185
  self.in_single = 0
1131
1186
  self.env.extend
1132
1187
  }
1133
- bodystmt kEND
1188
+ bodystmt k_end
1134
1189
  {
1135
1190
  result = new_sclass val
1136
1191
  self.env.unextend
1137
1192
  self.lexer.comments # we don't care about comments in the body
1138
1193
  }
1139
- | kMODULE
1194
+ | k_module
1140
1195
  {
1141
1196
  result = self.lexer.lineno
1142
1197
  }
@@ -1148,13 +1203,13 @@ rule
1148
1203
 
1149
1204
  self.env.extend
1150
1205
  }
1151
- bodystmt kEND
1206
+ bodystmt k_end
1152
1207
  {
1153
1208
  result = new_module val
1154
1209
  self.env.unextend
1155
1210
  self.lexer.comments # we don't care about comments in the body
1156
1211
  }
1157
- | kDEF fname
1212
+ | k_def fname
1158
1213
  {
1159
1214
  result = [self.in_def, self.lexer.cmdarg.stack.dup]
1160
1215
 
@@ -1165,7 +1220,7 @@ rule
1165
1220
  # TODO: port local_push_gen and local_pop_gen
1166
1221
  lexer.cmdarg.stack.replace [false]
1167
1222
  }
1168
- f_arglist bodystmt kEND
1223
+ f_arglist bodystmt k_end
1169
1224
  {
1170
1225
  in_def, cmdarg = val[2]
1171
1226
 
@@ -1176,7 +1231,7 @@ rule
1176
1231
  self.in_def = in_def
1177
1232
  self.lexer.comments # we don't care about comments in the body
1178
1233
  }
1179
- | kDEF singleton dot_or_colon
1234
+ | k_def singleton dot_or_colon
1180
1235
  {
1181
1236
  self.comments.push self.lexer.comments
1182
1237
  lexer.lex_state = :expr_fname
@@ -1189,7 +1244,7 @@ rule
1189
1244
  result = [lexer.lineno, self.lexer.cmdarg.stack.dup]
1190
1245
  lexer.cmdarg.stack.replace [false]
1191
1246
  }
1192
- f_arglist bodystmt kEND
1247
+ f_arglist bodystmt k_end
1193
1248
  {
1194
1249
  line, cmdarg = val[5]
1195
1250
  result = new_defs val
@@ -1234,7 +1289,15 @@ rule
1234
1289
  k_class: kCLASS
1235
1290
  k_module: kMODULE
1236
1291
  k_def: kDEF
1292
+ k_do: kDO
1293
+ k_do_block: kDO_BLOCK
1294
+ k_rescue: kRESCUE
1295
+ k_ensure: kENSURE
1296
+ k_when: kWHEN
1297
+ k_else: kELSE
1298
+ k_elsif: kELSIF
1237
1299
  k_end: kEND
1300
+ k_return: kRETURN
1238
1301
 
1239
1302
  then: term
1240
1303
  | kTHEN
@@ -1244,7 +1307,7 @@ rule
1244
1307
  | kDO_COND
1245
1308
 
1246
1309
  if_tail: opt_else
1247
- | kELSIF expr_value then compstmt if_tail
1310
+ | k_elsif expr_value then compstmt if_tail
1248
1311
  {
1249
1312
  result = s(:if, val[1], val[3], val[4])
1250
1313
  }
@@ -1415,18 +1478,22 @@ opt_block_args_tail: tCOMMA block_args_tail
1415
1478
 
1416
1479
  opt_block_param: none { result = 0 }
1417
1480
  | block_param_def
1481
+ {
1482
+ self.lexer.command_start = true
1483
+ }
1418
1484
 
1419
1485
  block_param_def: tPIPE opt_bv_decl tPIPE
1420
1486
  {
1487
+ # TODO: current_arg = 0
1421
1488
  result = args val
1422
1489
  }
1423
1490
  | tOROP
1424
1491
  {
1425
- self.lexer.command_start = true
1426
1492
  result = s(:args)
1427
1493
  }
1428
1494
  | tPIPE block_param opt_bv_decl tPIPE
1429
1495
  {
1496
+ # TODO: current_arg = 0
1430
1497
  result = args val
1431
1498
  }
1432
1499
 
@@ -1459,13 +1526,21 @@ opt_block_args_tail: tCOMMA block_args_tail
1459
1526
  lexer.paren_nest += 1
1460
1527
  lexer.lpar_beg = lexer.paren_nest
1461
1528
  }
1462
- f_larglist lambda_body
1529
+ f_larglist
1463
1530
  {
1464
- lpar, args, body = val
1531
+ result = [lexer.cmdarg.store(false), self.lexer.lineno]
1532
+ }
1533
+ lambda_body
1534
+ {
1535
+ lpar, args, (cmdarg, lineno), body = val
1465
1536
  lexer.lpar_beg = lpar
1466
1537
 
1538
+ lexer.cmdarg.restore cmdarg
1539
+ lexer.cmdarg.lexpop
1540
+
1467
1541
  call = new_call nil, :lambda
1468
1542
  result = new_iter call, args, body
1543
+ result.line = lineno
1469
1544
  self.env.unextend
1470
1545
  }
1471
1546
 
@@ -1483,28 +1558,15 @@ opt_block_args_tail: tCOMMA block_args_tail
1483
1558
  {
1484
1559
  result = val[1]
1485
1560
  }
1486
- | kDO_LAMBDA compstmt kEND
1561
+ | kDO_LAMBDA bodystmt kEND
1487
1562
  {
1488
1563
  result = val[1]
1489
1564
  }
1490
1565
 
1491
- do_block: kDO_BLOCK
1492
- {
1493
- self.env.extend :dynamic
1494
- result = self.lexer.lineno
1495
- }
1496
- opt_block_param
1497
- {
1498
- result = nil # self.env.dynamic.keys
1499
- }
1500
- compstmt kEND
1566
+ do_block: k_do_block do_body kEND
1501
1567
  {
1502
- args = val[2]
1503
- body = val[4]
1504
- result = new_iter nil, args, body
1505
- result.line = val[1]
1506
-
1507
- self.env.unextend
1568
+ # TODO: maybe fix lineno to kDO's lineno?
1569
+ result = val[1]
1508
1570
  }
1509
1571
 
1510
1572
  block_call: command do_block
@@ -1521,11 +1583,11 @@ opt_block_args_tail: tCOMMA block_args_tail
1521
1583
  result = val[1]
1522
1584
  result.insert 1, val[0]
1523
1585
  }
1524
- | block_call dot_or_colon operation2 opt_paren_args
1586
+ | block_call call_op2 operation2 opt_paren_args
1525
1587
  {
1526
1588
  result = new_call val[0], val[2].to_sym, val[3]
1527
1589
  }
1528
- | block_call dot_or_colon operation2 opt_paren_args brace_block
1590
+ | block_call call_op2 operation2 opt_paren_args brace_block
1529
1591
  {
1530
1592
  iter1, _, name, args, iter2 = val
1531
1593
 
@@ -1534,7 +1596,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1534
1596
 
1535
1597
  result = iter2
1536
1598
  }
1537
- | block_call dot_or_colon operation2 command_args do_block
1599
+ | block_call call_op2 operation2 command_args do_block
1538
1600
  {
1539
1601
  iter1, _, name, args, iter2 = val
1540
1602
 
@@ -1591,39 +1653,55 @@ opt_block_args_tail: tCOMMA block_args_tail
1591
1653
  self.env.extend :dynamic
1592
1654
  result = self.lexer.lineno
1593
1655
  }
1594
- opt_block_param
1595
- {
1596
- result = nil # self.env.dynamic.keys
1597
- }
1598
- compstmt tRCURLY
1656
+ brace_body tRCURLY
1599
1657
  {
1600
- _, line, args, _, body, _ = val
1658
+ _, line, body, _ = val
1601
1659
 
1602
- result = new_iter nil, args, body
1660
+ result = body
1603
1661
  result.line = line
1604
1662
 
1605
1663
  self.env.unextend
1606
1664
  }
1607
- | kDO
1665
+ | k_do
1608
1666
  {
1609
1667
  self.env.extend :dynamic
1610
1668
  result = self.lexer.lineno
1611
1669
  }
1612
- opt_block_param
1670
+ do_body kEND
1613
1671
  {
1614
- result = nil # self.env.dynamic.keys
1672
+ _, line, body, _ = val
1673
+
1674
+ result = body
1675
+ result.line = line
1676
+
1677
+ self.env.unextend
1615
1678
  }
1616
- compstmt kEND
1679
+
1680
+ brace_body: { self.env.extend :dynamic; result = self.lexer.lineno }
1681
+ { result = lexer.cmdarg.store(false) }
1682
+ opt_block_param compstmt
1617
1683
  {
1618
- _, line, args, _, body, _ = val
1684
+ line, cmdarg, param, cmpstmt = val
1619
1685
 
1620
- result = new_iter nil, args, body
1621
- result.line = line
1686
+ result = new_brace_body param, cmpstmt, line
1687
+ self.env.unextend
1688
+ lexer.cmdarg.restore cmdarg
1689
+ lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ?
1690
+ }
1622
1691
 
1692
+ do_body: { self.env.extend :dynamic; result = self.lexer.lineno }
1693
+ { result = lexer.cmdarg.store(false) }
1694
+ opt_block_param
1695
+ compstmt
1696
+ {
1697
+ line, cmdarg, param, cmpstmt = val
1698
+
1699
+ result = new_do_body param, cmpstmt, line
1623
1700
  self.env.unextend
1701
+ lexer.cmdarg.restore cmdarg
1624
1702
  }
1625
1703
 
1626
- case_body: kWHEN
1704
+ case_body: k_when
1627
1705
  {
1628
1706
  result = self.lexer.lineno
1629
1707
  }
@@ -1636,7 +1714,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1636
1714
 
1637
1715
  cases: opt_else | case_body
1638
1716
 
1639
- opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue
1717
+ opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue
1640
1718
  {
1641
1719
  (_, line), klasses, var, _, body, rest = val
1642
1720
 
@@ -1665,7 +1743,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1665
1743
  }
1666
1744
  | none
1667
1745
 
1668
- opt_ensure: kENSURE compstmt
1746
+ opt_ensure: k_ensure compstmt
1669
1747
  {
1670
1748
  _, body = val
1671
1749
 
@@ -1832,7 +1910,7 @@ regexp_contents: none
1832
1910
  result = lexer.lex_strterm
1833
1911
 
1834
1912
  lexer.lex_strterm = nil
1835
- lexer.lex_state = :expr_beg # TODO: expr_value ?
1913
+ lexer.lex_state = :expr_beg
1836
1914
  }
1837
1915
  string_dvar
1838
1916
  {
@@ -1853,11 +1931,11 @@ regexp_contents: none
1853
1931
  lexer.brace_nest = 0
1854
1932
  lexer.string_nest = 0
1855
1933
 
1856
- lexer.lex_state = :expr_value
1934
+ lexer.lex_state = :expr_beg
1857
1935
  }
1858
- compstmt tRCURLY
1936
+ compstmt
1937
+ tSTRING_DEND
1859
1938
  {
1860
- # TODO: tRCURLY -> tSTRING_END
1861
1939
  _, memo, stmt, _ = val
1862
1940
 
1863
1941
  lex_strterm, brace_nest, string_nest, oldcond, oldcmdarg, oldlex_state = memo
@@ -1980,23 +2058,18 @@ keyword_variable: kNIL { result = s(:nil) }
1980
2058
  backref: tNTH_REF { result = s(:nth_ref, val[0]) }
1981
2059
  | tBACK_REF { result = s(:back_ref, val[0]) }
1982
2060
 
1983
- superclass: term
1984
- {
1985
- result = nil
1986
- }
1987
- | tLT
2061
+ superclass: tLT
1988
2062
  {
1989
2063
  lexer.lex_state = :expr_beg
2064
+ lexer.command_start = true
1990
2065
  }
1991
2066
  expr_value term
1992
2067
  {
1993
2068
  result = val[2]
1994
2069
  }
1995
- | error term
2070
+ | none
1996
2071
  {
1997
- yyerrok
1998
2072
  result = nil
1999
- debug20 30, val, result
2000
2073
  }
2001
2074
 
2002
2075
  f_arglist: tLPAREN2 f_args rparen
@@ -2004,16 +2077,20 @@ keyword_variable: kNIL { result = s(:nil) }
2004
2077
  result = val[1]
2005
2078
  self.lexer.lex_state = :expr_beg
2006
2079
  self.lexer.command_start = true
2007
- # TODO:
2008
- # $<num>$ = parser->parser_in_kwarg;
2009
- # parser->parser_in_kwarg = 1;
2010
2080
  }
2011
- | f_args term
2081
+ | {
2082
+ result = self.in_kwarg
2083
+ self.in_kwarg = true
2084
+ # TODO: self.lexer.lex_state |= :expr_label
2085
+ }
2086
+ f_args term
2012
2087
  {
2013
- # TODO: parser->parser_in_kwarg = $<num>1;
2014
- result = val[0]
2015
- self.lexer.lex_state = :expr_beg
2016
- self.lexer.command_start = true
2088
+ kwarg, args, _ = val
2089
+
2090
+ self.in_kwarg = kwarg
2091
+ result = args
2092
+ lexer.lex_state = :expr_beg
2093
+ lexer.command_start = true
2017
2094
  }
2018
2095
 
2019
2096
  args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg
@@ -2214,7 +2291,9 @@ keyword_variable: kNIL { result = s(:nil) }
2214
2291
 
2215
2292
  f_kwrest: kwrest_mark tIDENTIFIER
2216
2293
  {
2217
- result = :"**#{val[1]}"
2294
+ name = val[1].to_sym
2295
+ self.assignable name
2296
+ result = :"**#{name}"
2218
2297
  }
2219
2298
  | kwrest_mark
2220
2299
  {
@@ -2321,9 +2400,10 @@ keyword_variable: kNIL { result = s(:nil) }
2321
2400
  {
2322
2401
  result = s(:array, val[0], val[2])
2323
2402
  }
2324
- | tLABEL opt_nl arg_value
2403
+ | tLABEL arg_value
2325
2404
  {
2326
- result = s(:array, s(:lit, val[0][0].to_sym), val.last)
2405
+ (label, _), arg = val
2406
+ result = s(:array, s(:lit, label.to_sym), arg)
2327
2407
  }
2328
2408
  | tDSTAR arg_value
2329
2409
  {
@@ -2335,6 +2415,10 @@ keyword_variable: kNIL { result = s(:nil) }
2335
2415
  operation3: tIDENTIFIER | tFID | op
2336
2416
  dot_or_colon: tDOT | tCOLON2
2337
2417
  call_op: tDOT
2418
+
2419
+ call_op2: call_op
2420
+ | tCOLON2
2421
+
2338
2422
  opt_terms: | terms
2339
2423
  opt_nl: | tNL
2340
2424
  rparen: opt_nl tRPAREN