ruby_parser 3.20.2 → 3.21.0

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