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/ruby32_parser.y DELETED
@@ -1,3521 +0,0 @@
1
- # -*- racc -*-
2
-
3
- class Ruby32Parser
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
- | tSTAR
1264
- {
1265
- (_, line), = val
1266
- result = s(:array, s(:splat).line(line)).line line
1267
- }
1268
- | args tCOMMA arg_value
1269
- {
1270
- args, _, id = val
1271
- result = self.list_append args, id
1272
- }
1273
- | args tCOMMA tSTAR arg_value
1274
- {
1275
- args, _, (_, line), id = val
1276
- result = self.list_append args, s(:splat, id).line(line)
1277
- }
1278
- | args tCOMMA tSTAR
1279
- {
1280
- args, _, (_, line) = val
1281
- result = self.list_append args, s(:splat).line(line)
1282
- }
1283
-
1284
- mrhs_arg: mrhs
1285
- {
1286
- result = new_masgn_arg val[0]
1287
- }
1288
- | arg_value
1289
- {
1290
- result = new_masgn_arg val[0], :wrap
1291
- }
1292
-
1293
- mrhs: args tCOMMA arg_value
1294
- {
1295
- result = val[0] << val[2]
1296
- }
1297
- | args tCOMMA tSTAR arg_value
1298
- {
1299
- arg, _, _, splat = val
1300
- result = self.arg_concat arg, splat
1301
- }
1302
- | tSTAR arg_value
1303
- {
1304
- _, arg = val
1305
- result = s(:splat, arg).line arg.line
1306
- }
1307
-
1308
- primary: literal
1309
- | strings
1310
- | xstring
1311
- | regexp
1312
- | words
1313
- | qwords
1314
- | symbols
1315
- | qsymbols
1316
- | var_ref
1317
- | backref
1318
- | tFID
1319
- {
1320
- (msg, line), = val
1321
- result = new_call nil, msg.to_sym
1322
- result.line line
1323
- }
1324
- | k_begin
1325
- {
1326
- lexer.cmdarg.push false
1327
- }
1328
- bodystmt k_end
1329
- {
1330
- lexer.cmdarg.pop
1331
- result = new_begin val
1332
- }
1333
- | tLPAREN_ARG
1334
- {
1335
- lexer.lex_state = EXPR_ENDARG
1336
- }
1337
- rparen
1338
- {
1339
- (_, line), _, _ = val
1340
- result = s(:begin).line line
1341
- }
1342
- | tLPAREN_ARG
1343
- stmt
1344
- {
1345
- lexer.lex_state = EXPR_ENDARG
1346
- }
1347
- rparen
1348
- {
1349
- _, stmt, _, _, = val
1350
- # warning "(...) interpreted as grouped expression"
1351
- result = stmt
1352
- }
1353
- | tLPAREN compstmt tRPAREN
1354
- {
1355
- (_, line), stmt, _ = val
1356
- result = stmt || s(:nil).line(line)
1357
- result.paren = true
1358
- }
1359
- | primary_value tCOLON2 tCONSTANT
1360
- {
1361
- expr, _, (id, _line) = val
1362
-
1363
- result = s(:colon2, expr, id.to_sym).line expr.line
1364
- }
1365
- | tCOLON3 tCONSTANT
1366
- {
1367
- result = wrap :colon3, val[1]
1368
- }
1369
- | tLBRACK aref_args rbracket
1370
- {
1371
- (_, line), args, (_, line_max) = val
1372
-
1373
- result = args || s(:array)
1374
- result.sexp_type = :array # aref_args is :args
1375
- result.line line
1376
- result.line_max = line_max
1377
- }
1378
- | tLBRACE
1379
- {
1380
- result = self.lexer.lineno
1381
- }
1382
- assoc_list tRCURLY
1383
- {
1384
- result = new_hash val
1385
- }
1386
- | k_return
1387
- {
1388
- (_, line), = val
1389
- result = s(:return).line line
1390
- }
1391
- | kYIELD tLPAREN2 call_args rparen
1392
- {
1393
- (_, line), _, args, _ = val
1394
-
1395
- result = new_yield(args).line line
1396
- }
1397
- | kYIELD tLPAREN2 rparen
1398
- {
1399
- (_, line), _, _ = val
1400
-
1401
- result = new_yield.line line
1402
- }
1403
- | kYIELD
1404
- {
1405
- (_, line), = val
1406
-
1407
- result = new_yield.line line
1408
- }
1409
- | kDEFINED opt_nl tLPAREN2 expr rparen
1410
- {
1411
- (_, line), _, _, arg, _ = val
1412
-
1413
- result = s(:defined, arg).line line
1414
- }
1415
- | kNOT tLPAREN2 expr rparen
1416
- {
1417
- _, _, lhs, _ = val
1418
- result = new_call lhs, :"!"
1419
- }
1420
- | kNOT tLPAREN2 rparen
1421
- {
1422
- debug 9
1423
- }
1424
- | fcall brace_block
1425
- {
1426
- call, iter = val
1427
-
1428
- iter.insert 1, call
1429
- result = iter
1430
- # FIX: probably not: call.line = iter.line
1431
- }
1432
- | method_call
1433
- | method_call brace_block
1434
- {
1435
- call, iter = val[0], val[1]
1436
- block_dup_check call, iter
1437
- iter.insert 1, call # FIX
1438
- result = iter
1439
- }
1440
- | lambda
1441
- {
1442
- expr, = val
1443
- result = expr
1444
- }
1445
- | k_if expr_value then compstmt if_tail k_end
1446
- {
1447
- _, c, _, t, f, _ = val
1448
- result = new_if c, t, f
1449
- }
1450
- | k_unless expr_value then compstmt opt_else k_end
1451
- {
1452
- _, c, _, t, f, _ = val
1453
- result = new_if c, f, t
1454
- }
1455
- | k_while expr_value_do compstmt k_end
1456
- {
1457
- _, cond, body, _ = val
1458
- result = new_while body, cond, true
1459
- }
1460
- | k_until expr_value_do compstmt k_end
1461
- {
1462
- _, cond, body, _ = val
1463
- result = new_until body, cond, true
1464
- }
1465
- | k_case expr_value opt_terms case_body k_end
1466
- {
1467
- (_, line), expr, _, body, _ = val
1468
- result = new_case expr, body, line
1469
- }
1470
- | k_case opt_terms case_body k_end
1471
- {
1472
- (_, line), _, body, _ = val
1473
- result = new_case nil, body, line
1474
- }
1475
- | k_case expr_value opt_terms p_case_body k_end
1476
- {
1477
- (_, line), expr, _, body, _ = val
1478
-
1479
- result = new_case expr, body, line
1480
- }
1481
- | k_for for_var kIN expr_value_do compstmt k_end
1482
- {
1483
- _, var, _, iter, body, _ = val
1484
- result = new_for iter, var, body
1485
- }
1486
- | k_class
1487
- cpath superclass
1488
- {
1489
- if (self.in_def || self.in_single > 0) then
1490
- yyerror "class definition in method body"
1491
- end
1492
- self.env.extend
1493
- }
1494
- bodystmt k_end
1495
- {
1496
- result = new_class val
1497
- self.env.unextend
1498
- self.lexer.ignore_body_comments
1499
- }
1500
- | k_class tLSHFT
1501
- expr
1502
- {
1503
- result = self.in_def
1504
- self.in_def = false
1505
- }
1506
- term
1507
- {
1508
- result = self.in_single
1509
- self.in_single = 0
1510
- self.env.extend
1511
- }
1512
- bodystmt
1513
- k_end
1514
- {
1515
- result = new_sclass val
1516
- self.env.unextend
1517
- self.lexer.ignore_body_comments
1518
- }
1519
- | k_module
1520
- cpath
1521
- {
1522
- yyerror "module definition in method body" if
1523
- self.in_def or self.in_single > 0
1524
-
1525
- self.env.extend
1526
- }
1527
- bodystmt k_end
1528
- {
1529
- result = new_module val
1530
- self.env.unextend
1531
- self.lexer.ignore_body_comments
1532
- }
1533
- | defn_head f_arglist bodystmt k_end
1534
- {
1535
- # [ [:f, 1, false], s(:args)...]
1536
- # =>
1537
- # [[:k_def, 666], [:f, 1], false, s(:args)...]
1538
- val.insert 1, val.first.pop
1539
- val.insert 0, [:k_def, 666]
1540
-
1541
- result, in_def = new_defn val
1542
-
1543
- lexer.cond.pop # group = local_pop
1544
- lexer.cmdarg.pop
1545
- self.env.unextend
1546
- self.in_def = in_def
1547
-
1548
- self.lexer.ignore_body_comments
1549
- }
1550
- | defs_head f_arglist bodystmt k_end
1551
- {
1552
- # [ [recv, [:name, 1, false]], s(:args...]
1553
- # =>
1554
- # [ recv, [:name, 1, false], s(:args...]
1555
- # =>
1556
- # [ recv, [:name, 1], false, s(:args...]
1557
- # =>
1558
- # [ :k_def, recv, [:name, 1], false, s(:args...]
1559
-
1560
- val.prepend(*val.shift)
1561
- val.insert 2, val[1].pop
1562
- val.insert 0, [:k_def, 666]
1563
-
1564
- result, in_def = new_defs val
1565
-
1566
- lexer.cond.pop # group = local_pop
1567
- lexer.cmdarg.pop
1568
- self.env.unextend
1569
- self.in_def = in_def
1570
-
1571
- self.in_single -= 1
1572
-
1573
- # TODO: restore cur_arg ? what's cur_arg?
1574
-
1575
- self.lexer.ignore_body_comments
1576
- }
1577
- | kBREAK
1578
- {
1579
- (_, line), = val
1580
- result = s(:break).line line
1581
- }
1582
- | kNEXT
1583
- {
1584
- (_, line), = val
1585
- result = s(:next).line line
1586
- }
1587
- | kREDO
1588
- {
1589
- (_, line), = val
1590
- result = s(:redo).line line
1591
- }
1592
- | kRETRY
1593
- {
1594
- (_, line), = val
1595
- result = s(:retry).line line
1596
- }
1597
-
1598
- primary_value: primary
1599
- {
1600
- result = value_expr(val[0])
1601
- }
1602
-
1603
- # These are really stupid
1604
- k_begin: kBEGIN
1605
- k_if: kIF
1606
- k_unless: kUNLESS
1607
- k_while: kWHILE
1608
- k_until: kUNTIL
1609
- k_case: kCASE
1610
- k_for: kFOR
1611
- k_class: kCLASS
1612
- {
1613
- self.comments.push self.lexer.comments
1614
- }
1615
- k_module: kMODULE
1616
- {
1617
- self.comments.push self.lexer.comments
1618
- }
1619
- k_def: kDEF
1620
- {
1621
- self.comments.push self.lexer.comments
1622
- }
1623
- k_do: kDO
1624
- k_do_block: kDO_BLOCK
1625
- k_rescue: kRESCUE
1626
- k_ensure: kENSURE
1627
- k_when: kWHEN
1628
- k_else: kELSE
1629
- k_elsif: kELSIF
1630
- k_end: kEND
1631
- k_return: kRETURN
1632
-
1633
- then: term
1634
- | kTHEN
1635
- | term kTHEN
1636
-
1637
- do: term
1638
- | kDO_COND
1639
-
1640
- if_tail: opt_else
1641
- | k_elsif expr_value then compstmt if_tail
1642
- {
1643
- (_, line), c, _, t, rest = val
1644
-
1645
- result = s(:if, c, t, rest).line line
1646
- }
1647
-
1648
- opt_else: none
1649
- | kELSE compstmt
1650
- {
1651
- result = val[1]
1652
- }
1653
-
1654
- for_var: lhs
1655
- | mlhs
1656
- {
1657
- val[0].delete_at 1 if val[0][1].nil? # HACK
1658
- }
1659
-
1660
- f_marg: f_norm_arg
1661
- {
1662
- (sym, line), = val
1663
-
1664
- result = s(:dummy, sym).line line
1665
- }
1666
- | tLPAREN f_margs rparen
1667
- {
1668
- _, args, _ = val
1669
- result = args
1670
- }
1671
-
1672
- f_marg_list: f_marg
1673
- {
1674
- arg, = val
1675
- line = arg.line
1676
-
1677
- arg = arg.last if arg.sexp_type == :dummy
1678
-
1679
- result = s(:array, arg).line line
1680
- }
1681
- | f_marg_list tCOMMA f_marg
1682
- {
1683
- args, _, arg = val
1684
-
1685
- arg = arg.last if arg.sexp_type == :dummy
1686
-
1687
- result = list_append args, arg
1688
- }
1689
-
1690
- f_margs: f_marg_list
1691
- {
1692
- args, = val
1693
-
1694
- result = block_var args
1695
- }
1696
- | f_marg_list tCOMMA f_rest_marg
1697
- {
1698
- args, _, rest = val
1699
-
1700
- result = block_var args, rest
1701
- }
1702
- | f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list
1703
- {
1704
- lhs, _, splat, _, rhs = val
1705
-
1706
- result = block_var lhs, splat, rhs
1707
- }
1708
- | f_rest_marg
1709
- {
1710
- rest, = val
1711
-
1712
- result = block_var rest
1713
- }
1714
- | f_rest_marg tCOMMA f_marg_list
1715
- {
1716
- splat, _, rest = val
1717
-
1718
- result = block_var splat, rest
1719
- }
1720
-
1721
- f_rest_marg: tSTAR f_norm_arg
1722
- {
1723
- _, (id, line) = val
1724
-
1725
- result = args ["*#{id}".to_sym]
1726
- result.line line
1727
- }
1728
- | tSTAR
1729
- {
1730
- (_, line), = val
1731
- result = args([:*]).line line
1732
- }
1733
-
1734
- f_any_kwrest: f_kwrest
1735
- | f_no_kwarg
1736
-
1737
- f_eq: tEQL # TODO: self.in_argdef = false
1738
-
1739
- block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg
1740
- {
1741
- result = call_args val
1742
- }
1743
- | f_block_kwarg opt_f_block_arg
1744
- {
1745
- result = call_args val
1746
- }
1747
- | f_any_kwrest opt_f_block_arg
1748
- {
1749
- result = call_args val
1750
- }
1751
- | f_block_arg
1752
- {
1753
- (id, line), = val
1754
- result = call_args [id]
1755
- result.line line
1756
- }
1757
-
1758
- opt_block_args_tail: tCOMMA block_args_tail
1759
- {
1760
- result = args val
1761
- }
1762
- | none
1763
-
1764
- excessed_comma: tCOMMA
1765
- {
1766
- result = s(:WTF_COMMA!)
1767
- }
1768
-
1769
- block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1770
- {
1771
- result = args val
1772
- }
1773
- | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1774
- {
1775
- result = args val
1776
- }
1777
- | f_arg tCOMMA f_block_optarg opt_block_args_tail
1778
- {
1779
- result = args val
1780
- }
1781
- | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail
1782
- {
1783
- result = args val
1784
- }
1785
- | f_arg tCOMMA f_rest_arg opt_block_args_tail
1786
- {
1787
- result = args val
1788
- }
1789
- | f_arg excessed_comma
1790
- {
1791
- arg, _ = val
1792
- result = arg << nil
1793
- }
1794
- | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1795
- {
1796
- result = args val
1797
- }
1798
- | f_arg opt_block_args_tail
1799
- {
1800
- result = args val
1801
- }
1802
- | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1803
- {
1804
- result = args val
1805
- }
1806
- | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1807
- {
1808
- result = args val
1809
- }
1810
- | f_block_optarg opt_block_args_tail
1811
- {
1812
- result = args val
1813
- }
1814
- | f_block_optarg tCOMMA f_arg opt_block_args_tail
1815
- {
1816
- result = args val
1817
- }
1818
- | f_rest_arg opt_block_args_tail
1819
- {
1820
- result = args val
1821
- }
1822
- | f_rest_arg tCOMMA f_arg opt_block_args_tail
1823
- {
1824
- result = args val
1825
- }
1826
- | block_args_tail
1827
- {
1828
- result = args val
1829
- }
1830
-
1831
- opt_block_param: none { result = 0 }
1832
- | block_param_def
1833
- {
1834
- self.lexer.command_start = true
1835
- }
1836
-
1837
- block_param_def: tPIPE opt_bv_decl tPIPE
1838
- {
1839
- # TODO: current_arg = 0
1840
- result = args val
1841
- }
1842
- | tOROP
1843
- {
1844
- (_, line), = val
1845
-
1846
- result = s(:args).line line
1847
- }
1848
- | tPIPE block_param opt_bv_decl tPIPE
1849
- {
1850
- # TODO: current_arg = 0
1851
- result = args val
1852
- }
1853
-
1854
- opt_bv_decl: opt_nl
1855
- | opt_nl tSEMI bv_decls opt_nl
1856
- {
1857
- result = args val
1858
- }
1859
-
1860
- bv_decls: bvar
1861
- {
1862
- result = args val
1863
- }
1864
- | bv_decls tCOMMA bvar
1865
- {
1866
- result = args val
1867
- }
1868
-
1869
- bvar: tIDENTIFIER
1870
- {
1871
- result = wrap :shadow, val[0]
1872
- }
1873
- | f_bad_arg
1874
-
1875
- lambda: tLAMBDA
1876
- {
1877
- self.env.extend :dynamic
1878
- result = lexer.lpar_beg
1879
- lexer.paren_nest += 1
1880
- lexer.lpar_beg = lexer.paren_nest
1881
- }
1882
- f_larglist
1883
- {
1884
- lexer.cmdarg.push false
1885
- }
1886
- lambda_body
1887
- {
1888
- (_, line), lpar, args, _cmdarg, body = val
1889
- lexer.lpar_beg = lpar
1890
-
1891
- lexer.cmdarg.pop
1892
-
1893
- call = s(:lambda).line line
1894
- result = new_iter call, args, body
1895
- result.line line
1896
- self.env.unextend # TODO: dynapush & dynapop
1897
- }
1898
-
1899
- f_larglist: tLPAREN2 f_args opt_bv_decl rparen
1900
- {
1901
- result = args val
1902
- }
1903
- | f_args
1904
- {
1905
- result = val[0]
1906
- result = 0 if result == s(:args)
1907
- }
1908
-
1909
- lambda_body: tLAMBEG compstmt tRCURLY
1910
- {
1911
- result = val[1]
1912
- }
1913
- | kDO_LAMBDA bodystmt kEND
1914
- {
1915
- result = val[1]
1916
- }
1917
-
1918
- do_block: k_do_block do_body kEND
1919
- {
1920
- (_, line), iter, _ = val
1921
- result = iter.line line
1922
- }
1923
-
1924
- block_call: command do_block
1925
- {
1926
- # TODO:
1927
- ## if (nd_type($1) == NODE_YIELD) {
1928
- ## compile_error(PARSER_ARG "block given to yield");
1929
-
1930
- cmd, blk = val
1931
-
1932
- syntax_error "Both block arg and actual block given." if
1933
- cmd.block_pass?
1934
-
1935
- if inverted? val then
1936
- val = invert_block_call val
1937
- cmd, blk = val
1938
- end
1939
-
1940
- result = blk
1941
- result.insert 1, cmd
1942
- }
1943
- | block_call call_op2 operation2 opt_paren_args
1944
- {
1945
- lhs, _, (id, _line), args = val
1946
-
1947
- result = new_call lhs, id.to_sym, args
1948
- }
1949
- | block_call call_op2 operation2 opt_paren_args brace_block
1950
- {
1951
- iter1, _, (name, _line), args, iter2 = val
1952
-
1953
- call = new_call iter1, name.to_sym, args
1954
- iter2.insert 1, call
1955
-
1956
- result = iter2
1957
- }
1958
- | block_call call_op2 operation2 command_args do_block
1959
- {
1960
- iter1, _, (name, _line), args, iter2 = val
1961
-
1962
- call = new_call iter1, name.to_sym, args
1963
- iter2.insert 1, call
1964
-
1965
- result = iter2
1966
- }
1967
-
1968
- method_call: fcall paren_args
1969
- {
1970
- call, args = val
1971
-
1972
- result = call
1973
-
1974
- if args then
1975
- call.concat args.sexp_body
1976
- result.line_max = args.line_max
1977
- end
1978
- }
1979
- | primary_value call_op operation2 opt_paren_args
1980
- {
1981
- recv, call_op, (op, op_line), args = val
1982
-
1983
- result = new_call recv, op.to_sym, args, call_op
1984
- result.line_max = op_line unless args
1985
- }
1986
- | primary_value tCOLON2 operation2 paren_args
1987
- {
1988
- recv, _, (op, _line), args = val
1989
-
1990
- result = new_call recv, op.to_sym, args
1991
- }
1992
- | primary_value tCOLON2 operation3
1993
- {
1994
- lhs, _, (id, _line) = val
1995
-
1996
- result = new_call lhs, id.to_sym
1997
- }
1998
- | primary_value call_op paren_args
1999
- {
2000
- result = new_call val[0], :call, val[2], val[1]
2001
- }
2002
- | primary_value tCOLON2 paren_args
2003
- {
2004
- result = new_call val[0], :call, val[2]
2005
- }
2006
- | kSUPER paren_args
2007
- {
2008
- result = new_super val[1]
2009
- }
2010
- | kSUPER
2011
- {
2012
- (_, line), = val
2013
- result = s(:zsuper).line line
2014
- }
2015
- | primary_value tLBRACK2 opt_call_args rbracket
2016
- {
2017
- result = new_aref val
2018
- }
2019
-
2020
- brace_block: tLCURLY
2021
- {
2022
- self.env.extend :dynamic
2023
- }
2024
- brace_body
2025
- tRCURLY
2026
- {
2027
- (_, line), _, body, _ = val
2028
-
2029
- result = body
2030
- result.line line
2031
-
2032
- self.env.unextend
2033
- }
2034
- | k_do
2035
- {
2036
- self.env.extend :dynamic
2037
- }
2038
- do_body
2039
- kEND
2040
- {
2041
- (_, line), _, body, _ = val
2042
-
2043
- result = body
2044
- result.line line
2045
-
2046
- self.env.unextend
2047
- }
2048
-
2049
- brace_body: { self.env.extend :dynamic; result = self.lexer.lineno }
2050
- { result = lexer.cmdarg.store(false) }
2051
- opt_block_param compstmt
2052
- {
2053
- line, cmdarg, param, cmpstmt = val
2054
-
2055
- result = new_brace_body param, cmpstmt, line
2056
- self.env.unextend
2057
- lexer.cmdarg.restore cmdarg
2058
- lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ?
2059
- }
2060
-
2061
- do_body: { self.env.extend :dynamic; result = self.lexer.lineno }
2062
- { lexer.cmdarg.push false }
2063
- opt_block_param
2064
- bodystmt
2065
- {
2066
- line, _cmdarg, param, cmpstmt = val
2067
-
2068
- result = new_do_body param, cmpstmt, line
2069
- lexer.cmdarg.pop
2070
- self.env.unextend
2071
- }
2072
-
2073
- case_args: arg_value
2074
- {
2075
- arg, = val
2076
-
2077
- result = s(:array, arg).line arg.line
2078
- }
2079
- | tSTAR arg_value
2080
- {
2081
- _, arg = val
2082
-
2083
- result = s(:array, s(:splat, arg).line(arg.line)).line arg.line
2084
- }
2085
- | case_args tCOMMA arg_value
2086
- {
2087
- args, _, id = val
2088
-
2089
- result = self.list_append args, id
2090
- }
2091
- | case_args tCOMMA tSTAR arg_value
2092
- {
2093
- args, _, _, id = val
2094
-
2095
- result = self.list_append args, s(:splat, id).line(id.line)
2096
- }
2097
-
2098
- case_body: k_when
2099
- case_args then compstmt cases
2100
- {
2101
- (_, line), case_args, _then, body, cases = val
2102
-
2103
- result = new_when case_args, body
2104
- result.line line
2105
- result << cases if cases
2106
- }
2107
-
2108
- cases: opt_else | case_body
2109
- ######################################################################
2110
-
2111
- p_case_body: kIN
2112
- {
2113
- self.lexer.lex_state = EXPR_BEG|EXPR_LABEL
2114
- self.lexer.command_start = false
2115
- result = self.in_kwarg
2116
- self.in_kwarg = true
2117
- push_pvtbl
2118
- push_pktbl
2119
- }
2120
- p_top_expr then
2121
- {
2122
- pop_pktbl
2123
- pop_pvtbl
2124
- old_kwargs = _values[-3]
2125
- self.in_kwarg = old_kwargs
2126
- }
2127
- compstmt
2128
- p_cases
2129
- {
2130
- (_, line), _, pat, _, _, body, cases = val
2131
-
2132
- result = new_in pat, body, cases, line
2133
- }
2134
-
2135
- p_cases: opt_else
2136
- | p_case_body
2137
-
2138
- p_top_expr: p_top_expr_body
2139
- | p_top_expr_body kIF_MOD expr_value
2140
- {
2141
- body, _, cond = val
2142
- body = remove_begin body
2143
-
2144
- result = s(:if, cond, body, nil).line body.line
2145
- }
2146
- | p_top_expr_body kUNLESS_MOD expr_value
2147
- {
2148
- body, _, cond = val
2149
- body = remove_begin body
2150
-
2151
- result = s(:if, cond, nil, body).line body.line
2152
- }
2153
-
2154
- p_top_expr_body: p_expr
2155
- | p_expr tCOMMA
2156
- {
2157
- expr, _ = val
2158
-
2159
- tail = new_array_pattern_tail nil, true, nil, nil
2160
- result = new_array_pattern nil, expr, tail, expr.line
2161
- }
2162
- | p_expr tCOMMA p_args
2163
- {
2164
- expr, _, args = val
2165
-
2166
- result = new_array_pattern nil, expr, args, expr.line
2167
- }
2168
- | p_find
2169
- {
2170
- find, = val
2171
-
2172
- result = new_find_pattern nil, find
2173
- }
2174
- | p_args_tail
2175
- {
2176
- args, = val
2177
- result = new_array_pattern nil, nil, args, args.line
2178
- }
2179
- | p_kwargs
2180
- {
2181
- kwargs, = val
2182
- result = new_hash_pattern nil, kwargs, kwargs.line
2183
- }
2184
-
2185
- p_expr: p_as
2186
-
2187
- p_as: p_expr tASSOC p_variable
2188
- {
2189
- # NODE *n = NEW_LIST($1, &@$);
2190
- # n = list_append(p, n, $3);
2191
- # $$ = new_hash(p, n, &@$);
2192
-
2193
- expr, _, var = val
2194
-
2195
- id = var.last
2196
-
2197
- self.env[id] = :lvar # HACK: need to extend env
2198
- lhs = s(:lasgn, id).line var.line
2199
-
2200
- result = new_assign lhs, expr
2201
- }
2202
- | p_alt
2203
-
2204
- p_alt: p_alt tPIPE p_expr_basic
2205
- {
2206
- lhs, _, rhs = val
2207
-
2208
- result = s(:or, lhs, rhs).line lhs.line
2209
- }
2210
- | p_expr_basic
2211
-
2212
- p_lparen: tLPAREN2 { push_pktbl }
2213
- p_lbracket: tLBRACK2 { push_pktbl }
2214
-
2215
- p_expr_basic: p_value
2216
- | p_variable
2217
- | p_const p_lparen p_args tRPAREN
2218
- {
2219
- lhs, _, args, _ = val
2220
-
2221
- pop_pktbl
2222
- result = new_array_pattern(lhs, nil, args, lhs.line)
2223
- }
2224
- | p_const p_lparen p_find tRPAREN
2225
- {
2226
- const, _, find, _ = val
2227
-
2228
- pop_pktbl
2229
- result = new_find_pattern(const, find).line const.line
2230
- }
2231
- | p_const p_lparen p_kwargs tRPAREN
2232
- {
2233
- lhs, _, kwargs, _ = val
2234
-
2235
- pop_pktbl
2236
- result = new_hash_pattern(lhs, kwargs, lhs.line)
2237
- }
2238
- | p_const tLPAREN2 tRPAREN
2239
- {
2240
- const, _, _ = val
2241
-
2242
- tail = new_array_pattern_tail nil, nil, nil, nil
2243
- result = new_array_pattern const, nil, tail, const.line
2244
- }
2245
- | p_const p_lbracket p_args rbracket
2246
- {
2247
- const, _, pre_arg, _ = val
2248
-
2249
- pop_pktbl
2250
- result = new_array_pattern const, nil, pre_arg, const.line
2251
- }
2252
- | p_const p_lbracket p_find rbracket
2253
- {
2254
- const, _, find, _ = val
2255
-
2256
- pop_pktbl
2257
- result = new_find_pattern(const, find).line const.line
2258
- }
2259
- | p_const p_lbracket p_kwargs rbracket
2260
- {
2261
- const, _, kwargs, _ = val
2262
-
2263
- result = new_hash_pattern const, kwargs, const.line
2264
- }
2265
- | p_const tLBRACK2 rbracket
2266
- {
2267
- const, _, _ = val
2268
-
2269
- tail = new_array_pattern_tail nil, nil, nil, nil
2270
- result = new_array_pattern const, nil, tail, const.line
2271
- }
2272
- | tLBRACK p_args rbracket
2273
- {
2274
- _, pat, _ = val
2275
-
2276
- result = new_array_pattern nil, nil, pat, pat.line
2277
- }
2278
- | tLBRACK p_find rbracket
2279
- {
2280
- _, find, _ = val
2281
-
2282
- result = new_find_pattern nil, find
2283
- }
2284
- | tLBRACK rbracket
2285
- {
2286
- (_, line), _ = val
2287
-
2288
- result = s(:array_pat).line line
2289
- }
2290
- | tLBRACE
2291
- {
2292
- push_pktbl
2293
- result = self.in_kwarg
2294
- self.in_kwarg = false
2295
- }
2296
- p_kwargs rbrace
2297
- {
2298
- _, in_kwarg, kwargs, _ = val
2299
-
2300
- pop_pktbl
2301
- self.in_kwarg = in_kwarg
2302
-
2303
- result = new_hash_pattern(nil, kwargs, kwargs.line)
2304
- }
2305
- | tLBRACE rbrace
2306
- {
2307
- (_, line), _ = val
2308
-
2309
- tail = new_hash_pattern_tail nil, nil, line
2310
- result = new_hash_pattern nil, tail, line
2311
- }
2312
- | tLPAREN { push_pktbl } p_expr tRPAREN
2313
- {
2314
- _, _, expr, _ = val
2315
-
2316
- pop_pktbl
2317
- result = expr
2318
- }
2319
-
2320
- p_args: p_expr
2321
- {
2322
- expr, = val
2323
-
2324
- ary = s(:array_TAIL, expr).line expr.line
2325
- result = new_array_pattern_tail(ary, nil, nil, nil).line expr.line
2326
- }
2327
- | p_args_head
2328
- {
2329
- head, = val
2330
-
2331
- result = new_array_pattern_tail head, true, nil, nil
2332
- }
2333
- | p_args_head p_arg
2334
- {
2335
- head, tail = val
2336
-
2337
- both = array_pat_concat head, tail
2338
-
2339
- result = new_array_pattern_tail both, nil, nil, nil
2340
- result.line head.line
2341
- }
2342
- | p_args_head p_rest
2343
- {
2344
- head, (rest, _) = val
2345
-
2346
- result = new_array_pattern_tail(head, true, rest, nil).line head.line
2347
- }
2348
- | p_args_head p_rest tCOMMA p_args_post
2349
- {
2350
- head, (rest, _), _, post = val
2351
-
2352
- result = new_array_pattern_tail(head, true, rest, post).line head.line
2353
- }
2354
- | p_args_tail
2355
-
2356
- p_args_head: p_arg tCOMMA
2357
- {
2358
- arg, _ = val
2359
- result = arg
2360
- }
2361
- | p_args_head p_arg tCOMMA
2362
- {
2363
- head, tail, _ = val
2364
-
2365
- result = s(:PATTERN, *head.sexp_body, *tail.sexp_body)
2366
- result.line head.line
2367
- }
2368
-
2369
- p_args_tail: p_rest
2370
- {
2371
- (id, line), = val
2372
-
2373
- result = new_array_pattern_tail nil, true, id, nil
2374
- result.line line
2375
- }
2376
- | p_rest tCOMMA p_args_post
2377
- {
2378
- (id, line), _, rhs = val
2379
-
2380
- result = new_array_pattern_tail nil, true, id, rhs
2381
- result.line line
2382
- }
2383
-
2384
- p_find: p_rest tCOMMA p_args_post tCOMMA p_rest
2385
- {
2386
- lhs, _, mid, _, rhs = val
2387
-
2388
- result = new_find_pattern_tail lhs, mid, rhs
2389
- }
2390
-
2391
- p_rest: tSTAR tIDENTIFIER
2392
- {
2393
- _, (id, line) = val
2394
-
2395
- result = [id.to_sym, line]
2396
- }
2397
- | tSTAR
2398
- {
2399
- (_id, line), = val
2400
-
2401
- result = [nil, line]
2402
- }
2403
-
2404
- p_args_post: p_arg
2405
- | p_args_post tCOMMA p_arg
2406
- {
2407
- lhs, _, rhs = val
2408
-
2409
- result = array_pat_concat lhs, rhs
2410
- }
2411
-
2412
- p_arg: p_expr
2413
- {
2414
- expr, = val
2415
- expr = s(:array_TAIL, expr).line expr.line unless
2416
- expr.sexp_type == :array_TAIL
2417
- result = expr
2418
- }
2419
-
2420
- p_kwargs: p_kwarg tCOMMA p_any_kwrest
2421
- {
2422
- kw_arg, _, rest = val
2423
- # TODO? new_unique_key_hash(p, $1, &@$)
2424
- result = new_hash_pattern_tail kw_arg, rest, kw_arg.line
2425
- }
2426
- | p_kwarg
2427
- {
2428
- kwarg, = val
2429
- # TODO? new_unique_key_hash(p, $1, &@$)
2430
- result = new_hash_pattern_tail kwarg, nil, kwarg.line
2431
- }
2432
- | p_kwarg tCOMMA
2433
- {
2434
- kwarg, _ = val
2435
- # TODO? new_unique_key_hash(p, $1, &@$)
2436
- result = new_hash_pattern_tail kwarg, nil, kwarg.line
2437
- }
2438
- | p_any_kwrest
2439
- {
2440
- rest, = val
2441
-
2442
- result = new_hash_pattern_tail nil, rest, rest.line
2443
- }
2444
-
2445
- p_kwarg: p_kw # TODO? rb_ary_new_from_args(1, $1)
2446
- | p_kwarg tCOMMA p_kw
2447
- {
2448
- kwarg, _, kw = val
2449
- kwarg.concat kw.sexp_body
2450
- result = kwarg
2451
- }
2452
-
2453
- p_kw: p_kw_label p_expr
2454
- {
2455
- # TODO: error_duplicate_pattern_key(p, get_id($1), &@1);
2456
- lhs, rhs = val
2457
-
2458
- result = s(:PAIR, lhs, rhs).line lhs.line
2459
- }
2460
- | p_kw_label
2461
- {
2462
- lhs, = val
2463
-
2464
- # TODO: error_duplicate_pattern_variable(p, get_id($1), &@1);
2465
-
2466
- # TODO: if ($1 && !is_local_id(get_id($1))) {
2467
- # yyerror1(&@1, "key must be valid as local variables");
2468
- # }
2469
-
2470
- # $$ = list_append(p, NEW_LIST(NEW_LIT(ID2SYM($1), &@$), &@$),
2471
- # assignable(p, $1, 0, &@$));
2472
-
2473
- case lhs.sexp_type
2474
- when :lit then
2475
- assignable [lhs.value, lhs.line]
2476
- else
2477
- # TODO or done?
2478
- debug 10
2479
- end
2480
-
2481
- # TODO PAIR -> LIST ?
2482
- result = s(:PAIR, lhs, nil).line lhs.line
2483
- }
2484
-
2485
- p_kw_label: tLABEL
2486
- {
2487
- result = wrap :lit, val[0]
2488
- }
2489
- | tSTRING_BEG string_contents tLABEL_END
2490
- {
2491
- # you can't actually get here the way I lex labels
2492
- debug 11
2493
- }
2494
-
2495
- p_kwrest: kwrest_mark tIDENTIFIER
2496
- {
2497
- _, (id, line) = val
2498
-
2499
- name = id.to_sym
2500
- self.assignable [name, line]
2501
- result = s(:kwrest, :"**#{name}").line line
2502
- }
2503
- | kwrest_mark
2504
- {
2505
- (_, line), = val
2506
-
2507
- result = s(:kwrest, :"**").line line
2508
- }
2509
-
2510
- p_kwnorest: kwrest_mark kNIL
2511
- {
2512
- (_, line), _ = val
2513
-
2514
- # TODO: or s(:norest)? s(:**nil)?
2515
- result = s(:kwrest, :"**nil").line line
2516
- }
2517
-
2518
- p_any_kwrest: p_kwrest
2519
- | p_kwnorest
2520
-
2521
- p_value: p_primitive
2522
- | p_primitive tDOT2 p_primitive
2523
- {
2524
- lhs, _, rhs = val
2525
-
2526
- lhs = value_expr lhs
2527
- rhs = value_expr rhs
2528
-
2529
- result = s(:dot2, lhs, rhs).line lhs.line
2530
- }
2531
- | p_primitive tDOT3 p_primitive
2532
- {
2533
- lhs, _, rhs = val
2534
-
2535
- lhs = value_expr lhs
2536
- rhs = value_expr rhs
2537
-
2538
- result = s(:dot3, lhs, rhs).line lhs.line
2539
- }
2540
- | p_primitive tDOT2
2541
- {
2542
- v1, _ = val
2543
-
2544
- result = s(:dot2, v1, nil).line v1.line
2545
- }
2546
- | p_primitive tDOT3
2547
- {
2548
- v1, _ = val
2549
-
2550
- result = s(:dot3, v1, nil).line v1.line
2551
- }
2552
- | p_var_ref
2553
- | p_expr_ref
2554
- | p_const
2555
- | tBDOT2 p_primitive
2556
- {
2557
- _, v1 = val
2558
-
2559
- result = s(:dot2, nil, v1).line v1.line
2560
- }
2561
- | tBDOT3 p_primitive
2562
- {
2563
- _, v1 = val
2564
-
2565
- result = s(:dot3, nil, v1).line v1.line
2566
- }
2567
-
2568
- p_primitive: literal
2569
- | strings
2570
- | xstring
2571
- | regexp
2572
- | words
2573
- {
2574
- result = ary_to_pat val[0]
2575
- }
2576
- | qwords
2577
- {
2578
- result = ary_to_pat val[0]
2579
- }
2580
- | symbols
2581
- {
2582
- result = ary_to_pat val[0]
2583
- }
2584
- | qsymbols
2585
- {
2586
- result = ary_to_pat val[0]
2587
- }
2588
- | keyword_variable
2589
- {
2590
- # TODO? if (!($$ = gettable(p, $1, &@$))) $$ = NEW_BEGIN(0, &@$);
2591
- var, = val
2592
-
2593
- result = var
2594
- }
2595
- | lambda
2596
-
2597
- p_variable: tIDENTIFIER
2598
- {
2599
- # TODO: error_duplicate_pattern_variable(p, $1, &@1);
2600
- # TODO: assignable(p, $1, 0, &@$);
2601
- result = wrap :lasgn, val[0]
2602
- }
2603
-
2604
- p_var_ref: tCARET tIDENTIFIER
2605
- {
2606
- # TODO: check id against env for lvar or dvar
2607
- result = wrap :lvar, val[1]
2608
- }
2609
- | tCARET nonlocal_var
2610
- {
2611
- _, var = val
2612
- result = var
2613
- }
2614
-
2615
- p_expr_ref: tCARET tLPAREN expr_value rparen
2616
- {
2617
- _, _, expr, _ = val
2618
- result = expr # TODO? s(:begin, expr).line expr.line
2619
- }
2620
-
2621
- p_const: tCOLON3 cname
2622
- {
2623
- result = wrap :colon3, val[1]
2624
- }
2625
- | p_const tCOLON2 cname
2626
- {
2627
- lhs, _, (id, _line) = val
2628
-
2629
- l = lhs.line
2630
- result = s(:const, s(:colon2, lhs, id.to_sym).line(l)).line l
2631
- }
2632
- | tCONSTANT
2633
- {
2634
- # TODO $$ = gettable(p, $1, &@$);
2635
- result = wrap :const, val[0]
2636
- }
2637
- ######################################################################
2638
-
2639
- opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue
2640
- {
2641
- (_, line), klasses, var, _, body, rest = val
2642
-
2643
- klasses ||= s(:array)
2644
- klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var
2645
- klasses.line line
2646
-
2647
- result = new_resbody(klasses, body)
2648
- result << rest if rest # UGH, rewritten above
2649
- }
2650
- |
2651
- {
2652
- result = nil
2653
- }
2654
-
2655
- exc_list: arg_value
2656
- {
2657
- arg, = val
2658
- result = s(:array, arg).line arg.line
2659
- }
2660
- | mrhs
2661
- | none
2662
-
2663
- exc_var: tASSOC lhs
2664
- {
2665
- result = val[1]
2666
- }
2667
- | none
2668
-
2669
- opt_ensure: k_ensure compstmt
2670
- {
2671
- (_, line), body = val
2672
-
2673
- result = body || s(:nil).line(line)
2674
- }
2675
- | none
2676
-
2677
- literal: numeric
2678
- {
2679
- (lit, line), = val
2680
- result = s(:lit, lit).line line
2681
- }
2682
- | symbol
2683
-
2684
- strings: string
2685
- {
2686
- str, = val
2687
- str = s(:dstr, str.value) if str.sexp_type == :evstr
2688
- result = str
2689
- }
2690
-
2691
- string: tCHAR
2692
- {
2693
- debug 12
2694
- }
2695
- | string1
2696
- | string string1
2697
- {
2698
- result = self.literal_concat val[0], val[1]
2699
- }
2700
-
2701
- string1: tSTRING_BEG string_contents tSTRING_END
2702
- {
2703
- (_, line), str, (_, func) = val
2704
-
2705
- str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT
2706
-
2707
- result = str.line line
2708
- }
2709
- | tSTRING
2710
- {
2711
- result = new_string val
2712
- }
2713
-
2714
- xstring: tXSTRING_BEG xstring_contents tSTRING_END
2715
- {
2716
- result = new_xstring val
2717
- # TODO: dedent?!?! SERIOUSLY?!?
2718
- }
2719
-
2720
- regexp: tREGEXP_BEG regexp_contents tREGEXP_END
2721
- {
2722
- result = new_regexp val
2723
- }
2724
-
2725
- words: tWORDS_BEG tSPACE tSTRING_END
2726
- {
2727
- (_, line), _, (_, line_max) = val
2728
-
2729
- result = s(:array).line line
2730
- result.line_max = line_max
2731
- }
2732
- | tWORDS_BEG word_list tSTRING_END
2733
- {
2734
- (_, line), list, (_, line_max) = val
2735
-
2736
- result = list.line line
2737
- result.line_max = line_max
2738
- }
2739
-
2740
- word_list: none
2741
- {
2742
- result = new_word_list
2743
- }
2744
- | word_list word tSPACE
2745
- {
2746
- result = val[0].dup << new_word_list_entry(val)
2747
- }
2748
-
2749
- word: string_content
2750
- | word string_content
2751
- {
2752
- result = self.literal_concat val[0], val[1]
2753
- }
2754
-
2755
- symbols: tSYMBOLS_BEG tSPACE tSTRING_END
2756
- {
2757
- (_, line), _, (_, line_max) = val
2758
-
2759
- result = s(:array).line line
2760
- result.line_max = line_max
2761
- }
2762
- | tSYMBOLS_BEG symbol_list tSTRING_END
2763
- {
2764
- (_, line), list, (_, line_max), = val
2765
-
2766
- result = list.line line
2767
- result.line_max = line_max
2768
- }
2769
-
2770
- symbol_list: none
2771
- {
2772
- result = new_symbol_list
2773
- }
2774
- | symbol_list word tSPACE
2775
- {
2776
- list, * = val
2777
- result = list.dup << new_symbol_list_entry(val)
2778
- }
2779
-
2780
- qwords: tQWORDS_BEG tSPACE tSTRING_END
2781
- {
2782
- (_, line), _, (_, line_max) = val
2783
-
2784
- result = s(:array).line line
2785
- result.line_max = line_max
2786
- }
2787
- | tQWORDS_BEG qword_list tSTRING_END
2788
- {
2789
- (_, line), list, (_, line_max) = val
2790
-
2791
- result = list.line line
2792
- result.line_max = line_max
2793
- }
2794
-
2795
- qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END
2796
- {
2797
- (_, line), _, (_, line_max) = val
2798
-
2799
- result = s(:array).line line
2800
- result.line_max = line_max
2801
- }
2802
- | tQSYMBOLS_BEG qsym_list tSTRING_END
2803
- {
2804
- (_, line), list, (_, line_max) = val
2805
-
2806
- result = list.line line
2807
- result.line_max = line_max
2808
- }
2809
-
2810
- qword_list: none
2811
- {
2812
- result = new_qword_list
2813
- }
2814
- | qword_list tSTRING_CONTENT tSPACE
2815
- {
2816
- result = val[0].dup << new_qword_list_entry(val)
2817
- }
2818
-
2819
- qsym_list: none
2820
- {
2821
- result = new_qsym_list
2822
- }
2823
- | qsym_list tSTRING_CONTENT tSPACE
2824
- {
2825
- result = val[0].dup << new_qsym_list_entry(val)
2826
- }
2827
-
2828
- string_contents: none
2829
- {
2830
- line = prev_value_to_lineno _values.last
2831
- result = s(:str, +"").line line
2832
- }
2833
- | string_contents string_content
2834
- {
2835
- v1, v2 = val
2836
- result = literal_concat v1, v2
2837
- }
2838
-
2839
- xstring_contents: none
2840
- {
2841
- result = nil
2842
- }
2843
- | xstring_contents string_content
2844
- {
2845
- v1, v2 = val
2846
- result = literal_concat v1, v2
2847
- }
2848
-
2849
- regexp_contents: none
2850
- {
2851
- result = nil
2852
- }
2853
- | regexp_contents string_content
2854
- {
2855
- v1, v2 = val
2856
- result = literal_concat v1, v2
2857
- }
2858
-
2859
- string_content: tSTRING_CONTENT
2860
- {
2861
- result = new_string val
2862
- }
2863
- | tSTRING_DVAR
2864
- {
2865
- result = lexer.lex_strterm
2866
-
2867
- lexer.lex_strterm = nil
2868
- lexer.lex_state = EXPR_BEG
2869
- }
2870
- string_dvar
2871
- {
2872
- _, strterm, str = val
2873
- lexer.lex_strterm = strterm
2874
- result = s(:evstr, str).line str.line
2875
- }
2876
- | tSTRING_DBEG
2877
- {
2878
- result = [lexer.lex_strterm,
2879
- lexer.brace_nest,
2880
- lexer.string_nest, # TODO: remove
2881
- lexer.lex_state,
2882
- ]
2883
-
2884
- lexer.cmdarg.push false
2885
- lexer.cond.push false
2886
-
2887
- lexer.lex_strterm = nil
2888
- lexer.brace_nest = 0
2889
- lexer.string_nest = 0
2890
-
2891
- lexer.lex_state = EXPR_BEG
2892
- }
2893
- compstmt
2894
- tSTRING_DEND
2895
- {
2896
- (_, line), memo, stmt, _ = val
2897
-
2898
- lex_strterm, brace_nest, string_nest, oldlex_state = memo
2899
- # TODO: heredoc_indent
2900
-
2901
- lexer.lex_strterm = lex_strterm
2902
- lexer.brace_nest = brace_nest
2903
- lexer.string_nest = string_nest
2904
-
2905
- lexer.cond.pop
2906
- lexer.cmdarg.pop
2907
-
2908
- lexer.lex_state = oldlex_state
2909
-
2910
- case stmt
2911
- when Sexp then
2912
- case stmt.sexp_type
2913
- when :str, :dstr, :evstr then
2914
- result = stmt
2915
- else
2916
- result = s(:evstr, stmt).line line
2917
- end
2918
- when nil then
2919
- result = s(:evstr).line line
2920
- else
2921
- debug 13
2922
- raise "unknown string body: #{stmt.inspect}"
2923
- end
2924
- }
2925
-
2926
- string_dvar: tGVAR
2927
- {
2928
- result = wrap :gvar, val[0]
2929
- }
2930
- | tIVAR
2931
- {
2932
- result = wrap :ivar, val[0]
2933
- }
2934
- | tCVAR
2935
- {
2936
- result = wrap :cvar, val[0]
2937
- }
2938
- | backref
2939
-
2940
- symbol: ssym
2941
- | dsym
2942
-
2943
- ssym: tSYMBEG sym
2944
- {
2945
- lexer.lex_state = EXPR_END
2946
- result = wrap :lit, val[1]
2947
- }
2948
- | tSYMBOL
2949
- {
2950
- lexer.lex_state = EXPR_END
2951
- result = wrap :lit, val[0]
2952
- }
2953
-
2954
- sym: fname | tIVAR | tGVAR | tCVAR
2955
-
2956
- dsym: tSYMBEG string_contents tSTRING_END
2957
- {
2958
- (_, line), result, _ = val
2959
-
2960
- lexer.lex_state = EXPR_END
2961
-
2962
- result ||= s(:str, "").line line
2963
-
2964
- case result.sexp_type
2965
- when :dstr then
2966
- result.sexp_type = :dsym
2967
- when :str then
2968
- result = s(:lit, result.last.to_sym).line result.line
2969
- when :evstr then
2970
- result = s(:dsym, "", result).line result.line
2971
- else
2972
- debug 14
2973
- end
2974
- }
2975
-
2976
- numeric: simple_numeric
2977
- | tUMINUS_NUM simple_numeric =tLOWEST
2978
- {
2979
- _, (num, line) = val
2980
- result = [-num, line]
2981
- }
2982
-
2983
- simple_numeric: tINTEGER
2984
- | tFLOAT
2985
- | tRATIONAL
2986
- | tIMAGINARY
2987
-
2988
- nonlocal_var: tIVAR { result = wrap :ivar, val[0] }
2989
- | tGVAR { result = wrap :gvar, val[0] }
2990
- | tCVAR { result = wrap :cvar, val[0] }
2991
-
2992
- user_variable: tIDENTIFIER
2993
- | tIVAR
2994
- | tGVAR
2995
- | tCONSTANT
2996
- | tCVAR
2997
-
2998
- keyword_variable: kNIL { (_, line), = val; result = s(:nil).line line }
2999
- | kSELF { (_, line), = val; result = s(:self).line line }
3000
- | kTRUE { (_, line), = val; result = s(:true).line line }
3001
- | kFALSE { (_, line), = val; result = s(:false).line line }
3002
- | k__FILE__ { (_, line), = val; result = s(:str, self.file).line line }
3003
- | k__LINE__ { (_, line), = val; result = s(:lit, line).line line }
3004
- | k__ENCODING__
3005
- {
3006
- (_, l), = val
3007
- result =
3008
- if defined? Encoding then
3009
- s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l
3010
- else
3011
- s(:str, "Unsupported!").line l
3012
- end
3013
- }
3014
-
3015
- var_ref: user_variable
3016
- {
3017
- raise "NO: #{val.inspect}" if Sexp === val.first
3018
- (var, line), = val
3019
- result = Sexp === var ? var : self.gettable(var)
3020
-
3021
- result.line line
3022
- }
3023
- | keyword_variable
3024
- {
3025
- var = val[0]
3026
- result = Sexp === var ? var : self.gettable(var)
3027
- }
3028
-
3029
- var_lhs: user_variable
3030
- {
3031
- result = self.assignable val[0]
3032
- }
3033
- | keyword_variable
3034
- {
3035
- result = self.assignable val[0]
3036
- debug 15
3037
- }
3038
-
3039
- backref: tNTH_REF
3040
- {
3041
- (ref, line), = val
3042
- result = s(:nth_ref, ref).line line
3043
- }
3044
- | tBACK_REF
3045
- {
3046
- (ref, line), = val
3047
- result = s(:back_ref, ref).line line
3048
- }
3049
-
3050
- superclass: tLT
3051
- {
3052
- lexer.lex_state = EXPR_BEG
3053
- lexer.command_start = true
3054
- }
3055
- expr_value term
3056
- {
3057
- result = val[2]
3058
- }
3059
- | none
3060
- {
3061
- result = nil
3062
- }
3063
-
3064
- f_opt_paren_args: f_paren_args
3065
- | none
3066
- {
3067
- result = end_args val
3068
- }
3069
-
3070
- f_paren_args: tLPAREN2 f_args rparen
3071
- {
3072
- result = end_args val
3073
- }
3074
-
3075
- f_arglist: f_paren_args
3076
- | {
3077
- result = self.in_kwarg
3078
- self.in_kwarg = true
3079
- self.lexer.lex_state |= EXPR_LABEL
3080
- }
3081
- f_args term
3082
- {
3083
- result = end_args val
3084
- }
3085
-
3086
- args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg
3087
- {
3088
- result = args val
3089
- }
3090
- | f_kwarg opt_f_block_arg
3091
- {
3092
- result = args val
3093
- }
3094
- | f_any_kwrest opt_f_block_arg
3095
- {
3096
- result = args val
3097
- }
3098
- | f_block_arg
3099
- | args_forward
3100
-
3101
- opt_args_tail: tCOMMA args_tail
3102
- {
3103
- result = val[1]
3104
- }
3105
- |
3106
- {
3107
- result = nil
3108
- }
3109
-
3110
- f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail
3111
- {
3112
- result = args val
3113
- }
3114
- | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
3115
- {
3116
- result = args val
3117
- }
3118
- | f_arg tCOMMA f_optarg opt_args_tail
3119
- {
3120
- result = args val
3121
- }
3122
- | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail
3123
- {
3124
- result = args val
3125
- }
3126
- | f_arg tCOMMA f_rest_arg opt_args_tail
3127
- {
3128
- result = args val
3129
- }
3130
- | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
3131
- {
3132
- result = args val
3133
- }
3134
- | f_arg opt_args_tail
3135
- {
3136
- result = args val
3137
- }
3138
- | f_optarg tCOMMA f_rest_arg opt_args_tail
3139
- {
3140
- result = args val
3141
- }
3142
- | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
3143
- {
3144
- result = args val
3145
- }
3146
- | f_optarg opt_args_tail
3147
- {
3148
- result = args val
3149
- }
3150
- | f_optarg tCOMMA f_arg opt_args_tail
3151
- {
3152
- result = args val
3153
- }
3154
- | f_rest_arg opt_args_tail
3155
- {
3156
- result = args val
3157
- }
3158
- | f_rest_arg tCOMMA f_arg opt_args_tail
3159
- {
3160
- result = args val
3161
- }
3162
- | args_tail
3163
- {
3164
- result = args val
3165
- }
3166
- |
3167
- {
3168
- result = args val
3169
- }
3170
-
3171
- args_forward: tBDOT3
3172
- {
3173
- (_, line), = val
3174
- result = s(:forward_args).line line
3175
- }
3176
-
3177
- f_bad_arg: tCONSTANT
3178
- {
3179
- yyerror "formal argument cannot be a constant"
3180
- }
3181
- | tIVAR
3182
- {
3183
- yyerror "formal argument cannot be an instance variable"
3184
- }
3185
- | tGVAR
3186
- {
3187
- yyerror "formal argument cannot be a global variable"
3188
- }
3189
- | tCVAR
3190
- {
3191
- yyerror "formal argument cannot be a class variable"
3192
- }
3193
-
3194
- f_norm_arg: f_bad_arg
3195
- | tIDENTIFIER
3196
- {
3197
- (id, line), = val
3198
- identifier = id.to_sym
3199
- self.env[identifier] = :lvar
3200
-
3201
- result = [identifier, line]
3202
- }
3203
-
3204
- f_arg_asgn: f_norm_arg
3205
-
3206
- f_arg_item: f_arg_asgn
3207
- | tLPAREN f_margs rparen
3208
- {
3209
- _, margs, _ = val
3210
-
3211
- result = margs
3212
- }
3213
-
3214
- f_arg: f_arg_item
3215
- {
3216
- result = new_arg val
3217
- }
3218
- | f_arg tCOMMA f_arg_item
3219
- {
3220
- list, _, item = val
3221
-
3222
- if list.sexp_type == :args then
3223
- result = list
3224
- else
3225
- result = s(:args, list).line list.line
3226
- end
3227
-
3228
- if Sexp === item then
3229
- line_max = item.line_max
3230
- else
3231
- item, line_max = item
3232
- end
3233
-
3234
- result << item
3235
- result.line_max = line_max
3236
- }
3237
-
3238
- f_label: tLABEL
3239
-
3240
- f_kw: f_label arg_value
3241
- {
3242
- # TODO: new_kw_arg
3243
- (label, line), arg = val
3244
-
3245
- identifier = label.to_sym
3246
- self.env[identifier] = :lvar
3247
-
3248
- kwarg = s(:kwarg, identifier, arg).line line
3249
- result = s(:array, kwarg).line line
3250
- }
3251
- | f_label
3252
- {
3253
- (label, line), = val
3254
-
3255
- id = label.to_sym
3256
- self.env[id] = :lvar
3257
-
3258
- result = s(:array, s(:kwarg, id).line(line)).line line
3259
- }
3260
-
3261
- f_block_kw: f_label primary_value
3262
- {
3263
- # TODO: new_kw_arg
3264
- (label, line), expr = val
3265
- id = label.to_sym
3266
- self.env[id] = :lvar
3267
-
3268
- result = s(:array, s(:kwarg, id, expr).line(line)).line line
3269
- }
3270
- | f_label
3271
- {
3272
- # TODO: new_kw_arg
3273
- (label, line), = val
3274
- id = label.to_sym
3275
- self.env[id] = :lvar
3276
-
3277
- result = s(:array, s(:kwarg, id).line(line)).line line
3278
- }
3279
-
3280
- f_block_kwarg: f_block_kw
3281
- | f_block_kwarg tCOMMA f_block_kw
3282
- {
3283
- list, _, item = val
3284
- result = list << item.last
3285
- }
3286
-
3287
- f_kwarg: f_kw
3288
- | f_kwarg tCOMMA f_kw
3289
- {
3290
- result = args val
3291
- }
3292
-
3293
- kwrest_mark: tPOW
3294
- | tDSTAR
3295
-
3296
- f_no_kwarg: kwrest_mark kNIL
3297
- {
3298
- (_, line), _ = val
3299
- result = [:"**nil", line]
3300
- }
3301
-
3302
- f_kwrest: kwrest_mark tIDENTIFIER
3303
- {
3304
- _, (id, line) = val
3305
-
3306
- name = id.to_sym
3307
- self.assignable [name, line]
3308
- result = [:"**#{name}", line]
3309
- }
3310
- | kwrest_mark
3311
- {
3312
- (_, line), = val
3313
- id = :"**"
3314
- self.env[id] = :lvar
3315
- result = [id, line]
3316
- }
3317
-
3318
- f_opt: f_arg_asgn
3319
- f_eq
3320
- arg_value
3321
- {
3322
- lhs, _, rhs = val
3323
- result = self.assignable lhs, rhs
3324
- # TODO: detect duplicate names
3325
- # TODO? p->cur_arg = 0;
3326
- # TODO? p->ctxt.in_argdef = 1;
3327
- }
3328
-
3329
- f_block_opt: f_arg_asgn
3330
- f_eq
3331
- primary_value
3332
- {
3333
- lhs, _, rhs = val
3334
- result = self.assignable lhs, rhs
3335
- # TODO? p->cur_arg = 0;
3336
- # TODO? p->ctxt.in_argdef = 1;
3337
- }
3338
-
3339
- f_block_optarg: f_block_opt
3340
- {
3341
- optblk, = val
3342
- result = s(:block, optblk).line optblk.line
3343
- }
3344
- | f_block_optarg tCOMMA f_block_opt
3345
- {
3346
- optarg, _, optblk = val
3347
- result = optarg
3348
- result << optblk
3349
- }
3350
-
3351
- f_optarg: f_opt
3352
- {
3353
- opt, = val
3354
- result = s(:block, opt).line opt.line
3355
- }
3356
- | f_optarg tCOMMA f_opt
3357
- {
3358
- result = self.block_append val[0], val[2]
3359
- }
3360
-
3361
- restarg_mark: tSTAR2 | tSTAR
3362
-
3363
- f_rest_arg: restarg_mark tIDENTIFIER
3364
- {
3365
- # TODO: differs from parse.y - needs tests
3366
- _, (id, line) = val
3367
- name = id.to_sym
3368
- self.assignable [name, line]
3369
- result = [:"*#{name}", line]
3370
- }
3371
- | restarg_mark
3372
- {
3373
- (_, line), = val
3374
- name = :"*"
3375
- self.env[name] = :lvar
3376
- result = [name, line]
3377
- }
3378
-
3379
- blkarg_mark: tAMPER2 | tAMPER
3380
-
3381
- f_block_arg: blkarg_mark tIDENTIFIER
3382
- {
3383
- _, (id, line) = val
3384
- identifier = id.to_sym
3385
-
3386
- self.env[identifier] = :lvar
3387
- result = ["&#{identifier}".to_sym, line]
3388
- }
3389
- | blkarg_mark
3390
- {
3391
- (_, line), = val
3392
-
3393
- result = [:&, line]
3394
- }
3395
-
3396
- opt_f_block_arg: tCOMMA f_block_arg
3397
- {
3398
- _, arg = val
3399
- result = arg
3400
- }
3401
- |
3402
- {
3403
- result = nil
3404
- }
3405
-
3406
- singleton: var_ref
3407
- | tLPAREN2
3408
- {
3409
- lexer.lex_state = EXPR_BEG
3410
- }
3411
- expr rparen
3412
- {
3413
- result = val[2]
3414
- yyerror "Can't define single method for literals." if
3415
- result.sexp_type == :lit
3416
- }
3417
-
3418
- assoc_list: none
3419
- {
3420
- result = s(:array).line lexer.lineno
3421
- }
3422
- | assocs trailer
3423
-
3424
- assocs: assoc
3425
- | assocs tCOMMA assoc
3426
- {
3427
- list = val[0].dup
3428
- more = val[2].sexp_body
3429
- list.push(*more) unless more.empty?
3430
- result = list
3431
- result.sexp_type = :hash
3432
- }
3433
-
3434
- assoc: arg_value tASSOC arg_value
3435
- {
3436
- v1, _, v2 = val
3437
- result = s(:array, v1, v2).line v1.line
3438
- }
3439
- | tLABEL arg_value
3440
- {
3441
- label, arg = val
3442
-
3443
- lit = wrap :lit, label
3444
- result = s(:array, lit, arg).line lit.line
3445
- }
3446
- | tLABEL
3447
- {
3448
- lit = wrap :lit, val[0]
3449
- arg = nil
3450
-
3451
- result = s(:array, lit, arg).line lit.line
3452
- }
3453
- | tSTRING_BEG string_contents tLABEL_END arg_value
3454
- {
3455
- (_, line), sym, _, value = val
3456
-
3457
- sym.sexp_type = :dsym
3458
-
3459
- result = s(:array, sym, value).line line
3460
- }
3461
- | tDSTAR arg_value
3462
- {
3463
- _, arg = val
3464
- line = arg.line
3465
- result = s(:array, s(:kwsplat, arg).line(line)).line line
3466
- }
3467
- | tDSTAR
3468
- {
3469
- (_, line), = val
3470
- result = s(:array, s(:kwsplat).line(line)).line line
3471
- }
3472
-
3473
- operation: tIDENTIFIER | tCONSTANT | tFID
3474
- operation2: tIDENTIFIER | tCONSTANT | tFID | op
3475
- operation3: tIDENTIFIER | tFID | op
3476
- dot_or_colon: tDOT | tCOLON2
3477
- call_op: tDOT
3478
- | tLONELY # TODO: rename tANDDOT?
3479
-
3480
- call_op2: call_op
3481
- | tCOLON2
3482
-
3483
- opt_terms: | terms
3484
- opt_nl: | tNL
3485
- rparen: opt_nl tRPAREN
3486
- {
3487
- _, close = val # TODO: include lineno in close?
3488
- result = [close, lexer.lineno]
3489
- }
3490
- rbracket: opt_nl tRBRACK
3491
- {
3492
- _, close = val
3493
- result = [close, lexer.lineno]
3494
- }
3495
- rbrace: opt_nl tRCURLY
3496
- {
3497
- _, close = val
3498
- result = [close, lexer.lineno]
3499
- }
3500
- trailer: | tNL | tCOMMA
3501
-
3502
- term: tSEMI { yyerrok }
3503
- | tNL
3504
-
3505
- terms: term
3506
- | terms tSEMI { yyerrok }
3507
-
3508
- none: { result = nil; }
3509
- end
3510
-
3511
- ---- inner
3512
-
3513
- require "ruby_lexer"
3514
- require "ruby_parser_extras"
3515
- include RubyLexer::State::Values
3516
-
3517
- # :stopdoc:
3518
-
3519
- # Local Variables: **
3520
- # racc-token-length-max:14 **
3521
- # End: **