ruby_parser 3.20.3 → 3.21.1

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