parser 2.3.0.pre.2 → 2.3.0.pre.3

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.
@@ -7,7 +7,7 @@ module Parser
7
7
  MONOLITHIC = { :tSTRING_BEG => :tSTRING }
8
8
 
9
9
  TYPES = {
10
- # type start token interpolate?
10
+ # type start token interpolate?
11
11
  "'" => [ :tSTRING_BEG, false ],
12
12
  "<<'" => [ :tSTRING_BEG, false ],
13
13
  '%q' => [ :tSTRING_BEG, false ],
@@ -7,7 +7,7 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
7
7
  kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__
8
8
  k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT
9
9
  tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT
10
- tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ
10
+ tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ
11
11
  tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF
12
12
  tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN
13
13
  tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE
@@ -6,7 +6,7 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
6
6
  kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD
7
7
  kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__
8
8
  k__FILE__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tNTH_REF
9
- tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT tREGEXP_END tUPLUS
9
+ tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT tUPLUS
10
10
  tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ tGEQ tLEQ tANDOP
11
11
  tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF tASET tLSHFT tRSHFT
12
12
  tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN tLPAREN2 tRPAREN tLPAREN_ARG
@@ -7,7 +7,7 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
7
7
  kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__
8
8
  k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT
9
9
  tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT
10
- tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ
10
+ tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ
11
11
  tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF
12
12
  tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN
13
13
  tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE
@@ -7,7 +7,7 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
7
7
  kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__
8
8
  k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT
9
9
  tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT
10
- tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ
10
+ tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ
11
11
  tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF
12
12
  tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN
13
13
  tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE
@@ -7,7 +7,7 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
7
7
  kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__
8
8
  k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT
9
9
  tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT
10
- tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ
10
+ tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ
11
11
  tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF
12
12
  tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN
13
13
  tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE
@@ -1470,6 +1470,7 @@ opt_block_args_tail:
1470
1470
  lambda_body
1471
1471
  {
1472
1472
  @lexer.cmdarg = val[2]
1473
+ @lexer.cmdarg.lexpop
1473
1474
 
1474
1475
  result = [ val[1], val[3] ]
1475
1476
 
@@ -7,7 +7,7 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
7
7
  kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__
8
8
  k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT
9
9
  tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT
10
- tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ
10
+ tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ
11
11
  tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF
12
12
  tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN
13
13
  tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE
@@ -785,6 +785,11 @@ rule
785
785
  result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil)
786
786
  }
787
787
 
788
+ # Note: MRI eventually came to rely on disambiguation based on
789
+ # the lexer state, but it is too contrived with the Ragel lexer,
790
+ # so we kept this approach. See ruby/ruby@b0c03f63e5 for
791
+ # the initial commit, and ruby/ruby@23352f62a for MRI revert,
792
+ # which we decided not to track.
788
793
  | arg tEH
789
794
  {
790
795
  @lexer.push_cond
@@ -1479,6 +1484,7 @@ opt_block_args_tail:
1479
1484
  lambda_body
1480
1485
  {
1481
1486
  @lexer.cmdarg = val[2]
1487
+ @lexer.cmdarg.lexpop
1482
1488
 
1483
1489
  result = [ val[1], val[3] ]
1484
1490
 
@@ -0,0 +1,2363 @@
1
+ class Parser::Ruby23
2
+
3
+ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
4
+ kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT
5
+ kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER
6
+ kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD
7
+ kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__
8
+ k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT
9
+ tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT
10
+ tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ
11
+ tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF
12
+ tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN
13
+ tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE
14
+ tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE
15
+ tDSTAR tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY
16
+ tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG tREGEXP_OPT
17
+ tWORDS_BEG tQWORDS_BEG tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DBEG
18
+ tSTRING_DVAR tSTRING_END tSTRING_DEND tSTRING tSYMBOL
19
+ tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA tLAMBEG tCHARACTER
20
+ tRATIONAL tIMAGINARY tLABEL_END tANDDOT
21
+
22
+ prechigh
23
+ right tBANG tTILDE tUPLUS
24
+ right tPOW
25
+ right tUMINUS_NUM tUMINUS
26
+ left tSTAR2 tDIVIDE tPERCENT
27
+ left tPLUS tMINUS
28
+ left tLSHFT tRSHFT
29
+ left tAMPER2
30
+ left tPIPE tCARET
31
+ left tGT tGEQ tLT tLEQ
32
+ nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
33
+ left tANDOP
34
+ left tOROP
35
+ nonassoc tDOT2 tDOT3
36
+ right tEH tCOLON
37
+ left kRESCUE_MOD
38
+ right tEQL tOP_ASGN
39
+ nonassoc kDEFINED
40
+ right kNOT
41
+ left kOR kAND
42
+ nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD
43
+ nonassoc tLBRACE_ARG
44
+ nonassoc tLOWEST
45
+ preclow
46
+
47
+ rule
48
+
49
+ program: top_compstmt
50
+
51
+ top_compstmt: top_stmts opt_terms
52
+ {
53
+ result = @builder.compstmt(val[0])
54
+ }
55
+
56
+ top_stmts: # nothing
57
+ {
58
+ result = []
59
+ }
60
+ | top_stmt
61
+ {
62
+ result = [ val[0] ]
63
+ }
64
+ | top_stmts terms top_stmt
65
+ {
66
+ result = val[0] << val[2]
67
+ }
68
+ | error top_stmt
69
+ {
70
+ result = [ val[1] ]
71
+ }
72
+
73
+ top_stmt: stmt
74
+ | klBEGIN tLCURLY top_compstmt tRCURLY
75
+ {
76
+ result = @builder.preexe(val[0], val[1], val[2], val[3])
77
+ }
78
+
79
+ bodystmt: compstmt opt_rescue opt_else opt_ensure
80
+ {
81
+ rescue_bodies = val[1]
82
+ else_t, else_ = val[2]
83
+ ensure_t, ensure_ = val[3]
84
+
85
+ if rescue_bodies.empty? && !else_.nil?
86
+ diagnostic :warning, :useless_else, nil, else_t
87
+ end
88
+
89
+ result = @builder.begin_body(val[0],
90
+ rescue_bodies,
91
+ else_t, else_,
92
+ ensure_t, ensure_)
93
+ }
94
+
95
+ compstmt: stmts opt_terms
96
+ {
97
+ result = @builder.compstmt(val[0])
98
+ }
99
+
100
+ stmts: # nothing
101
+ {
102
+ result = []
103
+ }
104
+ | stmt_or_begin
105
+ {
106
+ result = [ val[0] ]
107
+ }
108
+ | stmts terms stmt_or_begin
109
+ {
110
+ result = val[0] << val[2]
111
+ }
112
+ | error stmt
113
+ {
114
+ result = [ val[1] ]
115
+ }
116
+
117
+ stmt_or_begin: stmt
118
+ | klBEGIN tLCURLY top_compstmt tRCURLY
119
+ {
120
+ diagnostic :error, :begin_in_method, nil, val[0]
121
+ }
122
+
123
+ stmt: kALIAS fitem
124
+ {
125
+ @lexer.state = :expr_fname
126
+ }
127
+ fitem
128
+ {
129
+ result = @builder.alias(val[0], val[1], val[3])
130
+ }
131
+ | kALIAS tGVAR tGVAR
132
+ {
133
+ result = @builder.alias(val[0],
134
+ @builder.gvar(val[1]),
135
+ @builder.gvar(val[2]))
136
+ }
137
+ | kALIAS tGVAR tBACK_REF
138
+ {
139
+ result = @builder.alias(val[0],
140
+ @builder.gvar(val[1]),
141
+ @builder.back_ref(val[2]))
142
+ }
143
+ | kALIAS tGVAR tNTH_REF
144
+ {
145
+ diagnostic :error, :nth_ref_alias, nil, val[2]
146
+ }
147
+ | kUNDEF undef_list
148
+ {
149
+ result = @builder.undef_method(val[0], val[1])
150
+ }
151
+ | stmt kIF_MOD expr_value
152
+ {
153
+ result = @builder.condition_mod(val[0], nil,
154
+ val[1], val[2])
155
+ }
156
+ | stmt kUNLESS_MOD expr_value
157
+ {
158
+ result = @builder.condition_mod(nil, val[0],
159
+ val[1], val[2])
160
+ }
161
+ | stmt kWHILE_MOD expr_value
162
+ {
163
+ result = @builder.loop_mod(:while, val[0], val[1], val[2])
164
+ }
165
+ | stmt kUNTIL_MOD expr_value
166
+ {
167
+ result = @builder.loop_mod(:until, val[0], val[1], val[2])
168
+ }
169
+ | stmt kRESCUE_MOD stmt
170
+ {
171
+ rescue_body = @builder.rescue_body(val[1],
172
+ nil, nil, nil,
173
+ nil, val[2])
174
+
175
+ result = @builder.begin_body(val[0], [ rescue_body ])
176
+ }
177
+ | klEND tLCURLY compstmt tRCURLY
178
+ {
179
+ result = @builder.postexe(val[0], val[1], val[2], val[3])
180
+ }
181
+ | command_asgn
182
+ | mlhs tEQL command_call
183
+ {
184
+ result = @builder.multi_assign(val[0], val[1], val[2])
185
+ }
186
+ | var_lhs tOP_ASGN command_call
187
+ {
188
+ result = @builder.op_assign(val[0], val[1], val[2])
189
+ }
190
+ | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_call
191
+ {
192
+ result = @builder.op_assign(
193
+ @builder.index(
194
+ val[0], val[1], val[2], val[3]),
195
+ val[4], val[5])
196
+ }
197
+ | primary_value call_op tIDENTIFIER tOP_ASGN command_call
198
+ {
199
+ result = @builder.op_assign(
200
+ @builder.call_method(
201
+ val[0], val[1], val[2]),
202
+ val[3], val[4])
203
+ }
204
+ | primary_value call_op tCONSTANT tOP_ASGN command_call
205
+ {
206
+ result = @builder.op_assign(
207
+ @builder.call_method(
208
+ val[0], val[1], val[2]),
209
+ val[3], val[4])
210
+ }
211
+ | primary_value tCOLON2 tCONSTANT tOP_ASGN command_call
212
+ {
213
+ result = @builder.op_assign(
214
+ @builder.call_method(
215
+ val[0], val[1], val[2]),
216
+ val[3], val[4])
217
+ }
218
+ | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
219
+ {
220
+ result = @builder.op_assign(
221
+ @builder.call_method(
222
+ val[0], val[1], val[2]),
223
+ val[3], val[4])
224
+ }
225
+ | backref tOP_ASGN command_call
226
+ {
227
+ @builder.op_assign(val[0], val[1], val[2])
228
+ }
229
+ | lhs tEQL mrhs
230
+ {
231
+ result = @builder.assign(val[0], val[1],
232
+ @builder.array(nil, val[2], nil))
233
+ }
234
+ | mlhs tEQL mrhs_arg
235
+ {
236
+ result = @builder.multi_assign(val[0], val[1], val[2])
237
+ }
238
+ | expr
239
+
240
+ command_asgn: lhs tEQL command_call
241
+ {
242
+ result = @builder.assign(val[0], val[1], val[2])
243
+ }
244
+ | lhs tEQL command_asgn
245
+ {
246
+ result = @builder.assign(val[0], val[1], val[2])
247
+ }
248
+
249
+ expr: command_call
250
+ | expr kAND expr
251
+ {
252
+ result = @builder.logical_op(:and, val[0], val[1], val[2])
253
+ }
254
+ | expr kOR expr
255
+ {
256
+ result = @builder.logical_op(:or, val[0], val[1], val[2])
257
+ }
258
+ | kNOT opt_nl expr
259
+ {
260
+ result = @builder.not_op(val[0], nil, val[2], nil)
261
+ }
262
+ | tBANG command_call
263
+ {
264
+ result = @builder.not_op(val[0], nil, val[1], nil)
265
+ }
266
+ | arg
267
+
268
+ expr_value: expr
269
+
270
+ command_call: command
271
+ | block_command
272
+
273
+ block_command: block_call
274
+ | block_call dot_or_colon operation2 command_args
275
+ {
276
+ result = @builder.call_method(val[0], val[1], val[2],
277
+ nil, val[3], nil)
278
+ }
279
+
280
+ cmd_brace_block: tLBRACE_ARG
281
+ {
282
+ @static_env.extend_dynamic
283
+ }
284
+ opt_block_param compstmt tRCURLY
285
+ {
286
+ result = [ val[0], val[2], val[3], val[4] ]
287
+
288
+ @static_env.unextend
289
+ }
290
+
291
+ fcall: operation
292
+
293
+ command: fcall command_args =tLOWEST
294
+ {
295
+ result = @builder.call_method(nil, nil, val[0],
296
+ nil, val[1], nil)
297
+ }
298
+ | fcall command_args cmd_brace_block
299
+ {
300
+ method_call = @builder.call_method(nil, nil, val[0],
301
+ nil, val[1], nil)
302
+
303
+ begin_t, args, body, end_t = val[2]
304
+ result = @builder.block(method_call,
305
+ begin_t, args, body, end_t)
306
+ }
307
+ | primary_value call_op operation2 command_args =tLOWEST
308
+ {
309
+ result = @builder.call_method(val[0], val[1], val[2],
310
+ nil, val[3], nil)
311
+ }
312
+ | primary_value call_op operation2 command_args cmd_brace_block
313
+ {
314
+ method_call = @builder.call_method(val[0], val[1], val[2],
315
+ nil, val[3], nil)
316
+
317
+ begin_t, args, body, end_t = val[4]
318
+ result = @builder.block(method_call,
319
+ begin_t, args, body, end_t)
320
+ }
321
+ | primary_value tCOLON2 operation2 command_args =tLOWEST
322
+ {
323
+ result = @builder.call_method(val[0], val[1], val[2],
324
+ nil, val[3], nil)
325
+ }
326
+ | primary_value tCOLON2 operation2 command_args cmd_brace_block
327
+ {
328
+ method_call = @builder.call_method(val[0], val[1], val[2],
329
+ nil, val[3], nil)
330
+
331
+ begin_t, args, body, end_t = val[4]
332
+ result = @builder.block(method_call,
333
+ begin_t, args, body, end_t)
334
+ }
335
+ | kSUPER command_args
336
+ {
337
+ result = @builder.keyword_cmd(:super, val[0],
338
+ nil, val[1], nil)
339
+ }
340
+ | kYIELD command_args
341
+ {
342
+ result = @builder.keyword_cmd(:yield, val[0],
343
+ nil, val[1], nil)
344
+ }
345
+ | kRETURN call_args
346
+ {
347
+ result = @builder.keyword_cmd(:return, val[0],
348
+ nil, val[1], nil)
349
+ }
350
+ | kBREAK call_args
351
+ {
352
+ result = @builder.keyword_cmd(:break, val[0],
353
+ nil, val[1], nil)
354
+ }
355
+ | kNEXT call_args
356
+ {
357
+ result = @builder.keyword_cmd(:next, val[0],
358
+ nil, val[1], nil)
359
+ }
360
+
361
+ mlhs: mlhs_basic
362
+ {
363
+ result = @builder.multi_lhs(nil, val[0], nil)
364
+ }
365
+ | tLPAREN mlhs_inner rparen
366
+ {
367
+ result = @builder.begin(val[0], val[1], val[2])
368
+ }
369
+
370
+ mlhs_inner: mlhs_basic
371
+ {
372
+ result = @builder.multi_lhs(nil, val[0], nil)
373
+ }
374
+ | tLPAREN mlhs_inner rparen
375
+ {
376
+ result = @builder.multi_lhs(val[0], val[1], val[2])
377
+ }
378
+
379
+ mlhs_basic: mlhs_head
380
+ | mlhs_head mlhs_item
381
+ {
382
+ result = val[0].
383
+ push(val[1])
384
+ }
385
+ | mlhs_head tSTAR mlhs_node
386
+ {
387
+ result = val[0].
388
+ push(@builder.splat(val[1], val[2]))
389
+ }
390
+ | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post
391
+ {
392
+ result = val[0].
393
+ push(@builder.splat(val[1], val[2])).
394
+ concat(val[4])
395
+ }
396
+ | mlhs_head tSTAR
397
+ {
398
+ result = val[0].
399
+ push(@builder.splat(val[1]))
400
+ }
401
+ | mlhs_head tSTAR tCOMMA mlhs_post
402
+ {
403
+ result = val[0].
404
+ push(@builder.splat(val[1])).
405
+ concat(val[3])
406
+ }
407
+ | tSTAR mlhs_node
408
+ {
409
+ result = [ @builder.splat(val[0], val[1]) ]
410
+ }
411
+ | tSTAR mlhs_node tCOMMA mlhs_post
412
+ {
413
+ result = [ @builder.splat(val[0], val[1]),
414
+ *val[3] ]
415
+ }
416
+ | tSTAR
417
+ {
418
+ result = [ @builder.splat(val[0]) ]
419
+ }
420
+ | tSTAR tCOMMA mlhs_post
421
+ {
422
+ result = [ @builder.splat(val[0]),
423
+ *val[2] ]
424
+ }
425
+
426
+ mlhs_item: mlhs_node
427
+ | tLPAREN mlhs_inner rparen
428
+ {
429
+ result = @builder.begin(val[0], val[1], val[2])
430
+ }
431
+
432
+ mlhs_head: mlhs_item tCOMMA
433
+ {
434
+ result = [ val[0] ]
435
+ }
436
+ | mlhs_head mlhs_item tCOMMA
437
+ {
438
+ result = val[0] << val[1]
439
+ }
440
+
441
+ mlhs_post: mlhs_item
442
+ {
443
+ result = [ val[0] ]
444
+ }
445
+ | mlhs_post tCOMMA mlhs_item
446
+ {
447
+ result = val[0] << val[2]
448
+ }
449
+
450
+ mlhs_node: user_variable
451
+ {
452
+ result = @builder.assignable(val[0])
453
+ }
454
+ | keyword_variable
455
+ {
456
+ result = @builder.assignable(val[0])
457
+ }
458
+ | primary_value tLBRACK2 opt_call_args rbracket
459
+ {
460
+ result = @builder.index_asgn(val[0], val[1], val[2], val[3])
461
+ }
462
+ | primary_value call_op tIDENTIFIER
463
+ {
464
+ result = @builder.attr_asgn(val[0], val[1], val[2])
465
+ }
466
+ | primary_value tCOLON2 tIDENTIFIER
467
+ {
468
+ result = @builder.attr_asgn(val[0], val[1], val[2])
469
+ }
470
+ | primary_value call_op tCONSTANT
471
+ {
472
+ result = @builder.attr_asgn(val[0], val[1], val[2])
473
+ }
474
+ | primary_value tCOLON2 tCONSTANT
475
+ {
476
+ result = @builder.assignable(
477
+ @builder.const_fetch(val[0], val[1], val[2]))
478
+ }
479
+ | tCOLON3 tCONSTANT
480
+ {
481
+ result = @builder.assignable(
482
+ @builder.const_global(val[0], val[1]))
483
+ }
484
+ | backref
485
+ {
486
+ result = @builder.assignable(val[0])
487
+ }
488
+
489
+ lhs: user_variable
490
+ {
491
+ result = @builder.assignable(val[0])
492
+ }
493
+ | keyword_variable
494
+ {
495
+ result = @builder.assignable(val[0])
496
+ }
497
+ | primary_value tLBRACK2 opt_call_args rbracket
498
+ {
499
+ result = @builder.index_asgn(val[0], val[1], val[2], val[3])
500
+ }
501
+ | primary_value call_op tIDENTIFIER
502
+ {
503
+ result = @builder.attr_asgn(val[0], val[1], val[2])
504
+ }
505
+ | primary_value tCOLON2 tIDENTIFIER
506
+ {
507
+ result = @builder.attr_asgn(val[0], val[1], val[2])
508
+ }
509
+ | primary_value call_op tCONSTANT
510
+ {
511
+ result = @builder.attr_asgn(val[0], val[1], val[2])
512
+ }
513
+ | primary_value tCOLON2 tCONSTANT
514
+ {
515
+ result = @builder.assignable(
516
+ @builder.const_fetch(val[0], val[1], val[2]))
517
+ }
518
+ | tCOLON3 tCONSTANT
519
+ {
520
+ result = @builder.assignable(
521
+ @builder.const_global(val[0], val[1]))
522
+ }
523
+ | backref
524
+ {
525
+ result = @builder.assignable(val[0])
526
+ }
527
+
528
+ cname: tIDENTIFIER
529
+ {
530
+ diagnostic :error, :module_name_const, nil, val[0]
531
+ }
532
+ | tCONSTANT
533
+
534
+ cpath: tCOLON3 cname
535
+ {
536
+ result = @builder.const_global(val[0], val[1])
537
+ }
538
+ | cname
539
+ {
540
+ result = @builder.const(val[0])
541
+ }
542
+ | primary_value tCOLON2 cname
543
+ {
544
+ result = @builder.const_fetch(val[0], val[1], val[2])
545
+ }
546
+
547
+ fname: tIDENTIFIER | tCONSTANT | tFID
548
+ | op
549
+ | reswords
550
+
551
+ fsym: fname
552
+ {
553
+ result = @builder.symbol(val[0])
554
+ }
555
+ | symbol
556
+
557
+ fitem: fsym
558
+ | dsym
559
+
560
+ undef_list: fitem
561
+ {
562
+ result = [ val[0] ]
563
+ }
564
+ | undef_list tCOMMA
565
+ {
566
+ @lexer.state = :expr_fname
567
+ }
568
+ fitem
569
+ {
570
+ result = val[0] << val[3]
571
+ }
572
+
573
+ op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ
574
+ | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ
575
+ | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
576
+ | tSTAR | tDIVIDE | tPERCENT | tPOW | tBANG | tTILDE
577
+ | tUPLUS | tUMINUS | tAREF | tASET | tDSTAR | tBACK_REF2
578
+
579
+ reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND
580
+ | kALIAS | kAND | kBEGIN | kBREAK | kCASE
581
+ | kCLASS | kDEF | kDEFINED | kDO | kELSE
582
+ | kELSIF | kEND | kENSURE | kFALSE | kFOR
583
+ | kIN | kMODULE | kNEXT | kNIL | kNOT
584
+ | kOR | kREDO | kRESCUE | kRETRY | kRETURN
585
+ | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF
586
+ | kWHEN | kYIELD | kIF | kUNLESS | kWHILE
587
+ | kUNTIL
588
+
589
+ arg: lhs tEQL arg
590
+ {
591
+ result = @builder.assign(val[0], val[1], val[2])
592
+ }
593
+ | lhs tEQL arg kRESCUE_MOD arg
594
+ {
595
+ rescue_body = @builder.rescue_body(val[3],
596
+ nil, nil, nil,
597
+ nil, val[4])
598
+
599
+ rescue_ = @builder.begin_body(val[2], [ rescue_body ])
600
+
601
+ result = @builder.assign(val[0], val[1], rescue_)
602
+ }
603
+ | var_lhs tOP_ASGN arg
604
+ {
605
+ result = @builder.op_assign(val[0], val[1], val[2])
606
+ }
607
+ | var_lhs tOP_ASGN arg kRESCUE_MOD arg
608
+ {
609
+ rescue_body = @builder.rescue_body(val[3],
610
+ nil, nil, nil,
611
+ nil, val[4])
612
+
613
+ rescue_ = @builder.begin_body(val[2], [ rescue_body ])
614
+
615
+ result = @builder.op_assign(val[0], val[1], rescue_)
616
+ }
617
+ | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg
618
+ {
619
+ result = @builder.op_assign(
620
+ @builder.index(
621
+ val[0], val[1], val[2], val[3]),
622
+ val[4], val[5])
623
+ }
624
+ | primary_value call_op tIDENTIFIER tOP_ASGN arg
625
+ {
626
+ result = @builder.op_assign(
627
+ @builder.call_method(
628
+ val[0], val[1], val[2]),
629
+ val[3], val[4])
630
+ }
631
+ | primary_value call_op tCONSTANT tOP_ASGN arg
632
+ {
633
+ result = @builder.op_assign(
634
+ @builder.call_method(
635
+ val[0], val[1], val[2]),
636
+ val[3], val[4])
637
+ }
638
+ | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg
639
+ {
640
+ result = @builder.op_assign(
641
+ @builder.call_method(
642
+ val[0], val[1], val[2]),
643
+ val[3], val[4])
644
+ }
645
+ | primary_value tCOLON2 tCONSTANT tOP_ASGN arg
646
+ {
647
+ const = @builder.const_op_assignable(
648
+ @builder.const_fetch(val[0], val[1], val[2]))
649
+ result = @builder.op_assign(const, val[3], val[4])
650
+ }
651
+ | tCOLON3 tCONSTANT tOP_ASGN arg
652
+ {
653
+ const = @builder.const_op_assignable(
654
+ @builder.const_global(val[0], val[1]))
655
+ result = @builder.op_assign(const, val[2], val[3])
656
+ }
657
+ | backref tOP_ASGN arg
658
+ {
659
+ result = @builder.op_assign(val[0], val[1], val[2])
660
+ }
661
+ | arg tDOT2 arg
662
+ {
663
+ result = @builder.range_inclusive(val[0], val[1], val[2])
664
+ }
665
+ | arg tDOT3 arg
666
+ {
667
+ result = @builder.range_exclusive(val[0], val[1], val[2])
668
+ }
669
+ | arg tPLUS arg
670
+ {
671
+ result = @builder.binary_op(val[0], val[1], val[2])
672
+ }
673
+ | arg tMINUS arg
674
+ {
675
+ result = @builder.binary_op(val[0], val[1], val[2])
676
+ }
677
+ | arg tSTAR2 arg
678
+ {
679
+ result = @builder.binary_op(val[0], val[1], val[2])
680
+ }
681
+ | arg tDIVIDE arg
682
+ {
683
+ result = @builder.binary_op(val[0], val[1], val[2])
684
+ }
685
+ | arg tPERCENT arg
686
+ {
687
+ result = @builder.binary_op(val[0], val[1], val[2])
688
+ }
689
+ | arg tPOW arg
690
+ {
691
+ result = @builder.binary_op(val[0], val[1], val[2])
692
+ }
693
+ | tUMINUS_NUM simple_numeric tPOW arg
694
+ {
695
+ result = @builder.unary_op(val[0],
696
+ @builder.binary_op(
697
+ val[1], val[2], val[3]))
698
+ }
699
+ | tUPLUS arg
700
+ {
701
+ result = @builder.unary_op(val[0], val[1])
702
+ }
703
+ | tUMINUS arg
704
+ {
705
+ result = @builder.unary_op(val[0], val[1])
706
+ }
707
+ | arg tPIPE arg
708
+ {
709
+ result = @builder.binary_op(val[0], val[1], val[2])
710
+ }
711
+ | arg tCARET arg
712
+ {
713
+ result = @builder.binary_op(val[0], val[1], val[2])
714
+ }
715
+ | arg tAMPER2 arg
716
+ {
717
+ result = @builder.binary_op(val[0], val[1], val[2])
718
+ }
719
+ | arg tCMP arg
720
+ {
721
+ result = @builder.binary_op(val[0], val[1], val[2])
722
+ }
723
+ | arg tGT arg
724
+ {
725
+ result = @builder.binary_op(val[0], val[1], val[2])
726
+ }
727
+ | arg tGEQ arg
728
+ {
729
+ result = @builder.binary_op(val[0], val[1], val[2])
730
+ }
731
+ | arg tLT arg
732
+ {
733
+ result = @builder.binary_op(val[0], val[1], val[2])
734
+ }
735
+ | arg tLEQ arg
736
+ {
737
+ result = @builder.binary_op(val[0], val[1], val[2])
738
+ }
739
+ | arg tEQ arg
740
+ {
741
+ result = @builder.binary_op(val[0], val[1], val[2])
742
+ }
743
+ | arg tEQQ arg
744
+ {
745
+ result = @builder.binary_op(val[0], val[1], val[2])
746
+ }
747
+ | arg tNEQ arg
748
+ {
749
+ result = @builder.binary_op(val[0], val[1], val[2])
750
+ }
751
+ | arg tMATCH arg
752
+ {
753
+ result = @builder.match_op(val[0], val[1], val[2])
754
+ }
755
+ | arg tNMATCH arg
756
+ {
757
+ result = @builder.binary_op(val[0], val[1], val[2])
758
+ }
759
+ | tBANG arg
760
+ {
761
+ result = @builder.not_op(val[0], nil, val[1], nil)
762
+ }
763
+ | tTILDE arg
764
+ {
765
+ result = @builder.unary_op(val[0], val[1])
766
+ }
767
+ | arg tLSHFT arg
768
+ {
769
+ result = @builder.binary_op(val[0], val[1], val[2])
770
+ }
771
+ | arg tRSHFT arg
772
+ {
773
+ result = @builder.binary_op(val[0], val[1], val[2])
774
+ }
775
+ | arg tANDOP arg
776
+ {
777
+ result = @builder.logical_op(:and, val[0], val[1], val[2])
778
+ }
779
+ | arg tOROP arg
780
+ {
781
+ result = @builder.logical_op(:or, val[0], val[1], val[2])
782
+ }
783
+ | kDEFINED opt_nl arg
784
+ {
785
+ result = @builder.keyword_cmd(:defined?, val[0], nil, [ val[2] ], nil)
786
+ }
787
+
788
+ # Note: MRI eventually came to rely on disambiguation based on
789
+ # the lexer state, but it is too contrived with the Ragel lexer,
790
+ # so we kept this approach. See ruby/ruby@b0c03f63e5 for
791
+ # the initial commit, and ruby/ruby@23352f62a for MRI revert,
792
+ # which we decided not to track.
793
+ | arg tEH
794
+ {
795
+ @lexer.push_cond
796
+ @lexer.cond.push(true)
797
+ }
798
+ arg opt_nl tCOLON
799
+ {
800
+ @lexer.pop_cond
801
+ }
802
+ arg
803
+ {
804
+ result = @builder.ternary(val[0], val[1],
805
+ val[3], val[5], val[7])
806
+ }
807
+ | primary
808
+
809
+ arg_value: arg
810
+
811
+ aref_args: none
812
+ | args trailer
813
+ | args tCOMMA assocs trailer
814
+ {
815
+ result = val[0] << @builder.associate(nil, val[2], nil)
816
+ }
817
+ | assocs trailer
818
+ {
819
+ result = [ @builder.associate(nil, val[0], nil) ]
820
+ }
821
+
822
+ paren_args: tLPAREN2 opt_call_args rparen
823
+ {
824
+ result = val
825
+ }
826
+
827
+ opt_paren_args: # nothing
828
+ {
829
+ result = [ nil, [], nil ]
830
+ }
831
+ | paren_args
832
+
833
+ opt_call_args: # nothing
834
+ {
835
+ result = []
836
+ }
837
+ | call_args
838
+ | args tCOMMA
839
+ | args tCOMMA assocs tCOMMA
840
+ {
841
+ result = val[0] << @builder.associate(nil, val[2], nil)
842
+ }
843
+ | assocs tCOMMA
844
+ {
845
+ result = [ @builder.associate(nil, val[0], nil) ]
846
+ }
847
+
848
+ call_args: command
849
+ {
850
+ result = [ val[0] ]
851
+ }
852
+ | args opt_block_arg
853
+ {
854
+ result = val[0].concat(val[1])
855
+ }
856
+ | assocs opt_block_arg
857
+ {
858
+ result = [ @builder.associate(nil, val[0], nil) ]
859
+ result.concat(val[1])
860
+ }
861
+ | args tCOMMA assocs opt_block_arg
862
+ {
863
+ assocs = @builder.associate(nil, val[2], nil)
864
+ result = val[0] << assocs
865
+ result.concat(val[3])
866
+ }
867
+ | block_arg
868
+ {
869
+ result = [ val[0] ]
870
+ }
871
+
872
+ command_args: {
873
+ result = @lexer.cmdarg.dup
874
+ @lexer.cmdarg.push(true)
875
+ }
876
+ call_args
877
+ {
878
+ @lexer.cmdarg = val[0]
879
+
880
+ result = val[1]
881
+ }
882
+
883
+ block_arg: tAMPER arg_value
884
+ {
885
+ result = @builder.block_pass(val[0], val[1])
886
+ }
887
+
888
+ opt_block_arg: tCOMMA block_arg
889
+ {
890
+ result = [ val[1] ]
891
+ }
892
+ | # nothing
893
+ {
894
+ result = []
895
+ }
896
+
897
+ args: arg_value
898
+ {
899
+ result = [ val[0] ]
900
+ }
901
+ | tSTAR arg_value
902
+ {
903
+ result = [ @builder.splat(val[0], val[1]) ]
904
+ }
905
+ | args tCOMMA arg_value
906
+ {
907
+ result = val[0] << val[2]
908
+ }
909
+ | args tCOMMA tSTAR arg_value
910
+ {
911
+ result = val[0] << @builder.splat(val[2], val[3])
912
+ }
913
+
914
+ mrhs_arg: mrhs
915
+ {
916
+ result = @builder.array(nil, val[0], nil)
917
+ }
918
+ | arg_value
919
+
920
+ mrhs: args tCOMMA arg_value
921
+ {
922
+ result = val[0] << val[2]
923
+ }
924
+ | args tCOMMA tSTAR arg_value
925
+ {
926
+ result = val[0] << @builder.splat(val[2], val[3])
927
+ }
928
+ | tSTAR arg_value
929
+ {
930
+ result = [ @builder.splat(val[0], val[1]) ]
931
+ }
932
+
933
+ primary: literal
934
+ | strings
935
+ | xstring
936
+ | regexp
937
+ | words
938
+ | qwords
939
+ | symbols
940
+ | qsymbols
941
+ | var_ref
942
+ | backref
943
+ | tFID
944
+ {
945
+ result = @builder.call_method(nil, nil, val[0])
946
+ }
947
+ | kBEGIN
948
+ {
949
+ result = @lexer.cmdarg.dup
950
+ @lexer.cmdarg.clear
951
+ }
952
+ bodystmt kEND
953
+ {
954
+ @lexer.cmdarg = val[1]
955
+
956
+ result = @builder.begin_keyword(val[0], val[2], val[3])
957
+ }
958
+ | tLPAREN_ARG
959
+ {
960
+ result = @lexer.cmdarg.dup
961
+ @lexer.cmdarg.clear
962
+ }
963
+ expr
964
+ {
965
+ @lexer.state = :expr_endarg
966
+ }
967
+ opt_nl tRPAREN
968
+ {
969
+ @lexer.cmdarg = val[1]
970
+
971
+ result = @builder.begin(val[0], val[2], val[5])
972
+ }
973
+ | tLPAREN_ARG
974
+ {
975
+ @lexer.state = :expr_endarg
976
+ }
977
+ opt_nl tRPAREN
978
+ {
979
+ result = @builder.begin(val[0], nil, val[3])
980
+ }
981
+ | tLPAREN compstmt tRPAREN
982
+ {
983
+ result = @builder.begin(val[0], val[1], val[2])
984
+ }
985
+ | primary_value tCOLON2 tCONSTANT
986
+ {
987
+ result = @builder.const_fetch(val[0], val[1], val[2])
988
+ }
989
+ | tCOLON3 tCONSTANT
990
+ {
991
+ result = @builder.const_global(val[0], val[1])
992
+ }
993
+ | tLBRACK aref_args tRBRACK
994
+ {
995
+ result = @builder.array(val[0], val[1], val[2])
996
+ }
997
+ | tLBRACE assoc_list tRCURLY
998
+ {
999
+ result = @builder.associate(val[0], val[1], val[2])
1000
+ }
1001
+ | kRETURN
1002
+ {
1003
+ result = @builder.keyword_cmd(:return, val[0])
1004
+ }
1005
+ | kYIELD tLPAREN2 call_args rparen
1006
+ {
1007
+ result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3])
1008
+ }
1009
+ | kYIELD tLPAREN2 rparen
1010
+ {
1011
+ result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2])
1012
+ }
1013
+ | kYIELD
1014
+ {
1015
+ result = @builder.keyword_cmd(:yield, val[0])
1016
+ }
1017
+ | kDEFINED opt_nl tLPAREN2 expr rparen
1018
+ {
1019
+ result = @builder.keyword_cmd(:defined?, val[0],
1020
+ val[2], [ val[3] ], val[4])
1021
+ }
1022
+ | kNOT tLPAREN2 expr rparen
1023
+ {
1024
+ result = @builder.not_op(val[0], val[1], val[2], val[3])
1025
+ }
1026
+ | kNOT tLPAREN2 rparen
1027
+ {
1028
+ result = @builder.not_op(val[0], val[1], nil, val[2])
1029
+ }
1030
+ | fcall brace_block
1031
+ {
1032
+ method_call = @builder.call_method(nil, nil, val[0])
1033
+
1034
+ begin_t, args, body, end_t = val[1]
1035
+ result = @builder.block(method_call,
1036
+ begin_t, args, body, end_t)
1037
+ }
1038
+ | method_call
1039
+ | method_call brace_block
1040
+ {
1041
+ begin_t, args, body, end_t = val[1]
1042
+ result = @builder.block(val[0],
1043
+ begin_t, args, body, end_t)
1044
+ }
1045
+ | tLAMBDA lambda
1046
+ {
1047
+ lambda_call = @builder.call_lambda(val[0])
1048
+
1049
+ args, (begin_t, body, end_t) = val[1]
1050
+ result = @builder.block(lambda_call,
1051
+ begin_t, args, body, end_t)
1052
+ }
1053
+ | kIF expr_value then compstmt if_tail kEND
1054
+ {
1055
+ else_t, else_ = val[4]
1056
+ result = @builder.condition(val[0], val[1], val[2],
1057
+ val[3], else_t,
1058
+ else_, val[5])
1059
+ }
1060
+ | kUNLESS expr_value then compstmt opt_else kEND
1061
+ {
1062
+ else_t, else_ = val[4]
1063
+ result = @builder.condition(val[0], val[1], val[2],
1064
+ else_, else_t,
1065
+ val[3], val[5])
1066
+ }
1067
+ | kWHILE
1068
+ {
1069
+ @lexer.cond.push(true)
1070
+ }
1071
+ expr_value do
1072
+ {
1073
+ @lexer.cond.pop
1074
+ }
1075
+ compstmt kEND
1076
+ {
1077
+ result = @builder.loop(:while, val[0], val[2], val[3],
1078
+ val[5], val[6])
1079
+ }
1080
+ | kUNTIL
1081
+ {
1082
+ @lexer.cond.push(true)
1083
+ }
1084
+ expr_value do
1085
+ {
1086
+ @lexer.cond.pop
1087
+ }
1088
+ compstmt kEND
1089
+ {
1090
+ result = @builder.loop(:until, val[0], val[2], val[3],
1091
+ val[5], val[6])
1092
+ }
1093
+ | kCASE expr_value opt_terms case_body kEND
1094
+ {
1095
+ *when_bodies, (else_t, else_body) = *val[3]
1096
+
1097
+ result = @builder.case(val[0], val[1],
1098
+ when_bodies, else_t, else_body,
1099
+ val[4])
1100
+ }
1101
+ | kCASE opt_terms case_body kEND
1102
+ {
1103
+ *when_bodies, (else_t, else_body) = *val[2]
1104
+
1105
+ result = @builder.case(val[0], nil,
1106
+ when_bodies, else_t, else_body,
1107
+ val[3])
1108
+ }
1109
+ | kFOR for_var kIN
1110
+ {
1111
+ @lexer.cond.push(true)
1112
+ }
1113
+ expr_value do
1114
+ {
1115
+ @lexer.cond.pop
1116
+ }
1117
+ compstmt kEND
1118
+ {
1119
+ result = @builder.for(val[0], val[1],
1120
+ val[2], val[4],
1121
+ val[5], val[7], val[8])
1122
+ }
1123
+ | kCLASS cpath superclass
1124
+ {
1125
+ @static_env.extend_static
1126
+ @lexer.push_cmdarg
1127
+ }
1128
+ bodystmt kEND
1129
+ {
1130
+ if in_def?
1131
+ diagnostic :error, :class_in_def, nil, val[0]
1132
+ end
1133
+
1134
+ lt_t, superclass = val[2]
1135
+ result = @builder.def_class(val[0], val[1],
1136
+ lt_t, superclass,
1137
+ val[4], val[5])
1138
+
1139
+ @lexer.pop_cmdarg
1140
+ @static_env.unextend
1141
+ }
1142
+ | kCLASS tLSHFT expr term
1143
+ {
1144
+ result = @def_level
1145
+ @def_level = 0
1146
+
1147
+ @static_env.extend_static
1148
+ @lexer.push_cmdarg
1149
+ }
1150
+ bodystmt kEND
1151
+ {
1152
+ result = @builder.def_sclass(val[0], val[1], val[2],
1153
+ val[5], val[6])
1154
+
1155
+ @lexer.pop_cmdarg
1156
+ @static_env.unextend
1157
+
1158
+ @def_level = val[4]
1159
+ }
1160
+ | kMODULE cpath
1161
+ {
1162
+ @static_env.extend_static
1163
+ @lexer.push_cmdarg
1164
+ }
1165
+ bodystmt kEND
1166
+ {
1167
+ if in_def?
1168
+ diagnostic :error, :module_in_def, nil, val[0]
1169
+ end
1170
+
1171
+ result = @builder.def_module(val[0], val[1],
1172
+ val[3], val[4])
1173
+
1174
+ @lexer.pop_cmdarg
1175
+ @static_env.unextend
1176
+ }
1177
+ | kDEF fname
1178
+ {
1179
+ @def_level += 1
1180
+ @static_env.extend_static
1181
+ @lexer.push_cmdarg
1182
+ }
1183
+ f_arglist bodystmt kEND
1184
+ {
1185
+ result = @builder.def_method(val[0], val[1],
1186
+ val[3], val[4], val[5])
1187
+
1188
+ @lexer.pop_cmdarg
1189
+ @static_env.unextend
1190
+ @def_level -= 1
1191
+ }
1192
+ | kDEF singleton dot_or_colon
1193
+ {
1194
+ @lexer.state = :expr_fname
1195
+ }
1196
+ fname
1197
+ {
1198
+ @def_level += 1
1199
+ @static_env.extend_static
1200
+ @lexer.push_cmdarg
1201
+ }
1202
+ f_arglist bodystmt kEND
1203
+ {
1204
+ result = @builder.def_singleton(val[0], val[1], val[2],
1205
+ val[4], val[6], val[7], val[8])
1206
+
1207
+ @lexer.pop_cmdarg
1208
+ @static_env.unextend
1209
+ @def_level -= 1
1210
+ }
1211
+ | kBREAK
1212
+ {
1213
+ result = @builder.keyword_cmd(:break, val[0])
1214
+ }
1215
+ | kNEXT
1216
+ {
1217
+ result = @builder.keyword_cmd(:next, val[0])
1218
+ }
1219
+ | kREDO
1220
+ {
1221
+ result = @builder.keyword_cmd(:redo, val[0])
1222
+ }
1223
+ | kRETRY
1224
+ {
1225
+ result = @builder.keyword_cmd(:retry, val[0])
1226
+ }
1227
+
1228
+ primary_value: primary
1229
+
1230
+ then: term
1231
+ | kTHEN
1232
+ | term kTHEN
1233
+ {
1234
+ result = val[1]
1235
+ }
1236
+
1237
+ do: term
1238
+ | kDO_COND
1239
+
1240
+ if_tail: opt_else
1241
+ | kELSIF expr_value then compstmt if_tail
1242
+ {
1243
+ else_t, else_ = val[4]
1244
+ result = [ val[0],
1245
+ @builder.condition(val[0], val[1], val[2],
1246
+ val[3], else_t,
1247
+ else_, nil),
1248
+ ]
1249
+ }
1250
+
1251
+ opt_else: none
1252
+ | kELSE compstmt
1253
+ {
1254
+ result = val
1255
+ }
1256
+
1257
+ for_var: lhs
1258
+ | mlhs
1259
+
1260
+ f_marg: f_norm_arg
1261
+ {
1262
+ result = @builder.arg(val[0])
1263
+ }
1264
+ | tLPAREN f_margs rparen
1265
+ {
1266
+ result = @builder.multi_lhs(val[0], val[1], val[2])
1267
+ }
1268
+
1269
+ f_marg_list: f_marg
1270
+ {
1271
+ result = [ val[0] ]
1272
+ }
1273
+ | f_marg_list tCOMMA f_marg
1274
+ {
1275
+ result = val[0] << val[2]
1276
+ }
1277
+
1278
+ f_margs: f_marg_list
1279
+ | f_marg_list tCOMMA tSTAR f_norm_arg
1280
+ {
1281
+ result = val[0].
1282
+ push(@builder.restarg(val[2], val[3]))
1283
+ }
1284
+ | f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list
1285
+ {
1286
+ result = val[0].
1287
+ push(@builder.restarg(val[2], val[3])).
1288
+ concat(val[5])
1289
+ }
1290
+ | f_marg_list tCOMMA tSTAR
1291
+ {
1292
+ result = val[0].
1293
+ push(@builder.restarg(val[2]))
1294
+ }
1295
+ | f_marg_list tCOMMA tSTAR tCOMMA f_marg_list
1296
+ {
1297
+ result = val[0].
1298
+ push(@builder.restarg(val[2])).
1299
+ concat(val[4])
1300
+ }
1301
+ | tSTAR f_norm_arg
1302
+ {
1303
+ result = [ @builder.restarg(val[0], val[1]) ]
1304
+ }
1305
+ | tSTAR f_norm_arg tCOMMA f_marg_list
1306
+ {
1307
+ result = [ @builder.restarg(val[0], val[1]),
1308
+ *val[3] ]
1309
+ }
1310
+ | tSTAR
1311
+ {
1312
+ result = [ @builder.restarg(val[0]) ]
1313
+ }
1314
+ | tSTAR tCOMMA f_marg_list
1315
+ {
1316
+ result = [ @builder.restarg(val[0]),
1317
+ *val[2] ]
1318
+ }
1319
+
1320
+ block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg
1321
+ {
1322
+ result = val[0].concat(val[2]).concat(val[3])
1323
+ }
1324
+ | f_block_kwarg opt_f_block_arg
1325
+ {
1326
+ result = val[0].concat(val[1])
1327
+ }
1328
+ | f_kwrest opt_f_block_arg
1329
+ {
1330
+ result = val[0].concat(val[1])
1331
+ }
1332
+ | f_block_arg
1333
+ {
1334
+ result = [ val[0] ]
1335
+ }
1336
+
1337
+ opt_block_args_tail:
1338
+ tCOMMA block_args_tail
1339
+ {
1340
+ result = val[1]
1341
+ }
1342
+ | # nothing
1343
+ {
1344
+ result = []
1345
+ }
1346
+
1347
+ block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1348
+ {
1349
+ result = val[0].
1350
+ concat(val[2]).
1351
+ concat(val[4]).
1352
+ concat(val[5])
1353
+ }
1354
+ | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1355
+ {
1356
+ result = val[0].
1357
+ concat(val[2]).
1358
+ concat(val[4]).
1359
+ concat(val[6]).
1360
+ concat(val[7])
1361
+ }
1362
+ | f_arg tCOMMA f_block_optarg opt_block_args_tail
1363
+ {
1364
+ result = val[0].
1365
+ concat(val[2]).
1366
+ concat(val[3])
1367
+ }
1368
+ | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail
1369
+ {
1370
+ result = val[0].
1371
+ concat(val[2]).
1372
+ concat(val[4]).
1373
+ concat(val[5])
1374
+ }
1375
+ | f_arg tCOMMA f_rest_arg opt_block_args_tail
1376
+ {
1377
+ result = val[0].
1378
+ concat(val[2]).
1379
+ concat(val[3])
1380
+ }
1381
+ | f_arg tCOMMA
1382
+ | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1383
+ {
1384
+ result = val[0].
1385
+ concat(val[2]).
1386
+ concat(val[4]).
1387
+ concat(val[5])
1388
+ }
1389
+ | f_arg opt_block_args_tail
1390
+ {
1391
+ result = val[0].concat(val[1])
1392
+ }
1393
+ | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1394
+ {
1395
+ result = val[0].
1396
+ concat(val[2]).
1397
+ concat(val[3])
1398
+ }
1399
+ | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1400
+ {
1401
+ result = val[0].
1402
+ concat(val[2]).
1403
+ concat(val[4]).
1404
+ concat(val[5])
1405
+ }
1406
+ | f_block_optarg opt_block_args_tail
1407
+ {
1408
+ result = val[0].
1409
+ concat(val[1])
1410
+ }
1411
+ | f_block_optarg tCOMMA f_arg opt_block_args_tail
1412
+ {
1413
+ result = val[0].
1414
+ concat(val[2]).
1415
+ concat(val[3])
1416
+ }
1417
+ | f_rest_arg opt_block_args_tail
1418
+ {
1419
+ result = val[0].
1420
+ concat(val[1])
1421
+ }
1422
+ | f_rest_arg tCOMMA f_arg opt_block_args_tail
1423
+ {
1424
+ result = val[0].
1425
+ concat(val[2]).
1426
+ concat(val[3])
1427
+ }
1428
+ | block_args_tail
1429
+
1430
+ opt_block_param: # nothing
1431
+ {
1432
+ result = @builder.args(nil, [], nil)
1433
+ }
1434
+ | block_param_def
1435
+ {
1436
+ @lexer.state = :expr_value
1437
+ }
1438
+
1439
+ block_param_def: tPIPE opt_bv_decl tPIPE
1440
+ {
1441
+ result = @builder.args(val[0], val[1], val[2])
1442
+ }
1443
+ | tOROP
1444
+ {
1445
+ result = @builder.args(val[0], [], val[0])
1446
+ }
1447
+ | tPIPE block_param opt_bv_decl tPIPE
1448
+ {
1449
+ result = @builder.args(val[0], val[1].concat(val[2]), val[3])
1450
+ }
1451
+
1452
+ opt_bv_decl: opt_nl
1453
+ {
1454
+ result = []
1455
+ }
1456
+ | opt_nl tSEMI bv_decls opt_nl
1457
+ {
1458
+ result = val[2]
1459
+ }
1460
+
1461
+ bv_decls: bvar
1462
+ {
1463
+ result = [ val[0] ]
1464
+ }
1465
+ | bv_decls tCOMMA bvar
1466
+ {
1467
+ result = val[0] << val[2]
1468
+ }
1469
+
1470
+ bvar: tIDENTIFIER
1471
+ {
1472
+ result = @builder.shadowarg(val[0])
1473
+ }
1474
+ | f_bad_arg
1475
+
1476
+ lambda: {
1477
+ @static_env.extend_dynamic
1478
+ }
1479
+ f_larglist
1480
+ {
1481
+ result = @lexer.cmdarg.dup
1482
+ @lexer.cmdarg.clear
1483
+ }
1484
+ lambda_body
1485
+ {
1486
+ @lexer.cmdarg = val[2]
1487
+ @lexer.cmdarg.lexpop
1488
+
1489
+ result = [ val[1], val[3] ]
1490
+
1491
+ @static_env.unextend
1492
+ }
1493
+
1494
+ f_larglist: tLPAREN2 f_args opt_bv_decl tRPAREN
1495
+ {
1496
+ result = @builder.args(val[0], val[1].concat(val[2]), val[3])
1497
+ }
1498
+ | f_args
1499
+ {
1500
+ result = @builder.args(nil, val[0], nil)
1501
+ }
1502
+
1503
+ lambda_body: tLAMBEG compstmt tRCURLY
1504
+ {
1505
+ result = [ val[0], val[1], val[2] ]
1506
+ }
1507
+ | kDO_LAMBDA compstmt kEND
1508
+ {
1509
+ result = [ val[0], val[1], val[2] ]
1510
+ }
1511
+
1512
+ do_block: kDO_BLOCK
1513
+ {
1514
+ @static_env.extend_dynamic
1515
+ }
1516
+ opt_block_param compstmt kEND
1517
+ {
1518
+ result = [ val[0], val[2], val[3], val[4] ]
1519
+
1520
+ @static_env.unextend
1521
+ }
1522
+
1523
+ block_call: command do_block
1524
+ {
1525
+ begin_t, block_args, body, end_t = val[1]
1526
+ result = @builder.block(val[0],
1527
+ begin_t, block_args, body, end_t)
1528
+ }
1529
+ | block_call dot_or_colon operation2 opt_paren_args
1530
+ {
1531
+ lparen_t, args, rparen_t = val[3]
1532
+ result = @builder.call_method(val[0], val[1], val[2],
1533
+ lparen_t, args, rparen_t)
1534
+ }
1535
+ | block_call dot_or_colon operation2 opt_paren_args brace_block
1536
+ {
1537
+ lparen_t, args, rparen_t = val[3]
1538
+ method_call = @builder.call_method(val[0], val[1], val[2],
1539
+ lparen_t, args, rparen_t)
1540
+
1541
+ begin_t, args, body, end_t = val[4]
1542
+ result = @builder.block(method_call,
1543
+ begin_t, args, body, end_t)
1544
+ }
1545
+ | block_call dot_or_colon operation2 command_args do_block
1546
+ {
1547
+ method_call = @builder.call_method(val[0], val[1], val[2],
1548
+ nil, val[3], nil)
1549
+
1550
+ begin_t, args, body, end_t = val[4]
1551
+ result = @builder.block(method_call,
1552
+ begin_t, args, body, end_t)
1553
+ }
1554
+
1555
+ method_call: fcall paren_args
1556
+ {
1557
+ lparen_t, args, rparen_t = val[1]
1558
+ result = @builder.call_method(nil, nil, val[0],
1559
+ lparen_t, args, rparen_t)
1560
+ }
1561
+ | primary_value call_op operation2 opt_paren_args
1562
+ {
1563
+ lparen_t, args, rparen_t = val[3]
1564
+ result = @builder.call_method(val[0], val[1], val[2],
1565
+ lparen_t, args, rparen_t)
1566
+ }
1567
+ | primary_value tCOLON2 operation2 paren_args
1568
+ {
1569
+ lparen_t, args, rparen_t = val[3]
1570
+ result = @builder.call_method(val[0], val[1], val[2],
1571
+ lparen_t, args, rparen_t)
1572
+ }
1573
+ | primary_value tCOLON2 operation3
1574
+ {
1575
+ result = @builder.call_method(val[0], val[1], val[2])
1576
+ }
1577
+ | primary_value call_op paren_args
1578
+ {
1579
+ lparen_t, args, rparen_t = val[2]
1580
+ result = @builder.call_method(val[0], val[1], nil,
1581
+ lparen_t, args, rparen_t)
1582
+ }
1583
+ | primary_value tCOLON2 paren_args
1584
+ {
1585
+ lparen_t, args, rparen_t = val[2]
1586
+ result = @builder.call_method(val[0], val[1], nil,
1587
+ lparen_t, args, rparen_t)
1588
+ }
1589
+ | kSUPER paren_args
1590
+ {
1591
+ lparen_t, args, rparen_t = val[1]
1592
+ result = @builder.keyword_cmd(:super, val[0],
1593
+ lparen_t, args, rparen_t)
1594
+ }
1595
+ | kSUPER
1596
+ {
1597
+ result = @builder.keyword_cmd(:zsuper, val[0])
1598
+ }
1599
+ | primary_value tLBRACK2 opt_call_args rbracket
1600
+ {
1601
+ result = @builder.index(val[0], val[1], val[2], val[3])
1602
+ }
1603
+
1604
+ brace_block: tLCURLY
1605
+ {
1606
+ @static_env.extend_dynamic
1607
+ }
1608
+ opt_block_param compstmt tRCURLY
1609
+ {
1610
+ result = [ val[0], val[2], val[3], val[4] ]
1611
+
1612
+ @static_env.unextend
1613
+ }
1614
+ | kDO
1615
+ {
1616
+ @static_env.extend_dynamic
1617
+ }
1618
+ opt_block_param compstmt kEND
1619
+ {
1620
+ result = [ val[0], val[2], val[3], val[4] ]
1621
+
1622
+ @static_env.unextend
1623
+ }
1624
+
1625
+ case_body: kWHEN args then compstmt cases
1626
+ {
1627
+ result = [ @builder.when(val[0], val[1], val[2], val[3]),
1628
+ *val[4] ]
1629
+ }
1630
+
1631
+ cases: opt_else
1632
+ {
1633
+ result = [ val[0] ]
1634
+ }
1635
+ | case_body
1636
+
1637
+ opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue
1638
+ {
1639
+ assoc_t, exc_var = val[2]
1640
+
1641
+ if val[1]
1642
+ exc_list = @builder.array(nil, val[1], nil)
1643
+ end
1644
+
1645
+ result = [ @builder.rescue_body(val[0],
1646
+ exc_list, assoc_t, exc_var,
1647
+ val[3], val[4]),
1648
+ *val[5] ]
1649
+ }
1650
+ |
1651
+ {
1652
+ result = []
1653
+ }
1654
+
1655
+ exc_list: arg_value
1656
+ {
1657
+ result = [ val[0] ]
1658
+ }
1659
+ | mrhs
1660
+ | none
1661
+
1662
+ exc_var: tASSOC lhs
1663
+ {
1664
+ result = [ val[0], val[1] ]
1665
+ }
1666
+ | none
1667
+
1668
+ opt_ensure: kENSURE compstmt
1669
+ {
1670
+ result = [ val[0], val[1] ]
1671
+ }
1672
+ | none
1673
+
1674
+ literal: numeric
1675
+ | symbol
1676
+ | dsym
1677
+
1678
+ strings: string
1679
+ {
1680
+ result = @builder.string_compose(nil, val[0], nil)
1681
+ }
1682
+
1683
+ string: string1
1684
+ {
1685
+ result = [ val[0] ]
1686
+ }
1687
+ | string string1
1688
+ {
1689
+ result = val[0] << val[1]
1690
+ }
1691
+
1692
+ string1: tSTRING_BEG string_contents tSTRING_END
1693
+ {
1694
+ result = @builder.string_compose(val[0], val[1], val[2])
1695
+ }
1696
+ | tSTRING
1697
+ {
1698
+ result = @builder.string(val[0])
1699
+ }
1700
+ | tCHARACTER
1701
+ {
1702
+ result = @builder.character(val[0])
1703
+ }
1704
+
1705
+ xstring: tXSTRING_BEG xstring_contents tSTRING_END
1706
+ {
1707
+ result = @builder.xstring_compose(val[0], val[1], val[2])
1708
+ }
1709
+
1710
+ regexp: tREGEXP_BEG regexp_contents tSTRING_END tREGEXP_OPT
1711
+ {
1712
+ opts = @builder.regexp_options(val[3])
1713
+ result = @builder.regexp_compose(val[0], val[1], val[2], opts)
1714
+ }
1715
+
1716
+ words: tWORDS_BEG word_list tSTRING_END
1717
+ {
1718
+ result = @builder.words_compose(val[0], val[1], val[2])
1719
+ }
1720
+
1721
+ word_list: # nothing
1722
+ {
1723
+ result = []
1724
+ }
1725
+ | word_list word tSPACE
1726
+ {
1727
+ result = val[0] << @builder.word(val[1])
1728
+ }
1729
+
1730
+ word: string_content
1731
+ {
1732
+ result = [ val[0] ]
1733
+ }
1734
+ | word string_content
1735
+ {
1736
+ result = val[0] << val[1]
1737
+ }
1738
+
1739
+ symbols: tSYMBOLS_BEG symbol_list tSTRING_END
1740
+ {
1741
+ result = @builder.symbols_compose(val[0], val[1], val[2])
1742
+ }
1743
+
1744
+ symbol_list: # nothing
1745
+ {
1746
+ result = []
1747
+ }
1748
+ | symbol_list word tSPACE
1749
+ {
1750
+ result = val[0] << @builder.word(val[1])
1751
+ }
1752
+
1753
+ qwords: tQWORDS_BEG qword_list tSTRING_END
1754
+ {
1755
+ result = @builder.words_compose(val[0], val[1], val[2])
1756
+ }
1757
+
1758
+ qsymbols: tQSYMBOLS_BEG qsym_list tSTRING_END
1759
+ {
1760
+ result = @builder.symbols_compose(val[0], val[1], val[2])
1761
+ }
1762
+
1763
+ qword_list: # nothing
1764
+ {
1765
+ result = []
1766
+ }
1767
+ | qword_list tSTRING_CONTENT tSPACE
1768
+ {
1769
+ result = val[0] << @builder.string_internal(val[1])
1770
+ }
1771
+
1772
+ qsym_list: # nothing
1773
+ {
1774
+ result = []
1775
+ }
1776
+ | qsym_list tSTRING_CONTENT tSPACE
1777
+ {
1778
+ result = val[0] << @builder.symbol_internal(val[1])
1779
+ }
1780
+
1781
+ string_contents: # nothing
1782
+ {
1783
+ result = []
1784
+ }
1785
+ | string_contents string_content
1786
+ {
1787
+ result = val[0] << val[1]
1788
+ }
1789
+
1790
+ xstring_contents: # nothing
1791
+ {
1792
+ result = []
1793
+ }
1794
+ | xstring_contents string_content
1795
+ {
1796
+ result = val[0] << val[1]
1797
+ }
1798
+
1799
+ regexp_contents: # nothing
1800
+ {
1801
+ result = []
1802
+ }
1803
+ | regexp_contents string_content
1804
+ {
1805
+ result = val[0] << val[1]
1806
+ }
1807
+
1808
+ string_content: tSTRING_CONTENT
1809
+ {
1810
+ result = @builder.string_internal(val[0])
1811
+ }
1812
+ | tSTRING_DVAR string_dvar
1813
+ {
1814
+ result = val[1]
1815
+ }
1816
+ | tSTRING_DBEG
1817
+ {
1818
+ @lexer.cond.push(false)
1819
+ @lexer.cmdarg.push(false)
1820
+ }
1821
+ compstmt tSTRING_DEND
1822
+ {
1823
+ @lexer.cond.lexpop
1824
+ @lexer.cmdarg.lexpop
1825
+
1826
+ result = @builder.begin(val[0], val[2], val[3])
1827
+ }
1828
+
1829
+ string_dvar: tGVAR
1830
+ {
1831
+ result = @builder.gvar(val[0])
1832
+ }
1833
+ | tIVAR
1834
+ {
1835
+ result = @builder.ivar(val[0])
1836
+ }
1837
+ | tCVAR
1838
+ {
1839
+ result = @builder.cvar(val[0])
1840
+ }
1841
+ | backref
1842
+
1843
+
1844
+ symbol: tSYMBOL
1845
+ {
1846
+ result = @builder.symbol(val[0])
1847
+ }
1848
+
1849
+ dsym: tSYMBEG xstring_contents tSTRING_END
1850
+ {
1851
+ result = @builder.symbol_compose(val[0], val[1], val[2])
1852
+ }
1853
+
1854
+ numeric: simple_numeric
1855
+ {
1856
+ result = val[0]
1857
+ }
1858
+ | tUMINUS_NUM simple_numeric =tLOWEST
1859
+ {
1860
+ result = @builder.negate(val[0], val[1])
1861
+ }
1862
+
1863
+ simple_numeric: tINTEGER
1864
+ {
1865
+ result = @builder.integer(val[0])
1866
+ }
1867
+ | tFLOAT
1868
+ {
1869
+ result = @builder.float(val[0])
1870
+ }
1871
+ | tRATIONAL
1872
+ {
1873
+ result = @builder.rational(val[0])
1874
+ }
1875
+ | tIMAGINARY
1876
+ {
1877
+ result = @builder.complex(val[0])
1878
+ }
1879
+
1880
+ user_variable: tIDENTIFIER
1881
+ {
1882
+ result = @builder.ident(val[0])
1883
+ }
1884
+ | tIVAR
1885
+ {
1886
+ result = @builder.ivar(val[0])
1887
+ }
1888
+ | tGVAR
1889
+ {
1890
+ result = @builder.gvar(val[0])
1891
+ }
1892
+ | tCONSTANT
1893
+ {
1894
+ result = @builder.const(val[0])
1895
+ }
1896
+ | tCVAR
1897
+ {
1898
+ result = @builder.cvar(val[0])
1899
+ }
1900
+
1901
+ keyword_variable: kNIL
1902
+ {
1903
+ result = @builder.nil(val[0])
1904
+ }
1905
+ | kSELF
1906
+ {
1907
+ result = @builder.self(val[0])
1908
+ }
1909
+ | kTRUE
1910
+ {
1911
+ result = @builder.true(val[0])
1912
+ }
1913
+ | kFALSE
1914
+ {
1915
+ result = @builder.false(val[0])
1916
+ }
1917
+ | k__FILE__
1918
+ {
1919
+ result = @builder.__FILE__(val[0])
1920
+ }
1921
+ | k__LINE__
1922
+ {
1923
+ result = @builder.__LINE__(val[0])
1924
+ }
1925
+ | k__ENCODING__
1926
+ {
1927
+ result = @builder.__ENCODING__(val[0])
1928
+ }
1929
+
1930
+ var_ref: user_variable
1931
+ {
1932
+ result = @builder.accessible(val[0])
1933
+ }
1934
+ | keyword_variable
1935
+ {
1936
+ result = @builder.accessible(val[0])
1937
+ }
1938
+
1939
+ var_lhs: user_variable
1940
+ {
1941
+ result = @builder.assignable(val[0])
1942
+ }
1943
+ | keyword_variable
1944
+ {
1945
+ result = @builder.assignable(val[0])
1946
+ }
1947
+
1948
+ backref: tNTH_REF
1949
+ {
1950
+ result = @builder.nth_ref(val[0])
1951
+ }
1952
+ | tBACK_REF
1953
+ {
1954
+ result = @builder.back_ref(val[0])
1955
+ }
1956
+
1957
+ superclass: term
1958
+ {
1959
+ result = nil
1960
+ }
1961
+ | tLT
1962
+ {
1963
+ @lexer.state = :expr_value
1964
+ }
1965
+ expr_value term
1966
+ {
1967
+ result = [ val[0], val[2] ]
1968
+ }
1969
+ | error term
1970
+ {
1971
+ yyerrok
1972
+ result = nil
1973
+ }
1974
+
1975
+ f_arglist: tLPAREN2 f_args rparen
1976
+ {
1977
+ result = @builder.args(val[0], val[1], val[2])
1978
+
1979
+ @lexer.state = :expr_value
1980
+ }
1981
+ | {
1982
+ result = @lexer.in_kwarg
1983
+ @lexer.in_kwarg = true
1984
+ }
1985
+ f_args term
1986
+ {
1987
+ @lexer.in_kwarg = val[0]
1988
+ result = @builder.args(nil, val[1], nil)
1989
+ }
1990
+
1991
+ args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg
1992
+ {
1993
+ result = val[0].concat(val[2]).concat(val[3])
1994
+ }
1995
+ | f_kwarg opt_f_block_arg
1996
+ {
1997
+ result = val[0].concat(val[1])
1998
+ }
1999
+ | f_kwrest opt_f_block_arg
2000
+ {
2001
+ result = val[0].concat(val[1])
2002
+ }
2003
+ | f_block_arg
2004
+ {
2005
+ result = [ val[0] ]
2006
+ }
2007
+
2008
+ opt_args_tail: tCOMMA args_tail
2009
+ {
2010
+ result = val[1]
2011
+ }
2012
+ | # nothing
2013
+ {
2014
+ result = []
2015
+ }
2016
+
2017
+ f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail
2018
+ {
2019
+ result = val[0].
2020
+ concat(val[2]).
2021
+ concat(val[4]).
2022
+ concat(val[5])
2023
+ }
2024
+ | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
2025
+ {
2026
+ result = val[0].
2027
+ concat(val[2]).
2028
+ concat(val[4]).
2029
+ concat(val[6]).
2030
+ concat(val[7])
2031
+ }
2032
+ | f_arg tCOMMA f_optarg opt_args_tail
2033
+ {
2034
+ result = val[0].
2035
+ concat(val[2]).
2036
+ concat(val[3])
2037
+ }
2038
+ | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail
2039
+ {
2040
+ result = val[0].
2041
+ concat(val[2]).
2042
+ concat(val[4]).
2043
+ concat(val[5])
2044
+ }
2045
+ | f_arg tCOMMA f_rest_arg opt_args_tail
2046
+ {
2047
+ result = val[0].
2048
+ concat(val[2]).
2049
+ concat(val[3])
2050
+ }
2051
+ | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
2052
+ {
2053
+ result = val[0].
2054
+ concat(val[2]).
2055
+ concat(val[4]).
2056
+ concat(val[5])
2057
+ }
2058
+ | f_arg opt_args_tail
2059
+ {
2060
+ result = val[0].
2061
+ concat(val[1])
2062
+ }
2063
+ | f_optarg tCOMMA f_rest_arg opt_args_tail
2064
+ {
2065
+ result = val[0].
2066
+ concat(val[2]).
2067
+ concat(val[3])
2068
+ }
2069
+ | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
2070
+ {
2071
+ result = val[0].
2072
+ concat(val[2]).
2073
+ concat(val[4]).
2074
+ concat(val[5])
2075
+ }
2076
+ | f_optarg opt_args_tail
2077
+ {
2078
+ result = val[0].
2079
+ concat(val[1])
2080
+ }
2081
+ | f_optarg tCOMMA f_arg opt_args_tail
2082
+ {
2083
+ result = val[0].
2084
+ concat(val[2]).
2085
+ concat(val[3])
2086
+ }
2087
+ | f_rest_arg opt_args_tail
2088
+ {
2089
+ result = val[0].
2090
+ concat(val[1])
2091
+ }
2092
+ | f_rest_arg tCOMMA f_arg opt_args_tail
2093
+ {
2094
+ result = val[0].
2095
+ concat(val[2]).
2096
+ concat(val[3])
2097
+ }
2098
+ | args_tail
2099
+ {
2100
+ result = val[0]
2101
+ }
2102
+ | # nothing
2103
+ {
2104
+ result = []
2105
+ }
2106
+
2107
+ f_bad_arg: tCONSTANT
2108
+ {
2109
+ diagnostic :error, :argument_const, nil, val[0]
2110
+ }
2111
+ | tIVAR
2112
+ {
2113
+ diagnostic :error, :argument_ivar, nil, val[0]
2114
+ }
2115
+ | tGVAR
2116
+ {
2117
+ diagnostic :error, :argument_gvar, nil, val[0]
2118
+ }
2119
+ | tCVAR
2120
+ {
2121
+ diagnostic :error, :argument_cvar, nil, val[0]
2122
+ }
2123
+
2124
+ f_norm_arg: f_bad_arg
2125
+ | tIDENTIFIER
2126
+ {
2127
+ @static_env.declare val[0][0]
2128
+
2129
+ result = val[0]
2130
+ }
2131
+
2132
+ f_arg_asgn: f_norm_arg
2133
+ {
2134
+ result = val[0]
2135
+ }
2136
+
2137
+ f_arg_item: f_arg_asgn
2138
+ {
2139
+ result = @builder.arg(val[0])
2140
+ }
2141
+ | tLPAREN f_margs rparen
2142
+ {
2143
+ result = @builder.multi_lhs(val[0], val[1], val[2])
2144
+ }
2145
+
2146
+ f_arg: f_arg_item
2147
+ {
2148
+ result = [ val[0] ]
2149
+ }
2150
+ | f_arg tCOMMA f_arg_item
2151
+ {
2152
+ result = val[0] << val[2]
2153
+ }
2154
+
2155
+ f_label: tLABEL
2156
+ {
2157
+ check_kwarg_name(val[0])
2158
+
2159
+ @static_env.declare val[0][0]
2160
+
2161
+ result = val[0]
2162
+ }
2163
+
2164
+ f_kw: f_label arg_value
2165
+ {
2166
+ result = @builder.kwoptarg(val[0], val[1])
2167
+ }
2168
+ | f_label
2169
+ {
2170
+ result = @builder.kwarg(val[0])
2171
+ }
2172
+
2173
+ f_block_kw: f_label primary_value
2174
+ {
2175
+ result = @builder.kwoptarg(val[0], val[1])
2176
+ }
2177
+ | f_label
2178
+ {
2179
+ result = @builder.kwarg(val[0])
2180
+ }
2181
+
2182
+ f_block_kwarg: f_block_kw
2183
+ {
2184
+ result = [ val[0] ]
2185
+ }
2186
+ | f_block_kwarg tCOMMA f_block_kw
2187
+ {
2188
+ result = val[0] << val[2]
2189
+ }
2190
+
2191
+ f_kwarg: f_kw
2192
+ {
2193
+ result = [ val[0] ]
2194
+ }
2195
+ | f_kwarg tCOMMA f_kw
2196
+ {
2197
+ result = val[0] << val[2]
2198
+ }
2199
+
2200
+ kwrest_mark: tPOW | tDSTAR
2201
+
2202
+ f_kwrest: kwrest_mark tIDENTIFIER
2203
+ {
2204
+ @static_env.declare val[1][0]
2205
+
2206
+ result = [ @builder.kwrestarg(val[0], val[1]) ]
2207
+ }
2208
+ | kwrest_mark
2209
+ {
2210
+ result = [ @builder.kwrestarg(val[0]) ]
2211
+ }
2212
+
2213
+ f_opt: f_arg_asgn tEQL arg_value
2214
+ {
2215
+ result = @builder.optarg(val[0], val[1], val[2])
2216
+ }
2217
+
2218
+ f_block_opt: f_arg_asgn tEQL primary_value
2219
+ {
2220
+ result = @builder.optarg(val[0], val[1], val[2])
2221
+ }
2222
+
2223
+ f_block_optarg: f_block_opt
2224
+ {
2225
+ result = [ val[0] ]
2226
+ }
2227
+ | f_block_optarg tCOMMA f_block_opt
2228
+ {
2229
+ result = val[0] << val[2]
2230
+ }
2231
+
2232
+ f_optarg: f_opt
2233
+ {
2234
+ result = [ val[0] ]
2235
+ }
2236
+ | f_optarg tCOMMA f_opt
2237
+ {
2238
+ result = val[0] << val[2]
2239
+ }
2240
+
2241
+ restarg_mark: tSTAR2 | tSTAR
2242
+
2243
+ f_rest_arg: restarg_mark tIDENTIFIER
2244
+ {
2245
+ @static_env.declare val[1][0]
2246
+
2247
+ result = [ @builder.restarg(val[0], val[1]) ]
2248
+ }
2249
+ | restarg_mark
2250
+ {
2251
+ result = [ @builder.restarg(val[0]) ]
2252
+ }
2253
+
2254
+ blkarg_mark: tAMPER2 | tAMPER
2255
+
2256
+ f_block_arg: blkarg_mark tIDENTIFIER
2257
+ {
2258
+ @static_env.declare val[1][0]
2259
+
2260
+ result = @builder.blockarg(val[0], val[1])
2261
+ }
2262
+
2263
+ opt_f_block_arg: tCOMMA f_block_arg
2264
+ {
2265
+ result = [ val[1] ]
2266
+ }
2267
+ |
2268
+ {
2269
+ result = []
2270
+ }
2271
+
2272
+ singleton: var_ref
2273
+ | tLPAREN2 expr rparen
2274
+ {
2275
+ result = val[1]
2276
+ }
2277
+
2278
+ assoc_list: # nothing
2279
+ {
2280
+ result = []
2281
+ }
2282
+ | assocs trailer
2283
+
2284
+ assocs: assoc
2285
+ {
2286
+ result = [ val[0] ]
2287
+ }
2288
+ | assocs tCOMMA assoc
2289
+ {
2290
+ result = val[0] << val[2]
2291
+ }
2292
+
2293
+ assoc: arg_value tASSOC arg_value
2294
+ {
2295
+ result = @builder.pair(val[0], val[1], val[2])
2296
+ }
2297
+ | tLABEL arg_value
2298
+ {
2299
+ result = @builder.pair_keyword(val[0], val[1])
2300
+ }
2301
+ | tSTRING_BEG string_contents tLABEL_END arg_value
2302
+ {
2303
+ result = @builder.pair_quoted(val[0], val[1], val[2], val[3])
2304
+ }
2305
+ | tDSTAR arg_value
2306
+ {
2307
+ result = @builder.kwsplat(val[0], val[1])
2308
+ }
2309
+
2310
+ operation: tIDENTIFIER | tCONSTANT | tFID
2311
+ operation2: tIDENTIFIER | tCONSTANT | tFID | op
2312
+ operation3: tIDENTIFIER | tFID | op
2313
+ dot_or_colon: call_op | tCOLON2
2314
+ call_op: tDOT
2315
+ {
2316
+ result = [:dot, val[0][1]]
2317
+ }
2318
+ | tANDDOT
2319
+ {
2320
+ result = [:anddot, val[0][1]]
2321
+ }
2322
+ opt_terms: | terms
2323
+ opt_nl: | tNL
2324
+ rparen: opt_nl tRPAREN
2325
+ {
2326
+ result = val[1]
2327
+ }
2328
+ rbracket: opt_nl tRBRACK
2329
+ {
2330
+ result = val[1]
2331
+ }
2332
+ trailer: | tNL | tCOMMA
2333
+
2334
+ term: tSEMI
2335
+ {
2336
+ yyerrok
2337
+ }
2338
+ | tNL
2339
+
2340
+ terms: term
2341
+ | terms tSEMI
2342
+
2343
+ none: # nothing
2344
+ {
2345
+ result = nil
2346
+ }
2347
+ end
2348
+
2349
+ ---- header
2350
+
2351
+ require 'parser'
2352
+
2353
+ Parser.check_for_encoding_support
2354
+
2355
+ ---- inner
2356
+
2357
+ def version
2358
+ 23
2359
+ end
2360
+
2361
+ def default_encoding
2362
+ Encoding::UTF_8
2363
+ end