ruby_parser 3.20.2 → 3.21.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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/History.rdoc +44 -0
  4. data/Manifest.txt +14 -24
  5. data/README.rdoc +3 -3
  6. data/Rakefile +113 -115
  7. data/compare/normalize.rb +2 -0
  8. data/lib/ruby_lexer.rb +22 -23
  9. data/lib/ruby_lexer.rex.rb +1 -2
  10. data/lib/ruby_parser.rb +15 -13
  11. data/lib/{ruby_parser.yy → ruby_parser2.yy} +3 -10
  12. data/lib/{ruby20_parser.rb → ruby_parser20.rb} +9 -12
  13. data/lib/{ruby21_parser.rb → ruby_parser21.rb} +9 -12
  14. data/lib/{ruby22_parser.rb → ruby_parser22.rb} +9 -12
  15. data/lib/{ruby23_parser.rb → ruby_parser23.rb} +9 -12
  16. data/lib/{ruby24_parser.rb → ruby_parser24.rb} +9 -12
  17. data/lib/{ruby25_parser.rb → ruby_parser25.rb} +9 -12
  18. data/lib/{ruby26_parser.rb → ruby_parser26.rb} +9 -12
  19. data/lib/{ruby27_parser.rb → ruby_parser27.rb} +9 -12
  20. data/lib/{ruby3_parser.yy → ruby_parser3.yy} +32 -36
  21. data/lib/{ruby30_parser.rb → ruby_parser30.rb} +38 -39
  22. data/lib/{ruby31_parser.rb → ruby_parser31.rb} +2788 -2704
  23. data/lib/{ruby32_parser.rb → ruby_parser32.rb} +2735 -2741
  24. data/lib/ruby_parser33.rb +13577 -0
  25. data/lib/ruby_parser_extras.rb +36 -18
  26. data/test/test_ruby_lexer.rb +5 -5
  27. data/test/test_ruby_parser.rb +29 -19
  28. data/tools/munge.rb +8 -2
  29. data/tools/ripper.rb +14 -12
  30. data.tar.gz.sig +0 -0
  31. metadata +41 -51
  32. metadata.gz.sig +0 -0
  33. data/lib/ruby20_parser.y +0 -2707
  34. data/lib/ruby21_parser.y +0 -2724
  35. data/lib/ruby22_parser.y +0 -2735
  36. data/lib/ruby23_parser.y +0 -2737
  37. data/lib/ruby24_parser.y +0 -2745
  38. data/lib/ruby25_parser.y +0 -2745
  39. data/lib/ruby26_parser.y +0 -2760
  40. data/lib/ruby27_parser.y +0 -3360
  41. data/lib/ruby30_parser.y +0 -3486
  42. data/lib/ruby31_parser.y +0 -3520
  43. data/lib/ruby32_parser.y +0 -3521
data/lib/ruby31_parser.y DELETED
@@ -1,3520 +0,0 @@
1
- # -*- racc -*-
2
-
3
- class Ruby31Parser
4
-
5
- token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
6
- kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT
7
- kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER
8
- kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD
9
- kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__
10
- k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT
11
- tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT
12
- tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ
13
- tGEQ tLEQ tANDOP tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF
14
- tASET tLSHFT tRSHFT tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN
15
- tLPAREN2 tRPAREN tLPAREN_ARG tLBRACK tLBRACK2 tRBRACK tLBRACE
16
- tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2 tTILDE tPERCENT tDIVIDE
17
- tPLUS tMINUS tLT tGT tPIPE tBANG tCARET tLCURLY tRCURLY
18
- tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG
19
- tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END
20
- tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA
21
- tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND
22
- tRATIONAL tIMAGINARY
23
- tLABEL_END
24
- tLONELY
25
- tBDOT2 tBDOT3
26
-
27
- preclow
28
- nonassoc tLOWEST
29
- nonassoc tLBRACE_ARG
30
- nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD
31
- left kOR kAND
32
- right kNOT
33
- nonassoc kDEFINED
34
- right tEQL tOP_ASGN
35
- left kRESCUE_MOD
36
- right tEH tCOLON
37
- nonassoc tDOT2 tDOT3 tBDOT2 tBDOT3
38
- left tOROP
39
- left tANDOP
40
- nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
41
- left tGT tGEQ tLT tLEQ
42
- left tPIPE tCARET
43
- left tAMPER2
44
- left tLSHFT tRSHFT
45
- left tPLUS tMINUS
46
- left tSTAR2 tDIVIDE tPERCENT # TODO: tSTAR2 -> tMULT
47
- right tUMINUS_NUM tUMINUS
48
- right tPOW
49
- right tBANG tTILDE tUPLUS
50
- prechigh
51
-
52
- rule
53
-
54
- program: {
55
- self.lexer.lex_state = EXPR_BEG
56
- }
57
- top_compstmt
58
- {
59
- result = new_compstmt val
60
-
61
- lexer.cond.pop # local_pop
62
- lexer.cmdarg.pop
63
- }
64
-
65
- top_compstmt: top_stmts opt_terms
66
- {
67
- stmt, _ = val
68
- result = stmt
69
- }
70
-
71
- top_stmts: none
72
- | top_stmt
73
- | top_stmts terms top_stmt
74
- {
75
- result = self.block_append val[0], val[2]
76
- }
77
- | error top_stmt
78
-
79
- top_stmt: stmt
80
- | klBEGIN
81
- {
82
- if (self.in_def || self.in_single > 0) then
83
- debug 1
84
- yyerror "BEGIN in method"
85
- end
86
- self.env.extend
87
- }
88
- begin_block
89
- {
90
- (_, lineno), _, iter = val
91
- iter.line lineno
92
-
93
- (_, preexe,) = iter
94
- preexe.line lineno
95
-
96
- result = iter
97
- }
98
-
99
- begin_block: tLCURLY top_compstmt tRCURLY
100
- {
101
- (_, line), stmt, _ = val
102
- result = new_iter s(:preexe).line(line), 0, stmt
103
- }
104
-
105
- bodystmt: compstmt opt_rescue k_else
106
- {
107
- res = _values[-2]
108
- yyerror "else without rescue is useless" unless res
109
- }
110
- compstmt
111
- opt_ensure
112
- {
113
- body, resc, _, _, els, ens = val
114
-
115
- result = new_body [body, resc, els, ens]
116
- }
117
- | compstmt opt_rescue opt_ensure
118
- {
119
- body, resc, ens = val
120
-
121
- result = new_body [body, resc, nil, ens]
122
- }
123
-
124
- compstmt: stmts opt_terms
125
- {
126
- result = new_compstmt val
127
- }
128
-
129
- stmts: none
130
- | stmt_or_begin # TODO: newline_node ?
131
- | stmts terms stmt_or_begin
132
- {
133
- result = self.block_append val[0], val[2]
134
- }
135
- | error stmt
136
- {
137
- result = val[1]
138
- debug 2
139
- }
140
-
141
- stmt_or_begin: stmt
142
- | klBEGIN
143
- {
144
- yyerror "BEGIN is permitted only at toplevel"
145
- }
146
- begin_block
147
- {
148
- result = val[2] # wtf?
149
- }
150
-
151
- stmt: kALIAS fitem
152
- {
153
- lexer.lex_state = EXPR_FNAME
154
- }
155
- fitem
156
- {
157
- (_, line), lhs, _, rhs = val
158
- result = s(:alias, lhs, rhs).line(line).line line
159
- }
160
- | kALIAS tGVAR tGVAR
161
- {
162
- (_, line), (lhs, _), (rhs, _) = val
163
- result = s(:valias, lhs.to_sym, rhs.to_sym).line line
164
- }
165
- | kALIAS tGVAR tBACK_REF
166
- {
167
- (_, line), (lhs, _), (rhs, _) = val
168
- result = s(:valias, lhs.to_sym, :"$#{rhs}").line line
169
- }
170
- | kALIAS tGVAR tNTH_REF
171
- {
172
- yyerror "can't make alias for the number variables"
173
- }
174
- | kUNDEF undef_list
175
- {
176
- result = val[1]
177
- }
178
- | stmt kIF_MOD expr_value
179
- {
180
- t, _, c = val
181
- result = new_if c, t, nil
182
- }
183
- | stmt kUNLESS_MOD expr_value
184
- {
185
- f, _, c = val
186
- result = new_if c, nil, f
187
- }
188
- | stmt kWHILE_MOD expr_value
189
- {
190
- e, _, c = val
191
- result = new_while e, c, true
192
- }
193
- | stmt kUNTIL_MOD expr_value
194
- {
195
- e, _, c = val
196
- result = new_until e, c, true
197
- }
198
- | stmt kRESCUE_MOD stmt
199
- {
200
- body, _, resbody = val
201
-
202
- resbody = new_resbody s(:array).line(resbody.line), resbody
203
- result = new_rescue body, resbody
204
- }
205
- | klEND tLCURLY compstmt tRCURLY
206
- {
207
- (_, line), _, stmt, _ = val
208
-
209
- if (self.in_def || self.in_single > 0) then
210
- debug 3
211
- yyerror "END in method; use at_exit"
212
- end
213
-
214
- result = new_iter s(:postexe).line(line), 0, stmt
215
- }
216
- | command_asgn
217
- | mlhs tEQL command_call
218
- {
219
- result = new_masgn val[0], val[2], :wrap
220
- }
221
- | lhs tEQL mrhs
222
- {
223
- lhs, _, rhs = val
224
-
225
- result = new_assign lhs, s(:svalue, rhs).line(rhs.line)
226
- }
227
- | mlhs tEQL mrhs_arg kRESCUE_MOD stmt
228
- {
229
- # unwraps s(:to_ary, rhs)
230
- lhs, _, (_, rhs), _, resbody = val
231
-
232
- resbody = new_resbody s(:array).line(resbody.line), resbody
233
-
234
- result = new_masgn lhs, new_rescue(rhs, resbody), :wrap
235
- }
236
- | mlhs tEQL mrhs_arg
237
- {
238
- result = new_masgn val[0], val[2]
239
- }
240
- | expr
241
-
242
- command_asgn: lhs tEQL command_rhs
243
- {
244
- result = new_assign val[0], val[2]
245
- }
246
- # | lhs tEQL command_asgn
247
- # {
248
- # result = new_assign val[0], val[2]
249
- # }
250
- | var_lhs tOP_ASGN command_rhs
251
- {
252
- result = new_op_asgn val
253
- }
254
- | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs
255
- {
256
- result = new_op_asgn1 val
257
- }
258
- | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs
259
- {
260
- prim, (call_op, _), (id, _), (op_asgn, _), rhs = val
261
-
262
- result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym)
263
- result.sexp_type = :safe_op_asgn if call_op == '&.'
264
- result.line prim.line
265
- }
266
- | primary_value call_op tCONSTANT tOP_ASGN command_rhs
267
- {
268
- prim, (call_op, _), (id, _), (op_asgn, _), rhs = val
269
-
270
- result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym)
271
- result.sexp_type = :safe_op_asgn if call_op == '&.'
272
- result.line prim.line
273
- }
274
- | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs
275
- {
276
- lhs1, _, (lhs2, line), (id, _), rhs = val
277
-
278
- result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line
279
- }
280
- | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs
281
- {
282
- lhs1, _, (lhs2, line), (id, _), rhs = val
283
-
284
- result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line
285
- }
286
- | defn_head f_opt_paren_args tEQL command
287
- {
288
- result = new_endless_defn val
289
- }
290
- | defn_head f_opt_paren_args tEQL command kRESCUE_MOD arg
291
- {
292
- result = new_endless_defn val
293
- }
294
- | defs_head f_opt_paren_args tEQL command
295
- {
296
- result = new_endless_defs val
297
- }
298
- | defs_head f_opt_paren_args tEQL command kRESCUE_MOD arg
299
- {
300
- result = new_endless_defs val
301
- }
302
- | backref tOP_ASGN command_rhs
303
- {
304
- self.backref_assign_error val[0]
305
- }
306
-
307
- command_rhs: command_call =tOP_ASGN
308
- {
309
- expr, = val
310
- result = value_expr expr
311
- }
312
- | command_call kRESCUE_MOD stmt
313
- {
314
- expr, (_, line), resbody = val
315
-
316
- expr = value_expr expr
317
- ary = s(:array).line line
318
- result = new_rescue(expr, new_resbody(ary, resbody))
319
- }
320
- | command_asgn
321
-
322
- expr: command_call
323
- | expr kAND expr
324
- {
325
- lhs, _, rhs = val
326
- result = logical_op :and, lhs, rhs
327
- }
328
- | expr kOR expr
329
- {
330
- lhs, _, rhs = val
331
- result = logical_op :or, lhs, rhs
332
- }
333
- | kNOT opt_nl expr
334
- {
335
- (_, line), _, expr = val
336
- result = new_call(expr, :"!").line line
337
- # REFACTOR: call_uni_op
338
- }
339
- | tBANG command_call
340
- {
341
- _, cmd = val
342
- result = new_call(cmd, :"!").line cmd.line
343
- # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict
344
- # REFACTOR: call_uni_op -- see parse26.y
345
- }
346
- | arg tASSOC
347
- {
348
- # value_expr($1);
349
- self.lexer.lex_state = EXPR_BEG|EXPR_LABEL
350
- self.lexer.command_start = false
351
- result = self.in_kwarg
352
- self.in_kwarg = true
353
- self.env.extend
354
- }
355
- p_top_expr_body
356
- {
357
- lhs, _, in_kwarg, rhs = val
358
-
359
- self.env.unextend
360
- self.in_kwarg = in_kwarg
361
-
362
- rhs = new_in rhs, nil, nil, rhs.line
363
- result = new_case lhs, rhs, rhs.line
364
- }
365
- | arg
366
- kIN
367
- {
368
- # TODO? value_expr($1);
369
- self.lexer.lex_state = EXPR_BEG|EXPR_LABEL
370
- self.lexer.command_start = false
371
- result = self.in_kwarg
372
- self.in_kwarg = true
373
- self.env.extend
374
- }
375
- p_top_expr_body
376
- {
377
- self.env.unextend
378
-
379
- expr, _, old_kwarg, pat = val
380
-
381
- expr = value_expr expr
382
-
383
- self.in_kwarg = old_kwarg
384
- pat_in = new_in pat, nil, nil, expr.line
385
- result = new_case expr, pat_in, expr.line
386
- }
387
- | arg =tLBRACE_ARG
388
-
389
- def_name: fname
390
- {
391
- # TODO: numparam_name(p, fname);
392
-
393
- (id, line), = val
394
- old_in_def = self.in_def
395
-
396
- self.in_def = true # group = local_push
397
- self.env.extend
398
- lexer.cmdarg.push false
399
- lexer.cond.push false
400
-
401
- result = [id.to_sym, line, old_in_def]
402
- }
403
- defn_head: k_def def_name
404
- {
405
- _, name = val
406
- result = name
407
- }
408
- defs_head: k_def singleton dot_or_colon
409
- {
410
- lexer.lex_state = EXPR_FNAME
411
- }
412
- def_name
413
- {
414
- lexer.lex_state = EXPR_ENDFN|EXPR_LABEL
415
- self.in_single += 1 # TODO: remove?
416
-
417
- # self.in_def = true # local_push
418
- # self.env.extend
419
- # lexer.cmdarg.push false
420
- # lexer.cond.push false
421
-
422
- _, recv, _, _, name = val
423
-
424
- result = [recv, name]
425
- }
426
-
427
- expr_value: expr
428
- {
429
- result = value_expr(val[0])
430
- }
431
-
432
- expr_value_do: {
433
- lexer.cond.push true
434
- }
435
- expr_value do
436
- {
437
- lexer.cond.pop
438
- }
439
- {
440
- _, expr, _, _ = val
441
- result = expr
442
- }
443
-
444
- command_call: command
445
- | block_command
446
-
447
- block_command: block_call
448
- | block_call call_op2 operation2 command_args
449
- {
450
- blk, _, (msg, _line), args = val
451
- result = new_call(blk, msg.to_sym, args).line blk.line
452
- }
453
-
454
- cmd_brace_block: tLBRACE_ARG
455
- {
456
- # self.env.extend(:dynamic)
457
- result = self.lexer.lineno
458
- }
459
- brace_body tRCURLY
460
- {
461
- _, line, body, _ = val
462
-
463
- result = body
464
- result.line line
465
-
466
- # self.env.unextend
467
- }
468
-
469
- fcall: operation
470
- {
471
- (msg, line), = val
472
- result = new_call(nil, msg.to_sym).line line
473
- }
474
-
475
- command: fcall command_args =tLOWEST
476
- {
477
- call, args = val
478
- result = call.concat args.sexp_body
479
- }
480
- | fcall command_args cmd_brace_block
481
- {
482
- call, args, block = val
483
-
484
- result = call.concat args.sexp_body
485
-
486
- if block then
487
- block_dup_check result, block
488
-
489
- result, operation = block, result
490
- result.insert 1, operation
491
- end
492
- }
493
- | primary_value call_op operation2 command_args =tLOWEST
494
- {
495
- lhs, callop, (op, _), args = val
496
-
497
- result = new_call lhs, op.to_sym, args, callop
498
- result.line lhs.line
499
- }
500
- | primary_value call_op operation2 command_args cmd_brace_block
501
- {
502
- recv, _, (msg, _line), args, block = val
503
- call = new_call recv, msg.to_sym, args, val[1]
504
-
505
- block_dup_check call, block
506
-
507
- block.insert 1, call
508
- result = block
509
- }
510
- | primary_value tCOLON2 operation2 command_args =tLOWEST
511
- {
512
- lhs, _, (id, line), args = val
513
-
514
- result = new_call lhs, id.to_sym, args
515
- result.line line
516
- }
517
- | primary_value tCOLON2 operation2 command_args cmd_brace_block
518
- {
519
- recv, _, (msg, _line), args, block = val
520
- call = new_call recv, msg.to_sym, args
521
-
522
- block_dup_check call, block
523
-
524
- block.insert 1, call
525
- result = block
526
- }
527
- | kSUPER command_args
528
- {
529
- result = new_super val[1]
530
- }
531
- | kYIELD command_args
532
- {
533
- (_, line), args = val
534
- result = new_yield args
535
- result.line line # TODO: push to new_yield
536
- }
537
- | k_return call_args
538
- {
539
- line = val[0].last
540
- result = s(:return, ret_args(val[1])).line(line)
541
- }
542
- | kBREAK call_args
543
- {
544
- (_, line), args = val
545
- result = s(:break, ret_args(args)).line line
546
- }
547
- | kNEXT call_args
548
- {
549
- line = val[0].last
550
- result = s(:next, ret_args(val[1])).line(line)
551
- }
552
-
553
- mlhs: mlhs_basic
554
- | tLPAREN mlhs_inner rparen
555
- {
556
- result = val[1]
557
- }
558
-
559
- mlhs_inner: mlhs_basic
560
- | tLPAREN mlhs_inner rparen
561
- {
562
- _, arg, _ = val
563
- l = arg.line
564
-
565
- result = s(:masgn, s(:array, arg).line(l)).line l
566
- }
567
-
568
- mlhs_basic: mlhs_head
569
- {
570
- head, = val
571
- result = s(:masgn, head).line head.line
572
- }
573
- | mlhs_head mlhs_item
574
- {
575
- lhs, rhs = val
576
- result = s(:masgn, lhs << rhs.compact).line lhs.line
577
- }
578
- | mlhs_head tSTAR mlhs_node
579
- {
580
- head, _, tail = val
581
- head << s(:splat, tail).line(tail.line)
582
- result = s(:masgn, head).line head.line
583
- }
584
- | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post
585
- {
586
- ary1, _, splat, _, ary2 = val
587
-
588
- result = list_append ary1, s(:splat, splat).line(splat.line)
589
- result.concat ary2.sexp_body
590
- result = s(:masgn, result).line result.line
591
- }
592
- | mlhs_head tSTAR
593
- {
594
- head, _ = val
595
- l = head.line
596
- result = s(:masgn, head << s(:splat).line(l)).line l
597
- }
598
- | mlhs_head tSTAR tCOMMA mlhs_post
599
- {
600
- head, _, _, post = val
601
- ary = list_append head, s(:splat).line(head.line)
602
- ary.concat post.sexp_body
603
- result = s(:masgn, ary).line ary.line
604
- }
605
- | tSTAR mlhs_node
606
- {
607
- _, node = val
608
- l = node.line
609
- splat = s(:splat, node).line l
610
- ary = s(:array, splat).line l
611
- result = s(:masgn, ary).line l
612
- }
613
- | tSTAR mlhs_node tCOMMA mlhs_post
614
- {
615
- _, node, _, post = val
616
-
617
- splat = s(:splat, node).line node.line
618
- ary = s(:array, splat).line splat.line
619
- ary.concat post.sexp_body
620
- result = s(:masgn, ary).line ary.line
621
- }
622
- | tSTAR
623
- {
624
- (_, l), = val
625
- result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l
626
- }
627
- | tSTAR tCOMMA mlhs_post
628
- {
629
- _, _, post = val
630
- l = post.line
631
-
632
- splat = s(:splat).line l
633
- ary = s(:array, splat, *post.sexp_body).line l
634
- result = s(:masgn, ary).line l
635
- }
636
-
637
- mlhs_item: mlhs_node
638
- | tLPAREN mlhs_inner rparen
639
- {
640
- result = val[1]
641
- }
642
-
643
- mlhs_head: mlhs_item tCOMMA
644
- {
645
- lhs, _ = val
646
- result = s(:array, lhs).line lhs.line
647
- }
648
- | mlhs_head mlhs_item tCOMMA
649
- {
650
- result = val[0] << val[1].compact
651
- }
652
-
653
- mlhs_post: mlhs_item
654
- {
655
- item, = val
656
- result = s(:array, item).line item.line
657
- }
658
- | mlhs_post tCOMMA mlhs_item
659
- {
660
- result = list_append val[0], val[2]
661
- }
662
-
663
- mlhs_node: user_variable
664
- {
665
- result = self.assignable val[0]
666
- }
667
- | keyword_variable
668
- {
669
- result = self.assignable val[0]
670
- }
671
- | primary_value tLBRACK2 opt_call_args rbracket
672
- {
673
- result = self.aryset val[0], val[2]
674
- }
675
- | primary_value call_op tIDENTIFIER
676
- {
677
- lhs, call_op, (id, _line) = val
678
-
679
- result = new_attrasgn lhs, id, call_op
680
- }
681
- | primary_value tCOLON2 tIDENTIFIER
682
- {
683
- recv, _, (id, _line) = val
684
- result = new_attrasgn recv, id
685
- }
686
- | primary_value call_op tCONSTANT
687
- {
688
- lhs, call_op, (id, _line) = val
689
-
690
- result = new_attrasgn lhs, id, call_op
691
- }
692
- | primary_value tCOLON2 tCONSTANT
693
- {
694
- if (self.in_def || self.in_single > 0) then
695
- debug 4
696
- yyerror "dynamic constant assignment"
697
- end
698
-
699
- expr, _, (id, _line) = val
700
- l = expr.line
701
-
702
- result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l
703
- }
704
- | tCOLON3 tCONSTANT
705
- {
706
- if (self.in_def || self.in_single > 0) then
707
- debug 5
708
- yyerror "dynamic constant assignment"
709
- end
710
-
711
- _, (id, l) = val
712
-
713
- result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l
714
- }
715
- | backref
716
- {
717
- ref, = val
718
-
719
- self.backref_assign_error ref
720
- }
721
-
722
- lhs: user_variable
723
- {
724
- var, = val
725
-
726
- result = self.assignable var
727
- }
728
- | keyword_variable
729
- {
730
- var, = val
731
-
732
- result = self.assignable var
733
-
734
- debug 6
735
- }
736
- | primary_value tLBRACK2 opt_call_args rbracket
737
- {
738
- lhs, _, args, _ = val
739
-
740
- result = self.aryset lhs, args
741
- }
742
- | primary_value call_op tIDENTIFIER # REFACTOR
743
- {
744
- lhs, op, (id, _line) = val
745
-
746
- result = new_attrasgn lhs, id, op
747
- }
748
- | primary_value tCOLON2 tIDENTIFIER
749
- {
750
- lhs, _, (id, _line) = val
751
-
752
- result = new_attrasgn lhs, id
753
- }
754
- | primary_value call_op tCONSTANT # REFACTOR?
755
- {
756
- lhs, call_op, (id, _line) = val
757
-
758
- result = new_attrasgn lhs, id, call_op
759
- }
760
- | primary_value tCOLON2 tCONSTANT
761
- {
762
- expr, _, (id, _line) = val
763
-
764
- if (self.in_def || self.in_single > 0) then
765
- debug 7
766
- yyerror "dynamic constant assignment"
767
- end
768
-
769
- l = expr.line
770
- result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l
771
- }
772
- | tCOLON3 tCONSTANT
773
- {
774
- _, (id, l) = val
775
-
776
- if (self.in_def || self.in_single > 0) then
777
- debug 8
778
- yyerror "dynamic constant assignment"
779
- end
780
-
781
- result = s(:const, s(:colon3, id.to_sym).line(l)).line l
782
- }
783
- | backref
784
- {
785
- self.backref_assign_error val[0]
786
- }
787
-
788
- cname: tIDENTIFIER
789
- {
790
- yyerror "class/module name must be CONSTANT"
791
- }
792
- | tCONSTANT
793
-
794
- cpath: tCOLON3 cname
795
- {
796
- result = wrap :colon3, val[1]
797
- }
798
- | cname
799
- {
800
- (id, line), = val
801
- result = [id.to_sym, line] # TODO: sexp?
802
- }
803
- | primary_value tCOLON2 cname
804
- {
805
- pval, _, (name, _line) = val
806
-
807
- result = s(:colon2, pval, name.to_sym)
808
- result.line pval.line
809
- }
810
-
811
- fname: tIDENTIFIER | tCONSTANT | tFID
812
- | op
813
- {
814
- lexer.lex_state = EXPR_END
815
- }
816
-
817
- | reswords
818
-
819
- fitem: fname
820
- {
821
- result = wrap :lit, val[0]
822
- }
823
- | symbol
824
-
825
- undef_list: fitem
826
- {
827
- result = new_undef val[0]
828
- }
829
- |
830
- undef_list tCOMMA
831
- {
832
- lexer.lex_state = EXPR_FNAME
833
- }
834
- fitem
835
- {
836
- result = new_undef val[0], val[3]
837
- }
838
-
839
- op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ
840
- | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ
841
- | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
842
- | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE
843
- | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2
844
-
845
- reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND
846
- | kALIAS | kAND | kBEGIN | kBREAK | kCASE
847
- | kCLASS | kDEF | kDEFINED | kDO | kELSE
848
- | kELSIF | kEND | kENSURE | kFALSE | kFOR
849
- | kIN | kMODULE | kNEXT | kNIL | kNOT
850
- | kOR | kREDO | kRESCUE | kRETRY | kRETURN
851
- | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF
852
- | kWHEN | kYIELD | kIF | kUNLESS | kWHILE
853
- | kUNTIL
854
-
855
- arg: lhs tEQL arg_rhs
856
- {
857
- result = new_assign val[0], val[2]
858
- }
859
- | var_lhs tOP_ASGN arg_rhs
860
- {
861
- result = new_op_asgn val
862
- }
863
- | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs
864
- {
865
- result = new_op_asgn1 val
866
- }
867
- | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs
868
- {
869
- result = new_op_asgn2 val
870
- }
871
- | primary_value call_op tCONSTANT tOP_ASGN arg_rhs
872
- {
873
- result = new_op_asgn2 val
874
- }
875
- | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs
876
- {
877
- lhs, _, (id, _line), (op, _), rhs = val
878
-
879
- result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line
880
- }
881
- | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs
882
- {
883
- lhs1, _, (lhs2, _line), op, rhs = val
884
-
885
- lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line
886
- result = new_const_op_asgn [lhs, op, rhs]
887
- }
888
- | tCOLON3 tCONSTANT tOP_ASGN arg_rhs
889
- {
890
- _, lhs, op, rhs = val
891
-
892
- lhs = wrap :colon3, lhs
893
- result = new_const_op_asgn [lhs, op, rhs]
894
- }
895
- | backref tOP_ASGN arg_rhs
896
- {
897
- # TODO: lhs = var_field val[0]
898
- asgn = new_op_asgn val
899
- result = self.backref_assign_error asgn
900
- }
901
- | arg tDOT2 arg
902
- {
903
- v1, v2 = val[0], val[2]
904
- if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then
905
- result = s(:lit, (v1.last)..(v2.last)).line v1.line
906
- else
907
- result = s(:dot2, v1, v2).line v1.line
908
- end
909
- }
910
- | arg tDOT3 arg
911
- {
912
- v1, v2 = val[0], val[2]
913
- if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then
914
- result = s(:lit, (v1.last)...(v2.last)).line v1.line
915
- else
916
- result = s(:dot3, v1, v2).line v1.line
917
- end
918
- }
919
- | arg tDOT2
920
- {
921
- v1, _ = val
922
- v2 = nil
923
-
924
- result = s(:dot2, v1, v2).line v1.line
925
- }
926
- | arg tDOT3
927
- {
928
- v1, _ = val
929
- v2 = nil
930
-
931
- result = s(:dot3, v1, v2).line v1.line
932
- }
933
-
934
- | tBDOT2 arg
935
- {
936
- _, v2, = val
937
- v1 = nil
938
-
939
- result = s(:dot2, v1, v2).line v2.line
940
- }
941
- | tBDOT3 arg
942
- {
943
- _, v2 = val
944
- v1 = nil
945
-
946
- result = s(:dot3, v1, v2).line v2.line
947
- }
948
-
949
- | arg tPLUS arg
950
- {
951
- result = new_call val[0], :+, argl(val[2])
952
- }
953
- | arg tMINUS arg
954
- {
955
- result = new_call val[0], :-, argl(val[2])
956
- }
957
- | arg tSTAR2 arg # TODO: rename
958
- {
959
- result = new_call val[0], :*, argl(val[2])
960
- }
961
- | arg tDIVIDE arg
962
- {
963
- result = new_call val[0], :"/", argl(val[2])
964
- }
965
- | arg tPERCENT arg
966
- {
967
- result = new_call val[0], :"%", argl(val[2])
968
- }
969
- | arg tPOW arg
970
- {
971
- result = new_call val[0], :**, argl(val[2])
972
- }
973
- | tUMINUS_NUM simple_numeric tPOW arg
974
- {
975
- _, num, _, arg = val
976
- lit = wrap :lit, num
977
- result = new_call(new_call(lit, :"**", argl(arg)), :"-@")
978
-
979
- }
980
- | tUPLUS arg
981
- {
982
- result = new_call val[1], :"+@"
983
- }
984
- | tUMINUS arg
985
- {
986
- result = new_call val[1], :"-@"
987
- }
988
- | arg tPIPE arg
989
- {
990
- result = new_call val[0], :"|", argl(val[2])
991
- }
992
- | arg tCARET arg
993
- {
994
- result = new_call val[0], :"^", argl(val[2])
995
- }
996
- | arg tAMPER2 arg
997
- {
998
- result = new_call val[0], :"&", argl(val[2])
999
- }
1000
- | arg tCMP arg
1001
- {
1002
- result = new_call val[0], :"<=>", argl(val[2])
1003
- }
1004
- | rel_expr =tCMP
1005
- | arg tEQ arg
1006
- {
1007
- result = new_call val[0], :"==", argl(val[2])
1008
- }
1009
- | arg tEQQ arg
1010
- {
1011
- result = new_call val[0], :"===", argl(val[2])
1012
- }
1013
- | arg tNEQ arg
1014
- {
1015
- result = new_call val[0], :"!=", argl(val[2])
1016
- }
1017
- | arg tMATCH arg
1018
- {
1019
- lhs, _, rhs = val
1020
- result = new_match lhs, rhs
1021
- }
1022
- | arg tNMATCH arg
1023
- {
1024
- lhs, _, rhs = val
1025
- result = s(:not, new_match(lhs, rhs)).line lhs.line
1026
- }
1027
- | tBANG arg
1028
- {
1029
- _, arg = val
1030
- result = new_call arg, :"!"
1031
- result.line arg.line
1032
- }
1033
- | tTILDE arg
1034
- {
1035
- result = new_call value_expr(val[1]), :"~"
1036
- }
1037
- | arg tLSHFT arg
1038
- {
1039
- val[0] = value_expr val[0]
1040
- val[2] = value_expr val[2]
1041
- result = new_call val[0], :"\<\<", argl(val[2])
1042
- }
1043
- | arg tRSHFT arg
1044
- {
1045
- val[0] = value_expr val[0]
1046
- val[2] = value_expr val[2]
1047
- result = new_call val[0], :">>", argl(val[2])
1048
- }
1049
- | arg tANDOP arg
1050
- {
1051
- result = logical_op :and, val[0], val[2]
1052
- }
1053
- | arg tOROP arg
1054
- {
1055
- result = logical_op :or, val[0], val[2]
1056
- }
1057
- | kDEFINED opt_nl arg
1058
- {
1059
- (_, line), _, arg = val
1060
- result = s(:defined, arg).line line
1061
- }
1062
- | arg tEH arg opt_nl tCOLON arg
1063
- {
1064
- c, _, t, _, _, f = val
1065
- result = s(:if, c, t, f).line c.line
1066
- }
1067
- | defn_head f_opt_paren_args tEQL arg
1068
- {
1069
- result = new_endless_defn val
1070
- }
1071
- | defn_head f_opt_paren_args tEQL arg kRESCUE_MOD arg
1072
- {
1073
- result = new_endless_defn val
1074
- }
1075
- | defs_head f_opt_paren_args tEQL arg
1076
- {
1077
- result = new_endless_defs val
1078
- }
1079
- | defs_head f_opt_paren_args tEQL arg kRESCUE_MOD arg
1080
- {
1081
- result = new_endless_defs val
1082
- }
1083
- | primary
1084
-
1085
- relop: tGT
1086
- | tLT
1087
- | tGEQ
1088
- | tLEQ
1089
-
1090
- rel_expr: arg relop arg =tGT
1091
- {
1092
- lhs, (op, _), rhs = val
1093
- result = new_call lhs, op.to_sym, argl(rhs)
1094
- }
1095
- | rel_expr relop arg =tGT
1096
- {
1097
- lhs, (op, _), rhs = val
1098
- warn "comparison '%s' after comparison", op
1099
- result = new_call lhs, op.to_sym, argl(rhs)
1100
- }
1101
-
1102
- arg_value: arg
1103
- {
1104
- result = value_expr(val[0])
1105
- }
1106
-
1107
- aref_args: none
1108
- | args trailer
1109
- {
1110
- result = args [val[0]]
1111
- }
1112
- | args tCOMMA assocs trailer
1113
- {
1114
- result = args [val[0], array_to_hash(val[2])]
1115
- }
1116
- | assocs trailer
1117
- {
1118
- result = args [array_to_hash(val[0])]
1119
- }
1120
-
1121
- arg_rhs: arg =tOP_ASGN
1122
- | arg kRESCUE_MOD arg
1123
- {
1124
- body, (_, line), resbody = val
1125
- body = value_expr body
1126
- resbody = remove_begin resbody
1127
-
1128
- ary = s(:array).line line
1129
- result = new_rescue(body, new_resbody(ary, resbody))
1130
- }
1131
-
1132
- paren_args: tLPAREN2 opt_call_args rparen
1133
- {
1134
- _, args, (_, line_max) = val
1135
-
1136
- result = args
1137
- result.line_max = line_max if args
1138
- }
1139
- | tLPAREN2 args tCOMMA args_forward rparen
1140
- {
1141
- yyerror "Unexpected ..." unless
1142
- self.lexer.is_local_id(:"*") &&
1143
- self.lexer.is_local_id(:"**") &&
1144
- self.lexer.is_local_id(:"&")
1145
-
1146
- result = call_args val
1147
- }
1148
- | tLPAREN2 args_forward rparen
1149
- {
1150
- yyerror "Unexpected ..." unless
1151
- self.lexer.is_local_id(:"*") &&
1152
- self.lexer.is_local_id(:"**") &&
1153
- self.lexer.is_local_id(:"&")
1154
-
1155
- result = call_args val
1156
- }
1157
-
1158
- opt_paren_args: none
1159
- | paren_args
1160
-
1161
- opt_call_args: none
1162
- | call_args
1163
- | args tCOMMA
1164
- {
1165
- result = args val
1166
- }
1167
- | args tCOMMA assocs tCOMMA
1168
- {
1169
- result = args [val[0], array_to_hash(val[2])]
1170
- }
1171
- | assocs tCOMMA
1172
- {
1173
- result = args [array_to_hash(val[0])]
1174
- }
1175
-
1176
- call_args: command
1177
- {
1178
- warning "parenthesize argument(s) for future version"
1179
- result = call_args val
1180
- }
1181
- | args opt_block_arg
1182
- {
1183
- result = call_args val
1184
- }
1185
- | assocs opt_block_arg
1186
- {
1187
- result = call_args [array_to_hash(val[0]), val[1]]
1188
- }
1189
- | args tCOMMA assocs opt_block_arg
1190
- {
1191
- result = call_args [val[0], array_to_hash(val[2]), val[3]]
1192
- }
1193
- | block_arg
1194
- {
1195
- result = call_args val
1196
- }
1197
-
1198
- command_args: {
1199
- # parse26.y line 2200
1200
-
1201
- # If call_args starts with a open paren '(' or
1202
- # '[', look-ahead reading of the letters calls
1203
- # CMDARG_PUSH(0), but the push must be done
1204
- # after CMDARG_PUSH(1). So this code makes them
1205
- # consistent by first cancelling the premature
1206
- # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and
1207
- # finally redoing CMDARG_PUSH(0).
1208
-
1209
- result = yychar = self.last_token_type.first
1210
- lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar)
1211
- lexer.cmdarg.pop if lookahead
1212
- lexer.cmdarg.push true
1213
- lexer.cmdarg.push false if lookahead
1214
- }
1215
- call_args
1216
- {
1217
- yychar, args = val
1218
-
1219
- # call_args can be followed by tLBRACE_ARG (that
1220
- # does CMDARG_PUSH(0) in the lexer) but the push
1221
- # must be done after CMDARG_POP() in the parser.
1222
- # So this code does CMDARG_POP() to pop 0 pushed
1223
- # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed
1224
- # by command_args, and CMDARG_PUSH(0) to restore
1225
- # back the flag set by tLBRACE_ARG.
1226
-
1227
- lookahead = [:tLBRACE_ARG].include?(yychar)
1228
- lexer.cmdarg.pop if lookahead
1229
- lexer.cmdarg.pop
1230
- lexer.cmdarg.push false if lookahead
1231
- result = args
1232
- }
1233
-
1234
- block_arg: tAMPER arg_value
1235
- {
1236
- _, arg = val
1237
- result = s(:block_pass, arg).line arg.line
1238
- }
1239
- | tAMPER
1240
- {
1241
- (_, line), = val
1242
- result = s(:block_pass).line line
1243
- }
1244
-
1245
- opt_block_arg: tCOMMA block_arg
1246
- {
1247
- result = val[1]
1248
- }
1249
- | none
1250
-
1251
- args: arg_value
1252
- {
1253
- arg, = val
1254
- lineno = arg.line
1255
-
1256
- result = s(:array, arg).line lineno
1257
- }
1258
- | tSTAR arg_value
1259
- {
1260
- _, arg = val
1261
- result = s(:array, s(:splat, arg).line(arg.line)).line arg.line
1262
- }
1263
- | args tCOMMA arg_value
1264
- {
1265
- args, _, id = val
1266
- result = self.list_append args, id
1267
- }
1268
- | args tCOMMA tSTAR arg_value
1269
- {
1270
- args, _, (_, line), id = val
1271
- result = self.list_append args, s(:splat, id).line(line)
1272
- }
1273
-
1274
- mrhs_arg: mrhs
1275
- {
1276
- result = new_masgn_arg val[0]
1277
- }
1278
- | arg_value
1279
- {
1280
- result = new_masgn_arg val[0], :wrap
1281
- }
1282
-
1283
- mrhs: args tCOMMA arg_value
1284
- {
1285
- result = val[0] << val[2]
1286
- }
1287
- | args tCOMMA tSTAR arg_value
1288
- {
1289
- arg, _, _, splat = val
1290
- result = self.arg_concat arg, splat
1291
- }
1292
- | tSTAR arg_value
1293
- {
1294
- _, arg = val
1295
- result = s(:splat, arg).line arg.line
1296
- }
1297
-
1298
- primary: literal
1299
- | strings
1300
- | xstring
1301
- | regexp
1302
- | words
1303
- | qwords
1304
- | symbols
1305
- | qsymbols
1306
- | var_ref
1307
- | backref
1308
- | tFID
1309
- {
1310
- (msg, line), = val
1311
- result = new_call nil, msg.to_sym
1312
- result.line line
1313
- }
1314
- | k_begin
1315
- {
1316
- lexer.cmdarg.push false
1317
- }
1318
- bodystmt k_end
1319
- {
1320
- lexer.cmdarg.pop
1321
- result = new_begin val
1322
- }
1323
- | tLPAREN_ARG
1324
- {
1325
- lexer.lex_state = EXPR_ENDARG
1326
- }
1327
- rparen
1328
- {
1329
- (_, line), _, _ = val
1330
- result = s(:begin).line line
1331
- }
1332
- | tLPAREN_ARG
1333
- stmt
1334
- {
1335
- lexer.lex_state = EXPR_ENDARG
1336
- }
1337
- rparen
1338
- {
1339
- _, stmt, _, _, = val
1340
- # warning "(...) interpreted as grouped expression"
1341
- result = stmt
1342
- }
1343
- | tLPAREN compstmt tRPAREN
1344
- {
1345
- (_, line), stmt, _ = val
1346
- result = stmt || s(:nil).line(line)
1347
- result.paren = true
1348
- }
1349
- | primary_value tCOLON2 tCONSTANT
1350
- {
1351
- expr, _, (id, _line) = val
1352
-
1353
- result = s(:colon2, expr, id.to_sym).line expr.line
1354
- }
1355
- | tCOLON3 tCONSTANT
1356
- {
1357
- result = wrap :colon3, val[1]
1358
- }
1359
- | tLBRACK aref_args rbracket
1360
- {
1361
- (_, line), args, (_, line_max) = val
1362
-
1363
- result = args || s(:array)
1364
- result.sexp_type = :array # aref_args is :args
1365
- result.line line
1366
- result.line_max = line_max
1367
- }
1368
- | tLBRACE
1369
- {
1370
- result = self.lexer.lineno
1371
- }
1372
- assoc_list tRCURLY
1373
- {
1374
- result = new_hash val
1375
- }
1376
- | k_return
1377
- {
1378
- (_, line), = val
1379
- result = s(:return).line line
1380
- }
1381
- | kYIELD tLPAREN2 call_args rparen
1382
- {
1383
- (_, line), _, args, _ = val
1384
-
1385
- result = new_yield(args).line line
1386
- }
1387
- | kYIELD tLPAREN2 rparen
1388
- {
1389
- (_, line), _, _ = val
1390
-
1391
- result = new_yield.line line
1392
- }
1393
- | kYIELD
1394
- {
1395
- (_, line), = val
1396
-
1397
- result = new_yield.line line
1398
- }
1399
- | kDEFINED opt_nl tLPAREN2 expr rparen
1400
- {
1401
- (_, line), _, _, arg, _ = val
1402
-
1403
- result = s(:defined, arg).line line
1404
- }
1405
- | kNOT tLPAREN2 expr rparen
1406
- {
1407
- _, _, lhs, _ = val
1408
- result = new_call lhs, :"!"
1409
- }
1410
- | kNOT tLPAREN2 rparen
1411
- {
1412
- debug 9
1413
- }
1414
- | fcall brace_block
1415
- {
1416
- call, iter = val
1417
-
1418
- iter.insert 1, call
1419
- result = iter
1420
- # FIX: probably not: call.line = iter.line
1421
- }
1422
- | method_call
1423
- | method_call brace_block
1424
- {
1425
- call, iter = val[0], val[1]
1426
- block_dup_check call, iter
1427
- iter.insert 1, call # FIX
1428
- result = iter
1429
- }
1430
- | lambda
1431
- {
1432
- expr, = val
1433
- result = expr
1434
- }
1435
- | k_if expr_value then compstmt if_tail k_end
1436
- {
1437
- _, c, _, t, f, _ = val
1438
- result = new_if c, t, f
1439
- }
1440
- | k_unless expr_value then compstmt opt_else k_end
1441
- {
1442
- _, c, _, t, f, _ = val
1443
- result = new_if c, f, t
1444
- }
1445
- | k_while expr_value_do compstmt k_end
1446
- {
1447
- _, cond, body, _ = val
1448
- result = new_while body, cond, true
1449
- }
1450
- | k_until expr_value_do compstmt k_end
1451
- {
1452
- _, cond, body, _ = val
1453
- result = new_until body, cond, true
1454
- }
1455
- | k_case expr_value opt_terms case_body k_end
1456
- {
1457
- (_, line), expr, _, body, _ = val
1458
- result = new_case expr, body, line
1459
- }
1460
- | k_case opt_terms case_body k_end
1461
- {
1462
- (_, line), _, body, _ = val
1463
- result = new_case nil, body, line
1464
- }
1465
- | k_case expr_value opt_terms p_case_body k_end
1466
- {
1467
- (_, line), expr, _, body, _ = val
1468
-
1469
- result = new_case expr, body, line
1470
- }
1471
- | k_for for_var kIN expr_value_do compstmt k_end
1472
- {
1473
- _, var, _, iter, body, _ = val
1474
- result = new_for iter, var, body
1475
- }
1476
- | k_class
1477
- cpath superclass
1478
- {
1479
- if (self.in_def || self.in_single > 0) then
1480
- yyerror "class definition in method body"
1481
- end
1482
- self.env.extend
1483
- }
1484
- bodystmt k_end
1485
- {
1486
- result = new_class val
1487
- self.env.unextend
1488
- self.lexer.ignore_body_comments
1489
- }
1490
- | k_class tLSHFT
1491
- expr
1492
- {
1493
- result = self.in_def
1494
- self.in_def = false
1495
- }
1496
- term
1497
- {
1498
- result = self.in_single
1499
- self.in_single = 0
1500
- self.env.extend
1501
- }
1502
- bodystmt
1503
- k_end
1504
- {
1505
- result = new_sclass val
1506
- self.env.unextend
1507
- self.lexer.ignore_body_comments
1508
- }
1509
- | k_module
1510
- cpath
1511
- {
1512
- yyerror "module definition in method body" if
1513
- self.in_def or self.in_single > 0
1514
-
1515
- self.env.extend
1516
- }
1517
- bodystmt k_end
1518
- {
1519
- result = new_module val
1520
- self.env.unextend
1521
- self.lexer.ignore_body_comments
1522
- }
1523
- | defn_head f_arglist bodystmt k_end
1524
- {
1525
- # [ [:f, 1, false], s(:args)...]
1526
- # =>
1527
- # [[:k_def, 666], [:f, 1], false, s(:args)...]
1528
- val.insert 1, val.first.pop
1529
- val.insert 0, [:k_def, 666]
1530
-
1531
- result, in_def = new_defn val
1532
-
1533
- lexer.cond.pop # group = local_pop
1534
- lexer.cmdarg.pop
1535
- self.env.unextend
1536
- self.in_def = in_def
1537
-
1538
- self.lexer.ignore_body_comments
1539
- }
1540
- | defs_head f_arglist bodystmt k_end
1541
- {
1542
- # [ [recv, [:name, 1, false]], s(:args...]
1543
- # =>
1544
- # [ recv, [:name, 1, false], s(:args...]
1545
- # =>
1546
- # [ recv, [:name, 1], false, s(:args...]
1547
- # =>
1548
- # [ :k_def, recv, [:name, 1], false, s(:args...]
1549
-
1550
- val.prepend(*val.shift)
1551
- val.insert 2, val[1].pop
1552
- val.insert 0, [:k_def, 666]
1553
-
1554
- result, in_def = new_defs val
1555
-
1556
- lexer.cond.pop # group = local_pop
1557
- lexer.cmdarg.pop
1558
- self.env.unextend
1559
- self.in_def = in_def
1560
-
1561
- self.in_single -= 1
1562
-
1563
- # TODO: restore cur_arg ? what's cur_arg?
1564
-
1565
- self.lexer.ignore_body_comments
1566
- }
1567
- | kBREAK
1568
- {
1569
- (_, line), = val
1570
- result = s(:break).line line
1571
- }
1572
- | kNEXT
1573
- {
1574
- (_, line), = val
1575
- result = s(:next).line line
1576
- }
1577
- | kREDO
1578
- {
1579
- (_, line), = val
1580
- result = s(:redo).line line
1581
- }
1582
- | kRETRY
1583
- {
1584
- (_, line), = val
1585
- result = s(:retry).line line
1586
- }
1587
-
1588
- primary_value: primary
1589
- {
1590
- result = value_expr(val[0])
1591
- }
1592
-
1593
- # These are really stupid
1594
- k_begin: kBEGIN
1595
- k_if: kIF
1596
- k_unless: kUNLESS
1597
- k_while: kWHILE
1598
- k_until: kUNTIL
1599
- k_case: kCASE
1600
- k_for: kFOR
1601
- k_class: kCLASS
1602
- {
1603
- self.comments.push self.lexer.comments
1604
- }
1605
- k_module: kMODULE
1606
- {
1607
- self.comments.push self.lexer.comments
1608
- }
1609
- k_def: kDEF
1610
- {
1611
- self.comments.push self.lexer.comments
1612
- }
1613
- k_do: kDO
1614
- k_do_block: kDO_BLOCK
1615
- k_rescue: kRESCUE
1616
- k_ensure: kENSURE
1617
- k_when: kWHEN
1618
- k_else: kELSE
1619
- k_elsif: kELSIF
1620
- k_end: kEND
1621
- k_return: kRETURN
1622
-
1623
- then: term
1624
- | kTHEN
1625
- | term kTHEN
1626
-
1627
- do: term
1628
- | kDO_COND
1629
-
1630
- if_tail: opt_else
1631
- | k_elsif expr_value then compstmt if_tail
1632
- {
1633
- (_, line), c, _, t, rest = val
1634
-
1635
- result = s(:if, c, t, rest).line line
1636
- }
1637
-
1638
- opt_else: none
1639
- | kELSE compstmt
1640
- {
1641
- result = val[1]
1642
- }
1643
-
1644
- for_var: lhs
1645
- | mlhs
1646
- {
1647
- val[0].delete_at 1 if val[0][1].nil? # HACK
1648
- }
1649
-
1650
- f_marg: f_norm_arg
1651
- {
1652
- (sym, line), = val
1653
-
1654
- result = s(:dummy, sym).line line
1655
- }
1656
- | tLPAREN f_margs rparen
1657
- {
1658
- _, args, _ = val
1659
- result = args
1660
- }
1661
-
1662
- f_marg_list: f_marg
1663
- {
1664
- arg, = val
1665
- line = arg.line
1666
-
1667
- arg = arg.last if arg.sexp_type == :dummy
1668
-
1669
- result = s(:array, arg).line line
1670
- }
1671
- | f_marg_list tCOMMA f_marg
1672
- {
1673
- args, _, arg = val
1674
-
1675
- arg = arg.last if arg.sexp_type == :dummy
1676
-
1677
- result = list_append args, arg
1678
- }
1679
-
1680
- f_margs: f_marg_list
1681
- {
1682
- args, = val
1683
-
1684
- result = block_var args
1685
- }
1686
- | f_marg_list tCOMMA f_rest_marg
1687
- {
1688
- args, _, rest = val
1689
-
1690
- result = block_var args, rest
1691
- }
1692
- | f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list
1693
- {
1694
- lhs, _, splat, _, rhs = val
1695
-
1696
- result = block_var lhs, splat, rhs
1697
- }
1698
- | f_rest_marg
1699
- {
1700
- rest, = val
1701
-
1702
- result = block_var rest
1703
- }
1704
- | f_rest_marg tCOMMA f_marg_list
1705
- {
1706
- splat, _, rest = val
1707
-
1708
- result = block_var splat, rest
1709
- }
1710
-
1711
- f_rest_marg: tSTAR f_norm_arg
1712
- {
1713
- _, (id, line) = val
1714
-
1715
- result = args ["*#{id}".to_sym]
1716
- result.line line
1717
- }
1718
- | tSTAR
1719
- {
1720
- (_, line), = val
1721
- result = args([:*]).line line
1722
- }
1723
-
1724
- f_any_kwrest: f_kwrest
1725
- | f_no_kwarg
1726
-
1727
- f_eq: tEQL # TODO: self.in_argdef = false
1728
-
1729
- block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg
1730
- {
1731
- result = call_args val
1732
- }
1733
- | f_block_kwarg opt_f_block_arg
1734
- {
1735
- result = call_args val
1736
- }
1737
- | f_any_kwrest opt_f_block_arg
1738
- {
1739
- result = call_args val
1740
- }
1741
- | f_block_arg
1742
- {
1743
- (id, line), = val
1744
- result = call_args [id]
1745
- result.line line
1746
- }
1747
-
1748
- opt_block_args_tail: tCOMMA block_args_tail
1749
- {
1750
- result = args val
1751
- }
1752
- | none
1753
-
1754
- excessed_comma: tCOMMA
1755
- {
1756
- result = s(:WTF_COMMA!)
1757
- }
1758
-
1759
- block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1760
- {
1761
- result = args val
1762
- }
1763
- | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1764
- {
1765
- result = args val
1766
- }
1767
- | f_arg tCOMMA f_block_optarg opt_block_args_tail
1768
- {
1769
- result = args val
1770
- }
1771
- | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail
1772
- {
1773
- result = args val
1774
- }
1775
- | f_arg tCOMMA f_rest_arg opt_block_args_tail
1776
- {
1777
- result = args val
1778
- }
1779
- | f_arg excessed_comma
1780
- {
1781
- arg, _ = val
1782
- result = arg << nil
1783
- }
1784
- | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1785
- {
1786
- result = args val
1787
- }
1788
- | f_arg opt_block_args_tail
1789
- {
1790
- result = args val
1791
- }
1792
- | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1793
- {
1794
- result = args val
1795
- }
1796
- | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1797
- {
1798
- result = args val
1799
- }
1800
- | f_block_optarg opt_block_args_tail
1801
- {
1802
- result = args val
1803
- }
1804
- | f_block_optarg tCOMMA f_arg opt_block_args_tail
1805
- {
1806
- result = args val
1807
- }
1808
- | f_rest_arg opt_block_args_tail
1809
- {
1810
- result = args val
1811
- }
1812
- | f_rest_arg tCOMMA f_arg opt_block_args_tail
1813
- {
1814
- result = args val
1815
- }
1816
- | block_args_tail
1817
- {
1818
- result = args val
1819
- }
1820
-
1821
- opt_block_param: none { result = 0 }
1822
- | block_param_def
1823
- {
1824
- self.lexer.command_start = true
1825
- }
1826
-
1827
- block_param_def: tPIPE opt_bv_decl tPIPE
1828
- {
1829
- # TODO: current_arg = 0
1830
- result = args val
1831
- }
1832
- | tOROP
1833
- {
1834
- (_, line), = val
1835
-
1836
- result = s(:args).line line
1837
- }
1838
- | tPIPE block_param opt_bv_decl tPIPE
1839
- {
1840
- # TODO: current_arg = 0
1841
- result = args val
1842
- }
1843
-
1844
- opt_bv_decl: opt_nl
1845
- | opt_nl tSEMI bv_decls opt_nl
1846
- {
1847
- result = args val
1848
- }
1849
-
1850
- bv_decls: bvar
1851
- {
1852
- result = args val
1853
- }
1854
- | bv_decls tCOMMA bvar
1855
- {
1856
- result = args val
1857
- }
1858
-
1859
- bvar: tIDENTIFIER
1860
- {
1861
- result = wrap :shadow, val[0]
1862
- }
1863
- | f_bad_arg
1864
-
1865
- lambda: tLAMBDA
1866
- {
1867
- self.env.extend :dynamic
1868
- result = lexer.lpar_beg
1869
- lexer.paren_nest += 1
1870
- lexer.lpar_beg = lexer.paren_nest
1871
- }
1872
- f_larglist
1873
- {
1874
- lexer.cmdarg.push false
1875
- }
1876
- lambda_body
1877
- {
1878
- (_, line), lpar, args, _cmdarg, body = val
1879
- lexer.lpar_beg = lpar
1880
-
1881
- lexer.cmdarg.pop
1882
-
1883
- call = s(:lambda).line line
1884
- result = new_iter call, args, body
1885
- result.line line
1886
- self.env.unextend # TODO: dynapush & dynapop
1887
- }
1888
-
1889
- f_larglist: tLPAREN2 f_args opt_bv_decl rparen
1890
- {
1891
- result = args val
1892
- }
1893
- | f_args
1894
- {
1895
- result = val[0]
1896
- result = 0 if result == s(:args)
1897
- }
1898
-
1899
- lambda_body: tLAMBEG compstmt tRCURLY
1900
- {
1901
- result = val[1]
1902
- }
1903
- | kDO_LAMBDA bodystmt kEND
1904
- {
1905
- result = val[1]
1906
- }
1907
-
1908
- do_block: k_do_block do_body kEND
1909
- {
1910
- (_, line), iter, _ = val
1911
- result = iter.line line
1912
- }
1913
-
1914
- block_call: command do_block
1915
- {
1916
- # TODO:
1917
- ## if (nd_type($1) == NODE_YIELD) {
1918
- ## compile_error(PARSER_ARG "block given to yield");
1919
-
1920
- cmd, blk = val
1921
-
1922
- syntax_error "Both block arg and actual block given." if
1923
- cmd.block_pass?
1924
-
1925
- if inverted? val then
1926
- val = invert_block_call val
1927
- cmd, blk = val
1928
- end
1929
-
1930
- result = blk
1931
- result.insert 1, cmd
1932
- }
1933
- | block_call call_op2 operation2 opt_paren_args
1934
- {
1935
- lhs, _, (id, _line), args = val
1936
-
1937
- result = new_call lhs, id.to_sym, args
1938
- }
1939
- | block_call call_op2 operation2 opt_paren_args brace_block
1940
- {
1941
- iter1, _, (name, _line), args, iter2 = val
1942
-
1943
- call = new_call iter1, name.to_sym, args
1944
- iter2.insert 1, call
1945
-
1946
- result = iter2
1947
- }
1948
- | block_call call_op2 operation2 command_args do_block
1949
- {
1950
- iter1, _, (name, _line), args, iter2 = val
1951
-
1952
- call = new_call iter1, name.to_sym, args
1953
- iter2.insert 1, call
1954
-
1955
- result = iter2
1956
- }
1957
-
1958
- method_call: fcall paren_args
1959
- {
1960
- call, args = val
1961
-
1962
- result = call
1963
-
1964
- if args then
1965
- call.concat args.sexp_body
1966
- result.line_max = args.line_max
1967
- end
1968
- }
1969
- | primary_value call_op operation2 opt_paren_args
1970
- {
1971
- recv, call_op, (op, op_line), args = val
1972
-
1973
- result = new_call recv, op.to_sym, args, call_op
1974
- result.line_max = op_line unless args
1975
- }
1976
- | primary_value tCOLON2 operation2 paren_args
1977
- {
1978
- recv, _, (op, _line), args = val
1979
-
1980
- result = new_call recv, op.to_sym, args
1981
- }
1982
- | primary_value tCOLON2 operation3
1983
- {
1984
- lhs, _, (id, _line) = val
1985
-
1986
- result = new_call lhs, id.to_sym
1987
- }
1988
- | primary_value call_op paren_args
1989
- {
1990
- result = new_call val[0], :call, val[2], val[1]
1991
- }
1992
- | primary_value tCOLON2 paren_args
1993
- {
1994
- result = new_call val[0], :call, val[2]
1995
- }
1996
- | kSUPER paren_args
1997
- {
1998
- result = new_super val[1]
1999
- }
2000
- | kSUPER
2001
- {
2002
- (_, line), = val
2003
- result = s(:zsuper).line line
2004
- }
2005
- | primary_value tLBRACK2 opt_call_args rbracket
2006
- {
2007
- result = new_aref val
2008
- }
2009
-
2010
- brace_block: tLCURLY
2011
- {
2012
- self.env.extend :dynamic
2013
- }
2014
- brace_body
2015
- tRCURLY
2016
- {
2017
- (_, line), _, body, _ = val
2018
-
2019
- result = body
2020
- result.line line
2021
-
2022
- self.env.unextend
2023
- }
2024
- | k_do
2025
- {
2026
- self.env.extend :dynamic
2027
- }
2028
- do_body
2029
- kEND
2030
- {
2031
- (_, line), _, body, _ = val
2032
-
2033
- result = body
2034
- result.line line
2035
-
2036
- self.env.unextend
2037
- }
2038
-
2039
- brace_body: { self.env.extend :dynamic; result = self.lexer.lineno }
2040
- { result = lexer.cmdarg.store(false) }
2041
- opt_block_param compstmt
2042
- {
2043
- line, cmdarg, param, cmpstmt = val
2044
-
2045
- result = new_brace_body param, cmpstmt, line
2046
- self.env.unextend
2047
- lexer.cmdarg.restore cmdarg
2048
- lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ?
2049
- }
2050
-
2051
- do_body: { self.env.extend :dynamic; result = self.lexer.lineno }
2052
- { lexer.cmdarg.push false }
2053
- opt_block_param
2054
- bodystmt
2055
- {
2056
- line, _cmdarg, param, cmpstmt = val
2057
-
2058
- result = new_do_body param, cmpstmt, line
2059
- lexer.cmdarg.pop
2060
- self.env.unextend
2061
- }
2062
-
2063
- case_args: arg_value
2064
- {
2065
- arg, = val
2066
-
2067
- result = s(:array, arg).line arg.line
2068
- }
2069
- | tSTAR arg_value
2070
- {
2071
- _, arg = val
2072
-
2073
- result = s(:array, s(:splat, arg).line(arg.line)).line arg.line
2074
- }
2075
- | case_args tCOMMA arg_value
2076
- {
2077
- args, _, id = val
2078
-
2079
- result = self.list_append args, id
2080
- }
2081
- | case_args tCOMMA tSTAR arg_value
2082
- {
2083
- args, _, _, id = val
2084
-
2085
- result = self.list_append args, s(:splat, id).line(id.line)
2086
- }
2087
-
2088
- case_body: k_when
2089
- case_args then compstmt cases
2090
- {
2091
- (_, line), case_args, _then, body, cases = val
2092
-
2093
- result = new_when case_args, body
2094
- result.line line
2095
- result << cases if cases
2096
- }
2097
-
2098
- cases: opt_else | case_body
2099
- ######################################################################
2100
-
2101
- p_case_body: kIN
2102
- {
2103
- self.lexer.lex_state = EXPR_BEG|EXPR_LABEL
2104
- self.lexer.command_start = false
2105
- result = self.in_kwarg
2106
- self.in_kwarg = true
2107
- push_pvtbl
2108
- push_pktbl
2109
- }
2110
- p_top_expr then
2111
- {
2112
- pop_pktbl
2113
- pop_pvtbl
2114
- old_kwargs = _values[-3]
2115
- self.in_kwarg = old_kwargs
2116
- }
2117
- compstmt
2118
- p_cases
2119
- {
2120
- (_, line), _, pat, _, _, body, cases = val
2121
-
2122
- result = new_in pat, body, cases, line
2123
- }
2124
-
2125
- p_cases: opt_else
2126
- | p_case_body
2127
-
2128
- p_top_expr: p_top_expr_body
2129
- | p_top_expr_body kIF_MOD expr_value
2130
- {
2131
- body, _, cond = val
2132
- body = remove_begin body
2133
-
2134
- result = s(:if, cond, body, nil).line body.line
2135
- }
2136
- | p_top_expr_body kUNLESS_MOD expr_value
2137
- {
2138
- body, _, cond = val
2139
- body = remove_begin body
2140
-
2141
- result = s(:if, cond, nil, body).line body.line
2142
- }
2143
-
2144
- p_top_expr_body: p_expr
2145
- | p_expr tCOMMA
2146
- {
2147
- expr, _ = val
2148
-
2149
- tail = new_array_pattern_tail nil, true, nil, nil
2150
- result = new_array_pattern nil, expr, tail, expr.line
2151
- }
2152
- | p_expr tCOMMA p_args
2153
- {
2154
- expr, _, args = val
2155
-
2156
- result = new_array_pattern nil, expr, args, expr.line
2157
- }
2158
- | p_find
2159
- {
2160
- find, = val
2161
-
2162
- result = new_find_pattern nil, find
2163
- }
2164
- | p_args_tail
2165
- {
2166
- args, = val
2167
- result = new_array_pattern nil, nil, args, args.line
2168
- }
2169
- | p_kwargs
2170
- {
2171
- kwargs, = val
2172
- result = new_hash_pattern nil, kwargs, kwargs.line
2173
- }
2174
-
2175
- p_expr: p_as
2176
-
2177
- p_as: p_expr tASSOC p_variable
2178
- {
2179
- # NODE *n = NEW_LIST($1, &@$);
2180
- # n = list_append(p, n, $3);
2181
- # $$ = new_hash(p, n, &@$);
2182
-
2183
- expr, _, var = val
2184
-
2185
- id = var.last
2186
-
2187
- self.env[id] = :lvar # HACK: need to extend env
2188
- lhs = s(:lasgn, id).line var.line
2189
-
2190
- result = new_assign lhs, expr
2191
- }
2192
- | p_alt
2193
-
2194
- p_alt: p_alt tPIPE p_expr_basic
2195
- {
2196
- lhs, _, rhs = val
2197
-
2198
- result = s(:or, lhs, rhs).line lhs.line
2199
- }
2200
- | p_expr_basic
2201
-
2202
- p_lparen: tLPAREN2 { push_pktbl }
2203
- p_lbracket: tLBRACK2 { push_pktbl }
2204
-
2205
- p_expr_basic: p_value
2206
- | p_variable
2207
- | p_const p_lparen p_args tRPAREN
2208
- {
2209
- lhs, _, args, _ = val
2210
-
2211
- pop_pktbl
2212
- result = new_array_pattern(lhs, nil, args, lhs.line)
2213
- }
2214
- | p_const p_lparen p_find tRPAREN
2215
- {
2216
- const, _, find, _ = val
2217
-
2218
- pop_pktbl
2219
- result = new_find_pattern(const, find).line const.line
2220
- }
2221
- | p_const p_lparen p_kwargs tRPAREN
2222
- {
2223
- lhs, _, kwargs, _ = val
2224
-
2225
- pop_pktbl
2226
- result = new_hash_pattern(lhs, kwargs, lhs.line)
2227
- }
2228
- | p_const tLPAREN2 tRPAREN
2229
- {
2230
- const, _, _ = val
2231
-
2232
- tail = new_array_pattern_tail nil, nil, nil, nil
2233
- result = new_array_pattern const, nil, tail, const.line
2234
- }
2235
- | p_const p_lbracket p_args rbracket
2236
- {
2237
- const, _, pre_arg, _ = val
2238
-
2239
- pop_pktbl
2240
- result = new_array_pattern const, nil, pre_arg, const.line
2241
- }
2242
- | p_const p_lbracket p_find rbracket
2243
- {
2244
- const, _, find, _ = val
2245
-
2246
- pop_pktbl
2247
- result = new_find_pattern(const, find).line const.line
2248
- }
2249
- | p_const p_lbracket p_kwargs rbracket
2250
- {
2251
- const, _, kwargs, _ = val
2252
-
2253
- result = new_hash_pattern const, kwargs, const.line
2254
- }
2255
- | p_const tLBRACK2 rbracket
2256
- {
2257
- const, _, _ = val
2258
-
2259
- tail = new_array_pattern_tail nil, nil, nil, nil
2260
- result = new_array_pattern const, nil, tail, const.line
2261
- }
2262
- | tLBRACK p_args rbracket
2263
- {
2264
- _, pat, _ = val
2265
-
2266
- result = new_array_pattern nil, nil, pat, pat.line
2267
- }
2268
- | tLBRACK p_find rbracket
2269
- {
2270
- _, find, _ = val
2271
-
2272
- result = new_find_pattern nil, find
2273
- }
2274
- | tLBRACK rbracket
2275
- {
2276
- (_, line), _ = val
2277
-
2278
- result = s(:array_pat).line line
2279
- }
2280
- | tLBRACE
2281
- {
2282
- push_pktbl
2283
- result = self.in_kwarg
2284
- self.in_kwarg = false
2285
- }
2286
- p_kwargs rbrace
2287
- {
2288
- _, in_kwarg, kwargs, _ = val
2289
-
2290
- pop_pktbl
2291
- self.in_kwarg = in_kwarg
2292
-
2293
- result = new_hash_pattern(nil, kwargs, kwargs.line)
2294
- }
2295
- | tLBRACE rbrace
2296
- {
2297
- (_, line), _ = val
2298
-
2299
- tail = new_hash_pattern_tail nil, nil, line
2300
- result = new_hash_pattern nil, tail, line
2301
- }
2302
- | tLPAREN { push_pktbl } p_expr tRPAREN
2303
- {
2304
- _, _, expr, _ = val
2305
-
2306
- pop_pktbl
2307
- result = expr
2308
- }
2309
-
2310
- p_args: p_expr
2311
- {
2312
- expr, = val
2313
-
2314
- ary = s(:array_TAIL, expr).line expr.line
2315
- result = new_array_pattern_tail(ary, nil, nil, nil).line expr.line
2316
- }
2317
- | p_args_head
2318
- {
2319
- head, = val
2320
-
2321
- result = new_array_pattern_tail head, true, nil, nil
2322
- }
2323
- | p_args_head p_arg
2324
- {
2325
- head, tail = val
2326
-
2327
- both = array_pat_concat head, tail
2328
-
2329
- result = new_array_pattern_tail both, nil, nil, nil
2330
- result.line head.line
2331
- }
2332
- | p_args_head tSTAR tIDENTIFIER
2333
- {
2334
- head, _, (id, _line) = val
2335
-
2336
- result = new_array_pattern_tail head, true, id.to_sym, nil
2337
- result.line head.line
2338
- }
2339
- | p_args_head tSTAR tIDENTIFIER tCOMMA p_args_post
2340
- {
2341
- head, _, (id, _line), _, post = val
2342
-
2343
- result = new_array_pattern_tail head, true, id.to_sym, post
2344
- result.line head.line
2345
- }
2346
- | p_args_head tSTAR
2347
- {
2348
- expr, _ = val
2349
-
2350
- result = new_array_pattern_tail(expr, true, nil, nil).line expr.line
2351
- }
2352
- | p_args_head tSTAR tCOMMA p_args_post
2353
- {
2354
- head, _, _, post = val
2355
-
2356
- result = new_array_pattern_tail(head, true, nil, post).line head.line
2357
- }
2358
- | p_args_tail
2359
-
2360
- p_args_head: p_arg tCOMMA
2361
- {
2362
- arg, _ = val
2363
- result = arg
2364
- }
2365
- | p_args_head p_arg tCOMMA
2366
- {
2367
- head, tail, _ = val
2368
-
2369
- result = s(:PATTERN, *head.sexp_body, *tail.sexp_body)
2370
- result.line head.line
2371
- }
2372
-
2373
- p_args_tail: p_rest
2374
- {
2375
- (id, line), = val
2376
-
2377
- result = new_array_pattern_tail nil, true, id, nil
2378
- result.line line
2379
- }
2380
- | p_rest tCOMMA p_args_post
2381
- {
2382
- (id, line), _, rhs = val
2383
-
2384
- result = new_array_pattern_tail nil, true, id, rhs
2385
- result.line line
2386
- }
2387
-
2388
- p_find: p_rest tCOMMA p_args_post tCOMMA p_rest
2389
- {
2390
- lhs, _, mid, _, rhs = val
2391
-
2392
- result = new_find_pattern_tail lhs, mid, rhs
2393
- }
2394
-
2395
- p_rest: tSTAR tIDENTIFIER
2396
- {
2397
- _, (id, line) = val
2398
-
2399
- result = [id.to_sym, line]
2400
- }
2401
- | tSTAR
2402
- {
2403
- (_id, line), = val
2404
-
2405
- result = [nil, line]
2406
- }
2407
-
2408
- p_args_post: p_arg
2409
- | p_args_post tCOMMA p_arg
2410
- {
2411
- lhs, _, rhs = val
2412
-
2413
- result = array_pat_concat lhs, rhs
2414
- }
2415
-
2416
- p_arg: p_expr
2417
- {
2418
- expr, = val
2419
- expr = s(:array_TAIL, expr).line expr.line unless
2420
- expr.sexp_type == :array_TAIL
2421
- result = expr
2422
- }
2423
-
2424
- p_kwargs: p_kwarg tCOMMA p_any_kwrest
2425
- {
2426
- kw_arg, _, rest = val
2427
- # TODO? new_unique_key_hash(p, $1, &@$)
2428
- result = new_hash_pattern_tail kw_arg, rest, kw_arg.line
2429
- }
2430
- | p_kwarg
2431
- {
2432
- kwarg, = val
2433
- # TODO? new_unique_key_hash(p, $1, &@$)
2434
- result = new_hash_pattern_tail kwarg, nil, kwarg.line
2435
- }
2436
- | p_kwarg tCOMMA
2437
- {
2438
- kwarg, _ = val
2439
- # TODO? new_unique_key_hash(p, $1, &@$)
2440
- result = new_hash_pattern_tail kwarg, nil, kwarg.line
2441
- }
2442
- | p_any_kwrest
2443
- {
2444
- rest, = val
2445
-
2446
- result = new_hash_pattern_tail nil, rest, rest.line
2447
- }
2448
-
2449
- p_kwarg: p_kw # TODO? rb_ary_new_from_args(1, $1)
2450
- | p_kwarg tCOMMA p_kw
2451
- {
2452
- kwarg, _, kw = val
2453
- kwarg.concat kw.sexp_body
2454
- result = kwarg
2455
- }
2456
-
2457
- p_kw: p_kw_label p_expr
2458
- {
2459
- # TODO: error_duplicate_pattern_key(p, get_id($1), &@1);
2460
- lhs, rhs = val
2461
-
2462
- result = s(:PAIR, lhs, rhs).line lhs.line
2463
- }
2464
- | p_kw_label
2465
- {
2466
- lhs, = val
2467
-
2468
- # TODO: error_duplicate_pattern_variable(p, get_id($1), &@1);
2469
-
2470
- # TODO: if ($1 && !is_local_id(get_id($1))) {
2471
- # yyerror1(&@1, "key must be valid as local variables");
2472
- # }
2473
-
2474
- # $$ = list_append(p, NEW_LIST(NEW_LIT(ID2SYM($1), &@$), &@$),
2475
- # assignable(p, $1, 0, &@$));
2476
-
2477
- case lhs.sexp_type
2478
- when :lit then
2479
- assignable [lhs.value, lhs.line]
2480
- else
2481
- # TODO or done?
2482
- debug 10
2483
- end
2484
-
2485
- # TODO PAIR -> LIST ?
2486
- result = s(:PAIR, lhs, nil).line lhs.line
2487
- }
2488
-
2489
- p_kw_label: tLABEL
2490
- {
2491
- result = wrap :lit, val[0]
2492
- }
2493
- | tSTRING_BEG string_contents tLABEL_END
2494
- {
2495
- # you can't actually get here the way I lex labels
2496
- debug 11
2497
- }
2498
-
2499
- p_kwrest: kwrest_mark tIDENTIFIER
2500
- {
2501
- _, (id, line) = val
2502
-
2503
- name = id.to_sym
2504
- self.assignable [name, line]
2505
- result = s(:kwrest, :"**#{name}").line line
2506
- }
2507
- | kwrest_mark
2508
- {
2509
- (_, line), = val
2510
-
2511
- result = s(:kwrest, :"**").line line
2512
- }
2513
-
2514
- p_kwnorest: kwrest_mark kNIL
2515
- {
2516
- (_, line), _ = val
2517
-
2518
- # TODO: or s(:norest)? s(:**nil)?
2519
- result = s(:kwrest, :"**nil").line line
2520
- }
2521
-
2522
- p_any_kwrest: p_kwrest
2523
- | p_kwnorest
2524
-
2525
- p_value: p_primitive
2526
- | p_primitive tDOT2 p_primitive
2527
- {
2528
- lhs, _, rhs = val
2529
-
2530
- lhs = value_expr lhs
2531
- rhs = value_expr rhs
2532
-
2533
- result = s(:dot2, lhs, rhs).line lhs.line
2534
- }
2535
- | p_primitive tDOT3 p_primitive
2536
- {
2537
- lhs, _, rhs = val
2538
-
2539
- lhs = value_expr lhs
2540
- rhs = value_expr rhs
2541
-
2542
- result = s(:dot3, lhs, rhs).line lhs.line
2543
- }
2544
- | p_primitive tDOT2
2545
- {
2546
- v1, _ = val
2547
-
2548
- result = s(:dot2, v1, nil).line v1.line
2549
- }
2550
- | p_primitive tDOT3
2551
- {
2552
- v1, _ = val
2553
-
2554
- result = s(:dot3, v1, nil).line v1.line
2555
- }
2556
- | p_var_ref
2557
- | p_expr_ref
2558
- | p_const
2559
- | tBDOT2 p_primitive
2560
- {
2561
- _, v1 = val
2562
-
2563
- result = s(:dot2, nil, v1).line v1.line
2564
- }
2565
- | tBDOT3 p_primitive
2566
- {
2567
- _, v1 = val
2568
-
2569
- result = s(:dot3, nil, v1).line v1.line
2570
- }
2571
-
2572
- p_primitive: literal
2573
- | strings
2574
- | xstring
2575
- | regexp
2576
- | words
2577
- {
2578
- result = ary_to_pat val[0]
2579
- }
2580
- | qwords
2581
- {
2582
- result = ary_to_pat val[0]
2583
- }
2584
- | symbols
2585
- {
2586
- result = ary_to_pat val[0]
2587
- }
2588
- | qsymbols
2589
- {
2590
- result = ary_to_pat val[0]
2591
- }
2592
- | keyword_variable
2593
- {
2594
- # TODO? if (!($$ = gettable(p, $1, &@$))) $$ = NEW_BEGIN(0, &@$);
2595
- var, = val
2596
-
2597
- result = var
2598
- }
2599
- | lambda
2600
-
2601
- p_variable: tIDENTIFIER
2602
- {
2603
- # TODO: error_duplicate_pattern_variable(p, $1, &@1);
2604
- # TODO: assignable(p, $1, 0, &@$);
2605
- result = wrap :lasgn, val[0]
2606
- }
2607
-
2608
- p_var_ref: tCARET tIDENTIFIER
2609
- {
2610
- # TODO: check id against env for lvar or dvar
2611
- result = wrap :lvar, val[1]
2612
- }
2613
- | tCARET nonlocal_var
2614
- {
2615
- _, var = val
2616
- result = var
2617
- }
2618
-
2619
- p_expr_ref: tCARET tLPAREN expr_value rparen
2620
- {
2621
- _, _, expr, _ = val
2622
- result = expr # TODO? s(:begin, expr).line expr.line
2623
- }
2624
-
2625
- p_const: tCOLON3 cname
2626
- {
2627
- result = wrap :colon3, val[1]
2628
- }
2629
- | p_const tCOLON2 cname
2630
- {
2631
- lhs, _, (id, _line) = val
2632
-
2633
- l = lhs.line
2634
- result = s(:const, s(:colon2, lhs, id.to_sym).line(l)).line l
2635
- }
2636
- | tCONSTANT
2637
- {
2638
- # TODO $$ = gettable(p, $1, &@$);
2639
- result = wrap :const, val[0]
2640
- }
2641
- ######################################################################
2642
-
2643
- opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue
2644
- {
2645
- (_, line), klasses, var, _, body, rest = val
2646
-
2647
- klasses ||= s(:array)
2648
- klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var
2649
- klasses.line line
2650
-
2651
- result = new_resbody(klasses, body)
2652
- result << rest if rest # UGH, rewritten above
2653
- }
2654
- |
2655
- {
2656
- result = nil
2657
- }
2658
-
2659
- exc_list: arg_value
2660
- {
2661
- arg, = val
2662
- result = s(:array, arg).line arg.line
2663
- }
2664
- | mrhs
2665
- | none
2666
-
2667
- exc_var: tASSOC lhs
2668
- {
2669
- result = val[1]
2670
- }
2671
- | none
2672
-
2673
- opt_ensure: k_ensure compstmt
2674
- {
2675
- (_, line), body = val
2676
-
2677
- result = body || s(:nil).line(line)
2678
- }
2679
- | none
2680
-
2681
- literal: numeric
2682
- {
2683
- (lit, line), = val
2684
- result = s(:lit, lit).line line
2685
- }
2686
- | symbol
2687
-
2688
- strings: string
2689
- {
2690
- str, = val
2691
- str = s(:dstr, str.value) if str.sexp_type == :evstr
2692
- result = str
2693
- }
2694
-
2695
- string: tCHAR
2696
- {
2697
- debug 12
2698
- }
2699
- | string1
2700
- | string string1
2701
- {
2702
- result = self.literal_concat val[0], val[1]
2703
- }
2704
-
2705
- string1: tSTRING_BEG string_contents tSTRING_END
2706
- {
2707
- (_, line), str, (_, func) = val
2708
-
2709
- str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT
2710
-
2711
- result = str.line line
2712
- }
2713
- | tSTRING
2714
- {
2715
- result = new_string val
2716
- }
2717
-
2718
- xstring: tXSTRING_BEG xstring_contents tSTRING_END
2719
- {
2720
- result = new_xstring val
2721
- # TODO: dedent?!?! SERIOUSLY?!?
2722
- }
2723
-
2724
- regexp: tREGEXP_BEG regexp_contents tREGEXP_END
2725
- {
2726
- result = new_regexp val
2727
- }
2728
-
2729
- words: tWORDS_BEG tSPACE tSTRING_END
2730
- {
2731
- (_, line), _, (_, line_max) = val
2732
-
2733
- result = s(:array).line line
2734
- result.line_max = line_max
2735
- }
2736
- | tWORDS_BEG word_list tSTRING_END
2737
- {
2738
- (_, line), list, (_, line_max) = val
2739
-
2740
- result = list.line line
2741
- result.line_max = line_max
2742
- }
2743
-
2744
- word_list: none
2745
- {
2746
- result = new_word_list
2747
- }
2748
- | word_list word tSPACE
2749
- {
2750
- result = val[0].dup << new_word_list_entry(val)
2751
- }
2752
-
2753
- word: string_content
2754
- | word string_content
2755
- {
2756
- result = self.literal_concat val[0], val[1]
2757
- }
2758
-
2759
- symbols: tSYMBOLS_BEG tSPACE tSTRING_END
2760
- {
2761
- (_, line), _, (_, line_max) = val
2762
-
2763
- result = s(:array).line line
2764
- result.line_max = line_max
2765
- }
2766
- | tSYMBOLS_BEG symbol_list tSTRING_END
2767
- {
2768
- (_, line), list, (_, line_max), = val
2769
-
2770
- result = list.line line
2771
- result.line_max = line_max
2772
- }
2773
-
2774
- symbol_list: none
2775
- {
2776
- result = new_symbol_list
2777
- }
2778
- | symbol_list word tSPACE
2779
- {
2780
- list, * = val
2781
- result = list.dup << new_symbol_list_entry(val)
2782
- }
2783
-
2784
- qwords: tQWORDS_BEG tSPACE tSTRING_END
2785
- {
2786
- (_, line), _, (_, line_max) = val
2787
-
2788
- result = s(:array).line line
2789
- result.line_max = line_max
2790
- }
2791
- | tQWORDS_BEG qword_list tSTRING_END
2792
- {
2793
- (_, line), list, (_, line_max) = val
2794
-
2795
- result = list.line line
2796
- result.line_max = line_max
2797
- }
2798
-
2799
- qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END
2800
- {
2801
- (_, line), _, (_, line_max) = val
2802
-
2803
- result = s(:array).line line
2804
- result.line_max = line_max
2805
- }
2806
- | tQSYMBOLS_BEG qsym_list tSTRING_END
2807
- {
2808
- (_, line), list, (_, line_max) = val
2809
-
2810
- result = list.line line
2811
- result.line_max = line_max
2812
- }
2813
-
2814
- qword_list: none
2815
- {
2816
- result = new_qword_list
2817
- }
2818
- | qword_list tSTRING_CONTENT tSPACE
2819
- {
2820
- result = val[0].dup << new_qword_list_entry(val)
2821
- }
2822
-
2823
- qsym_list: none
2824
- {
2825
- result = new_qsym_list
2826
- }
2827
- | qsym_list tSTRING_CONTENT tSPACE
2828
- {
2829
- result = val[0].dup << new_qsym_list_entry(val)
2830
- }
2831
-
2832
- string_contents: none
2833
- {
2834
- line = prev_value_to_lineno _values.last
2835
- result = s(:str, +"").line line
2836
- }
2837
- | string_contents string_content
2838
- {
2839
- v1, v2 = val
2840
- result = literal_concat v1, v2
2841
- }
2842
-
2843
- xstring_contents: none
2844
- {
2845
- result = nil
2846
- }
2847
- | xstring_contents string_content
2848
- {
2849
- v1, v2 = val
2850
- result = literal_concat v1, v2
2851
- }
2852
-
2853
- regexp_contents: none
2854
- {
2855
- result = nil
2856
- }
2857
- | regexp_contents string_content
2858
- {
2859
- v1, v2 = val
2860
- result = literal_concat v1, v2
2861
- }
2862
-
2863
- string_content: tSTRING_CONTENT
2864
- {
2865
- result = new_string val
2866
- }
2867
- | tSTRING_DVAR
2868
- {
2869
- result = lexer.lex_strterm
2870
-
2871
- lexer.lex_strterm = nil
2872
- lexer.lex_state = EXPR_BEG
2873
- }
2874
- string_dvar
2875
- {
2876
- _, strterm, str = val
2877
- lexer.lex_strterm = strterm
2878
- result = s(:evstr, str).line str.line
2879
- }
2880
- | tSTRING_DBEG
2881
- {
2882
- result = [lexer.lex_strterm,
2883
- lexer.brace_nest,
2884
- lexer.string_nest, # TODO: remove
2885
- lexer.lex_state,
2886
- ]
2887
-
2888
- lexer.cmdarg.push false
2889
- lexer.cond.push false
2890
-
2891
- lexer.lex_strterm = nil
2892
- lexer.brace_nest = 0
2893
- lexer.string_nest = 0
2894
-
2895
- lexer.lex_state = EXPR_BEG
2896
- }
2897
- compstmt
2898
- tSTRING_DEND
2899
- {
2900
- (_, line), memo, stmt, _ = val
2901
-
2902
- lex_strterm, brace_nest, string_nest, oldlex_state = memo
2903
- # TODO: heredoc_indent
2904
-
2905
- lexer.lex_strterm = lex_strterm
2906
- lexer.brace_nest = brace_nest
2907
- lexer.string_nest = string_nest
2908
-
2909
- lexer.cond.pop
2910
- lexer.cmdarg.pop
2911
-
2912
- lexer.lex_state = oldlex_state
2913
-
2914
- case stmt
2915
- when Sexp then
2916
- case stmt.sexp_type
2917
- when :str, :dstr, :evstr then
2918
- result = stmt
2919
- else
2920
- result = s(:evstr, stmt).line line
2921
- end
2922
- when nil then
2923
- result = s(:evstr).line line
2924
- else
2925
- debug 13
2926
- raise "unknown string body: #{stmt.inspect}"
2927
- end
2928
- }
2929
-
2930
- string_dvar: tGVAR
2931
- {
2932
- result = wrap :gvar, val[0]
2933
- }
2934
- | tIVAR
2935
- {
2936
- result = wrap :ivar, val[0]
2937
- }
2938
- | tCVAR
2939
- {
2940
- result = wrap :cvar, val[0]
2941
- }
2942
- | backref
2943
-
2944
- symbol: ssym
2945
- | dsym
2946
-
2947
- ssym: tSYMBEG sym
2948
- {
2949
- lexer.lex_state = EXPR_END
2950
- result = wrap :lit, val[1]
2951
- }
2952
- | tSYMBOL
2953
- {
2954
- lexer.lex_state = EXPR_END
2955
- result = wrap :lit, val[0]
2956
- }
2957
-
2958
- sym: fname | tIVAR | tGVAR | tCVAR
2959
-
2960
- dsym: tSYMBEG string_contents tSTRING_END
2961
- {
2962
- (_, line), result, _ = val
2963
-
2964
- lexer.lex_state = EXPR_END
2965
-
2966
- result ||= s(:str, "").line line
2967
-
2968
- case result.sexp_type
2969
- when :dstr then
2970
- result.sexp_type = :dsym
2971
- when :str then
2972
- result = s(:lit, result.last.to_sym).line result.line
2973
- when :evstr then
2974
- result = s(:dsym, "", result).line result.line
2975
- else
2976
- debug 14
2977
- end
2978
- }
2979
-
2980
- numeric: simple_numeric
2981
- | tUMINUS_NUM simple_numeric =tLOWEST
2982
- {
2983
- _, (num, line) = val
2984
- result = [-num, line]
2985
- }
2986
-
2987
- simple_numeric: tINTEGER
2988
- | tFLOAT
2989
- | tRATIONAL
2990
- | tIMAGINARY
2991
-
2992
- nonlocal_var: tIVAR { result = wrap :ivar, val[0] }
2993
- | tGVAR { result = wrap :gvar, val[0] }
2994
- | tCVAR { result = wrap :cvar, val[0] }
2995
-
2996
- user_variable: tIDENTIFIER
2997
- | tIVAR
2998
- | tGVAR
2999
- | tCONSTANT
3000
- | tCVAR
3001
-
3002
- keyword_variable: kNIL { (_, line), = val; result = s(:nil).line line }
3003
- | kSELF { (_, line), = val; result = s(:self).line line }
3004
- | kTRUE { (_, line), = val; result = s(:true).line line }
3005
- | kFALSE { (_, line), = val; result = s(:false).line line }
3006
- | k__FILE__ { (_, line), = val; result = s(:str, self.file).line line }
3007
- | k__LINE__ { (_, line), = val; result = s(:lit, line).line line }
3008
- | k__ENCODING__
3009
- {
3010
- (_, l), = val
3011
- result =
3012
- if defined? Encoding then
3013
- s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l
3014
- else
3015
- s(:str, "Unsupported!").line l
3016
- end
3017
- }
3018
-
3019
- var_ref: user_variable
3020
- {
3021
- raise "NO: #{val.inspect}" if Sexp === val.first
3022
- (var, line), = val
3023
- result = Sexp === var ? var : self.gettable(var)
3024
-
3025
- result.line line
3026
- }
3027
- | keyword_variable
3028
- {
3029
- var = val[0]
3030
- result = Sexp === var ? var : self.gettable(var)
3031
- }
3032
-
3033
- var_lhs: user_variable
3034
- {
3035
- result = self.assignable val[0]
3036
- }
3037
- | keyword_variable
3038
- {
3039
- result = self.assignable val[0]
3040
- debug 15
3041
- }
3042
-
3043
- backref: tNTH_REF
3044
- {
3045
- (ref, line), = val
3046
- result = s(:nth_ref, ref).line line
3047
- }
3048
- | tBACK_REF
3049
- {
3050
- (ref, line), = val
3051
- result = s(:back_ref, ref).line line
3052
- }
3053
-
3054
- superclass: tLT
3055
- {
3056
- lexer.lex_state = EXPR_BEG
3057
- lexer.command_start = true
3058
- }
3059
- expr_value term
3060
- {
3061
- result = val[2]
3062
- }
3063
- | none
3064
- {
3065
- result = nil
3066
- }
3067
-
3068
- f_opt_paren_args: f_paren_args
3069
- | none
3070
- {
3071
- result = end_args val
3072
- }
3073
-
3074
- f_paren_args: tLPAREN2 f_args rparen
3075
- {
3076
- result = end_args val
3077
- }
3078
-
3079
- f_arglist: f_paren_args
3080
- | {
3081
- result = self.in_kwarg
3082
- self.in_kwarg = true
3083
- self.lexer.lex_state |= EXPR_LABEL
3084
- }
3085
- f_args term
3086
- {
3087
- result = end_args val
3088
- }
3089
-
3090
- args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg
3091
- {
3092
- result = args val
3093
- }
3094
- | f_kwarg opt_f_block_arg
3095
- {
3096
- result = args val
3097
- }
3098
- | f_any_kwrest opt_f_block_arg
3099
- {
3100
- result = args val
3101
- }
3102
- | f_block_arg
3103
- | args_forward
3104
-
3105
- opt_args_tail: tCOMMA args_tail
3106
- {
3107
- result = val[1]
3108
- }
3109
- |
3110
- {
3111
- result = nil
3112
- }
3113
-
3114
- f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail
3115
- {
3116
- result = args val
3117
- }
3118
- | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
3119
- {
3120
- result = args val
3121
- }
3122
- | f_arg tCOMMA f_optarg opt_args_tail
3123
- {
3124
- result = args val
3125
- }
3126
- | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail
3127
- {
3128
- result = args val
3129
- }
3130
- | f_arg tCOMMA f_rest_arg opt_args_tail
3131
- {
3132
- result = args val
3133
- }
3134
- | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
3135
- {
3136
- result = args val
3137
- }
3138
- | f_arg opt_args_tail
3139
- {
3140
- result = args val
3141
- }
3142
- | f_optarg tCOMMA f_rest_arg opt_args_tail
3143
- {
3144
- result = args val
3145
- }
3146
- | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
3147
- {
3148
- result = args val
3149
- }
3150
- | f_optarg opt_args_tail
3151
- {
3152
- result = args val
3153
- }
3154
- | f_optarg tCOMMA f_arg opt_args_tail
3155
- {
3156
- result = args val
3157
- }
3158
- | f_rest_arg opt_args_tail
3159
- {
3160
- result = args val
3161
- }
3162
- | f_rest_arg tCOMMA f_arg opt_args_tail
3163
- {
3164
- result = args val
3165
- }
3166
- | args_tail
3167
- {
3168
- result = args val
3169
- }
3170
- |
3171
- {
3172
- result = args val
3173
- }
3174
-
3175
- args_forward: tBDOT3
3176
- {
3177
- (_, line), = val
3178
- result = s(:forward_args).line line
3179
- }
3180
-
3181
- f_bad_arg: tCONSTANT
3182
- {
3183
- yyerror "formal argument cannot be a constant"
3184
- }
3185
- | tIVAR
3186
- {
3187
- yyerror "formal argument cannot be an instance variable"
3188
- }
3189
- | tGVAR
3190
- {
3191
- yyerror "formal argument cannot be a global variable"
3192
- }
3193
- | tCVAR
3194
- {
3195
- yyerror "formal argument cannot be a class variable"
3196
- }
3197
-
3198
- f_norm_arg: f_bad_arg
3199
- | tIDENTIFIER
3200
- {
3201
- (id, line), = val
3202
- identifier = id.to_sym
3203
- self.env[identifier] = :lvar
3204
-
3205
- result = [identifier, line]
3206
- }
3207
-
3208
- f_arg_asgn: f_norm_arg
3209
-
3210
- f_arg_item: f_arg_asgn
3211
- | tLPAREN f_margs rparen
3212
- {
3213
- _, margs, _ = val
3214
-
3215
- result = margs
3216
- }
3217
-
3218
- f_arg: f_arg_item
3219
- {
3220
- result = new_arg val
3221
- }
3222
- | f_arg tCOMMA f_arg_item
3223
- {
3224
- list, _, item = val
3225
-
3226
- if list.sexp_type == :args then
3227
- result = list
3228
- else
3229
- result = s(:args, list).line list.line
3230
- end
3231
-
3232
- if Sexp === item then
3233
- line_max = item.line_max
3234
- else
3235
- item, line_max = item
3236
- end
3237
-
3238
- result << item
3239
- result.line_max = line_max
3240
- }
3241
-
3242
- f_label: tLABEL
3243
-
3244
- f_kw: f_label arg_value
3245
- {
3246
- # TODO: new_kw_arg
3247
- (label, line), arg = val
3248
-
3249
- identifier = label.to_sym
3250
- self.env[identifier] = :lvar
3251
-
3252
- kwarg = s(:kwarg, identifier, arg).line line
3253
- result = s(:array, kwarg).line line
3254
- }
3255
- | f_label
3256
- {
3257
- (label, line), = val
3258
-
3259
- id = label.to_sym
3260
- self.env[id] = :lvar
3261
-
3262
- result = s(:array, s(:kwarg, id).line(line)).line line
3263
- }
3264
-
3265
- f_block_kw: f_label primary_value
3266
- {
3267
- # TODO: new_kw_arg
3268
- (label, line), expr = val
3269
- id = label.to_sym
3270
- self.env[id] = :lvar
3271
-
3272
- result = s(:array, s(:kwarg, id, expr).line(line)).line line
3273
- }
3274
- | f_label
3275
- {
3276
- # TODO: new_kw_arg
3277
- (label, line), = val
3278
- id = label.to_sym
3279
- self.env[id] = :lvar
3280
-
3281
- result = s(:array, s(:kwarg, id).line(line)).line line
3282
- }
3283
-
3284
- f_block_kwarg: f_block_kw
3285
- | f_block_kwarg tCOMMA f_block_kw
3286
- {
3287
- list, _, item = val
3288
- result = list << item.last
3289
- }
3290
-
3291
- f_kwarg: f_kw
3292
- | f_kwarg tCOMMA f_kw
3293
- {
3294
- result = args val
3295
- }
3296
-
3297
- kwrest_mark: tPOW
3298
- | tDSTAR
3299
-
3300
- f_no_kwarg: kwrest_mark kNIL
3301
- {
3302
- (_, line), _ = val
3303
- result = [:"**nil", line]
3304
- }
3305
-
3306
- f_kwrest: kwrest_mark tIDENTIFIER
3307
- {
3308
- _, (id, line) = val
3309
-
3310
- name = id.to_sym
3311
- self.assignable [name, line]
3312
- result = [:"**#{name}", line]
3313
- }
3314
- | kwrest_mark
3315
- {
3316
- (_, line), = val
3317
- id = :"**"
3318
- self.env[id] = :lvar
3319
- result = [id, line]
3320
- }
3321
-
3322
- f_opt: f_arg_asgn
3323
- f_eq
3324
- arg_value
3325
- {
3326
- lhs, _, rhs = val
3327
- result = self.assignable lhs, rhs
3328
- # TODO: detect duplicate names
3329
- # TODO? p->cur_arg = 0;
3330
- # TODO? p->ctxt.in_argdef = 1;
3331
- }
3332
-
3333
- f_block_opt: f_arg_asgn
3334
- f_eq
3335
- primary_value
3336
- {
3337
- lhs, _, rhs = val
3338
- result = self.assignable lhs, rhs
3339
- # TODO? p->cur_arg = 0;
3340
- # TODO? p->ctxt.in_argdef = 1;
3341
- }
3342
-
3343
- f_block_optarg: f_block_opt
3344
- {
3345
- optblk, = val
3346
- result = s(:block, optblk).line optblk.line
3347
- }
3348
- | f_block_optarg tCOMMA f_block_opt
3349
- {
3350
- optarg, _, optblk = val
3351
- result = optarg
3352
- result << optblk
3353
- }
3354
-
3355
- f_optarg: f_opt
3356
- {
3357
- opt, = val
3358
- result = s(:block, opt).line opt.line
3359
- }
3360
- | f_optarg tCOMMA f_opt
3361
- {
3362
- result = self.block_append val[0], val[2]
3363
- }
3364
-
3365
- restarg_mark: tSTAR2 | tSTAR
3366
-
3367
- f_rest_arg: restarg_mark tIDENTIFIER
3368
- {
3369
- # TODO: differs from parse.y - needs tests
3370
- _, (id, line) = val
3371
- name = id.to_sym
3372
- self.assignable [name, line]
3373
- result = [:"*#{name}", line]
3374
- }
3375
- | restarg_mark
3376
- {
3377
- (_, line), = val
3378
- name = :"*"
3379
- self.env[name] = :lvar
3380
- result = [name, line]
3381
- }
3382
-
3383
- blkarg_mark: tAMPER2 | tAMPER
3384
-
3385
- f_block_arg: blkarg_mark tIDENTIFIER
3386
- {
3387
- _, (id, line) = val
3388
- identifier = id.to_sym
3389
-
3390
- self.env[identifier] = :lvar
3391
- result = ["&#{identifier}".to_sym, line]
3392
- }
3393
- | blkarg_mark
3394
- {
3395
- (_, line), = val
3396
-
3397
- result = [:&, line]
3398
- }
3399
-
3400
- opt_f_block_arg: tCOMMA f_block_arg
3401
- {
3402
- _, arg = val
3403
- result = arg
3404
- }
3405
- |
3406
- {
3407
- result = nil
3408
- }
3409
-
3410
- singleton: var_ref
3411
- | tLPAREN2
3412
- {
3413
- lexer.lex_state = EXPR_BEG
3414
- }
3415
- expr rparen
3416
- {
3417
- result = val[2]
3418
- yyerror "Can't define single method for literals." if
3419
- result.sexp_type == :lit
3420
- }
3421
-
3422
- assoc_list: none
3423
- {
3424
- result = s(:array).line lexer.lineno
3425
- }
3426
- | assocs trailer
3427
-
3428
- assocs: assoc
3429
- | assocs tCOMMA assoc
3430
- {
3431
- list = val[0].dup
3432
- more = val[2].sexp_body
3433
- list.push(*more) unless more.empty?
3434
- result = list
3435
- result.sexp_type = :hash
3436
- }
3437
-
3438
- assoc: arg_value tASSOC arg_value
3439
- {
3440
- v1, _, v2 = val
3441
- result = s(:array, v1, v2).line v1.line
3442
- }
3443
- | tLABEL arg_value
3444
- {
3445
- label, arg = val
3446
-
3447
- lit = wrap :lit, label
3448
- result = s(:array, lit, arg).line lit.line
3449
- }
3450
- | tLABEL
3451
- {
3452
- lit = wrap :lit, val[0]
3453
- arg = nil
3454
-
3455
- result = s(:array, lit, arg).line lit.line
3456
- }
3457
- | tSTRING_BEG string_contents tLABEL_END arg_value
3458
- {
3459
- (_, line), sym, _, value = val
3460
-
3461
- sym.sexp_type = :dsym
3462
-
3463
- result = s(:array, sym, value).line line
3464
- }
3465
- | tDSTAR arg_value
3466
- {
3467
- _, arg = val
3468
- line = arg.line
3469
- result = s(:array, s(:kwsplat, arg).line(line)).line line
3470
- }
3471
-
3472
- operation: tIDENTIFIER | tCONSTANT | tFID
3473
- operation2: tIDENTIFIER | tCONSTANT | tFID | op
3474
- operation3: tIDENTIFIER | tFID | op
3475
- dot_or_colon: tDOT | tCOLON2
3476
- call_op: tDOT
3477
- | tLONELY # TODO: rename tANDDOT?
3478
-
3479
- call_op2: call_op
3480
- | tCOLON2
3481
-
3482
- opt_terms: | terms
3483
- opt_nl: | tNL
3484
- rparen: opt_nl tRPAREN
3485
- {
3486
- _, close = val # TODO: include lineno in close?
3487
- result = [close, lexer.lineno]
3488
- }
3489
- rbracket: opt_nl tRBRACK
3490
- {
3491
- _, close = val
3492
- result = [close, lexer.lineno]
3493
- }
3494
- rbrace: opt_nl tRCURLY
3495
- {
3496
- _, close = val
3497
- result = [close, lexer.lineno]
3498
- }
3499
- trailer: | tNL | tCOMMA
3500
-
3501
- term: tSEMI { yyerrok }
3502
- | tNL
3503
-
3504
- terms: term
3505
- | terms tSEMI { yyerrok }
3506
-
3507
- none: { result = nil; }
3508
- end
3509
-
3510
- ---- inner
3511
-
3512
- require "ruby_lexer"
3513
- require "ruby_parser_extras"
3514
- include RubyLexer::State::Values
3515
-
3516
- # :stopdoc:
3517
-
3518
- # Local Variables: **
3519
- # racc-token-length-max:14 **
3520
- # End: **