ruby_parser 3.20.3 → 3.21.1

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