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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/History.rdoc +47 -0
- data/Manifest.txt +5 -4
- data/Rakefile +41 -28
- data/compare/normalize.rb +29 -2
- data/debugging.md +18 -0
- data/lib/rp_extensions.rb +0 -7
- data/lib/ruby20_parser.rb +3689 -3502
- data/lib/ruby20_parser.y +284 -201
- data/lib/ruby21_parser.rb +3755 -3570
- data/lib/ruby21_parser.y +281 -197
- data/lib/ruby22_parser.rb +3780 -3600
- data/lib/ruby22_parser.y +281 -202
- data/lib/ruby23_parser.rb +3755 -3591
- data/lib/ruby23_parser.y +282 -203
- data/lib/ruby24_parser.rb +3755 -3591
- data/lib/ruby24_parser.y +282 -203
- data/lib/ruby25_parser.rb +3754 -3591
- data/lib/ruby25_parser.y +282 -203
- data/lib/ruby26_parser.rb +6999 -0
- data/lib/{ruby19_parser.y → ruby26_parser.y} +658 -305
- data/lib/ruby_lexer.rb +116 -118
- data/lib/ruby_lexer.rex +10 -8
- data/lib/ruby_lexer.rex.rb +8 -8
- data/lib/ruby_parser.rb +5 -7
- data/lib/ruby_parser.yy +308 -218
- data/lib/ruby_parser_extras.rb +88 -106
- data/test/test_ruby_lexer.rb +68 -121
- data/test/test_ruby_parser.rb +173 -277
- data/tools/munge.rb +216 -0
- data/tools/ripper.rb +23 -0
- metadata +18 -17
- metadata.gz.sig +1 -1
- data/lib/ruby18_parser.rb +0 -5793
- data/lib/ruby18_parser.y +0 -1908
- data/lib/ruby19_parser.rb +0 -6185
data/lib/ruby_lexer.rex
CHANGED
@@ -27,9 +27,9 @@ start
|
|
27
27
|
|
28
28
|
return process_string if lex_strterm
|
29
29
|
|
30
|
-
self.
|
30
|
+
self.cmd_state = self.command_start
|
31
31
|
self.command_start = false
|
32
|
-
self.space_seen = false
|
32
|
+
self.space_seen = false # TODO: rename token_seen?
|
33
33
|
self.last_state = lex_state
|
34
34
|
|
35
35
|
rule
|
@@ -41,7 +41,7 @@ rule
|
|
41
41
|
|
42
42
|
/\n|\#/ process_newline_or_comment
|
43
43
|
|
44
|
-
/[\]\)\}]/
|
44
|
+
/[\]\)\}]/ process_brace_close
|
45
45
|
|
46
46
|
: /\!/
|
47
47
|
| in_arg_state? /\!\@/ { result :expr_arg, :tUBANG, "!@" }
|
@@ -50,10 +50,11 @@ rule
|
|
50
50
|
: /\./
|
51
51
|
| /\.\.\.?/ { result :expr_beg, TOKENS[text], text }
|
52
52
|
| /\.\d/ { rb_compile_error "no .<digit> floating literal anymore put 0 before dot" }
|
53
|
-
| /\./ { result :expr_dot, :tDOT, "." }
|
53
|
+
| /\./ { self.lex_state = :expr_beg; result :expr_dot, :tDOT, "." }
|
54
54
|
|
55
55
|
/\(/ process_paren
|
56
56
|
|
57
|
+
# TODO: :expr_beg|:expr_label
|
57
58
|
/\,/ { result :expr_beg, TOKENS[text], text }
|
58
59
|
|
59
60
|
: /=/
|
@@ -101,7 +102,7 @@ was_label? /\'#{SSTRING}\':?/o process_label_or_string
|
|
101
102
|
| /\|\=/ { result :expr_beg, :tOP_ASGN, "|" }
|
102
103
|
| /\|/ { result :arg_state, :tPIPE, "|" }
|
103
104
|
|
104
|
-
/\{/
|
105
|
+
/\{/ process_brace_open
|
105
106
|
|
106
107
|
: /\*/
|
107
108
|
| /\*\*=/ { result :expr_beg, :tOP_ASGN, "**" }
|
@@ -109,22 +110,23 @@ was_label? /\'#{SSTRING}\':?/o process_label_or_string
|
|
109
110
|
| /\*\=/ { result(:expr_beg, :tOP_ASGN, "*") }
|
110
111
|
| /\*/ { result(:arg_state, space_vs_beginning(:tSTAR, :tSTAR, :tSTAR2), "*") }
|
111
112
|
|
113
|
+
# TODO: fix result+process_lchevron to set command_start = true
|
112
114
|
: /</
|
113
115
|
| /\<\=\>/ { result :arg_state, :tCMP, "<=>" }
|
114
116
|
| /\<\=/ { result :arg_state, :tLEQ, "<=" }
|
115
|
-
| /\<\<\=/ { result :
|
117
|
+
| /\<\<\=/ { result :expr_beg, :tOP_ASGN, "<<" }
|
116
118
|
| /\<\</ process_lchevron
|
117
119
|
| /\</ { result :arg_state, :tLT, "<" }
|
118
120
|
|
119
121
|
: />/
|
120
122
|
| /\>\=/ { result :arg_state, :tGEQ, ">=" }
|
121
|
-
| /\>\>=/ { result :
|
123
|
+
| /\>\>=/ { result :expr_beg, :tOP_ASGN, ">>" }
|
122
124
|
| /\>\>/ { result :arg_state, :tRSHFT, ">>" }
|
123
125
|
| /\>/ { result :arg_state, :tGT, ">" }
|
124
126
|
|
125
127
|
: /\`/
|
126
128
|
| expr_fname? /\`/ { result(:expr_end, :tBACK_REF2, "`") }
|
127
|
-
| expr_dot? /\`/ { result((
|
129
|
+
| expr_dot? /\`/ { result((cmd_state ? :expr_cmdarg : :expr_arg), :tBACK_REF2, "`") }
|
128
130
|
| /\`/ { string STR_XQUOTE, '`'; result(nil, :tXSTRING_BEG, "`") }
|
129
131
|
|
130
132
|
/\?/ process_questionmark
|
data/lib/ruby_lexer.rex.rb
CHANGED
@@ -70,9 +70,9 @@ class RubyLexer
|
|
70
70
|
|
71
71
|
def next_token
|
72
72
|
return process_string if lex_strterm
|
73
|
-
self.
|
73
|
+
self.cmd_state = self.command_start
|
74
74
|
self.command_start = false
|
75
|
-
self.space_seen = false
|
75
|
+
self.space_seen = false # TODO: rename token_seen?
|
76
76
|
self.last_state = lex_state
|
77
77
|
|
78
78
|
token = nil
|
@@ -87,7 +87,7 @@ class RubyLexer
|
|
87
87
|
when text = ss.scan(/\n|\#/) then
|
88
88
|
process_newline_or_comment text
|
89
89
|
when text = ss.scan(/[\]\)\}]/) then
|
90
|
-
|
90
|
+
process_brace_close text
|
91
91
|
when ss.match?(/\!/) then
|
92
92
|
case
|
93
93
|
when in_arg_state? && (ss.skip(/\!\@/)) then
|
@@ -102,7 +102,7 @@ class RubyLexer
|
|
102
102
|
when ss.skip(/\.\d/) then
|
103
103
|
action { rb_compile_error "no .<digit> floating literal anymore put 0 before dot" }
|
104
104
|
when ss.skip(/\./) then
|
105
|
-
action { result :expr_dot, :tDOT, "." }
|
105
|
+
action { self.lex_state = :expr_beg; result :expr_dot, :tDOT, "." }
|
106
106
|
end # group /\./
|
107
107
|
when text = ss.scan(/\(/) then
|
108
108
|
process_paren text
|
@@ -183,7 +183,7 @@ class RubyLexer
|
|
183
183
|
action { result :arg_state, :tPIPE, "|" }
|
184
184
|
end # group /\|/
|
185
185
|
when text = ss.scan(/\{/) then
|
186
|
-
|
186
|
+
process_brace_open text
|
187
187
|
when ss.match?(/\*/) then
|
188
188
|
case
|
189
189
|
when ss.skip(/\*\*=/) then
|
@@ -202,7 +202,7 @@ class RubyLexer
|
|
202
202
|
when ss.skip(/\<\=/) then
|
203
203
|
action { result :arg_state, :tLEQ, "<=" }
|
204
204
|
when ss.skip(/\<\<\=/) then
|
205
|
-
action { result :
|
205
|
+
action { result :expr_beg, :tOP_ASGN, "<<" }
|
206
206
|
when text = ss.scan(/\<\</) then
|
207
207
|
process_lchevron text
|
208
208
|
when ss.skip(/\</) then
|
@@ -213,7 +213,7 @@ class RubyLexer
|
|
213
213
|
when ss.skip(/\>\=/) then
|
214
214
|
action { result :arg_state, :tGEQ, ">=" }
|
215
215
|
when ss.skip(/\>\>=/) then
|
216
|
-
action { result :
|
216
|
+
action { result :expr_beg, :tOP_ASGN, ">>" }
|
217
217
|
when ss.skip(/\>\>/) then
|
218
218
|
action { result :arg_state, :tRSHFT, ">>" }
|
219
219
|
when ss.skip(/\>/) then
|
@@ -224,7 +224,7 @@ class RubyLexer
|
|
224
224
|
when expr_fname? && (ss.skip(/\`/)) then
|
225
225
|
action { result(:expr_end, :tBACK_REF2, "`") }
|
226
226
|
when expr_dot? && (ss.skip(/\`/)) then
|
227
|
-
action { result((
|
227
|
+
action { result((cmd_state ? :expr_cmdarg : :expr_arg), :tBACK_REF2, "`") }
|
228
228
|
when ss.skip(/\`/) then
|
229
229
|
action { string STR_XQUOTE, '`'; result(nil, :tXSTRING_BEG, "`") }
|
230
230
|
end # group /\`/
|
data/lib/ruby_parser.rb
CHANGED
@@ -34,7 +34,7 @@ class RubyParser
|
|
34
34
|
begin
|
35
35
|
return parser.process s, f, t
|
36
36
|
rescue Racc::ParseError, RubyParser::SyntaxError => exc
|
37
|
-
e
|
37
|
+
e ||= exc
|
38
38
|
end
|
39
39
|
end
|
40
40
|
raise e
|
@@ -66,27 +66,25 @@ end
|
|
66
66
|
|
67
67
|
##
|
68
68
|
# Unfortunately a problem with racc is that it won't let me namespace
|
69
|
-
# properly, so instead of RubyParser::
|
70
|
-
# the old
|
69
|
+
# properly, so instead of RubyParser::V25, I still have to generate
|
70
|
+
# the old Ruby25Parser and shove it in as V25.
|
71
71
|
|
72
|
-
require "ruby18_parser"
|
73
|
-
require "ruby19_parser"
|
74
72
|
require "ruby20_parser"
|
75
73
|
require "ruby21_parser"
|
76
74
|
require "ruby22_parser"
|
77
75
|
require "ruby23_parser"
|
78
76
|
require "ruby24_parser"
|
79
77
|
require "ruby25_parser"
|
78
|
+
require "ruby26_parser"
|
80
79
|
|
81
80
|
class RubyParser # HACK
|
82
81
|
VERSIONS.clear # also a HACK caused by racc namespace issues
|
83
82
|
|
83
|
+
class V26 < ::Ruby26Parser; end
|
84
84
|
class V25 < ::Ruby25Parser; end
|
85
85
|
class V24 < ::Ruby24Parser; end
|
86
86
|
class V23 < ::Ruby23Parser; end
|
87
87
|
class V22 < ::Ruby22Parser; end
|
88
88
|
class V21 < ::Ruby21Parser; end
|
89
89
|
class V20 < ::Ruby20Parser; end
|
90
|
-
class V19 < ::Ruby19Parser; end
|
91
|
-
class V18 < ::Ruby18Parser; end
|
92
90
|
end
|
data/lib/ruby_parser.yy
CHANGED
@@ -12,6 +12,8 @@ class Ruby23Parser
|
|
12
12
|
class Ruby24Parser
|
13
13
|
#elif V == 25
|
14
14
|
class Ruby25Parser
|
15
|
+
#elif V == 26
|
16
|
+
class Ruby26Parser
|
15
17
|
#else
|
16
18
|
fail "version not specified or supported on code generation"
|
17
19
|
#endif
|
@@ -108,14 +110,35 @@ rule
|
|
108
110
|
end
|
109
111
|
self.env.extend
|
110
112
|
}
|
111
|
-
|
113
|
+
begin_block
|
112
114
|
{
|
113
|
-
|
115
|
+
_, _, block = val
|
116
|
+
result = block
|
117
|
+
}
|
118
|
+
|
119
|
+
begin_block: tLCURLY top_compstmt tRCURLY
|
120
|
+
{
|
121
|
+
_, stmt, _ = val
|
122
|
+
result = new_iter s(:preexe), 0, stmt
|
123
|
+
}
|
124
|
+
|
125
|
+
bodystmt: compstmt opt_rescue k_else
|
126
|
+
{
|
127
|
+
res = _values[-2]
|
128
|
+
yyerror "else without rescue is useless" unless res
|
114
129
|
}
|
130
|
+
compstmt
|
131
|
+
opt_ensure
|
132
|
+
{
|
133
|
+
body, resc, _, _, els, ens = val
|
115
134
|
|
116
|
-
|
135
|
+
result = new_body [body, resc, els, ens]
|
136
|
+
}
|
137
|
+
| compstmt opt_rescue opt_ensure
|
117
138
|
{
|
118
|
-
|
139
|
+
body, resc, ens = val
|
140
|
+
|
141
|
+
result = new_body [body, resc, nil, ens]
|
119
142
|
}
|
120
143
|
|
121
144
|
compstmt: stmts opt_terms
|
@@ -124,8 +147,8 @@ rule
|
|
124
147
|
}
|
125
148
|
|
126
149
|
stmts: none
|
127
|
-
|
|
128
|
-
| stmts terms
|
150
|
+
| stmt_or_begin # TODO: newline_node ?
|
151
|
+
| stmts terms stmt_or_begin
|
129
152
|
{
|
130
153
|
result = self.block_append val[0], val[2]
|
131
154
|
}
|
@@ -135,6 +158,21 @@ rule
|
|
135
158
|
debug20 2, val, result
|
136
159
|
}
|
137
160
|
|
161
|
+
stmt_or_begin: stmt
|
162
|
+
| klBEGIN
|
163
|
+
{
|
164
|
+
if (self.in_def || self.in_single > 0) then
|
165
|
+
debug20 1
|
166
|
+
yyerror "BEGIN in method"
|
167
|
+
end
|
168
|
+
self.env.extend
|
169
|
+
}
|
170
|
+
begin_block
|
171
|
+
{
|
172
|
+
_, _, stmt = val
|
173
|
+
result = stmt
|
174
|
+
}
|
175
|
+
|
138
176
|
stmt: kALIAS fitem
|
139
177
|
{
|
140
178
|
lexer.lex_state = :expr_fname
|
@@ -178,7 +216,8 @@ rule
|
|
178
216
|
}
|
179
217
|
| stmt kRESCUE_MOD stmt
|
180
218
|
{
|
181
|
-
|
219
|
+
body, _, resbody = val
|
220
|
+
result = new_rescue body, new_resbody(s(:array), resbody)
|
182
221
|
}
|
183
222
|
| klEND tLCURLY compstmt tRCURLY
|
184
223
|
{
|
@@ -193,15 +232,41 @@ rule
|
|
193
232
|
{
|
194
233
|
result = new_masgn val[0], val[2], :wrap
|
195
234
|
}
|
196
|
-
|
|
235
|
+
| lhs tEQL mrhs
|
236
|
+
{
|
237
|
+
result = new_assign val[0], s(:svalue, val[2])
|
238
|
+
}
|
239
|
+
#if V == 20
|
240
|
+
| mlhs tEQL arg_value
|
241
|
+
{
|
242
|
+
result = new_masgn val[0], val[2], :wrap
|
243
|
+
}
|
244
|
+
| mlhs tEQL mrhs
|
245
|
+
#else
|
246
|
+
| mlhs tEQL mrhs_arg
|
247
|
+
#endif
|
248
|
+
{
|
249
|
+
result = new_masgn val[0], val[2]
|
250
|
+
}
|
251
|
+
| expr
|
252
|
+
|
253
|
+
command_asgn: lhs tEQL command_rhs
|
254
|
+
{
|
255
|
+
result = new_assign val[0], val[2]
|
256
|
+
}
|
257
|
+
# | lhs tEQL command_asgn
|
258
|
+
# {
|
259
|
+
# result = new_assign val[0], val[2]
|
260
|
+
# }
|
261
|
+
| var_lhs tOP_ASGN command_rhs
|
197
262
|
{
|
198
263
|
result = new_op_asgn val
|
199
264
|
}
|
200
|
-
| primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN
|
265
|
+
| primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs
|
201
266
|
{
|
202
267
|
result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
|
203
268
|
}
|
204
|
-
| primary_value call_op tIDENTIFIER tOP_ASGN
|
269
|
+
| primary_value call_op tIDENTIFIER tOP_ASGN command_rhs
|
205
270
|
{
|
206
271
|
result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
|
207
272
|
if val[1] == '&.'
|
@@ -209,7 +274,7 @@ rule
|
|
209
274
|
end
|
210
275
|
result.line = val[0].line
|
211
276
|
}
|
212
|
-
| primary_value call_op tCONSTANT tOP_ASGN
|
277
|
+
| primary_value call_op tCONSTANT tOP_ASGN command_rhs
|
213
278
|
{
|
214
279
|
result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
|
215
280
|
if val[1] == '&.'
|
@@ -217,46 +282,33 @@ rule
|
|
217
282
|
end
|
218
283
|
result.line = val[0].line
|
219
284
|
}
|
220
|
-
| primary_value tCOLON2 tCONSTANT tOP_ASGN
|
285
|
+
| primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs
|
221
286
|
{
|
222
287
|
result = s(:op_asgn, val[0], val[4], val[2], val[3])
|
223
288
|
debug20 4, val, result
|
224
289
|
}
|
225
|
-
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN
|
290
|
+
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs
|
226
291
|
{
|
227
292
|
result = s(:op_asgn, val[0], val[4], val[2], val[3])
|
228
293
|
debug20 5, val, result
|
229
294
|
}
|
230
|
-
| backref tOP_ASGN
|
295
|
+
| backref tOP_ASGN command_rhs
|
231
296
|
{
|
232
297
|
self.backref_assign_error val[0]
|
233
298
|
}
|
234
|
-
| lhs tEQL mrhs
|
235
|
-
{
|
236
|
-
result = new_assign val[0], s(:svalue, val[2])
|
237
|
-
}
|
238
|
-
#if V == 20
|
239
|
-
| mlhs tEQL arg_value
|
240
|
-
{
|
241
|
-
result = new_masgn val[0], val[2], :wrap
|
242
|
-
}
|
243
|
-
| mlhs tEQL mrhs
|
244
|
-
#else
|
245
|
-
| mlhs tEQL mrhs_arg
|
246
|
-
#endif
|
247
|
-
{
|
248
|
-
result = new_masgn val[0], val[2]
|
249
|
-
}
|
250
|
-
| expr
|
251
299
|
|
252
|
-
|
300
|
+
command_rhs: command_call =tOP_ASGN
|
253
301
|
{
|
254
|
-
|
302
|
+
expr, = val
|
303
|
+
result = value_expr expr
|
255
304
|
}
|
256
|
-
|
|
305
|
+
| command_call kRESCUE_MOD stmt
|
257
306
|
{
|
258
|
-
|
307
|
+
expr, _, resbody = val
|
308
|
+
expr = value_expr expr
|
309
|
+
result = new_rescue(expr, new_resbody(s(:array), resbody))
|
259
310
|
}
|
311
|
+
| command_asgn
|
260
312
|
|
261
313
|
expr: command_call
|
262
314
|
| expr kAND expr
|
@@ -282,30 +334,40 @@ rule
|
|
282
334
|
result = value_expr(val[0])
|
283
335
|
}
|
284
336
|
|
337
|
+
expr_value_do: {
|
338
|
+
lexer.cond.push true
|
339
|
+
}
|
340
|
+
expr_value do
|
341
|
+
{
|
342
|
+
lexer.cond.pop
|
343
|
+
}
|
344
|
+
{
|
345
|
+
_, expr, _, _ = val
|
346
|
+
result = expr
|
347
|
+
}
|
348
|
+
|
285
349
|
command_call: command
|
286
350
|
| block_command
|
287
351
|
|
288
352
|
block_command: block_call
|
289
|
-
| block_call
|
353
|
+
| block_call call_op2 operation2 command_args
|
290
354
|
{
|
291
355
|
result = new_call val[0], val[2].to_sym, val[3]
|
292
356
|
}
|
293
357
|
|
294
358
|
cmd_brace_block: tLBRACE_ARG
|
295
359
|
{
|
296
|
-
self.env.extend(:dynamic)
|
360
|
+
# self.env.extend(:dynamic)
|
297
361
|
result = self.lexer.lineno
|
298
362
|
}
|
299
|
-
|
300
|
-
{
|
301
|
-
result = nil # self.env.dynamic.keys
|
302
|
-
}
|
303
|
-
compstmt tRCURLY
|
363
|
+
brace_body tRCURLY
|
304
364
|
{
|
305
|
-
|
306
|
-
result.line = val[1]
|
365
|
+
_, line, body, _ = val
|
307
366
|
|
308
|
-
|
367
|
+
result = body
|
368
|
+
result.line = line
|
369
|
+
|
370
|
+
# self.env.unextend
|
309
371
|
}
|
310
372
|
|
311
373
|
fcall: operation
|
@@ -363,7 +425,7 @@ rule
|
|
363
425
|
{
|
364
426
|
result = new_yield val[1]
|
365
427
|
}
|
366
|
-
|
|
428
|
+
| k_return call_args
|
367
429
|
{
|
368
430
|
line = val[0].last
|
369
431
|
result = s(:return, ret_args(val[1])).line(line)
|
@@ -587,8 +649,9 @@ rule
|
|
587
649
|
|
588
650
|
| reswords
|
589
651
|
{
|
652
|
+
(sym, _line), = val
|
590
653
|
lexer.lex_state = :expr_end
|
591
|
-
result =
|
654
|
+
result = sym
|
592
655
|
}
|
593
656
|
|
594
657
|
fsym: fname | symbol
|
@@ -618,7 +681,7 @@ rule
|
|
618
681
|
| tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
|
619
682
|
| tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE
|
620
683
|
| tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2
|
621
|
-
#if V
|
684
|
+
#if V >= 20
|
622
685
|
| tUBANG
|
623
686
|
#endif
|
624
687
|
|
@@ -632,51 +695,46 @@ rule
|
|
632
695
|
| kWHEN | kYIELD | kIF | kUNLESS | kWHILE
|
633
696
|
| kUNTIL
|
634
697
|
|
635
|
-
arg: lhs tEQL
|
698
|
+
arg: lhs tEQL arg_rhs
|
636
699
|
{
|
637
700
|
result = new_assign val[0], val[2]
|
638
701
|
}
|
639
|
-
|
|
640
|
-
{
|
641
|
-
result = new_assign val[0], s(:rescue, val[2], new_resbody(s(:array), val[4]))
|
642
|
-
}
|
643
|
-
| var_lhs tOP_ASGN arg
|
644
|
-
{
|
645
|
-
result = new_op_asgn val
|
646
|
-
}
|
647
|
-
| var_lhs tOP_ASGN arg kRESCUE_MOD arg
|
702
|
+
| var_lhs tOP_ASGN arg_rhs
|
648
703
|
{
|
649
704
|
result = new_op_asgn val
|
650
|
-
result = s(:rescue, result, new_resbody(s(:array), val[4]))
|
651
705
|
}
|
652
|
-
| primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN
|
706
|
+
| primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs
|
653
707
|
{
|
654
708
|
val[2].sexp_type = :arglist if val[2]
|
655
709
|
result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
|
656
710
|
}
|
657
|
-
| primary_value call_op tIDENTIFIER tOP_ASGN
|
711
|
+
| primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs
|
658
712
|
{
|
659
713
|
result = new_op_asgn2 val
|
660
714
|
}
|
661
|
-
| primary_value call_op tCONSTANT tOP_ASGN
|
715
|
+
| primary_value call_op tCONSTANT tOP_ASGN arg_rhs
|
662
716
|
{
|
663
717
|
result = new_op_asgn2 val
|
664
718
|
}
|
665
|
-
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN
|
719
|
+
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs
|
666
720
|
{
|
667
721
|
result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
|
668
722
|
}
|
669
|
-
| primary_value tCOLON2 tCONSTANT tOP_ASGN
|
723
|
+
| primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs
|
670
724
|
{
|
671
|
-
|
725
|
+
# TODO: assignment
|
726
|
+
raise "not yet: %p" % [val]
|
672
727
|
}
|
673
|
-
| tCOLON3 tCONSTANT tOP_ASGN
|
728
|
+
| tCOLON3 tCONSTANT tOP_ASGN arg_rhs
|
674
729
|
{
|
675
|
-
|
730
|
+
# TODO: assignment
|
731
|
+
raise "not yet: %p" % [val]
|
676
732
|
}
|
677
|
-
| backref tOP_ASGN
|
733
|
+
| backref tOP_ASGN arg_rhs
|
678
734
|
{
|
679
|
-
|
735
|
+
# TODO: lhs = var_field val[0]
|
736
|
+
asgn = new_op_asgn val
|
737
|
+
result = self.backref_assign_error asgn
|
680
738
|
}
|
681
739
|
| arg tDOT2 arg
|
682
740
|
{
|
@@ -696,6 +754,20 @@ rule
|
|
696
754
|
result = s(:dot3, v1, v2)
|
697
755
|
end
|
698
756
|
}
|
757
|
+
#if V >= 26
|
758
|
+
| arg tDOT2
|
759
|
+
{
|
760
|
+
v1, v2 = val[0], nil
|
761
|
+
|
762
|
+
result = s(:dot2, v1, v2)
|
763
|
+
}
|
764
|
+
| arg tDOT3
|
765
|
+
{
|
766
|
+
v1, v2 = val[0], nil
|
767
|
+
|
768
|
+
result = s(:dot3, v1, v2)
|
769
|
+
}
|
770
|
+
#endif
|
699
771
|
| arg tPLUS arg
|
700
772
|
{
|
701
773
|
result = new_call val[0], :+, argl(val[2])
|
@@ -760,22 +832,7 @@ rule
|
|
760
832
|
{
|
761
833
|
result = new_call val[0], :"<=>", argl(val[2])
|
762
834
|
}
|
763
|
-
|
|
764
|
-
{
|
765
|
-
result = new_call val[0], :">", argl(val[2])
|
766
|
-
}
|
767
|
-
| arg tGEQ arg
|
768
|
-
{
|
769
|
-
result = new_call val[0], :">=", argl(val[2])
|
770
|
-
}
|
771
|
-
| arg tLT arg
|
772
|
-
{
|
773
|
-
result = new_call val[0], :"<", argl(val[2])
|
774
|
-
}
|
775
|
-
| arg tLEQ arg
|
776
|
-
{
|
777
|
-
result = new_call val[0], :"<=", argl(val[2])
|
778
|
-
}
|
835
|
+
| rel_expr =tCMP
|
779
836
|
| arg tEQ arg
|
780
837
|
{
|
781
838
|
result = new_call val[0], :"==", argl(val[2])
|
@@ -834,6 +891,23 @@ rule
|
|
834
891
|
}
|
835
892
|
| primary
|
836
893
|
|
894
|
+
relop: tGT
|
895
|
+
| tLT
|
896
|
+
| tGEQ
|
897
|
+
| tLEQ
|
898
|
+
|
899
|
+
rel_expr: arg relop arg =tGT
|
900
|
+
{
|
901
|
+
lhs, op, rhs = val
|
902
|
+
result = new_call lhs, op.to_sym, argl(rhs)
|
903
|
+
}
|
904
|
+
| rel_expr relop arg =tGT
|
905
|
+
{
|
906
|
+
lhs, op, rhs = val
|
907
|
+
warn "comparison '%s' after comparison", op
|
908
|
+
result = new_call lhs, op.to_sym, argl(rhs)
|
909
|
+
}
|
910
|
+
|
837
911
|
arg_value: arg
|
838
912
|
{
|
839
913
|
result = value_expr(val[0])
|
@@ -853,6 +927,15 @@ rule
|
|
853
927
|
result = args [array_to_hash(val[0])]
|
854
928
|
}
|
855
929
|
|
930
|
+
arg_rhs: arg =tOP_ASGN
|
931
|
+
| arg kRESCUE_MOD arg
|
932
|
+
{
|
933
|
+
body, _, resbody = val
|
934
|
+
body = value_expr body
|
935
|
+
resbody = remove_begin resbody
|
936
|
+
result = new_rescue(body, new_resbody(s(:array), resbody))
|
937
|
+
}
|
938
|
+
|
856
939
|
paren_args: tLPAREN2 opt_call_args rparen
|
857
940
|
{
|
858
941
|
result = val[1]
|
@@ -908,12 +991,11 @@ rule
|
|
908
991
|
}
|
909
992
|
|
910
993
|
command_args: {
|
911
|
-
result = lexer.cmdarg.
|
912
|
-
lexer.cmdarg.push true
|
994
|
+
result = lexer.cmdarg.store true
|
913
995
|
}
|
914
996
|
call_args
|
915
997
|
{
|
916
|
-
lexer.cmdarg.
|
998
|
+
lexer.cmdarg.restore val[0]
|
917
999
|
result = val[1]
|
918
1000
|
}
|
919
1001
|
|
@@ -983,12 +1065,16 @@ rule
|
|
983
1065
|
{
|
984
1066
|
result = new_call nil, val[0].to_sym
|
985
1067
|
}
|
986
|
-
|
|
1068
|
+
| k_begin
|
987
1069
|
{
|
988
1070
|
result = self.lexer.lineno
|
1071
|
+
# TODO:
|
1072
|
+
# $<val>1 = cmdarg_stack;
|
1073
|
+
# CMDARG_SET(0);
|
989
1074
|
}
|
990
|
-
bodystmt
|
1075
|
+
bodystmt k_end
|
991
1076
|
{
|
1077
|
+
# TODO: CMDARG_SET($<val>1);
|
992
1078
|
unless val[2] then
|
993
1079
|
result = s(:nil)
|
994
1080
|
else
|
@@ -999,22 +1085,25 @@ rule
|
|
999
1085
|
}
|
1000
1086
|
| tLPAREN_ARG rparen
|
1001
1087
|
{
|
1088
|
+
# TODO: lex_state = :expr_endarg in between
|
1002
1089
|
debug20 13, val, result
|
1003
1090
|
}
|
1004
1091
|
| tLPAREN_ARG
|
1005
1092
|
{
|
1006
|
-
result =
|
1007
|
-
lexer.cmdarg.stack.
|
1093
|
+
result = lexer.cmdarg.store false
|
1094
|
+
# result = self.lexer.cmdarg.stack.dup
|
1095
|
+
# lexer.cmdarg.stack.replace [false] # TODO add api for these
|
1008
1096
|
}
|
1009
|
-
|
1097
|
+
stmt
|
1010
1098
|
{
|
1011
1099
|
lexer.lex_state = :expr_endarg
|
1012
1100
|
}
|
1013
1101
|
rparen
|
1014
1102
|
{
|
1103
|
+
_, cmdarg, stmt, _, _, = val
|
1015
1104
|
warning "(...) interpreted as grouped expression"
|
1016
|
-
lexer.cmdarg.
|
1017
|
-
result =
|
1105
|
+
lexer.cmdarg.restore cmdarg
|
1106
|
+
result = stmt
|
1018
1107
|
}
|
1019
1108
|
| tLPAREN compstmt tRPAREN
|
1020
1109
|
{
|
@@ -1042,7 +1131,7 @@ rule
|
|
1042
1131
|
{
|
1043
1132
|
result = new_hash val
|
1044
1133
|
}
|
1045
|
-
|
|
1134
|
+
| k_return
|
1046
1135
|
{
|
1047
1136
|
result = s(:return)
|
1048
1137
|
}
|
@@ -1090,61 +1179,42 @@ rule
|
|
1090
1179
|
{
|
1091
1180
|
result = val[1] # TODO: fix lineno
|
1092
1181
|
}
|
1093
|
-
|
|
1094
|
-
{
|
1095
|
-
result = new_if val[1], val[3], val[4]
|
1096
|
-
}
|
1097
|
-
| kUNLESS expr_value then compstmt opt_else kEND
|
1098
|
-
{
|
1099
|
-
result = new_if val[1], val[4], val[3]
|
1100
|
-
}
|
1101
|
-
| kWHILE
|
1102
|
-
{
|
1103
|
-
lexer.cond.push true
|
1104
|
-
}
|
1105
|
-
expr_value do
|
1106
|
-
{
|
1107
|
-
lexer.cond.pop
|
1108
|
-
}
|
1109
|
-
compstmt kEND
|
1182
|
+
| k_if expr_value then compstmt if_tail k_end
|
1110
1183
|
{
|
1111
|
-
|
1184
|
+
_, c, _, t, f, _ = val
|
1185
|
+
result = new_if c, t, f
|
1112
1186
|
}
|
1113
|
-
|
|
1187
|
+
| k_unless expr_value then compstmt opt_else k_end
|
1114
1188
|
{
|
1115
|
-
|
1189
|
+
_, c, _, t, f, _ = val
|
1190
|
+
result = new_if c, f, t
|
1116
1191
|
}
|
1117
|
-
|
1192
|
+
| k_while expr_value_do compstmt k_end
|
1118
1193
|
{
|
1119
|
-
|
1194
|
+
_, cond, body, _ = val
|
1195
|
+
result = new_while body, cond, true
|
1120
1196
|
}
|
1121
|
-
|
1197
|
+
| k_until expr_value_do compstmt k_end
|
1122
1198
|
{
|
1123
|
-
|
1199
|
+
_, cond, body, _ = val
|
1200
|
+
result = new_until body, cond, true
|
1124
1201
|
}
|
1125
|
-
|
|
1202
|
+
| k_case expr_value opt_terms case_body k_end
|
1126
1203
|
{
|
1127
1204
|
(_, line), expr, _, body, _ = val
|
1128
1205
|
result = new_case expr, body, line
|
1129
1206
|
}
|
1130
|
-
|
|
1207
|
+
| k_case opt_terms case_body k_end
|
1131
1208
|
{
|
1132
1209
|
(_, line), _, body, _ = val
|
1133
1210
|
result = new_case nil, body, line
|
1134
1211
|
}
|
1135
|
-
|
|
1136
|
-
{
|
1137
|
-
lexer.cond.push true
|
1138
|
-
}
|
1139
|
-
expr_value do
|
1140
|
-
{
|
1141
|
-
lexer.cond.pop
|
1142
|
-
}
|
1143
|
-
compstmt kEND
|
1212
|
+
| k_for for_var kIN expr_value_do compstmt k_end
|
1144
1213
|
{
|
1145
|
-
|
1214
|
+
_, var, _, iter, body, _ = val
|
1215
|
+
result = new_for iter, var, body
|
1146
1216
|
}
|
1147
|
-
|
|
1217
|
+
| k_class
|
1148
1218
|
{
|
1149
1219
|
result = self.lexer.lineno
|
1150
1220
|
}
|
@@ -1156,13 +1226,13 @@ rule
|
|
1156
1226
|
end
|
1157
1227
|
self.env.extend
|
1158
1228
|
}
|
1159
|
-
bodystmt
|
1229
|
+
bodystmt k_end
|
1160
1230
|
{
|
1161
1231
|
result = new_class val
|
1162
1232
|
self.env.unextend
|
1163
1233
|
self.lexer.comments # we don't care about comments in the body
|
1164
1234
|
}
|
1165
|
-
|
|
1235
|
+
| k_class tLSHFT
|
1166
1236
|
{
|
1167
1237
|
result = self.lexer.lineno
|
1168
1238
|
}
|
@@ -1177,13 +1247,13 @@ rule
|
|
1177
1247
|
self.in_single = 0
|
1178
1248
|
self.env.extend
|
1179
1249
|
}
|
1180
|
-
bodystmt
|
1250
|
+
bodystmt k_end
|
1181
1251
|
{
|
1182
1252
|
result = new_sclass val
|
1183
1253
|
self.env.unextend
|
1184
1254
|
self.lexer.comments # we don't care about comments in the body
|
1185
1255
|
}
|
1186
|
-
|
|
1256
|
+
| k_module
|
1187
1257
|
{
|
1188
1258
|
result = self.lexer.lineno
|
1189
1259
|
}
|
@@ -1195,13 +1265,13 @@ rule
|
|
1195
1265
|
|
1196
1266
|
self.env.extend
|
1197
1267
|
}
|
1198
|
-
bodystmt
|
1268
|
+
bodystmt k_end
|
1199
1269
|
{
|
1200
1270
|
result = new_module val
|
1201
1271
|
self.env.unextend
|
1202
1272
|
self.lexer.comments # we don't care about comments in the body
|
1203
1273
|
}
|
1204
|
-
|
|
1274
|
+
| k_def fname
|
1205
1275
|
{
|
1206
1276
|
result = [self.in_def, self.lexer.cmdarg.stack.dup]
|
1207
1277
|
|
@@ -1212,7 +1282,7 @@ rule
|
|
1212
1282
|
# TODO: port local_push_gen and local_pop_gen
|
1213
1283
|
lexer.cmdarg.stack.replace [false]
|
1214
1284
|
}
|
1215
|
-
f_arglist bodystmt
|
1285
|
+
f_arglist bodystmt k_end
|
1216
1286
|
{
|
1217
1287
|
in_def, cmdarg = val[2]
|
1218
1288
|
|
@@ -1223,7 +1293,7 @@ rule
|
|
1223
1293
|
self.in_def = in_def
|
1224
1294
|
self.lexer.comments # we don't care about comments in the body
|
1225
1295
|
}
|
1226
|
-
|
|
1296
|
+
| k_def singleton dot_or_colon
|
1227
1297
|
{
|
1228
1298
|
self.comments.push self.lexer.comments
|
1229
1299
|
lexer.lex_state = :expr_fname
|
@@ -1236,7 +1306,7 @@ rule
|
|
1236
1306
|
result = [lexer.lineno, self.lexer.cmdarg.stack.dup]
|
1237
1307
|
lexer.cmdarg.stack.replace [false]
|
1238
1308
|
}
|
1239
|
-
f_arglist bodystmt
|
1309
|
+
f_arglist bodystmt k_end
|
1240
1310
|
{
|
1241
1311
|
line, cmdarg = val[5]
|
1242
1312
|
result = new_defs val
|
@@ -1281,7 +1351,15 @@ rule
|
|
1281
1351
|
k_class: kCLASS
|
1282
1352
|
k_module: kMODULE
|
1283
1353
|
k_def: kDEF
|
1354
|
+
k_do: kDO
|
1355
|
+
k_do_block: kDO_BLOCK
|
1356
|
+
k_rescue: kRESCUE
|
1357
|
+
k_ensure: kENSURE
|
1358
|
+
k_when: kWHEN
|
1359
|
+
k_else: kELSE
|
1360
|
+
k_elsif: kELSIF
|
1284
1361
|
k_end: kEND
|
1362
|
+
k_return: kRETURN
|
1285
1363
|
|
1286
1364
|
then: term
|
1287
1365
|
| kTHEN
|
@@ -1291,7 +1369,7 @@ rule
|
|
1291
1369
|
| kDO_COND
|
1292
1370
|
|
1293
1371
|
if_tail: opt_else
|
1294
|
-
|
|
1372
|
+
| k_elsif expr_value then compstmt if_tail
|
1295
1373
|
{
|
1296
1374
|
result = s(:if, val[1], val[3], val[4])
|
1297
1375
|
}
|
@@ -1462,18 +1540,22 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1462
1540
|
|
1463
1541
|
opt_block_param: none { result = 0 }
|
1464
1542
|
| block_param_def
|
1543
|
+
{
|
1544
|
+
self.lexer.command_start = true
|
1545
|
+
}
|
1465
1546
|
|
1466
1547
|
block_param_def: tPIPE opt_bv_decl tPIPE
|
1467
1548
|
{
|
1549
|
+
# TODO: current_arg = 0
|
1468
1550
|
result = args val
|
1469
1551
|
}
|
1470
1552
|
| tOROP
|
1471
1553
|
{
|
1472
|
-
self.lexer.command_start = true
|
1473
1554
|
result = s(:args)
|
1474
1555
|
}
|
1475
1556
|
| tPIPE block_param opt_bv_decl tPIPE
|
1476
1557
|
{
|
1558
|
+
# TODO: current_arg = 0
|
1477
1559
|
result = args val
|
1478
1560
|
}
|
1479
1561
|
|
@@ -1506,13 +1588,21 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1506
1588
|
lexer.paren_nest += 1
|
1507
1589
|
lexer.lpar_beg = lexer.paren_nest
|
1508
1590
|
}
|
1509
|
-
f_larglist
|
1591
|
+
f_larglist
|
1592
|
+
{
|
1593
|
+
result = [lexer.cmdarg.store(false), self.lexer.lineno]
|
1594
|
+
}
|
1595
|
+
lambda_body
|
1510
1596
|
{
|
1511
|
-
lpar, args, body = val
|
1597
|
+
lpar, args, (cmdarg, lineno), body = val
|
1512
1598
|
lexer.lpar_beg = lpar
|
1513
1599
|
|
1600
|
+
lexer.cmdarg.restore cmdarg
|
1601
|
+
lexer.cmdarg.lexpop
|
1602
|
+
|
1514
1603
|
call = new_call nil, :lambda
|
1515
1604
|
result = new_iter call, args, body
|
1605
|
+
result.line = lineno
|
1516
1606
|
self.env.unextend
|
1517
1607
|
}
|
1518
1608
|
|
@@ -1530,28 +1620,15 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1530
1620
|
{
|
1531
1621
|
result = val[1]
|
1532
1622
|
}
|
1533
|
-
| kDO_LAMBDA
|
1623
|
+
| kDO_LAMBDA bodystmt kEND
|
1534
1624
|
{
|
1535
1625
|
result = val[1]
|
1536
1626
|
}
|
1537
1627
|
|
1538
|
-
do_block:
|
1539
|
-
{
|
1540
|
-
self.env.extend :dynamic
|
1541
|
-
result = self.lexer.lineno
|
1542
|
-
}
|
1543
|
-
opt_block_param
|
1544
|
-
{
|
1545
|
-
result = nil # self.env.dynamic.keys
|
1546
|
-
}
|
1547
|
-
compstmt kEND
|
1628
|
+
do_block: k_do_block do_body kEND
|
1548
1629
|
{
|
1549
|
-
|
1550
|
-
|
1551
|
-
result = new_iter nil, args, body
|
1552
|
-
result.line = val[1]
|
1553
|
-
|
1554
|
-
self.env.unextend
|
1630
|
+
# TODO: maybe fix lineno to kDO's lineno?
|
1631
|
+
result = val[1]
|
1555
1632
|
}
|
1556
1633
|
|
1557
1634
|
block_call: command do_block
|
@@ -1568,11 +1645,11 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1568
1645
|
result = val[1]
|
1569
1646
|
result.insert 1, val[0]
|
1570
1647
|
}
|
1571
|
-
| block_call
|
1648
|
+
| block_call call_op2 operation2 opt_paren_args
|
1572
1649
|
{
|
1573
1650
|
result = new_call val[0], val[2].to_sym, val[3]
|
1574
1651
|
}
|
1575
|
-
| block_call
|
1652
|
+
| block_call call_op2 operation2 opt_paren_args brace_block
|
1576
1653
|
{
|
1577
1654
|
iter1, _, name, args, iter2 = val
|
1578
1655
|
|
@@ -1581,7 +1658,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1581
1658
|
|
1582
1659
|
result = iter2
|
1583
1660
|
}
|
1584
|
-
| block_call
|
1661
|
+
| block_call call_op2 operation2 command_args do_block
|
1585
1662
|
{
|
1586
1663
|
iter1, _, name, args, iter2 = val
|
1587
1664
|
|
@@ -1638,43 +1715,59 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1638
1715
|
self.env.extend :dynamic
|
1639
1716
|
result = self.lexer.lineno
|
1640
1717
|
}
|
1641
|
-
|
1642
|
-
{
|
1643
|
-
result = nil # self.env.dynamic.keys
|
1644
|
-
}
|
1645
|
-
compstmt tRCURLY
|
1718
|
+
brace_body tRCURLY
|
1646
1719
|
{
|
1647
|
-
_, line,
|
1720
|
+
_, line, body, _ = val
|
1648
1721
|
|
1649
|
-
result =
|
1722
|
+
result = body
|
1650
1723
|
result.line = line
|
1651
1724
|
|
1652
1725
|
self.env.unextend
|
1653
1726
|
}
|
1654
|
-
|
|
1727
|
+
| k_do
|
1655
1728
|
{
|
1656
1729
|
self.env.extend :dynamic
|
1657
1730
|
result = self.lexer.lineno
|
1658
1731
|
}
|
1659
|
-
|
1732
|
+
do_body kEND
|
1733
|
+
{
|
1734
|
+
_, line, body, _ = val
|
1735
|
+
|
1736
|
+
result = body
|
1737
|
+
result.line = line
|
1738
|
+
|
1739
|
+
self.env.unextend
|
1740
|
+
}
|
1741
|
+
|
1742
|
+
brace_body: { self.env.extend :dynamic; result = self.lexer.lineno }
|
1743
|
+
{ result = lexer.cmdarg.store(false) }
|
1744
|
+
opt_block_param compstmt
|
1660
1745
|
{
|
1661
|
-
|
1746
|
+
line, cmdarg, param, cmpstmt = val
|
1747
|
+
|
1748
|
+
result = new_brace_body param, cmpstmt, line
|
1749
|
+
self.env.unextend
|
1750
|
+
lexer.cmdarg.restore cmdarg
|
1751
|
+
lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ?
|
1662
1752
|
}
|
1753
|
+
|
1754
|
+
do_body: { self.env.extend :dynamic; result = self.lexer.lineno }
|
1755
|
+
{ result = lexer.cmdarg.store(false) }
|
1756
|
+
opt_block_param
|
1663
1757
|
#if V >= 25
|
1664
|
-
bodystmt
|
1758
|
+
bodystmt
|
1665
1759
|
#else
|
1666
|
-
compstmt
|
1760
|
+
compstmt
|
1667
1761
|
#endif
|
1668
1762
|
{
|
1669
|
-
|
1670
|
-
|
1671
|
-
result = new_iter nil, args, body
|
1672
|
-
result.line = line
|
1763
|
+
line, cmdarg, param, cmpstmt = val
|
1673
1764
|
|
1765
|
+
result = new_do_body param, cmpstmt, line
|
1674
1766
|
self.env.unextend
|
1767
|
+
lexer.cmdarg.restore cmdarg
|
1675
1768
|
}
|
1676
1769
|
|
1677
|
-
case_body:
|
1770
|
+
case_body: k_when
|
1678
1771
|
{
|
1679
1772
|
result = self.lexer.lineno
|
1680
1773
|
}
|
@@ -1687,7 +1780,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1687
1780
|
|
1688
1781
|
cases: opt_else | case_body
|
1689
1782
|
|
1690
|
-
opt_rescue:
|
1783
|
+
opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue
|
1691
1784
|
{
|
1692
1785
|
(_, line), klasses, var, _, body, rest = val
|
1693
1786
|
|
@@ -1716,7 +1809,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1716
1809
|
}
|
1717
1810
|
| none
|
1718
1811
|
|
1719
|
-
opt_ensure:
|
1812
|
+
opt_ensure: k_ensure compstmt
|
1720
1813
|
{
|
1721
1814
|
_, body = val
|
1722
1815
|
|
@@ -1883,7 +1976,7 @@ regexp_contents: none
|
|
1883
1976
|
result = lexer.lex_strterm
|
1884
1977
|
|
1885
1978
|
lexer.lex_strterm = nil
|
1886
|
-
lexer.lex_state = :expr_beg
|
1979
|
+
lexer.lex_state = :expr_beg
|
1887
1980
|
}
|
1888
1981
|
string_dvar
|
1889
1982
|
{
|
@@ -1904,15 +1997,11 @@ regexp_contents: none
|
|
1904
1997
|
lexer.brace_nest = 0
|
1905
1998
|
lexer.string_nest = 0
|
1906
1999
|
|
1907
|
-
lexer.lex_state = :
|
2000
|
+
lexer.lex_state = :expr_beg
|
1908
2001
|
}
|
1909
|
-
compstmt
|
2002
|
+
compstmt
|
2003
|
+
tSTRING_DEND
|
1910
2004
|
{
|
1911
|
-
#if V == 20
|
1912
|
-
# TODO: tRCURLY -> tSTRING_DEND
|
1913
|
-
#else
|
1914
|
-
# TODO: tRCURLY -> tSTRING_END
|
1915
|
-
#endif
|
1916
2005
|
_, memo, stmt, _ = val
|
1917
2006
|
|
1918
2007
|
lex_strterm, brace_nest, string_nest, oldcond, oldcmdarg, oldlex_state = memo
|
@@ -2049,23 +2138,18 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2049
2138
|
backref: tNTH_REF { result = s(:nth_ref, val[0]) }
|
2050
2139
|
| tBACK_REF { result = s(:back_ref, val[0]) }
|
2051
2140
|
|
2052
|
-
superclass:
|
2053
|
-
{
|
2054
|
-
result = nil
|
2055
|
-
}
|
2056
|
-
| tLT
|
2141
|
+
superclass: tLT
|
2057
2142
|
{
|
2058
2143
|
lexer.lex_state = :expr_beg
|
2144
|
+
lexer.command_start = true
|
2059
2145
|
}
|
2060
2146
|
expr_value term
|
2061
2147
|
{
|
2062
2148
|
result = val[2]
|
2063
2149
|
}
|
2064
|
-
|
|
2150
|
+
| none
|
2065
2151
|
{
|
2066
|
-
yyerrok
|
2067
2152
|
result = nil
|
2068
|
-
debug20 30, val, result
|
2069
2153
|
}
|
2070
2154
|
|
2071
2155
|
f_arglist: tLPAREN2 f_args rparen
|
@@ -2073,16 +2157,20 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2073
2157
|
result = val[1]
|
2074
2158
|
self.lexer.lex_state = :expr_beg
|
2075
2159
|
self.lexer.command_start = true
|
2076
|
-
# TODO:
|
2077
|
-
# $<num>$ = parser->parser_in_kwarg;
|
2078
|
-
# parser->parser_in_kwarg = 1;
|
2079
2160
|
}
|
2080
|
-
|
|
2161
|
+
| {
|
2162
|
+
result = self.in_kwarg
|
2163
|
+
self.in_kwarg = true
|
2164
|
+
# TODO: self.lexer.lex_state |= :expr_label
|
2165
|
+
}
|
2166
|
+
f_args term
|
2081
2167
|
{
|
2082
|
-
|
2083
|
-
|
2084
|
-
self.
|
2085
|
-
|
2168
|
+
kwarg, args, _ = val
|
2169
|
+
|
2170
|
+
self.in_kwarg = kwarg
|
2171
|
+
result = args
|
2172
|
+
lexer.lex_state = :expr_beg
|
2173
|
+
lexer.command_start = true
|
2086
2174
|
}
|
2087
2175
|
|
2088
2176
|
args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg
|
@@ -2305,7 +2393,9 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2305
2393
|
|
2306
2394
|
f_kwrest: kwrest_mark tIDENTIFIER
|
2307
2395
|
{
|
2308
|
-
|
2396
|
+
name = val[1].to_sym
|
2397
|
+
self.assignable name
|
2398
|
+
result = :"**#{name}"
|
2309
2399
|
}
|
2310
2400
|
| kwrest_mark
|
2311
2401
|
{
|
@@ -2424,9 +2514,10 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2424
2514
|
{
|
2425
2515
|
result = s(:array, val[0], val[2])
|
2426
2516
|
}
|
2427
|
-
| tLABEL
|
2517
|
+
| tLABEL arg_value
|
2428
2518
|
{
|
2429
|
-
|
2519
|
+
(label, _), arg = val
|
2520
|
+
result = s(:array, s(:lit, label.to_sym), arg)
|
2430
2521
|
}
|
2431
2522
|
#if V >= 22
|
2432
2523
|
| tSTRING_BEG string_contents tLABEL_END arg_value
|
@@ -2435,11 +2526,6 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2435
2526
|
sym.sexp_type = :dsym
|
2436
2527
|
result = s(:array, sym, value)
|
2437
2528
|
}
|
2438
|
-
| tSYMBOL arg_value
|
2439
|
-
{
|
2440
|
-
raise "not yet: #{val.inspect}"
|
2441
|
-
# result = s(:array, s(:lit, val[1].to_sym), val[1])
|
2442
|
-
}
|
2443
2529
|
#endif
|
2444
2530
|
| tDSTAR arg_value
|
2445
2531
|
{
|
@@ -2452,8 +2538,12 @@ keyword_variable: kNIL { result = s(:nil) }
|
|
2452
2538
|
dot_or_colon: tDOT | tCOLON2
|
2453
2539
|
call_op: tDOT
|
2454
2540
|
#if V >= 23
|
2455
|
-
| tLONELY
|
2541
|
+
| tLONELY # TODO: rename tANDDOT?
|
2456
2542
|
#endif
|
2543
|
+
|
2544
|
+
call_op2: call_op
|
2545
|
+
| tCOLON2
|
2546
|
+
|
2457
2547
|
opt_terms: | terms
|
2458
2548
|
opt_nl: | tNL
|
2459
2549
|
rparen: opt_nl tRPAREN
|