parser 2.3.0.7 → 2.3.1.0

Sign up to get free protection for your applications and to get access to all the features.
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