ruby_parser 3.20.2 → 3.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/History.rdoc +44 -0
  4. data/Manifest.txt +14 -24
  5. data/README.rdoc +3 -3
  6. data/Rakefile +113 -115
  7. data/compare/normalize.rb +2 -0
  8. data/lib/ruby_lexer.rb +22 -23
  9. data/lib/ruby_lexer.rex.rb +1 -2
  10. data/lib/ruby_parser.rb +15 -13
  11. data/lib/{ruby_parser.yy → ruby_parser2.yy} +3 -10
  12. data/lib/{ruby20_parser.rb → ruby_parser20.rb} +9 -12
  13. data/lib/{ruby21_parser.rb → ruby_parser21.rb} +9 -12
  14. data/lib/{ruby22_parser.rb → ruby_parser22.rb} +9 -12
  15. data/lib/{ruby23_parser.rb → ruby_parser23.rb} +9 -12
  16. data/lib/{ruby24_parser.rb → ruby_parser24.rb} +9 -12
  17. data/lib/{ruby25_parser.rb → ruby_parser25.rb} +9 -12
  18. data/lib/{ruby26_parser.rb → ruby_parser26.rb} +9 -12
  19. data/lib/{ruby27_parser.rb → ruby_parser27.rb} +9 -12
  20. data/lib/{ruby3_parser.yy → ruby_parser3.yy} +32 -36
  21. data/lib/{ruby30_parser.rb → ruby_parser30.rb} +38 -39
  22. data/lib/{ruby31_parser.rb → ruby_parser31.rb} +2788 -2704
  23. data/lib/{ruby32_parser.rb → ruby_parser32.rb} +2735 -2741
  24. data/lib/ruby_parser33.rb +13577 -0
  25. data/lib/ruby_parser_extras.rb +36 -18
  26. data/test/test_ruby_lexer.rb +5 -5
  27. data/test/test_ruby_parser.rb +29 -19
  28. data/tools/munge.rb +8 -2
  29. data/tools/ripper.rb +14 -12
  30. data.tar.gz.sig +0 -0
  31. metadata +41 -51
  32. metadata.gz.sig +0 -0
  33. data/lib/ruby20_parser.y +0 -2707
  34. data/lib/ruby21_parser.y +0 -2724
  35. data/lib/ruby22_parser.y +0 -2735
  36. data/lib/ruby23_parser.y +0 -2737
  37. data/lib/ruby24_parser.y +0 -2745
  38. data/lib/ruby25_parser.y +0 -2745
  39. data/lib/ruby26_parser.y +0 -2760
  40. data/lib/ruby27_parser.y +0 -3360
  41. data/lib/ruby30_parser.y +0 -3486
  42. data/lib/ruby31_parser.y +0 -3520
  43. data/lib/ruby32_parser.y +0 -3521
data/lib/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: **