parser 2.3.0.7 → 2.3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5a26d867d04edc904373d219c6b5a1e96ef04d4d
4
- data.tar.gz: 85ac7d2151c8f28584ff798c7e23e12ae1500afe
3
+ metadata.gz: 9403827537b14d96c76aee39812704f453daf0fd
4
+ data.tar.gz: 3e2fa957c7c68533af47e28e4c2e48fef5a28a14
5
5
  SHA512:
6
- metadata.gz: ffa1d0b020bcb5802d13cb69477427d9f95d303a53de4addc37acdc82b03ac6abd2cc061e5a1a9fbf1cf6c2407a10c1dbb821ec0ce5c45b8ec103f5138d0894d
7
- data.tar.gz: e75209c9674253351150671eed73530c052bbfc122cac1f199163f23cbd77420a2cd7ae7cf8268c059ca12c68a5750acdb74e81433328c5472b8bb81db4b2237
6
+ metadata.gz: f5e0f974c0a580cd610c166a61eb6c65f9cb3c5458e4c759abb9c3858b2aa5772824d6b00d53707b5dca0cb6eab4d20d444d8b8cdb0a4705263ef3ea615c763c
7
+ data.tar.gz: 893aaddd0619465fd746ba816773f6add95a7e0e98e3090236e4cb0277bd600fcd10ecb41ec1f0a0da1077436ff479bc06791f8ad3fd1cfa3331a54398e73adb
data/.gitignore CHANGED
@@ -23,5 +23,6 @@ lib/parser/ruby20.rb
23
23
  lib/parser/ruby21.rb
24
24
  lib/parser/ruby22.rb
25
25
  lib/parser/ruby23.rb
26
+ lib/parser/ruby24.rb
26
27
  lib/parser/macruby.rb
27
28
  lib/parser/rubymotion.rb
@@ -1,6 +1,17 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ v2.3.1.0 (2016-04-27)
5
+ ---------------------
6
+
7
+ Features implemented:
8
+ * Parser::Current: update for Ruby 2.3.1. (whitequark)
9
+ * Builders::Default: allow masgn in conditional context on >=Ruby 2.4. (whitequark)
10
+ * ruby24.y: branch parser. (whitequark)
11
+
12
+ Bugs fixed:
13
+ * lexer.rl: "def x y; y A::B, ''; end": reject X:: in EXPR_ENDFN (fixes #285). (whitequark)
14
+
4
15
  v2.3.0.7 (2016-03-25)
5
16
  ---------------------
6
17
 
@@ -43,7 +54,7 @@ Bugs fixed:
43
54
  * Add :csend to Parser::Meta::NODE_TYPES (Markus Schirp)
44
55
  * lexer/dedenter: "\<\<x\n y\\n z\nx": don't dedent after escaped newline. (whitequark)
45
56
 
46
- v2.3.0.7 (2016-01-16)
57
+ v2.3.1.0 (2016-01-16)
47
58
  ---------------------
48
59
 
49
60
  v2.3.0.1 (2016-01-14)
data/Rakefile CHANGED
@@ -25,6 +25,7 @@ GENERATED_FILES = %w(lib/parser/lexer.rb
25
25
  lib/parser/ruby21.rb
26
26
  lib/parser/ruby22.rb
27
27
  lib/parser/ruby23.rb
28
+ lib/parser/ruby24.rb
28
29
  lib/parser/macruby.rb
29
30
  lib/parser/rubymotion.rb)
30
31
 
@@ -4,3 +4,4 @@ require 'parser/ruby20'
4
4
  require 'parser/ruby21'
5
5
  require 'parser/ruby22'
6
6
  require 'parser/ruby23'
7
+ require 'parser/ruby24'
@@ -1053,7 +1053,9 @@ module Parser
1053
1053
  def check_condition(cond)
1054
1054
  case cond.type
1055
1055
  when :masgn
1056
- diagnostic :error, :masgn_as_condition, nil, cond.loc.expression
1056
+ if @parser.version <= 23
1057
+ diagnostic :error, :masgn_as_condition, nil, cond.loc.expression
1058
+ end
1057
1059
 
1058
1060
  when :begin
1059
1061
  if cond.children.count == 1
@@ -55,7 +55,7 @@ module Parser
55
55
  CurrentRuby = Ruby22
56
56
 
57
57
  when /^2\.3\./
58
- current_version = '2.3.0'
58
+ current_version = '2.3.1'
59
59
  if RUBY_VERSION != current_version
60
60
  warn_syntax_deviation 'parser/ruby23', current_version
61
61
  end
@@ -66,11 +66,11 @@ module Parser
66
66
  when /^2\.4\./
67
67
  current_version = 'HEAD'
68
68
  if RUBY_VERSION != current_version
69
- warn_syntax_deviation 'parser/ruby23', current_version
69
+ warn_syntax_deviation 'parser/ruby24', current_version
70
70
  end
71
71
 
72
- require 'parser/ruby23'
73
- CurrentRuby = Ruby23
72
+ require 'parser/ruby24'
73
+ CurrentRuby = Ruby24
74
74
 
75
75
  else # :nocov:
76
76
  # Keep this in sync with released Ruby.
@@ -1307,9 +1307,9 @@ class Parser::Lexer
1307
1307
  # Transitions to `expr_end` afterwards.
1308
1308
  #
1309
1309
  expr_endfn := |*
1310
- label
1311
- => { emit(:tLABEL, tok(@ts, @te - 1))
1312
- fnext expr_labelarg; fbreak; };
1310
+ label ( any - ':' )
1311
+ => { emit(:tLABEL, tok(@ts, @te - 2), @ts, @te - 1)
1312
+ fhold; fnext expr_labelarg; fbreak; };
1313
1313
 
1314
1314
  w_space_comment;
1315
1315
 
@@ -0,0 +1,2346 @@
1
+ class Parser::Ruby24
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
+ | arg tEH arg opt_nl tCOLON arg
788
+ {
789
+ result = @builder.ternary(val[0], val[1],
790
+ val[2], val[4], val[5])
791
+ }
792
+ | primary
793
+
794
+ arg_value: arg
795
+
796
+ aref_args: none
797
+ | args trailer
798
+ | args tCOMMA assocs trailer
799
+ {
800
+ result = val[0] << @builder.associate(nil, val[2], nil)
801
+ }
802
+ | assocs trailer
803
+ {
804
+ result = [ @builder.associate(nil, val[0], nil) ]
805
+ }
806
+
807
+ paren_args: tLPAREN2 opt_call_args rparen
808
+ {
809
+ result = val
810
+ }
811
+
812
+ opt_paren_args: # nothing
813
+ {
814
+ result = [ nil, [], nil ]
815
+ }
816
+ | paren_args
817
+
818
+ opt_call_args: # nothing
819
+ {
820
+ result = []
821
+ }
822
+ | call_args
823
+ | args tCOMMA
824
+ | args tCOMMA assocs tCOMMA
825
+ {
826
+ result = val[0] << @builder.associate(nil, val[2], nil)
827
+ }
828
+ | assocs tCOMMA
829
+ {
830
+ result = [ @builder.associate(nil, val[0], nil) ]
831
+ }
832
+
833
+ call_args: command
834
+ {
835
+ result = [ val[0] ]
836
+ }
837
+ | args opt_block_arg
838
+ {
839
+ result = val[0].concat(val[1])
840
+ }
841
+ | assocs opt_block_arg
842
+ {
843
+ result = [ @builder.associate(nil, val[0], nil) ]
844
+ result.concat(val[1])
845
+ }
846
+ | args tCOMMA assocs opt_block_arg
847
+ {
848
+ assocs = @builder.associate(nil, val[2], nil)
849
+ result = val[0] << assocs
850
+ result.concat(val[3])
851
+ }
852
+ | block_arg
853
+ {
854
+ result = [ val[0] ]
855
+ }
856
+
857
+ command_args: {
858
+ result = @lexer.cmdarg.dup
859
+ @lexer.cmdarg.push(true)
860
+ }
861
+ call_args
862
+ {
863
+ @lexer.cmdarg = val[0]
864
+
865
+ result = val[1]
866
+ }
867
+
868
+ block_arg: tAMPER arg_value
869
+ {
870
+ result = @builder.block_pass(val[0], val[1])
871
+ }
872
+
873
+ opt_block_arg: tCOMMA block_arg
874
+ {
875
+ result = [ val[1] ]
876
+ }
877
+ | # nothing
878
+ {
879
+ result = []
880
+ }
881
+
882
+ args: arg_value
883
+ {
884
+ result = [ val[0] ]
885
+ }
886
+ | tSTAR arg_value
887
+ {
888
+ result = [ @builder.splat(val[0], val[1]) ]
889
+ }
890
+ | args tCOMMA arg_value
891
+ {
892
+ result = val[0] << val[2]
893
+ }
894
+ | args tCOMMA tSTAR arg_value
895
+ {
896
+ result = val[0] << @builder.splat(val[2], val[3])
897
+ }
898
+
899
+ mrhs_arg: mrhs
900
+ {
901
+ result = @builder.array(nil, val[0], nil)
902
+ }
903
+ | arg_value
904
+
905
+ mrhs: 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
+ | tSTAR arg_value
914
+ {
915
+ result = [ @builder.splat(val[0], val[1]) ]
916
+ }
917
+
918
+ primary: literal
919
+ | strings
920
+ | xstring
921
+ | regexp
922
+ | words
923
+ | qwords
924
+ | symbols
925
+ | qsymbols
926
+ | var_ref
927
+ | backref
928
+ | tFID
929
+ {
930
+ result = @builder.call_method(nil, nil, val[0])
931
+ }
932
+ | kBEGIN
933
+ {
934
+ result = @lexer.cmdarg.dup
935
+ @lexer.cmdarg.clear
936
+ }
937
+ bodystmt kEND
938
+ {
939
+ @lexer.cmdarg = val[1]
940
+
941
+ result = @builder.begin_keyword(val[0], val[2], val[3])
942
+ }
943
+ | tLPAREN_ARG
944
+ {
945
+ result = @lexer.cmdarg.dup
946
+ @lexer.cmdarg.clear
947
+ }
948
+ expr
949
+ {
950
+ @lexer.state = :expr_endarg
951
+ }
952
+ opt_nl tRPAREN
953
+ {
954
+ @lexer.cmdarg = val[1]
955
+
956
+ result = @builder.begin(val[0], val[2], val[5])
957
+ }
958
+ | tLPAREN_ARG
959
+ {
960
+ @lexer.state = :expr_endarg
961
+ }
962
+ opt_nl tRPAREN
963
+ {
964
+ result = @builder.begin(val[0], nil, val[3])
965
+ }
966
+ | tLPAREN compstmt tRPAREN
967
+ {
968
+ result = @builder.begin(val[0], val[1], val[2])
969
+ }
970
+ | primary_value tCOLON2 tCONSTANT
971
+ {
972
+ result = @builder.const_fetch(val[0], val[1], val[2])
973
+ }
974
+ | tCOLON3 tCONSTANT
975
+ {
976
+ result = @builder.const_global(val[0], val[1])
977
+ }
978
+ | tLBRACK aref_args tRBRACK
979
+ {
980
+ result = @builder.array(val[0], val[1], val[2])
981
+ }
982
+ | tLBRACE assoc_list tRCURLY
983
+ {
984
+ result = @builder.associate(val[0], val[1], val[2])
985
+ }
986
+ | kRETURN
987
+ {
988
+ result = @builder.keyword_cmd(:return, val[0])
989
+ }
990
+ | kYIELD tLPAREN2 call_args rparen
991
+ {
992
+ result = @builder.keyword_cmd(:yield, val[0], val[1], val[2], val[3])
993
+ }
994
+ | kYIELD tLPAREN2 rparen
995
+ {
996
+ result = @builder.keyword_cmd(:yield, val[0], val[1], [], val[2])
997
+ }
998
+ | kYIELD
999
+ {
1000
+ result = @builder.keyword_cmd(:yield, val[0])
1001
+ }
1002
+ | kDEFINED opt_nl tLPAREN2 expr rparen
1003
+ {
1004
+ result = @builder.keyword_cmd(:defined?, val[0],
1005
+ val[2], [ val[3] ], val[4])
1006
+ }
1007
+ | kNOT tLPAREN2 expr rparen
1008
+ {
1009
+ result = @builder.not_op(val[0], val[1], val[2], val[3])
1010
+ }
1011
+ | kNOT tLPAREN2 rparen
1012
+ {
1013
+ result = @builder.not_op(val[0], val[1], nil, val[2])
1014
+ }
1015
+ | fcall brace_block
1016
+ {
1017
+ method_call = @builder.call_method(nil, nil, val[0])
1018
+
1019
+ begin_t, args, body, end_t = val[1]
1020
+ result = @builder.block(method_call,
1021
+ begin_t, args, body, end_t)
1022
+ }
1023
+ | method_call
1024
+ | method_call brace_block
1025
+ {
1026
+ begin_t, args, body, end_t = val[1]
1027
+ result = @builder.block(val[0],
1028
+ begin_t, args, body, end_t)
1029
+ }
1030
+ | tLAMBDA lambda
1031
+ {
1032
+ lambda_call = @builder.call_lambda(val[0])
1033
+
1034
+ args, (begin_t, body, end_t) = val[1]
1035
+ result = @builder.block(lambda_call,
1036
+ begin_t, args, body, end_t)
1037
+ }
1038
+ | kIF expr_value then compstmt if_tail kEND
1039
+ {
1040
+ else_t, else_ = val[4]
1041
+ result = @builder.condition(val[0], val[1], val[2],
1042
+ val[3], else_t,
1043
+ else_, val[5])
1044
+ }
1045
+ | kUNLESS expr_value then compstmt opt_else kEND
1046
+ {
1047
+ else_t, else_ = val[4]
1048
+ result = @builder.condition(val[0], val[1], val[2],
1049
+ else_, else_t,
1050
+ val[3], val[5])
1051
+ }
1052
+ | kWHILE
1053
+ {
1054
+ @lexer.cond.push(true)
1055
+ }
1056
+ expr_value do
1057
+ {
1058
+ @lexer.cond.pop
1059
+ }
1060
+ compstmt kEND
1061
+ {
1062
+ result = @builder.loop(:while, val[0], val[2], val[3],
1063
+ val[5], val[6])
1064
+ }
1065
+ | kUNTIL
1066
+ {
1067
+ @lexer.cond.push(true)
1068
+ }
1069
+ expr_value do
1070
+ {
1071
+ @lexer.cond.pop
1072
+ }
1073
+ compstmt kEND
1074
+ {
1075
+ result = @builder.loop(:until, val[0], val[2], val[3],
1076
+ val[5], val[6])
1077
+ }
1078
+ | kCASE expr_value opt_terms case_body kEND
1079
+ {
1080
+ *when_bodies, (else_t, else_body) = *val[3]
1081
+
1082
+ result = @builder.case(val[0], val[1],
1083
+ when_bodies, else_t, else_body,
1084
+ val[4])
1085
+ }
1086
+ | kCASE opt_terms case_body kEND
1087
+ {
1088
+ *when_bodies, (else_t, else_body) = *val[2]
1089
+
1090
+ result = @builder.case(val[0], nil,
1091
+ when_bodies, else_t, else_body,
1092
+ val[3])
1093
+ }
1094
+ | kFOR for_var kIN
1095
+ {
1096
+ @lexer.cond.push(true)
1097
+ }
1098
+ expr_value do
1099
+ {
1100
+ @lexer.cond.pop
1101
+ }
1102
+ compstmt kEND
1103
+ {
1104
+ result = @builder.for(val[0], val[1],
1105
+ val[2], val[4],
1106
+ val[5], val[7], val[8])
1107
+ }
1108
+ | kCLASS cpath superclass
1109
+ {
1110
+ @static_env.extend_static
1111
+ @lexer.push_cmdarg
1112
+ }
1113
+ bodystmt kEND
1114
+ {
1115
+ if in_def?
1116
+ diagnostic :error, :class_in_def, nil, val[0]
1117
+ end
1118
+
1119
+ lt_t, superclass = val[2]
1120
+ result = @builder.def_class(val[0], val[1],
1121
+ lt_t, superclass,
1122
+ val[4], val[5])
1123
+
1124
+ @lexer.pop_cmdarg
1125
+ @static_env.unextend
1126
+ }
1127
+ | kCLASS tLSHFT expr term
1128
+ {
1129
+ result = @def_level
1130
+ @def_level = 0
1131
+
1132
+ @static_env.extend_static
1133
+ @lexer.push_cmdarg
1134
+ }
1135
+ bodystmt kEND
1136
+ {
1137
+ result = @builder.def_sclass(val[0], val[1], val[2],
1138
+ val[5], val[6])
1139
+
1140
+ @lexer.pop_cmdarg
1141
+ @static_env.unextend
1142
+
1143
+ @def_level = val[4]
1144
+ }
1145
+ | kMODULE cpath
1146
+ {
1147
+ @static_env.extend_static
1148
+ @lexer.push_cmdarg
1149
+ }
1150
+ bodystmt kEND
1151
+ {
1152
+ if in_def?
1153
+ diagnostic :error, :module_in_def, nil, val[0]
1154
+ end
1155
+
1156
+ result = @builder.def_module(val[0], val[1],
1157
+ val[3], val[4])
1158
+
1159
+ @lexer.pop_cmdarg
1160
+ @static_env.unextend
1161
+ }
1162
+ | kDEF fname
1163
+ {
1164
+ @def_level += 1
1165
+ @static_env.extend_static
1166
+ @lexer.push_cmdarg
1167
+ }
1168
+ f_arglist bodystmt kEND
1169
+ {
1170
+ result = @builder.def_method(val[0], val[1],
1171
+ val[3], val[4], val[5])
1172
+
1173
+ @lexer.pop_cmdarg
1174
+ @static_env.unextend
1175
+ @def_level -= 1
1176
+ }
1177
+ | kDEF singleton dot_or_colon
1178
+ {
1179
+ @lexer.state = :expr_fname
1180
+ }
1181
+ fname
1182
+ {
1183
+ @def_level += 1
1184
+ @static_env.extend_static
1185
+ @lexer.push_cmdarg
1186
+ }
1187
+ f_arglist bodystmt kEND
1188
+ {
1189
+ result = @builder.def_singleton(val[0], val[1], val[2],
1190
+ val[4], val[6], val[7], val[8])
1191
+
1192
+ @lexer.pop_cmdarg
1193
+ @static_env.unextend
1194
+ @def_level -= 1
1195
+ }
1196
+ | kBREAK
1197
+ {
1198
+ result = @builder.keyword_cmd(:break, val[0])
1199
+ }
1200
+ | kNEXT
1201
+ {
1202
+ result = @builder.keyword_cmd(:next, val[0])
1203
+ }
1204
+ | kREDO
1205
+ {
1206
+ result = @builder.keyword_cmd(:redo, val[0])
1207
+ }
1208
+ | kRETRY
1209
+ {
1210
+ result = @builder.keyword_cmd(:retry, val[0])
1211
+ }
1212
+
1213
+ primary_value: primary
1214
+
1215
+ then: term
1216
+ | kTHEN
1217
+ | term kTHEN
1218
+ {
1219
+ result = val[1]
1220
+ }
1221
+
1222
+ do: term
1223
+ | kDO_COND
1224
+
1225
+ if_tail: opt_else
1226
+ | kELSIF expr_value then compstmt if_tail
1227
+ {
1228
+ else_t, else_ = val[4]
1229
+ result = [ val[0],
1230
+ @builder.condition(val[0], val[1], val[2],
1231
+ val[3], else_t,
1232
+ else_, nil),
1233
+ ]
1234
+ }
1235
+
1236
+ opt_else: none
1237
+ | kELSE compstmt
1238
+ {
1239
+ result = val
1240
+ }
1241
+
1242
+ for_var: lhs
1243
+ | mlhs
1244
+
1245
+ f_marg: f_norm_arg
1246
+ {
1247
+ result = @builder.arg(val[0])
1248
+ }
1249
+ | tLPAREN f_margs rparen
1250
+ {
1251
+ result = @builder.multi_lhs(val[0], val[1], val[2])
1252
+ }
1253
+
1254
+ f_marg_list: f_marg
1255
+ {
1256
+ result = [ val[0] ]
1257
+ }
1258
+ | f_marg_list tCOMMA f_marg
1259
+ {
1260
+ result = val[0] << val[2]
1261
+ }
1262
+
1263
+ f_margs: f_marg_list
1264
+ | f_marg_list tCOMMA tSTAR f_norm_arg
1265
+ {
1266
+ result = val[0].
1267
+ push(@builder.restarg(val[2], val[3]))
1268
+ }
1269
+ | f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list
1270
+ {
1271
+ result = val[0].
1272
+ push(@builder.restarg(val[2], val[3])).
1273
+ concat(val[5])
1274
+ }
1275
+ | f_marg_list tCOMMA tSTAR
1276
+ {
1277
+ result = val[0].
1278
+ push(@builder.restarg(val[2]))
1279
+ }
1280
+ | f_marg_list tCOMMA tSTAR tCOMMA f_marg_list
1281
+ {
1282
+ result = val[0].
1283
+ push(@builder.restarg(val[2])).
1284
+ concat(val[4])
1285
+ }
1286
+ | tSTAR f_norm_arg
1287
+ {
1288
+ result = [ @builder.restarg(val[0], val[1]) ]
1289
+ }
1290
+ | tSTAR f_norm_arg tCOMMA f_marg_list
1291
+ {
1292
+ result = [ @builder.restarg(val[0], val[1]),
1293
+ *val[3] ]
1294
+ }
1295
+ | tSTAR
1296
+ {
1297
+ result = [ @builder.restarg(val[0]) ]
1298
+ }
1299
+ | tSTAR tCOMMA f_marg_list
1300
+ {
1301
+ result = [ @builder.restarg(val[0]),
1302
+ *val[2] ]
1303
+ }
1304
+
1305
+ block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg
1306
+ {
1307
+ result = val[0].concat(val[2]).concat(val[3])
1308
+ }
1309
+ | f_block_kwarg opt_f_block_arg
1310
+ {
1311
+ result = val[0].concat(val[1])
1312
+ }
1313
+ | f_kwrest opt_f_block_arg
1314
+ {
1315
+ result = val[0].concat(val[1])
1316
+ }
1317
+ | f_block_arg
1318
+ {
1319
+ result = [ val[0] ]
1320
+ }
1321
+
1322
+ opt_block_args_tail:
1323
+ tCOMMA block_args_tail
1324
+ {
1325
+ result = val[1]
1326
+ }
1327
+ | # nothing
1328
+ {
1329
+ result = []
1330
+ }
1331
+
1332
+ block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1333
+ {
1334
+ result = val[0].
1335
+ concat(val[2]).
1336
+ concat(val[4]).
1337
+ concat(val[5])
1338
+ }
1339
+ | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1340
+ {
1341
+ result = val[0].
1342
+ concat(val[2]).
1343
+ concat(val[4]).
1344
+ concat(val[6]).
1345
+ concat(val[7])
1346
+ }
1347
+ | f_arg tCOMMA f_block_optarg opt_block_args_tail
1348
+ {
1349
+ result = val[0].
1350
+ concat(val[2]).
1351
+ concat(val[3])
1352
+ }
1353
+ | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail
1354
+ {
1355
+ result = val[0].
1356
+ concat(val[2]).
1357
+ concat(val[4]).
1358
+ concat(val[5])
1359
+ }
1360
+ | f_arg tCOMMA f_rest_arg opt_block_args_tail
1361
+ {
1362
+ result = val[0].
1363
+ concat(val[2]).
1364
+ concat(val[3])
1365
+ }
1366
+ | f_arg tCOMMA
1367
+ | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1368
+ {
1369
+ result = val[0].
1370
+ concat(val[2]).
1371
+ concat(val[4]).
1372
+ concat(val[5])
1373
+ }
1374
+ | f_arg opt_block_args_tail
1375
+ {
1376
+ result = val[0].concat(val[1])
1377
+ }
1378
+ | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1379
+ {
1380
+ result = val[0].
1381
+ concat(val[2]).
1382
+ concat(val[3])
1383
+ }
1384
+ | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1385
+ {
1386
+ result = val[0].
1387
+ concat(val[2]).
1388
+ concat(val[4]).
1389
+ concat(val[5])
1390
+ }
1391
+ | f_block_optarg opt_block_args_tail
1392
+ {
1393
+ result = val[0].
1394
+ concat(val[1])
1395
+ }
1396
+ | f_block_optarg tCOMMA f_arg opt_block_args_tail
1397
+ {
1398
+ result = val[0].
1399
+ concat(val[2]).
1400
+ concat(val[3])
1401
+ }
1402
+ | f_rest_arg opt_block_args_tail
1403
+ {
1404
+ result = val[0].
1405
+ concat(val[1])
1406
+ }
1407
+ | f_rest_arg tCOMMA f_arg opt_block_args_tail
1408
+ {
1409
+ result = val[0].
1410
+ concat(val[2]).
1411
+ concat(val[3])
1412
+ }
1413
+ | block_args_tail
1414
+
1415
+ opt_block_param: # nothing
1416
+ {
1417
+ result = @builder.args(nil, [], nil)
1418
+ }
1419
+ | block_param_def
1420
+ {
1421
+ @lexer.state = :expr_value
1422
+ }
1423
+
1424
+ block_param_def: tPIPE opt_bv_decl tPIPE
1425
+ {
1426
+ result = @builder.args(val[0], val[1], val[2])
1427
+ }
1428
+ | tOROP
1429
+ {
1430
+ result = @builder.args(val[0], [], val[0])
1431
+ }
1432
+ | tPIPE block_param opt_bv_decl tPIPE
1433
+ {
1434
+ result = @builder.args(val[0], val[1].concat(val[2]), val[3])
1435
+ }
1436
+
1437
+ opt_bv_decl: opt_nl
1438
+ {
1439
+ result = []
1440
+ }
1441
+ | opt_nl tSEMI bv_decls opt_nl
1442
+ {
1443
+ result = val[2]
1444
+ }
1445
+
1446
+ bv_decls: bvar
1447
+ {
1448
+ result = [ val[0] ]
1449
+ }
1450
+ | bv_decls tCOMMA bvar
1451
+ {
1452
+ result = val[0] << val[2]
1453
+ }
1454
+
1455
+ bvar: tIDENTIFIER
1456
+ {
1457
+ result = @builder.shadowarg(val[0])
1458
+ }
1459
+ | f_bad_arg
1460
+
1461
+ lambda: {
1462
+ @static_env.extend_dynamic
1463
+ }
1464
+ f_larglist
1465
+ {
1466
+ result = @lexer.cmdarg.dup
1467
+ @lexer.cmdarg.clear
1468
+ }
1469
+ lambda_body
1470
+ {
1471
+ @lexer.cmdarg = val[2]
1472
+ @lexer.cmdarg.lexpop
1473
+
1474
+ result = [ val[1], val[3] ]
1475
+
1476
+ @static_env.unextend
1477
+ }
1478
+
1479
+ f_larglist: tLPAREN2 f_args opt_bv_decl tRPAREN
1480
+ {
1481
+ result = @builder.args(val[0], val[1].concat(val[2]), val[3])
1482
+ }
1483
+ | f_args
1484
+ {
1485
+ result = @builder.args(nil, val[0], nil)
1486
+ }
1487
+
1488
+ lambda_body: tLAMBEG compstmt tRCURLY
1489
+ {
1490
+ result = [ val[0], val[1], val[2] ]
1491
+ }
1492
+ | kDO_LAMBDA compstmt kEND
1493
+ {
1494
+ result = [ val[0], val[1], val[2] ]
1495
+ }
1496
+
1497
+ do_block: kDO_BLOCK
1498
+ {
1499
+ @static_env.extend_dynamic
1500
+ }
1501
+ opt_block_param compstmt kEND
1502
+ {
1503
+ result = [ val[0], val[2], val[3], val[4] ]
1504
+
1505
+ @static_env.unextend
1506
+ }
1507
+
1508
+ block_call: command do_block
1509
+ {
1510
+ begin_t, block_args, body, end_t = val[1]
1511
+ result = @builder.block(val[0],
1512
+ begin_t, block_args, body, end_t)
1513
+ }
1514
+ | block_call dot_or_colon operation2 opt_paren_args
1515
+ {
1516
+ lparen_t, args, rparen_t = val[3]
1517
+ result = @builder.call_method(val[0], val[1], val[2],
1518
+ lparen_t, args, rparen_t)
1519
+ }
1520
+ | block_call dot_or_colon operation2 opt_paren_args brace_block
1521
+ {
1522
+ lparen_t, args, rparen_t = val[3]
1523
+ method_call = @builder.call_method(val[0], val[1], val[2],
1524
+ lparen_t, args, rparen_t)
1525
+
1526
+ begin_t, args, body, end_t = val[4]
1527
+ result = @builder.block(method_call,
1528
+ begin_t, args, body, end_t)
1529
+ }
1530
+ | block_call dot_or_colon operation2 command_args do_block
1531
+ {
1532
+ method_call = @builder.call_method(val[0], val[1], val[2],
1533
+ nil, val[3], nil)
1534
+
1535
+ begin_t, args, body, end_t = val[4]
1536
+ result = @builder.block(method_call,
1537
+ begin_t, args, body, end_t)
1538
+ }
1539
+
1540
+ method_call: fcall paren_args
1541
+ {
1542
+ lparen_t, args, rparen_t = val[1]
1543
+ result = @builder.call_method(nil, nil, val[0],
1544
+ lparen_t, args, rparen_t)
1545
+ }
1546
+ | primary_value call_op operation2 opt_paren_args
1547
+ {
1548
+ lparen_t, args, rparen_t = val[3]
1549
+ result = @builder.call_method(val[0], val[1], val[2],
1550
+ lparen_t, args, rparen_t)
1551
+ }
1552
+ | primary_value tCOLON2 operation2 paren_args
1553
+ {
1554
+ lparen_t, args, rparen_t = val[3]
1555
+ result = @builder.call_method(val[0], val[1], val[2],
1556
+ lparen_t, args, rparen_t)
1557
+ }
1558
+ | primary_value tCOLON2 operation3
1559
+ {
1560
+ result = @builder.call_method(val[0], val[1], val[2])
1561
+ }
1562
+ | primary_value call_op paren_args
1563
+ {
1564
+ lparen_t, args, rparen_t = val[2]
1565
+ result = @builder.call_method(val[0], val[1], nil,
1566
+ lparen_t, args, rparen_t)
1567
+ }
1568
+ | primary_value tCOLON2 paren_args
1569
+ {
1570
+ lparen_t, args, rparen_t = val[2]
1571
+ result = @builder.call_method(val[0], val[1], nil,
1572
+ lparen_t, args, rparen_t)
1573
+ }
1574
+ | kSUPER paren_args
1575
+ {
1576
+ lparen_t, args, rparen_t = val[1]
1577
+ result = @builder.keyword_cmd(:super, val[0],
1578
+ lparen_t, args, rparen_t)
1579
+ }
1580
+ | kSUPER
1581
+ {
1582
+ result = @builder.keyword_cmd(:zsuper, val[0])
1583
+ }
1584
+ | primary_value tLBRACK2 opt_call_args rbracket
1585
+ {
1586
+ result = @builder.index(val[0], val[1], val[2], val[3])
1587
+ }
1588
+
1589
+ brace_block: tLCURLY
1590
+ {
1591
+ @static_env.extend_dynamic
1592
+ }
1593
+ opt_block_param compstmt tRCURLY
1594
+ {
1595
+ result = [ val[0], val[2], val[3], val[4] ]
1596
+
1597
+ @static_env.unextend
1598
+ }
1599
+ | kDO
1600
+ {
1601
+ @static_env.extend_dynamic
1602
+ }
1603
+ opt_block_param compstmt kEND
1604
+ {
1605
+ result = [ val[0], val[2], val[3], val[4] ]
1606
+
1607
+ @static_env.unextend
1608
+ }
1609
+
1610
+ case_body: kWHEN args then compstmt cases
1611
+ {
1612
+ result = [ @builder.when(val[0], val[1], val[2], val[3]),
1613
+ *val[4] ]
1614
+ }
1615
+
1616
+ cases: opt_else
1617
+ {
1618
+ result = [ val[0] ]
1619
+ }
1620
+ | case_body
1621
+
1622
+ opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue
1623
+ {
1624
+ assoc_t, exc_var = val[2]
1625
+
1626
+ if val[1]
1627
+ exc_list = @builder.array(nil, val[1], nil)
1628
+ end
1629
+
1630
+ result = [ @builder.rescue_body(val[0],
1631
+ exc_list, assoc_t, exc_var,
1632
+ val[3], val[4]),
1633
+ *val[5] ]
1634
+ }
1635
+ |
1636
+ {
1637
+ result = []
1638
+ }
1639
+
1640
+ exc_list: arg_value
1641
+ {
1642
+ result = [ val[0] ]
1643
+ }
1644
+ | mrhs
1645
+ | none
1646
+
1647
+ exc_var: tASSOC lhs
1648
+ {
1649
+ result = [ val[0], val[1] ]
1650
+ }
1651
+ | none
1652
+
1653
+ opt_ensure: kENSURE compstmt
1654
+ {
1655
+ result = [ val[0], val[1] ]
1656
+ }
1657
+ | none
1658
+
1659
+ literal: numeric
1660
+ | symbol
1661
+ | dsym
1662
+
1663
+ strings: string
1664
+ {
1665
+ result = @builder.string_compose(nil, val[0], nil)
1666
+ }
1667
+
1668
+ string: string1
1669
+ {
1670
+ result = [ val[0] ]
1671
+ }
1672
+ | string string1
1673
+ {
1674
+ result = val[0] << val[1]
1675
+ }
1676
+
1677
+ string1: tSTRING_BEG string_contents tSTRING_END
1678
+ {
1679
+ string = @builder.string_compose(val[0], val[1], val[2])
1680
+ result = @builder.dedent_string(string, @lexer.dedent_level)
1681
+ }
1682
+ | tSTRING
1683
+ {
1684
+ string = @builder.string(val[0])
1685
+ result = @builder.dedent_string(string, @lexer.dedent_level)
1686
+ }
1687
+ | tCHARACTER
1688
+ {
1689
+ result = @builder.character(val[0])
1690
+ }
1691
+
1692
+ xstring: tXSTRING_BEG xstring_contents tSTRING_END
1693
+ {
1694
+ string = @builder.xstring_compose(val[0], val[1], val[2])
1695
+ result = @builder.dedent_string(string, @lexer.dedent_level)
1696
+ }
1697
+
1698
+ regexp: tREGEXP_BEG regexp_contents tSTRING_END tREGEXP_OPT
1699
+ {
1700
+ opts = @builder.regexp_options(val[3])
1701
+ result = @builder.regexp_compose(val[0], val[1], val[2], opts)
1702
+ }
1703
+
1704
+ words: tWORDS_BEG word_list tSTRING_END
1705
+ {
1706
+ result = @builder.words_compose(val[0], val[1], val[2])
1707
+ }
1708
+
1709
+ word_list: # nothing
1710
+ {
1711
+ result = []
1712
+ }
1713
+ | word_list word tSPACE
1714
+ {
1715
+ result = val[0] << @builder.word(val[1])
1716
+ }
1717
+
1718
+ word: string_content
1719
+ {
1720
+ result = [ val[0] ]
1721
+ }
1722
+ | word string_content
1723
+ {
1724
+ result = val[0] << val[1]
1725
+ }
1726
+
1727
+ symbols: tSYMBOLS_BEG symbol_list tSTRING_END
1728
+ {
1729
+ result = @builder.symbols_compose(val[0], val[1], val[2])
1730
+ }
1731
+
1732
+ symbol_list: # nothing
1733
+ {
1734
+ result = []
1735
+ }
1736
+ | symbol_list word tSPACE
1737
+ {
1738
+ result = val[0] << @builder.word(val[1])
1739
+ }
1740
+
1741
+ qwords: tQWORDS_BEG qword_list tSTRING_END
1742
+ {
1743
+ result = @builder.words_compose(val[0], val[1], val[2])
1744
+ }
1745
+
1746
+ qsymbols: tQSYMBOLS_BEG qsym_list tSTRING_END
1747
+ {
1748
+ result = @builder.symbols_compose(val[0], val[1], val[2])
1749
+ }
1750
+
1751
+ qword_list: # nothing
1752
+ {
1753
+ result = []
1754
+ }
1755
+ | qword_list tSTRING_CONTENT tSPACE
1756
+ {
1757
+ result = val[0] << @builder.string_internal(val[1])
1758
+ }
1759
+
1760
+ qsym_list: # nothing
1761
+ {
1762
+ result = []
1763
+ }
1764
+ | qsym_list tSTRING_CONTENT tSPACE
1765
+ {
1766
+ result = val[0] << @builder.symbol_internal(val[1])
1767
+ }
1768
+
1769
+ string_contents: # nothing
1770
+ {
1771
+ result = []
1772
+ }
1773
+ | string_contents string_content
1774
+ {
1775
+ result = val[0] << val[1]
1776
+ }
1777
+
1778
+ xstring_contents: # nothing
1779
+ {
1780
+ result = []
1781
+ }
1782
+ | xstring_contents string_content
1783
+ {
1784
+ result = val[0] << val[1]
1785
+ }
1786
+
1787
+ regexp_contents: # nothing
1788
+ {
1789
+ result = []
1790
+ }
1791
+ | regexp_contents string_content
1792
+ {
1793
+ result = val[0] << val[1]
1794
+ }
1795
+
1796
+ string_content: tSTRING_CONTENT
1797
+ {
1798
+ result = @builder.string_internal(val[0])
1799
+ }
1800
+ | tSTRING_DVAR string_dvar
1801
+ {
1802
+ result = val[1]
1803
+ }
1804
+ | tSTRING_DBEG
1805
+ {
1806
+ @lexer.cond.push(false)
1807
+ @lexer.cmdarg.push(false)
1808
+ }
1809
+ compstmt tSTRING_DEND
1810
+ {
1811
+ @lexer.cond.lexpop
1812
+ @lexer.cmdarg.lexpop
1813
+
1814
+ result = @builder.begin(val[0], val[2], val[3])
1815
+ }
1816
+
1817
+ string_dvar: tGVAR
1818
+ {
1819
+ result = @builder.gvar(val[0])
1820
+ }
1821
+ | tIVAR
1822
+ {
1823
+ result = @builder.ivar(val[0])
1824
+ }
1825
+ | tCVAR
1826
+ {
1827
+ result = @builder.cvar(val[0])
1828
+ }
1829
+ | backref
1830
+
1831
+
1832
+ symbol: tSYMBOL
1833
+ {
1834
+ result = @builder.symbol(val[0])
1835
+ }
1836
+
1837
+ dsym: tSYMBEG xstring_contents tSTRING_END
1838
+ {
1839
+ result = @builder.symbol_compose(val[0], val[1], val[2])
1840
+ }
1841
+
1842
+ numeric: simple_numeric
1843
+ {
1844
+ result = val[0]
1845
+ }
1846
+ | tUMINUS_NUM simple_numeric =tLOWEST
1847
+ {
1848
+ result = @builder.negate(val[0], val[1])
1849
+ }
1850
+
1851
+ simple_numeric: tINTEGER
1852
+ {
1853
+ result = @builder.integer(val[0])
1854
+ }
1855
+ | tFLOAT
1856
+ {
1857
+ result = @builder.float(val[0])
1858
+ }
1859
+ | tRATIONAL
1860
+ {
1861
+ result = @builder.rational(val[0])
1862
+ }
1863
+ | tIMAGINARY
1864
+ {
1865
+ result = @builder.complex(val[0])
1866
+ }
1867
+
1868
+ user_variable: tIDENTIFIER
1869
+ {
1870
+ result = @builder.ident(val[0])
1871
+ }
1872
+ | tIVAR
1873
+ {
1874
+ result = @builder.ivar(val[0])
1875
+ }
1876
+ | tGVAR
1877
+ {
1878
+ result = @builder.gvar(val[0])
1879
+ }
1880
+ | tCONSTANT
1881
+ {
1882
+ result = @builder.const(val[0])
1883
+ }
1884
+ | tCVAR
1885
+ {
1886
+ result = @builder.cvar(val[0])
1887
+ }
1888
+
1889
+ keyword_variable: kNIL
1890
+ {
1891
+ result = @builder.nil(val[0])
1892
+ }
1893
+ | kSELF
1894
+ {
1895
+ result = @builder.self(val[0])
1896
+ }
1897
+ | kTRUE
1898
+ {
1899
+ result = @builder.true(val[0])
1900
+ }
1901
+ | kFALSE
1902
+ {
1903
+ result = @builder.false(val[0])
1904
+ }
1905
+ | k__FILE__
1906
+ {
1907
+ result = @builder.__FILE__(val[0])
1908
+ }
1909
+ | k__LINE__
1910
+ {
1911
+ result = @builder.__LINE__(val[0])
1912
+ }
1913
+ | k__ENCODING__
1914
+ {
1915
+ result = @builder.__ENCODING__(val[0])
1916
+ }
1917
+
1918
+ var_ref: user_variable
1919
+ {
1920
+ result = @builder.accessible(val[0])
1921
+ }
1922
+ | keyword_variable
1923
+ {
1924
+ result = @builder.accessible(val[0])
1925
+ }
1926
+
1927
+ var_lhs: user_variable
1928
+ {
1929
+ result = @builder.assignable(val[0])
1930
+ }
1931
+ | keyword_variable
1932
+ {
1933
+ result = @builder.assignable(val[0])
1934
+ }
1935
+
1936
+ backref: tNTH_REF
1937
+ {
1938
+ result = @builder.nth_ref(val[0])
1939
+ }
1940
+ | tBACK_REF
1941
+ {
1942
+ result = @builder.back_ref(val[0])
1943
+ }
1944
+
1945
+ superclass: tLT
1946
+ {
1947
+ @lexer.state = :expr_value
1948
+ }
1949
+ expr_value term
1950
+ {
1951
+ result = [ val[0], val[2] ]
1952
+ }
1953
+ | # nothing
1954
+ {
1955
+ result = nil
1956
+ }
1957
+
1958
+ f_arglist: tLPAREN2 f_args rparen
1959
+ {
1960
+ result = @builder.args(val[0], val[1], val[2])
1961
+
1962
+ @lexer.state = :expr_value
1963
+ }
1964
+ | {
1965
+ result = @lexer.in_kwarg
1966
+ @lexer.in_kwarg = true
1967
+ }
1968
+ f_args term
1969
+ {
1970
+ @lexer.in_kwarg = val[0]
1971
+ result = @builder.args(nil, val[1], nil)
1972
+ }
1973
+
1974
+ args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg
1975
+ {
1976
+ result = val[0].concat(val[2]).concat(val[3])
1977
+ }
1978
+ | f_kwarg opt_f_block_arg
1979
+ {
1980
+ result = val[0].concat(val[1])
1981
+ }
1982
+ | f_kwrest opt_f_block_arg
1983
+ {
1984
+ result = val[0].concat(val[1])
1985
+ }
1986
+ | f_block_arg
1987
+ {
1988
+ result = [ val[0] ]
1989
+ }
1990
+
1991
+ opt_args_tail: tCOMMA args_tail
1992
+ {
1993
+ result = val[1]
1994
+ }
1995
+ | # nothing
1996
+ {
1997
+ result = []
1998
+ }
1999
+
2000
+ f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail
2001
+ {
2002
+ result = val[0].
2003
+ concat(val[2]).
2004
+ concat(val[4]).
2005
+ concat(val[5])
2006
+ }
2007
+ | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
2008
+ {
2009
+ result = val[0].
2010
+ concat(val[2]).
2011
+ concat(val[4]).
2012
+ concat(val[6]).
2013
+ concat(val[7])
2014
+ }
2015
+ | f_arg tCOMMA f_optarg opt_args_tail
2016
+ {
2017
+ result = val[0].
2018
+ concat(val[2]).
2019
+ concat(val[3])
2020
+ }
2021
+ | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail
2022
+ {
2023
+ result = val[0].
2024
+ concat(val[2]).
2025
+ concat(val[4]).
2026
+ concat(val[5])
2027
+ }
2028
+ | f_arg tCOMMA f_rest_arg opt_args_tail
2029
+ {
2030
+ result = val[0].
2031
+ concat(val[2]).
2032
+ concat(val[3])
2033
+ }
2034
+ | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
2035
+ {
2036
+ result = val[0].
2037
+ concat(val[2]).
2038
+ concat(val[4]).
2039
+ concat(val[5])
2040
+ }
2041
+ | f_arg opt_args_tail
2042
+ {
2043
+ result = val[0].
2044
+ concat(val[1])
2045
+ }
2046
+ | f_optarg tCOMMA f_rest_arg opt_args_tail
2047
+ {
2048
+ result = val[0].
2049
+ concat(val[2]).
2050
+ concat(val[3])
2051
+ }
2052
+ | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
2053
+ {
2054
+ result = val[0].
2055
+ concat(val[2]).
2056
+ concat(val[4]).
2057
+ concat(val[5])
2058
+ }
2059
+ | f_optarg opt_args_tail
2060
+ {
2061
+ result = val[0].
2062
+ concat(val[1])
2063
+ }
2064
+ | f_optarg tCOMMA f_arg opt_args_tail
2065
+ {
2066
+ result = val[0].
2067
+ concat(val[2]).
2068
+ concat(val[3])
2069
+ }
2070
+ | f_rest_arg opt_args_tail
2071
+ {
2072
+ result = val[0].
2073
+ concat(val[1])
2074
+ }
2075
+ | f_rest_arg tCOMMA f_arg opt_args_tail
2076
+ {
2077
+ result = val[0].
2078
+ concat(val[2]).
2079
+ concat(val[3])
2080
+ }
2081
+ | args_tail
2082
+ {
2083
+ result = val[0]
2084
+ }
2085
+ | # nothing
2086
+ {
2087
+ result = []
2088
+ }
2089
+
2090
+ f_bad_arg: tCONSTANT
2091
+ {
2092
+ diagnostic :error, :argument_const, nil, val[0]
2093
+ }
2094
+ | tIVAR
2095
+ {
2096
+ diagnostic :error, :argument_ivar, nil, val[0]
2097
+ }
2098
+ | tGVAR
2099
+ {
2100
+ diagnostic :error, :argument_gvar, nil, val[0]
2101
+ }
2102
+ | tCVAR
2103
+ {
2104
+ diagnostic :error, :argument_cvar, nil, val[0]
2105
+ }
2106
+
2107
+ f_norm_arg: f_bad_arg
2108
+ | tIDENTIFIER
2109
+ {
2110
+ @static_env.declare val[0][0]
2111
+
2112
+ result = val[0]
2113
+ }
2114
+
2115
+ f_arg_asgn: f_norm_arg
2116
+ {
2117
+ result = val[0]
2118
+ }
2119
+
2120
+ f_arg_item: f_arg_asgn
2121
+ {
2122
+ result = @builder.arg(val[0])
2123
+ }
2124
+ | tLPAREN f_margs rparen
2125
+ {
2126
+ result = @builder.multi_lhs(val[0], val[1], val[2])
2127
+ }
2128
+
2129
+ f_arg: f_arg_item
2130
+ {
2131
+ result = [ val[0] ]
2132
+ }
2133
+ | f_arg tCOMMA f_arg_item
2134
+ {
2135
+ result = val[0] << val[2]
2136
+ }
2137
+
2138
+ f_label: tLABEL
2139
+ {
2140
+ check_kwarg_name(val[0])
2141
+
2142
+ @static_env.declare val[0][0]
2143
+
2144
+ result = val[0]
2145
+ }
2146
+
2147
+ f_kw: f_label arg_value
2148
+ {
2149
+ result = @builder.kwoptarg(val[0], val[1])
2150
+ }
2151
+ | f_label
2152
+ {
2153
+ result = @builder.kwarg(val[0])
2154
+ }
2155
+
2156
+ f_block_kw: f_label primary_value
2157
+ {
2158
+ result = @builder.kwoptarg(val[0], val[1])
2159
+ }
2160
+ | f_label
2161
+ {
2162
+ result = @builder.kwarg(val[0])
2163
+ }
2164
+
2165
+ f_block_kwarg: f_block_kw
2166
+ {
2167
+ result = [ val[0] ]
2168
+ }
2169
+ | f_block_kwarg tCOMMA f_block_kw
2170
+ {
2171
+ result = val[0] << val[2]
2172
+ }
2173
+
2174
+ f_kwarg: f_kw
2175
+ {
2176
+ result = [ val[0] ]
2177
+ }
2178
+ | f_kwarg tCOMMA f_kw
2179
+ {
2180
+ result = val[0] << val[2]
2181
+ }
2182
+
2183
+ kwrest_mark: tPOW | tDSTAR
2184
+
2185
+ f_kwrest: kwrest_mark tIDENTIFIER
2186
+ {
2187
+ @static_env.declare val[1][0]
2188
+
2189
+ result = [ @builder.kwrestarg(val[0], val[1]) ]
2190
+ }
2191
+ | kwrest_mark
2192
+ {
2193
+ result = [ @builder.kwrestarg(val[0]) ]
2194
+ }
2195
+
2196
+ f_opt: f_arg_asgn tEQL arg_value
2197
+ {
2198
+ result = @builder.optarg(val[0], val[1], val[2])
2199
+ }
2200
+
2201
+ f_block_opt: f_arg_asgn tEQL primary_value
2202
+ {
2203
+ result = @builder.optarg(val[0], val[1], val[2])
2204
+ }
2205
+
2206
+ f_block_optarg: f_block_opt
2207
+ {
2208
+ result = [ val[0] ]
2209
+ }
2210
+ | f_block_optarg tCOMMA f_block_opt
2211
+ {
2212
+ result = val[0] << val[2]
2213
+ }
2214
+
2215
+ f_optarg: f_opt
2216
+ {
2217
+ result = [ val[0] ]
2218
+ }
2219
+ | f_optarg tCOMMA f_opt
2220
+ {
2221
+ result = val[0] << val[2]
2222
+ }
2223
+
2224
+ restarg_mark: tSTAR2 | tSTAR
2225
+
2226
+ f_rest_arg: restarg_mark tIDENTIFIER
2227
+ {
2228
+ @static_env.declare val[1][0]
2229
+
2230
+ result = [ @builder.restarg(val[0], val[1]) ]
2231
+ }
2232
+ | restarg_mark
2233
+ {
2234
+ result = [ @builder.restarg(val[0]) ]
2235
+ }
2236
+
2237
+ blkarg_mark: tAMPER2 | tAMPER
2238
+
2239
+ f_block_arg: blkarg_mark tIDENTIFIER
2240
+ {
2241
+ @static_env.declare val[1][0]
2242
+
2243
+ result = @builder.blockarg(val[0], val[1])
2244
+ }
2245
+
2246
+ opt_f_block_arg: tCOMMA f_block_arg
2247
+ {
2248
+ result = [ val[1] ]
2249
+ }
2250
+ |
2251
+ {
2252
+ result = []
2253
+ }
2254
+
2255
+ singleton: var_ref
2256
+ | tLPAREN2 expr rparen
2257
+ {
2258
+ result = val[1]
2259
+ }
2260
+
2261
+ assoc_list: # nothing
2262
+ {
2263
+ result = []
2264
+ }
2265
+ | assocs trailer
2266
+
2267
+ assocs: assoc
2268
+ {
2269
+ result = [ val[0] ]
2270
+ }
2271
+ | assocs tCOMMA assoc
2272
+ {
2273
+ result = val[0] << val[2]
2274
+ }
2275
+
2276
+ assoc: arg_value tASSOC arg_value
2277
+ {
2278
+ result = @builder.pair(val[0], val[1], val[2])
2279
+ }
2280
+ | tLABEL arg_value
2281
+ {
2282
+ result = @builder.pair_keyword(val[0], val[1])
2283
+ }
2284
+ | tSTRING_BEG string_contents tLABEL_END arg_value
2285
+ {
2286
+ result = @builder.pair_quoted(val[0], val[1], val[2], val[3])
2287
+ }
2288
+ | tDSTAR arg_value
2289
+ {
2290
+ result = @builder.kwsplat(val[0], val[1])
2291
+ }
2292
+
2293
+ operation: tIDENTIFIER | tCONSTANT | tFID
2294
+ operation2: tIDENTIFIER | tCONSTANT | tFID | op
2295
+ operation3: tIDENTIFIER | tFID | op
2296
+ dot_or_colon: call_op | tCOLON2
2297
+ call_op: tDOT
2298
+ {
2299
+ result = [:dot, val[0][1]]
2300
+ }
2301
+ | tANDDOT
2302
+ {
2303
+ result = [:anddot, val[0][1]]
2304
+ }
2305
+ opt_terms: | terms
2306
+ opt_nl: | tNL
2307
+ rparen: opt_nl tRPAREN
2308
+ {
2309
+ result = val[1]
2310
+ }
2311
+ rbracket: opt_nl tRBRACK
2312
+ {
2313
+ result = val[1]
2314
+ }
2315
+ trailer: | tNL | tCOMMA
2316
+
2317
+ term: tSEMI
2318
+ {
2319
+ yyerrok
2320
+ }
2321
+ | tNL
2322
+
2323
+ terms: term
2324
+ | terms tSEMI
2325
+
2326
+ none: # nothing
2327
+ {
2328
+ result = nil
2329
+ }
2330
+ end
2331
+
2332
+ ---- header
2333
+
2334
+ require 'parser'
2335
+
2336
+ Parser.check_for_encoding_support
2337
+
2338
+ ---- inner
2339
+
2340
+ def version
2341
+ 24
2342
+ end
2343
+
2344
+ def default_encoding
2345
+ Encoding::UTF_8
2346
+ end