ruby_parser 3.20.3 → 3.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/History.rdoc +38 -0
  4. data/Manifest.txt +14 -24
  5. data/README.rdoc +3 -3
  6. data/Rakefile +113 -115
  7. data/compare/normalize.rb +2 -0
  8. data/lib/ruby_lexer.rb +9 -16
  9. data/lib/ruby_lexer.rex.rb +1 -2
  10. data/lib/ruby_parser.rb +15 -13
  11. data/lib/{ruby_parser.yy → ruby_parser2.yy} +3 -10
  12. data/lib/{ruby20_parser.rb → ruby_parser20.rb} +9 -12
  13. data/lib/{ruby21_parser.rb → ruby_parser21.rb} +9 -12
  14. data/lib/{ruby22_parser.rb → ruby_parser22.rb} +9 -12
  15. data/lib/{ruby23_parser.rb → ruby_parser23.rb} +9 -12
  16. data/lib/{ruby24_parser.rb → ruby_parser24.rb} +9 -12
  17. data/lib/{ruby25_parser.rb → ruby_parser25.rb} +9 -12
  18. data/lib/{ruby26_parser.rb → ruby_parser26.rb} +9 -12
  19. data/lib/{ruby27_parser.rb → ruby_parser27.rb} +9 -12
  20. data/lib/{ruby3_parser.yy → ruby_parser3.yy} +7 -33
  21. data/lib/{ruby30_parser.rb → ruby_parser30.rb} +11 -35
  22. data/lib/{ruby31_parser.rb → ruby_parser31.rb} +11 -35
  23. data/lib/{ruby32_parser.rb → ruby_parser32.rb} +11 -35
  24. data/lib/ruby_parser33.rb +13577 -0
  25. data/lib/ruby_parser_extras.rb +35 -17
  26. data/test/test_ruby_lexer.rb +5 -5
  27. data/test/test_ruby_parser.rb +22 -20
  28. data.tar.gz.sig +0 -0
  29. metadata +41 -51
  30. metadata.gz.sig +0 -0
  31. data/lib/ruby20_parser.y +0 -2707
  32. data/lib/ruby21_parser.y +0 -2724
  33. data/lib/ruby22_parser.y +0 -2735
  34. data/lib/ruby23_parser.y +0 -2737
  35. data/lib/ruby24_parser.y +0 -2745
  36. data/lib/ruby25_parser.y +0 -2745
  37. data/lib/ruby26_parser.y +0 -2760
  38. data/lib/ruby27_parser.y +0 -3360
  39. data/lib/ruby30_parser.y +0 -3508
  40. data/lib/ruby31_parser.y +0 -3542
  41. data/lib/ruby32_parser.y +0 -3543
data/lib/ruby26_parser.y DELETED
@@ -1,2760 +0,0 @@
1
- # -*- racc -*-
2
-
3
- class Ruby26Parser
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 11
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 { result = lexer.lineno } 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
- # TODO: move down to main match so I can just use val
109
-
110
- yyerror "else without rescue is useless" unless res
111
- }
112
- compstmt
113
- opt_ensure
114
- {
115
- body, resc, _, _, els, ens = val
116
-
117
- result = new_body [body, resc, els, ens]
118
- }
119
- | compstmt opt_rescue opt_ensure
120
- {
121
- body, resc, ens = val
122
-
123
- result = new_body [body, resc, nil, ens]
124
- }
125
-
126
- compstmt: stmts opt_terms
127
- {
128
- result = new_compstmt val
129
- }
130
-
131
- stmts: none
132
- | stmt_or_begin # TODO: newline_node ?
133
- | stmts terms stmt_or_begin
134
- {
135
- result = self.block_append val[0], val[2]
136
- }
137
- | error stmt
138
- {
139
- result = val[1]
140
- debug 12
141
- }
142
-
143
- stmt_or_begin: stmt
144
- | klBEGIN
145
- {
146
- yyerror "BEGIN is permitted only at toplevel"
147
- }
148
- begin_block
149
- {
150
- result = val[2] # wtf?
151
- }
152
-
153
- stmt: kALIAS fitem
154
- {
155
- lexer.lex_state = EXPR_FNAME
156
- }
157
- fitem
158
- {
159
- (_, line), lhs, _, rhs = val
160
- result = s(:alias, lhs, rhs).line(line).line line
161
- }
162
- | kALIAS tGVAR tGVAR
163
- {
164
- (_, line), (lhs, _), (rhs, _) = val
165
- result = s(:valias, lhs.to_sym, rhs.to_sym).line line
166
- }
167
- | kALIAS tGVAR tBACK_REF
168
- {
169
- (_, line), (lhs, _), (rhs, _) = val
170
- result = s(:valias, lhs.to_sym, :"$#{rhs}").line line
171
- }
172
- | kALIAS tGVAR tNTH_REF
173
- {
174
- yyerror "can't make alias for the number variables"
175
- }
176
- | kUNDEF undef_list
177
- {
178
- result = val[1]
179
- }
180
- | stmt kIF_MOD expr_value
181
- {
182
- t, _, c = val
183
- result = new_if c, t, nil
184
- }
185
- | stmt kUNLESS_MOD expr_value
186
- {
187
- f, _, c = val
188
- result = new_if c, nil, f
189
- }
190
- | stmt kWHILE_MOD expr_value
191
- {
192
- e, _, c = val
193
- result = new_while e, c, true
194
- }
195
- | stmt kUNTIL_MOD expr_value
196
- {
197
- e, _, c = val
198
- result = new_until e, c, true
199
- }
200
- | stmt kRESCUE_MOD stmt
201
- {
202
- body, _, resbody = val
203
-
204
- resbody = new_resbody s(:array).line(resbody.line), resbody
205
- result = new_rescue body, resbody
206
- }
207
- | klEND tLCURLY compstmt tRCURLY
208
- {
209
- (_, line), _, stmt, _ = val
210
-
211
- if (self.in_def || self.in_single > 0) then
212
- debug 13
213
- yyerror "END in method; use at_exit"
214
- end
215
-
216
- result = new_iter s(:postexe).line(line), 0, stmt
217
- }
218
- | command_asgn
219
- | mlhs tEQL command_call
220
- {
221
- result = new_masgn val[0], val[2], :wrap
222
- }
223
- | lhs tEQL mrhs
224
- {
225
- lhs, _, rhs = val
226
-
227
- result = new_assign lhs, s(:svalue, rhs).line(rhs.line)
228
- }
229
- | mlhs tEQL mrhs_arg
230
- {
231
- result = new_masgn val[0], val[2]
232
- }
233
- | expr
234
-
235
- command_asgn: lhs tEQL command_rhs
236
- {
237
- result = new_assign val[0], val[2]
238
- }
239
- # | lhs tEQL command_asgn
240
- # {
241
- # result = new_assign val[0], val[2]
242
- # }
243
- | var_lhs tOP_ASGN command_rhs
244
- {
245
- result = new_op_asgn val
246
- }
247
- | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs
248
- {
249
- result = new_op_asgn1 val
250
- }
251
- | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs
252
- {
253
- prim, (call_op, _), (id, _), (op_asgn, _), rhs = val
254
-
255
- result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym)
256
- result.sexp_type = :safe_op_asgn if call_op == '&.'
257
- result.line prim.line
258
- }
259
- | primary_value call_op tCONSTANT tOP_ASGN command_rhs
260
- {
261
- prim, (call_op, _), (id, _), (op_asgn, _), rhs = val
262
-
263
- result = s(:op_asgn, prim, rhs, id.to_sym, op_asgn.to_sym)
264
- result.sexp_type = :safe_op_asgn if call_op == '&.'
265
- result.line prim.line
266
- }
267
- | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs
268
- {
269
- lhs1, _, (lhs2, line), (id, _), rhs = val
270
-
271
- result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line
272
- }
273
- | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs
274
- {
275
- lhs1, _, (lhs2, line), (id, _), rhs = val
276
-
277
- result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, id.to_sym).line line
278
- }
279
- | backref tOP_ASGN command_rhs
280
- {
281
- self.backref_assign_error val[0]
282
- }
283
-
284
- command_rhs: command_call =tOP_ASGN
285
- {
286
- expr, = val
287
- result = value_expr expr
288
- }
289
- | command_call kRESCUE_MOD stmt
290
- {
291
- expr, (_, line), resbody = val
292
-
293
- expr = value_expr expr
294
- ary = s(:array).line line
295
- result = new_rescue(expr, new_resbody(ary, resbody))
296
- }
297
- | command_asgn
298
-
299
- expr: command_call
300
- | expr kAND expr
301
- {
302
- lhs, _, rhs = val
303
- result = logical_op :and, lhs, rhs
304
- }
305
- | expr kOR expr
306
- {
307
- lhs, _, rhs = val
308
- result = logical_op :or, lhs, rhs
309
- }
310
- | kNOT opt_nl expr
311
- {
312
- (_, line), _, expr = val
313
- result = new_call(expr, :"!").line line
314
- # REFACTOR: call_uni_op
315
- }
316
- | tBANG command_call
317
- {
318
- _, cmd = val
319
- result = new_call(cmd, :"!").line cmd.line
320
- # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict
321
- # REFACTOR: call_uni_op -- see parse26.y
322
- }
323
- | arg =tLBRACE_ARG
324
-
325
- expr_value: expr
326
- {
327
- result = value_expr(val[0])
328
- }
329
-
330
- expr_value_do: {
331
- lexer.cond.push true
332
- }
333
- expr_value do
334
- {
335
- lexer.cond.pop
336
- }
337
- {
338
- _, expr, _, _ = val
339
- result = expr
340
- }
341
-
342
- command_call: command
343
- | block_command
344
-
345
- block_command: block_call
346
- | block_call call_op2 operation2 command_args
347
- {
348
- blk, _, (msg, _line), args = val
349
- result = new_call(blk, msg.to_sym, args).line blk.line
350
- }
351
-
352
- cmd_brace_block: tLBRACE_ARG
353
- {
354
- # self.env.extend(:dynamic)
355
- result = self.lexer.lineno
356
- }
357
- brace_body tRCURLY
358
- {
359
- _, line, body, _ = val
360
-
361
- result = body
362
- result.line line
363
-
364
- # self.env.unextend
365
- }
366
-
367
- fcall: operation
368
- {
369
- (msg, line), = val
370
- result = new_call(nil, msg.to_sym).line line
371
- }
372
-
373
- command: fcall command_args =tLOWEST
374
- {
375
- call, args = val
376
- result = call.concat args.sexp_body
377
- }
378
- | fcall command_args cmd_brace_block
379
- {
380
- call, args, block = val
381
-
382
- result = call.concat args.sexp_body
383
-
384
- if block then
385
- block_dup_check result, block
386
-
387
- result, operation = block, result
388
- result.insert 1, operation
389
- end
390
- }
391
- | primary_value call_op operation2 command_args =tLOWEST
392
- {
393
- lhs, callop, (op, _), args = val
394
-
395
- result = new_call lhs, op.to_sym, args, callop
396
- result.line lhs.line
397
- }
398
- | primary_value call_op operation2 command_args cmd_brace_block
399
- {
400
- recv, _, (msg, _line), args, block = val
401
- call = new_call recv, msg.to_sym, args, val[1]
402
-
403
- block_dup_check call, block
404
-
405
- block.insert 1, call
406
- result = block
407
- }
408
- | primary_value tCOLON2 operation2 command_args =tLOWEST
409
- {
410
- lhs, _, (id, line), args = val
411
-
412
- result = new_call lhs, id.to_sym, args
413
- result.line line
414
- }
415
- | primary_value tCOLON2 operation2 command_args cmd_brace_block
416
- {
417
- recv, _, (msg, _line), args, block = val
418
- call = new_call recv, msg.to_sym, args
419
-
420
- block_dup_check call, block
421
-
422
- block.insert 1, call
423
- result = block
424
- }
425
- | kSUPER command_args
426
- {
427
- result = new_super val[1]
428
- }
429
- | kYIELD command_args
430
- {
431
- (_, line), args = val
432
- result = new_yield args
433
- result.line line # TODO: push to new_yield
434
- }
435
- | k_return call_args
436
- {
437
- line = val[0].last
438
- result = s(:return, ret_args(val[1])).line(line)
439
- }
440
- | kBREAK call_args
441
- {
442
- (_, line), args = val
443
- result = s(:break, ret_args(args)).line line
444
- }
445
- | kNEXT call_args
446
- {
447
- line = val[0].last
448
- result = s(:next, ret_args(val[1])).line(line)
449
- }
450
-
451
- mlhs: mlhs_basic
452
- | tLPAREN mlhs_inner rparen
453
- {
454
- result = val[1]
455
- }
456
-
457
- mlhs_inner: mlhs_basic
458
- | tLPAREN mlhs_inner rparen
459
- {
460
- _, arg, _ = val
461
- l = arg.line
462
-
463
- result = s(:masgn, s(:array, arg).line(l)).line l
464
- }
465
-
466
- mlhs_basic: mlhs_head
467
- {
468
- head, = val
469
- result = s(:masgn, head).line head.line
470
- }
471
- | mlhs_head mlhs_item
472
- {
473
- lhs, rhs = val
474
- result = s(:masgn, lhs << rhs.compact).line lhs.line
475
- }
476
- | mlhs_head tSTAR mlhs_node
477
- {
478
- head, _, tail = val
479
- head << s(:splat, tail).line(tail.line)
480
- result = s(:masgn, head).line head.line
481
- }
482
- | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post
483
- {
484
- ary1, _, splat, _, ary2 = val
485
-
486
- result = list_append ary1, s(:splat, splat).line(splat.line)
487
- result.concat ary2.sexp_body
488
- result = s(:masgn, result).line result.line
489
- }
490
- | mlhs_head tSTAR
491
- {
492
- head, _ = val
493
- l = head.line
494
- result = s(:masgn, head << s(:splat).line(l)).line l
495
- }
496
- | mlhs_head tSTAR tCOMMA mlhs_post
497
- {
498
- head, _, _, post = val
499
- ary = list_append head, s(:splat).line(head.line)
500
- ary.concat post.sexp_body
501
- result = s(:masgn, ary).line ary.line
502
- }
503
- | tSTAR mlhs_node
504
- {
505
- _, node = val
506
- l = node.line
507
- splat = s(:splat, node).line l
508
- ary = s(:array, splat).line l
509
- result = s(:masgn, ary).line l
510
- }
511
- | tSTAR mlhs_node tCOMMA mlhs_post
512
- {
513
- _, node, _, post = val
514
-
515
- splat = s(:splat, node).line node.line
516
- ary = s(:array, splat).line splat.line
517
- ary.concat post.sexp_body
518
- result = s(:masgn, ary).line ary.line
519
- }
520
- | tSTAR
521
- {
522
- l = lexer.lineno
523
- result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l
524
- }
525
- | tSTAR tCOMMA mlhs_post
526
- {
527
- _, _, post = val
528
- l = post.line
529
-
530
- splat = s(:splat).line l
531
- ary = s(:array, splat, *post.sexp_body).line l
532
- result = s(:masgn, ary).line l
533
- }
534
-
535
- mlhs_item: mlhs_node
536
- | tLPAREN mlhs_inner rparen
537
- {
538
- result = val[1]
539
- }
540
-
541
- mlhs_head: mlhs_item tCOMMA
542
- {
543
- lhs, _ = val
544
- result = s(:array, lhs).line lhs.line
545
- }
546
- | mlhs_head mlhs_item tCOMMA
547
- {
548
- result = val[0] << val[1].compact
549
- }
550
-
551
- mlhs_post: mlhs_item
552
- {
553
- item, = val
554
- result = s(:array, item).line item.line
555
- }
556
- | mlhs_post tCOMMA mlhs_item
557
- {
558
- result = list_append val[0], val[2]
559
- }
560
-
561
- mlhs_node: user_variable
562
- {
563
- result = self.assignable val[0]
564
- }
565
- | keyword_variable
566
- {
567
- result = self.assignable val[0]
568
- }
569
- | primary_value tLBRACK2 opt_call_args rbracket
570
- {
571
- result = self.aryset val[0], val[2]
572
- }
573
- | primary_value call_op tIDENTIFIER
574
- {
575
- lhs, call_op, (id, _line) = val
576
-
577
- result = new_attrasgn lhs, id, call_op
578
- }
579
- | primary_value tCOLON2 tIDENTIFIER
580
- {
581
- recv, _, (id, _line) = val
582
- result = new_attrasgn recv, id
583
- }
584
- | primary_value call_op tCONSTANT
585
- {
586
- lhs, call_op, (id, _line) = val
587
-
588
- result = new_attrasgn lhs, id, call_op
589
- }
590
- | primary_value tCOLON2 tCONSTANT
591
- {
592
- if (self.in_def || self.in_single > 0) then
593
- debug 14
594
- yyerror "dynamic constant assignment"
595
- end
596
-
597
- expr, _, (id, _line) = val
598
- l = expr.line
599
-
600
- result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l
601
- }
602
- | tCOLON3 tCONSTANT
603
- {
604
- if (self.in_def || self.in_single > 0) then
605
- debug 15
606
- yyerror "dynamic constant assignment"
607
- end
608
-
609
- _, (id, l) = val
610
-
611
- result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l
612
- }
613
- | backref
614
- {
615
- ref, = val
616
-
617
- self.backref_assign_error ref
618
- }
619
-
620
- lhs: user_variable
621
- {
622
- var, = val
623
-
624
- result = self.assignable var
625
- }
626
- | keyword_variable
627
- {
628
- var, = val
629
-
630
- result = self.assignable var
631
-
632
- debug 16
633
- }
634
- | primary_value tLBRACK2 opt_call_args rbracket
635
- {
636
- lhs, _, args, _ = val
637
-
638
- result = self.aryset lhs, args
639
- }
640
- | primary_value call_op tIDENTIFIER # REFACTOR
641
- {
642
- lhs, op, (id, _line) = val
643
-
644
- result = new_attrasgn lhs, id, op
645
- }
646
- | primary_value tCOLON2 tIDENTIFIER
647
- {
648
- lhs, _, (id, _line) = val
649
-
650
- result = new_attrasgn lhs, id
651
- }
652
- | primary_value call_op tCONSTANT # REFACTOR?
653
- {
654
- lhs, call_op, (id, _line) = val
655
-
656
- result = new_attrasgn lhs, id, call_op
657
- }
658
- | primary_value tCOLON2 tCONSTANT
659
- {
660
- expr, _, (id, _line) = val
661
-
662
- if (self.in_def || self.in_single > 0) then
663
- debug 17
664
- yyerror "dynamic constant assignment"
665
- end
666
-
667
- l = expr.line
668
- result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l
669
- }
670
- | tCOLON3 tCONSTANT
671
- {
672
- _, (id, l) = val
673
-
674
- if (self.in_def || self.in_single > 0) then
675
- debug 18
676
- yyerror "dynamic constant assignment"
677
- end
678
-
679
- result = s(:const, s(:colon3, id.to_sym).line(l)).line l
680
- }
681
- | backref
682
- {
683
- self.backref_assign_error val[0]
684
- }
685
-
686
- cname: tIDENTIFIER
687
- {
688
- yyerror "class/module name must be CONSTANT"
689
- }
690
- | tCONSTANT
691
-
692
- cpath: tCOLON3 cname
693
- {
694
- result = wrap :colon3, val[1]
695
- }
696
- | cname
697
- {
698
- (id, line), = val
699
- result = [id.to_sym, line] # TODO: sexp?
700
- }
701
- | primary_value tCOLON2 cname
702
- {
703
- pval, _, (name, _line) = val
704
-
705
- result = s(:colon2, pval, name.to_sym)
706
- result.line pval.line
707
- }
708
-
709
- fname: tIDENTIFIER | tCONSTANT | tFID
710
- | op
711
- {
712
- lexer.lex_state = EXPR_END
713
- }
714
-
715
- | reswords
716
-
717
- fitem: fname
718
- {
719
- result = wrap :lit, val[0]
720
- }
721
- | symbol
722
-
723
- undef_list: fitem
724
- {
725
- result = new_undef val[0]
726
- }
727
- |
728
- undef_list tCOMMA
729
- {
730
- lexer.lex_state = EXPR_FNAME
731
- }
732
- fitem
733
- {
734
- result = new_undef val[0], val[3]
735
- }
736
-
737
- op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ
738
- | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ
739
- | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
740
- | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE
741
- | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2
742
-
743
- reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND
744
- | kALIAS | kAND | kBEGIN | kBREAK | kCASE
745
- | kCLASS | kDEF | kDEFINED | kDO | kELSE
746
- | kELSIF | kEND | kENSURE | kFALSE | kFOR
747
- | kIN | kMODULE | kNEXT | kNIL | kNOT
748
- | kOR | kREDO | kRESCUE | kRETRY | kRETURN
749
- | kSELF | kSUPER | kTHEN | kTRUE | kUNDEF
750
- | kWHEN | kYIELD | kIF | kUNLESS | kWHILE
751
- | kUNTIL
752
-
753
- arg: lhs tEQL arg_rhs
754
- {
755
- result = new_assign val[0], val[2]
756
- }
757
- | var_lhs tOP_ASGN arg_rhs
758
- {
759
- result = new_op_asgn val
760
- }
761
- | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs
762
- {
763
- result = new_op_asgn1 val
764
- }
765
- | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs
766
- {
767
- result = new_op_asgn2 val
768
- }
769
- | primary_value call_op tCONSTANT tOP_ASGN arg_rhs
770
- {
771
- result = new_op_asgn2 val
772
- }
773
- | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs
774
- {
775
- lhs, _, (id, _line), (op, _), rhs = val
776
-
777
- result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line
778
- }
779
- | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs
780
- {
781
- lhs1, _, (lhs2, _line), op, rhs = val
782
-
783
- lhs = s(:colon2, lhs1, lhs2.to_sym).line lhs1.line
784
- result = new_const_op_asgn [lhs, op, rhs]
785
- }
786
- | tCOLON3 tCONSTANT tOP_ASGN arg_rhs
787
- {
788
- _, lhs, op, rhs = val
789
-
790
- lhs = wrap :colon3, lhs
791
- result = new_const_op_asgn [lhs, op, rhs]
792
- }
793
- | backref tOP_ASGN arg_rhs
794
- {
795
- # TODO: lhs = var_field val[0]
796
- asgn = new_op_asgn val
797
- result = self.backref_assign_error asgn
798
- }
799
- | arg tDOT2 arg
800
- {
801
- v1, v2 = val[0], val[2]
802
- if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then
803
- result = s(:lit, (v1.last)..(v2.last)).line v1.line
804
- else
805
- result = s(:dot2, v1, v2).line v1.line
806
- end
807
- }
808
- | arg tDOT3 arg
809
- {
810
- v1, v2 = val[0], val[2]
811
- if v1.sexp_type == :lit and v2.sexp_type == :lit and Integer === v1.last and Integer === v2.last then
812
- result = s(:lit, (v1.last)...(v2.last)).line v1.line
813
- else
814
- result = s(:dot3, v1, v2).line v1.line
815
- end
816
- }
817
- | arg tDOT2
818
- {
819
- v1, _ = val
820
- v2 = nil
821
-
822
- result = s(:dot2, v1, v2).line v1.line
823
- }
824
- | arg tDOT3
825
- {
826
- v1, _ = val
827
- v2 = nil
828
-
829
- result = s(:dot3, v1, v2).line v1.line
830
- }
831
-
832
-
833
- | arg tPLUS arg
834
- {
835
- result = new_call val[0], :+, argl(val[2])
836
- }
837
- | arg tMINUS arg
838
- {
839
- result = new_call val[0], :-, argl(val[2])
840
- }
841
- | arg tSTAR2 arg # TODO: rename
842
- {
843
- result = new_call val[0], :*, argl(val[2])
844
- }
845
- | arg tDIVIDE arg
846
- {
847
- result = new_call val[0], :"/", argl(val[2])
848
- }
849
- | arg tPERCENT arg
850
- {
851
- result = new_call val[0], :"%", argl(val[2])
852
- }
853
- | arg tPOW arg
854
- {
855
- result = new_call val[0], :**, argl(val[2])
856
- }
857
- | tUMINUS_NUM simple_numeric tPOW arg
858
- {
859
- _, (num, line), _, arg = val
860
- lit = s(:lit, num).line line
861
- result = new_call(new_call(lit, :"**", argl(arg)), :"-@")
862
-
863
- }
864
- | tUPLUS arg
865
- {
866
- result = new_call val[1], :"+@"
867
- }
868
- | tUMINUS arg
869
- {
870
- result = new_call val[1], :"-@"
871
- }
872
- | arg tPIPE arg
873
- {
874
- result = new_call val[0], :"|", argl(val[2])
875
- }
876
- | arg tCARET arg
877
- {
878
- result = new_call val[0], :"^", argl(val[2])
879
- }
880
- | arg tAMPER2 arg
881
- {
882
- result = new_call val[0], :"&", argl(val[2])
883
- }
884
- | arg tCMP arg
885
- {
886
- result = new_call val[0], :"<=>", argl(val[2])
887
- }
888
- | rel_expr =tCMP
889
- | arg tEQ arg
890
- {
891
- result = new_call val[0], :"==", argl(val[2])
892
- }
893
- | arg tEQQ arg
894
- {
895
- result = new_call val[0], :"===", argl(val[2])
896
- }
897
- | arg tNEQ arg
898
- {
899
- result = new_call val[0], :"!=", argl(val[2])
900
- }
901
- | arg tMATCH arg
902
- {
903
- lhs, _, rhs = val
904
- result = new_match lhs, rhs
905
- }
906
- | arg tNMATCH arg
907
- {
908
- lhs, _, rhs = val
909
- result = s(:not, new_match(lhs, rhs)).line lhs.line
910
- }
911
- | tBANG arg
912
- {
913
- _, arg = val
914
- result = new_call arg, :"!"
915
- result.line arg.line
916
- }
917
- | tTILDE arg
918
- {
919
- result = new_call value_expr(val[1]), :"~"
920
- }
921
- | arg tLSHFT arg
922
- {
923
- val[0] = value_expr val[0]
924
- val[2] = value_expr val[2]
925
- result = new_call val[0], :"\<\<", argl(val[2])
926
- }
927
- | arg tRSHFT arg
928
- {
929
- val[0] = value_expr val[0]
930
- val[2] = value_expr val[2]
931
- result = new_call val[0], :">>", argl(val[2])
932
- }
933
- | arg tANDOP arg
934
- {
935
- result = logical_op :and, val[0], val[2]
936
- }
937
- | arg tOROP arg
938
- {
939
- result = logical_op :or, val[0], val[2]
940
- }
941
- | kDEFINED opt_nl arg
942
- {
943
- (_, line), _, arg = val
944
- result = s(:defined, arg).line line
945
- }
946
- | arg tEH arg opt_nl tCOLON arg
947
- {
948
- c, _, t, _, _, f = val
949
- result = s(:if, c, t, f).line c.line
950
- }
951
- | primary
952
-
953
- relop: tGT
954
- | tLT
955
- | tGEQ
956
- | tLEQ
957
-
958
- rel_expr: arg relop arg =tGT
959
- {
960
- lhs, (op, _), rhs = val
961
- result = new_call lhs, op.to_sym, argl(rhs)
962
- }
963
- | rel_expr relop arg =tGT
964
- {
965
- lhs, (op, _), rhs = val
966
- warn "comparison '%s' after comparison", op
967
- result = new_call lhs, op.to_sym, argl(rhs)
968
- }
969
-
970
- arg_value: arg
971
- {
972
- result = value_expr(val[0])
973
- }
974
-
975
- aref_args: none
976
- | args trailer
977
- {
978
- result = args [val[0]]
979
- }
980
- | args tCOMMA assocs trailer
981
- {
982
- result = args [val[0], array_to_hash(val[2])]
983
- }
984
- | assocs trailer
985
- {
986
- result = args [array_to_hash(val[0])]
987
- }
988
-
989
- arg_rhs: arg =tOP_ASGN
990
- | arg kRESCUE_MOD arg
991
- {
992
- body, (_, line), resbody = val
993
- body = value_expr body
994
- resbody = remove_begin resbody
995
-
996
- ary = s(:array).line line
997
- result = new_rescue(body, new_resbody(ary, resbody))
998
- }
999
-
1000
- paren_args: tLPAREN2 opt_call_args rparen
1001
- {
1002
- _, args, (_, line_max) = val
1003
-
1004
- result = args
1005
- result.line_max = line_max if args
1006
- }
1007
-
1008
- opt_paren_args: none
1009
- | paren_args
1010
-
1011
- opt_call_args: none
1012
- | call_args
1013
- | args tCOMMA
1014
- {
1015
- result = args val
1016
- }
1017
- | args tCOMMA assocs tCOMMA
1018
- {
1019
- result = args [val[0], array_to_hash(val[2])]
1020
- }
1021
- | assocs tCOMMA
1022
- {
1023
- result = args [array_to_hash(val[0])]
1024
- }
1025
-
1026
- call_args: command
1027
- {
1028
- warning "parenthesize argument(s) for future version"
1029
- result = call_args val
1030
- }
1031
- | args opt_block_arg
1032
- {
1033
- result = call_args val
1034
- }
1035
- | assocs opt_block_arg
1036
- {
1037
- result = call_args [array_to_hash(val[0]), val[1]]
1038
- }
1039
- | args tCOMMA assocs opt_block_arg
1040
- {
1041
- result = call_args [val[0], array_to_hash(val[2]), val[3]]
1042
- }
1043
- | block_arg
1044
- {
1045
- result = call_args val
1046
- }
1047
-
1048
- command_args: {
1049
- # parse26.y line 2200
1050
-
1051
- # If call_args starts with a open paren '(' or
1052
- # '[', look-ahead reading of the letters calls
1053
- # CMDARG_PUSH(0), but the push must be done
1054
- # after CMDARG_PUSH(1). So this code makes them
1055
- # consistent by first cancelling the premature
1056
- # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and
1057
- # finally redoing CMDARG_PUSH(0).
1058
-
1059
- result = yychar = self.last_token_type.first
1060
- lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar)
1061
- lexer.cmdarg.pop if lookahead
1062
- lexer.cmdarg.push true
1063
- lexer.cmdarg.push false if lookahead
1064
- }
1065
- call_args
1066
- {
1067
- yychar, args = val
1068
-
1069
- # call_args can be followed by tLBRACE_ARG (that
1070
- # does CMDARG_PUSH(0) in the lexer) but the push
1071
- # must be done after CMDARG_POP() in the parser.
1072
- # So this code does CMDARG_POP() to pop 0 pushed
1073
- # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed
1074
- # by command_args, and CMDARG_PUSH(0) to restore
1075
- # back the flag set by tLBRACE_ARG.
1076
-
1077
- lookahead = [:tLBRACE_ARG].include?(yychar)
1078
- lexer.cmdarg.pop if lookahead
1079
- lexer.cmdarg.pop
1080
- lexer.cmdarg.push false if lookahead
1081
- result = args
1082
- }
1083
-
1084
- block_arg: tAMPER arg_value
1085
- {
1086
- _, arg = val
1087
- result = s(:block_pass, arg).line arg.line
1088
- }
1089
-
1090
- opt_block_arg: tCOMMA block_arg
1091
- {
1092
- result = val[1]
1093
- }
1094
- | none
1095
-
1096
- args: arg_value
1097
- {
1098
- arg, = val
1099
- lineno = arg.line || lexer.lineno # HACK
1100
-
1101
- result = s(:array, arg).line lineno
1102
- }
1103
- | tSTAR arg_value
1104
- {
1105
- _, arg = val
1106
- result = s(:array, s(:splat, arg).line(arg.line)).line arg.line
1107
- }
1108
- | args tCOMMA arg_value
1109
- {
1110
- args, _, id = val
1111
- result = self.list_append args, id
1112
- }
1113
- | args tCOMMA tSTAR arg_value
1114
- {
1115
- # TODO: the line number from tSTAR has been dropped
1116
- args, _, _, id = val
1117
- line = lexer.lineno
1118
- result = self.list_append args, s(:splat, id).line(line)
1119
- }
1120
-
1121
- mrhs_arg: mrhs
1122
- {
1123
- result = new_masgn_arg val[0]
1124
- }
1125
- | arg_value
1126
- {
1127
- result = new_masgn_arg val[0], :wrap
1128
- }
1129
-
1130
- mrhs: args tCOMMA arg_value
1131
- {
1132
- result = val[0] << val[2]
1133
- }
1134
- | args tCOMMA tSTAR arg_value
1135
- {
1136
- # TODO: make all tXXXX terminals include lexer.lineno
1137
- arg, _, _, splat = val
1138
- result = self.arg_concat arg, splat
1139
- }
1140
- | tSTAR arg_value
1141
- {
1142
- _, arg = val
1143
- result = s(:splat, arg).line arg.line
1144
- }
1145
-
1146
- primary: literal
1147
- | strings
1148
- | xstring
1149
- | regexp
1150
- | words
1151
- | qwords
1152
- | symbols
1153
- | qsymbols
1154
- | var_ref
1155
- | backref
1156
- | tFID
1157
- {
1158
- (msg, line), = val
1159
- result = new_call nil, msg.to_sym
1160
- result.line line
1161
- }
1162
- | k_begin
1163
- {
1164
- lexer.cmdarg.push false
1165
- }
1166
- bodystmt k_end
1167
- {
1168
- lexer.cmdarg.pop
1169
- result = new_begin val
1170
- }
1171
- | tLPAREN_ARG
1172
- {
1173
- lexer.lex_state = EXPR_ENDARG
1174
- result = lexer.lineno
1175
- }
1176
- rparen
1177
- {
1178
- _, line, _ = val
1179
- result = s(:begin).line line
1180
- }
1181
- | tLPAREN_ARG
1182
- stmt
1183
- {
1184
- lexer.lex_state = EXPR_ENDARG
1185
- }
1186
- rparen
1187
- {
1188
- _, stmt, _, _, = val
1189
- # warning "(...) interpreted as grouped expression"
1190
- result = stmt
1191
- }
1192
- | tLPAREN compstmt tRPAREN
1193
- {
1194
- _, stmt, _ = val
1195
- result = stmt
1196
- result ||= s(:nil).line lexer.lineno
1197
- result.paren = true
1198
- }
1199
- | primary_value tCOLON2 tCONSTANT
1200
- {
1201
- expr, _, (id, _line) = val
1202
-
1203
- result = s(:colon2, expr, id.to_sym).line expr.line
1204
- }
1205
- | tCOLON3 tCONSTANT
1206
- {
1207
- result = wrap :colon3, val[1]
1208
- }
1209
- | tLBRACK { result = lexer.lineno } aref_args rbracket
1210
- {
1211
- _, line, args, (_, line_max) = val
1212
-
1213
- result = args || s(:array)
1214
- result.sexp_type = :array # aref_args is :args
1215
- result.line line
1216
- result.line_max = line_max
1217
- }
1218
- | tLBRACE
1219
- {
1220
- result = self.lexer.lineno
1221
- }
1222
- assoc_list tRCURLY
1223
- {
1224
- result = new_hash val
1225
- }
1226
- | k_return
1227
- {
1228
- (_, line), = val
1229
- result = s(:return).line line
1230
- }
1231
- | kYIELD tLPAREN2 call_args rparen
1232
- {
1233
- (_, line), _, args, _ = val
1234
-
1235
- result = new_yield(args).line line
1236
- }
1237
- | kYIELD tLPAREN2 rparen
1238
- {
1239
- (_, line), _, _ = val
1240
-
1241
- result = new_yield.line line
1242
- }
1243
- | kYIELD
1244
- {
1245
- (_, line), = val
1246
-
1247
- result = new_yield.line line
1248
- }
1249
- | kDEFINED opt_nl tLPAREN2 expr rparen
1250
- {
1251
- (_, line), _, _, arg, _ = val
1252
-
1253
- result = s(:defined, arg).line line
1254
- }
1255
- | kNOT tLPAREN2 expr rparen
1256
- {
1257
- _, _, lhs, _ = val
1258
- result = new_call lhs, :"!"
1259
- }
1260
- | kNOT tLPAREN2 rparen
1261
- {
1262
- debug 20
1263
- }
1264
- | fcall brace_block
1265
- {
1266
- call, iter = val
1267
-
1268
- iter.insert 1, call
1269
- result = iter
1270
- # FIX: probably not: call.line = iter.line
1271
- }
1272
- | method_call
1273
- | method_call brace_block
1274
- {
1275
- call, iter = val[0], val[1]
1276
- block_dup_check call, iter
1277
- iter.insert 1, call # FIX
1278
- result = iter
1279
- }
1280
- | lambda
1281
- {
1282
- expr, = val
1283
- result = expr
1284
- }
1285
- | k_if expr_value then compstmt if_tail k_end
1286
- {
1287
- _, c, _, t, f, _ = val
1288
- result = new_if c, t, f
1289
- }
1290
- | k_unless expr_value then compstmt opt_else k_end
1291
- {
1292
- _, c, _, t, f, _ = val
1293
- result = new_if c, f, t
1294
- }
1295
- | k_while expr_value_do compstmt k_end
1296
- {
1297
- _, cond, body, _ = val
1298
- result = new_while body, cond, true
1299
- }
1300
- | k_until expr_value_do compstmt k_end
1301
- {
1302
- _, cond, body, _ = val
1303
- result = new_until body, cond, true
1304
- }
1305
- | k_case expr_value opt_terms case_body k_end
1306
- {
1307
- (_, line), expr, _, body, _ = val
1308
- result = new_case expr, body, line
1309
- }
1310
- | k_case opt_terms case_body k_end
1311
- {
1312
- (_, line), _, body, _ = val
1313
- result = new_case nil, body, line
1314
- }
1315
- | k_for for_var kIN expr_value_do compstmt k_end
1316
- {
1317
- _, var, _, iter, body, _ = val
1318
- result = new_for iter, var, body
1319
- }
1320
- | k_class
1321
- cpath superclass
1322
- {
1323
- if (self.in_def || self.in_single > 0) then
1324
- yyerror "class definition in method body"
1325
- end
1326
- self.env.extend
1327
- }
1328
- bodystmt k_end
1329
- {
1330
- result = new_class val
1331
- self.env.unextend
1332
- self.lexer.ignore_body_comments
1333
- }
1334
- | k_class tLSHFT
1335
- expr
1336
- {
1337
- result = self.in_def
1338
- self.in_def = false
1339
- }
1340
- term
1341
- {
1342
- result = self.in_single
1343
- self.in_single = 0
1344
- self.env.extend
1345
- }
1346
- bodystmt k_end
1347
- {
1348
- result = new_sclass val
1349
- self.env.unextend
1350
- self.lexer.ignore_body_comments
1351
- }
1352
- | k_module
1353
- cpath
1354
- {
1355
- yyerror "module definition in method body" if
1356
- self.in_def or self.in_single > 0
1357
-
1358
- self.env.extend
1359
- }
1360
- bodystmt k_end
1361
- {
1362
- result = new_module val
1363
- self.env.unextend
1364
- self.lexer.ignore_body_comments
1365
- }
1366
- | k_def fname
1367
- {
1368
- result = self.in_def
1369
-
1370
- self.in_def = true # group = local_push
1371
- self.env.extend
1372
- lexer.cmdarg.push false
1373
- lexer.cond.push false
1374
- }
1375
- f_arglist bodystmt k_end
1376
- {
1377
- result, in_def = new_defn val
1378
-
1379
- lexer.cond.pop # group = local_pop
1380
- lexer.cmdarg.pop
1381
- self.env.unextend
1382
- self.in_def = in_def
1383
-
1384
- self.lexer.ignore_body_comments
1385
- }
1386
- | k_def singleton dot_or_colon
1387
- {
1388
- lexer.lex_state = EXPR_FNAME
1389
- }
1390
- fname
1391
- {
1392
- result = self.in_def
1393
-
1394
- self.in_single += 1 # TODO: remove?
1395
-
1396
- self.in_def = true # local_push
1397
- self.env.extend
1398
- lexer.cmdarg.push false
1399
- lexer.cond.push false
1400
-
1401
- lexer.lex_state = EXPR_ENDFN|EXPR_LABEL
1402
- }
1403
- f_arglist bodystmt k_end
1404
- {
1405
-
1406
- # [kdef, recv, _, _, (name, line), in_def, args, body, kend]
1407
- # =>
1408
- # [kdef, recv, (name, line), in_def, args, body, kend]
1409
-
1410
- val.delete_at 3
1411
- val.delete_at 2
1412
-
1413
- result, in_def = new_defs val
1414
-
1415
- lexer.cond.pop # group = local_pop
1416
- lexer.cmdarg.pop
1417
- self.env.unextend
1418
- self.in_def = in_def
1419
-
1420
- self.in_single -= 1
1421
-
1422
- # TODO: restore cur_arg ? what's cur_arg?
1423
-
1424
- self.lexer.ignore_body_comments
1425
- }
1426
- | kBREAK
1427
- {
1428
- (_, line), = val
1429
- result = s(:break).line line
1430
- }
1431
- | kNEXT
1432
- {
1433
- (_, line), = val
1434
- result = s(:next).line line
1435
- }
1436
- | kREDO
1437
- {
1438
- (_, line), = val
1439
- result = s(:redo).line line
1440
- }
1441
- | kRETRY
1442
- {
1443
- (_, line), = val
1444
- result = s(:retry).line line
1445
- }
1446
-
1447
- primary_value: primary
1448
- {
1449
- result = value_expr(val[0])
1450
- }
1451
-
1452
- # These are really stupid
1453
- k_begin: kBEGIN
1454
- k_if: kIF
1455
- k_unless: kUNLESS
1456
- k_while: kWHILE
1457
- k_until: kUNTIL
1458
- k_case: kCASE
1459
- k_for: kFOR
1460
- k_class: kCLASS
1461
- {
1462
- self.comments.push self.lexer.comments
1463
- }
1464
- k_module: kMODULE
1465
- {
1466
- self.comments.push self.lexer.comments
1467
- }
1468
- k_def: kDEF
1469
- {
1470
- self.comments.push self.lexer.comments
1471
- }
1472
- k_do: kDO
1473
- k_do_block: kDO_BLOCK
1474
- k_rescue: kRESCUE
1475
- k_ensure: kENSURE
1476
- k_when: kWHEN
1477
- k_else: kELSE
1478
- k_elsif: kELSIF
1479
- k_end: kEND
1480
- k_return: kRETURN
1481
-
1482
- then: term
1483
- | kTHEN
1484
- | term kTHEN
1485
-
1486
- do: term
1487
- | kDO_COND
1488
-
1489
- if_tail: opt_else
1490
- | k_elsif expr_value then compstmt if_tail
1491
- {
1492
- (_, line), c, _, t, rest = val
1493
-
1494
- result = s(:if, c, t, rest).line line
1495
- }
1496
-
1497
- opt_else: none
1498
- | kELSE compstmt
1499
- {
1500
- result = val[1]
1501
- }
1502
-
1503
- for_var: lhs
1504
- | mlhs
1505
- {
1506
- val[0].delete_at 1 if val[0][1].nil? # HACK
1507
- }
1508
-
1509
- f_marg: f_norm_arg
1510
- | tLPAREN f_margs rparen
1511
- {
1512
- result = val[1]
1513
- }
1514
-
1515
- f_marg_list: f_marg
1516
- {
1517
- sym, = val
1518
-
1519
- result = s(:array, sym).line lexer.lineno
1520
- }
1521
- | f_marg_list tCOMMA f_marg
1522
- {
1523
- result = list_append val[0], val[2]
1524
- }
1525
-
1526
- f_margs: f_marg_list
1527
- {
1528
- args, = val
1529
-
1530
- result = block_var args
1531
- }
1532
- | f_marg_list tCOMMA f_rest_marg
1533
- {
1534
- args, _, rest = val
1535
-
1536
- result = block_var args, rest
1537
- }
1538
- | f_marg_list tCOMMA f_rest_marg tCOMMA f_marg_list
1539
- {
1540
- lhs, _, splat, _, rhs = val
1541
-
1542
- result = block_var lhs, splat, rhs
1543
- }
1544
- | f_rest_marg
1545
- {
1546
- rest, = val
1547
-
1548
- result = block_var rest
1549
- }
1550
- | f_rest_marg tCOMMA f_marg_list
1551
- {
1552
- splat, _, rest = val
1553
-
1554
- result = block_var splat, rest
1555
- }
1556
-
1557
- f_rest_marg: tSTAR f_norm_arg
1558
- {
1559
- _, (id, line) = val
1560
-
1561
- result = args ["*#{id}".to_sym]
1562
- result.line line
1563
- }
1564
- | tSTAR
1565
- {
1566
- result = args [:*]
1567
- result.line lexer.lineno # FIX: tSTAR -> line
1568
- }
1569
-
1570
- block_args_tail: f_block_kwarg tCOMMA f_kwrest opt_f_block_arg
1571
- {
1572
- result = call_args val
1573
- }
1574
- | f_block_kwarg opt_f_block_arg
1575
- {
1576
- result = call_args val
1577
- }
1578
- | f_kwrest opt_f_block_arg
1579
- {
1580
- result = call_args val
1581
- }
1582
- | f_block_arg
1583
- {
1584
- (id, line), = val
1585
- result = call_args [id]
1586
- result.line line
1587
- }
1588
-
1589
- opt_block_args_tail: tCOMMA block_args_tail
1590
- {
1591
- result = args val
1592
- }
1593
- | none
1594
-
1595
- block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1596
- {
1597
- result = args val
1598
- }
1599
- | f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1600
- {
1601
- result = args val
1602
- }
1603
- | f_arg tCOMMA f_block_optarg opt_block_args_tail
1604
- {
1605
- result = args val
1606
- }
1607
- | f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_block_args_tail
1608
- {
1609
- result = args val
1610
- }
1611
- | f_arg tCOMMA f_rest_arg opt_block_args_tail
1612
- {
1613
- result = args val
1614
- }
1615
- | f_arg tCOMMA
1616
- {
1617
- result = args(val) << nil
1618
- }
1619
- | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1620
- {
1621
- result = args val
1622
- }
1623
- | f_arg opt_block_args_tail
1624
- {
1625
- result = args val
1626
- }
1627
- | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1628
- {
1629
- result = args val
1630
- }
1631
- | f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1632
- {
1633
- result = args val
1634
- }
1635
- | f_block_optarg opt_block_args_tail
1636
- {
1637
- result = args val
1638
- }
1639
- | f_block_optarg tCOMMA f_arg opt_block_args_tail
1640
- {
1641
- result = args val
1642
- }
1643
- | f_rest_arg opt_block_args_tail
1644
- {
1645
- result = args val
1646
- }
1647
- | f_rest_arg tCOMMA f_arg opt_block_args_tail
1648
- {
1649
- result = args val
1650
- }
1651
- | block_args_tail
1652
- {
1653
- result = args val
1654
- }
1655
-
1656
- opt_block_param: none { result = 0 }
1657
- | block_param_def
1658
- {
1659
- self.lexer.command_start = true
1660
- }
1661
-
1662
- block_param_def: tPIPE opt_bv_decl tPIPE
1663
- {
1664
- # TODO: current_arg = 0
1665
- result = args val
1666
- }
1667
- | tOROP
1668
- {
1669
- result = s(:args).line lexer.lineno
1670
- }
1671
- | tPIPE block_param opt_bv_decl tPIPE
1672
- {
1673
- # TODO: current_arg = 0
1674
- result = args val
1675
- }
1676
-
1677
- opt_bv_decl: opt_nl
1678
- | opt_nl tSEMI bv_decls opt_nl
1679
- {
1680
- result = args val
1681
- }
1682
-
1683
- bv_decls: bvar
1684
- {
1685
- result = args val
1686
- }
1687
- | bv_decls tCOMMA bvar
1688
- {
1689
- result = args val
1690
- }
1691
-
1692
- bvar: tIDENTIFIER
1693
- {
1694
- result = wrap :shadow, val[0]
1695
- }
1696
- | f_bad_arg
1697
-
1698
- lambda: tLAMBDA
1699
- {
1700
- self.env.extend :dynamic
1701
- result = [lexer.lineno, lexer.lpar_beg]
1702
- lexer.paren_nest += 1
1703
- lexer.lpar_beg = lexer.paren_nest
1704
- }
1705
- f_larglist
1706
- {
1707
- lexer.cmdarg.push false
1708
- }
1709
- lambda_body
1710
- {
1711
- _, (line, lpar), args, _cmdarg, body = val
1712
- lexer.lpar_beg = lpar
1713
-
1714
- lexer.cmdarg.pop
1715
-
1716
- call = s(:lambda).line line
1717
- result = new_iter call, args, body
1718
- result.line line
1719
- self.env.unextend # TODO: dynapush & dynapop
1720
- }
1721
-
1722
- f_larglist: tLPAREN2 f_args opt_bv_decl rparen
1723
- {
1724
- result = args val
1725
- }
1726
- | f_args
1727
- {
1728
- result = val[0]
1729
- result = 0 if result == s(:args)
1730
- }
1731
-
1732
- lambda_body: tLAMBEG compstmt tRCURLY
1733
- {
1734
- result = val[1]
1735
- }
1736
- | kDO_LAMBDA bodystmt kEND
1737
- {
1738
- result = val[1]
1739
- }
1740
-
1741
- do_block: k_do_block do_body kEND
1742
- {
1743
- (_, line), iter, _ = val
1744
- result = iter.line line
1745
- }
1746
-
1747
- block_call: command do_block
1748
- {
1749
- # TODO:
1750
- ## if (nd_type($1) == NODE_YIELD) {
1751
- ## compile_error(PARSER_ARG "block given to yield");
1752
-
1753
- cmd, blk = val
1754
-
1755
- syntax_error "Both block arg and actual block given." if
1756
- cmd.block_pass?
1757
-
1758
- if inverted? val then
1759
- val = invert_block_call val
1760
- cmd, blk = val
1761
- end
1762
-
1763
- result = blk
1764
- result.insert 1, cmd
1765
- }
1766
- | block_call call_op2 operation2 opt_paren_args
1767
- {
1768
- lhs, _, (id, _line), args = val
1769
-
1770
- result = new_call lhs, id.to_sym, args
1771
- }
1772
- | block_call call_op2 operation2 opt_paren_args brace_block
1773
- {
1774
- iter1, _, (name, _line), args, iter2 = val
1775
-
1776
- call = new_call iter1, name.to_sym, args
1777
- iter2.insert 1, call
1778
-
1779
- result = iter2
1780
- }
1781
- | block_call call_op2 operation2 command_args do_block
1782
- {
1783
- iter1, _, (name, _line), args, iter2 = val
1784
-
1785
- call = new_call iter1, name.to_sym, args
1786
- iter2.insert 1, call
1787
-
1788
- result = iter2
1789
- }
1790
-
1791
- method_call: fcall paren_args
1792
- {
1793
- call, args = val
1794
-
1795
- result = call
1796
-
1797
- if args then
1798
- call.concat args.sexp_body
1799
- result.line_max = args.line_max
1800
- end
1801
- }
1802
- | primary_value call_op operation2 opt_paren_args
1803
- {
1804
- recv, call_op, (op, op_line), args = val
1805
-
1806
- result = new_call recv, op.to_sym, args, call_op
1807
- result.line_max = op_line unless args
1808
- }
1809
- | primary_value tCOLON2 operation2 paren_args
1810
- {
1811
- recv, _, (op, _line), args = val
1812
-
1813
- result = new_call recv, op.to_sym, args
1814
- }
1815
- | primary_value tCOLON2 operation3
1816
- {
1817
- lhs, _, (id, _line) = val
1818
-
1819
- result = new_call lhs, id.to_sym
1820
- }
1821
- | primary_value call_op paren_args
1822
- {
1823
- result = new_call val[0], :call, val[2], val[1]
1824
- }
1825
- | primary_value tCOLON2 paren_args
1826
- {
1827
- result = new_call val[0], :call, val[2]
1828
- }
1829
- | kSUPER paren_args
1830
- {
1831
- result = new_super val[1]
1832
- }
1833
- | kSUPER
1834
- {
1835
- result = s(:zsuper).line lexer.lineno
1836
- }
1837
- | primary_value tLBRACK2 opt_call_args rbracket
1838
- {
1839
- result = new_aref val
1840
- }
1841
-
1842
- brace_block: tLCURLY
1843
- {
1844
- self.env.extend :dynamic
1845
- result = self.lexer.lineno
1846
- }
1847
- brace_body tRCURLY
1848
- {
1849
- _, line, body, _ = val
1850
-
1851
- result = body
1852
- result.line line
1853
-
1854
- self.env.unextend
1855
- }
1856
- | k_do
1857
- {
1858
- self.env.extend :dynamic
1859
- result = self.lexer.lineno
1860
- }
1861
- do_body kEND
1862
- {
1863
- _, line, body, _ = val
1864
-
1865
- result = body
1866
- result.line line
1867
-
1868
- self.env.unextend
1869
- }
1870
-
1871
- brace_body: { self.env.extend :dynamic; result = self.lexer.lineno }
1872
- { result = lexer.cmdarg.store(false) }
1873
- opt_block_param compstmt
1874
- {
1875
- line, cmdarg, param, cmpstmt = val
1876
-
1877
- result = new_brace_body param, cmpstmt, line
1878
- self.env.unextend
1879
- lexer.cmdarg.restore cmdarg
1880
- lexer.cmdarg.pop # because of: cmdarg_stack >> 1 ?
1881
- }
1882
-
1883
- do_body: { self.env.extend :dynamic; result = self.lexer.lineno }
1884
- { lexer.cmdarg.push false }
1885
- opt_block_param
1886
- bodystmt
1887
- {
1888
- line, _cmdarg, param, cmpstmt = val
1889
-
1890
- result = new_do_body param, cmpstmt, line
1891
- lexer.cmdarg.pop
1892
- self.env.unextend
1893
- }
1894
-
1895
- case_args: arg_value
1896
- {
1897
- arg, = val
1898
-
1899
- result = s(:array, arg).line arg.line
1900
- }
1901
- | tSTAR arg_value
1902
- {
1903
- _, arg = val
1904
-
1905
- result = s(:array, s(:splat, arg).line(arg.line)).line arg.line
1906
- }
1907
- | case_args tCOMMA arg_value
1908
- {
1909
- args, _, id = val
1910
-
1911
- result = self.list_append args, id
1912
- }
1913
- | case_args tCOMMA tSTAR arg_value
1914
- {
1915
- args, _, _, id = val
1916
-
1917
- result = self.list_append args, s(:splat, id).line(id.line)
1918
- }
1919
-
1920
- case_body: k_when
1921
- {
1922
- result = self.lexer.lineno
1923
- }
1924
- case_args then compstmt cases
1925
- {
1926
- result = new_when(val[2], val[4])
1927
- result.line val[1]
1928
- result << val[5] if val[5]
1929
- }
1930
-
1931
- cases: opt_else | case_body
1932
-
1933
- opt_rescue: k_rescue exc_list exc_var then compstmt opt_rescue
1934
- {
1935
- (_, line), klasses, var, _, body, rest = val
1936
-
1937
- klasses ||= s(:array)
1938
- klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var
1939
- klasses.line line
1940
-
1941
- result = new_resbody(klasses, body)
1942
- result << rest if rest # UGH, rewritten above
1943
- }
1944
- |
1945
- {
1946
- result = nil
1947
- }
1948
-
1949
- exc_list: arg_value
1950
- {
1951
- arg, = val
1952
- result = s(:array, arg).line arg.line
1953
- }
1954
- | mrhs
1955
- | none
1956
-
1957
- exc_var: tASSOC lhs
1958
- {
1959
- result = val[1]
1960
- }
1961
- | none
1962
-
1963
- opt_ensure: k_ensure compstmt
1964
- {
1965
- (_, line), body = val
1966
-
1967
- result = body || s(:nil).line(line)
1968
- }
1969
- | none
1970
-
1971
- literal: numeric
1972
- {
1973
- (lit, line), = val
1974
- result = s(:lit, lit).line line
1975
- }
1976
- | symbol
1977
-
1978
- strings: string
1979
- {
1980
- str, = val
1981
- str = s(:dstr, str.value) if str.sexp_type == :evstr
1982
- result = str
1983
- }
1984
-
1985
- string: tCHAR
1986
- {
1987
- debug 37
1988
- }
1989
- | string1
1990
- | string string1
1991
- {
1992
- result = self.literal_concat val[0], val[1]
1993
- }
1994
-
1995
- string1: tSTRING_BEG string_contents tSTRING_END
1996
- {
1997
- (_, line), str, (_, func) = val
1998
-
1999
- str = dedent str if func =~ RubyLexer::STR_FUNC_DEDENT
2000
-
2001
- result = str.line line
2002
- }
2003
- | tSTRING
2004
- {
2005
- result = new_string val
2006
- }
2007
-
2008
- xstring: tXSTRING_BEG xstring_contents tSTRING_END
2009
- {
2010
- result = new_xstring val
2011
- # TODO: dedent?!?! SERIOUSLY?!?
2012
- }
2013
-
2014
- regexp: tREGEXP_BEG regexp_contents tREGEXP_END
2015
- {
2016
- result = new_regexp val
2017
- }
2018
-
2019
- words: tWORDS_BEG tSPACE tSTRING_END
2020
- {
2021
- (_, line), _, (_, line_max) = val
2022
-
2023
- result = s(:array).line line
2024
- result.line_max = line_max
2025
- }
2026
- | tWORDS_BEG word_list tSTRING_END
2027
- {
2028
- (_, line), list, (_, line_max) = val
2029
-
2030
- result = list.line line
2031
- result.line_max = line_max
2032
- }
2033
-
2034
- word_list: none
2035
- {
2036
- result = new_word_list
2037
- }
2038
- | word_list word tSPACE
2039
- {
2040
- result = val[0].dup << new_word_list_entry(val)
2041
- }
2042
-
2043
- word: string_content
2044
- | word string_content
2045
- {
2046
- result = self.literal_concat val[0], val[1]
2047
- }
2048
-
2049
- symbols: tSYMBOLS_BEG tSPACE tSTRING_END
2050
- {
2051
- (_, line), _, (_, line_max) = val
2052
-
2053
- result = s(:array).line line
2054
- result.line_max = line_max
2055
- }
2056
- | tSYMBOLS_BEG symbol_list tSTRING_END
2057
- {
2058
- (_, line), list, (_, line_max), = val
2059
-
2060
- result = list.line line
2061
- result.line_max = line_max
2062
- }
2063
-
2064
- symbol_list: none
2065
- {
2066
- result = new_symbol_list
2067
- }
2068
- | symbol_list word tSPACE
2069
- {
2070
- list, * = val
2071
- result = list.dup << new_symbol_list_entry(val)
2072
- }
2073
-
2074
- qwords: tQWORDS_BEG tSPACE tSTRING_END
2075
- {
2076
- (_, line), _, (_, line_max) = val
2077
-
2078
- result = s(:array).line line
2079
- result.line_max = line_max
2080
- }
2081
- | tQWORDS_BEG qword_list tSTRING_END
2082
- {
2083
- (_, line), list, (_, line_max) = val
2084
-
2085
- result = list.line line
2086
- result.line_max = line_max
2087
- }
2088
-
2089
- qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END
2090
- {
2091
- (_, line), _, (_, line_max) = val
2092
-
2093
- result = s(:array).line line
2094
- result.line_max = line_max
2095
- }
2096
- | tQSYMBOLS_BEG qsym_list tSTRING_END
2097
- {
2098
- (_, line), list, (_, line_max) = val
2099
-
2100
- result = list.line line
2101
- result.line_max = line_max
2102
- }
2103
-
2104
- qword_list: none
2105
- {
2106
- result = new_qword_list
2107
- }
2108
- | qword_list tSTRING_CONTENT tSPACE
2109
- {
2110
- result = val[0].dup << new_qword_list_entry(val)
2111
- }
2112
-
2113
- qsym_list: none
2114
- {
2115
- result = new_qsym_list
2116
- }
2117
- | qsym_list tSTRING_CONTENT tSPACE
2118
- {
2119
- result = val[0].dup << new_qsym_list_entry(val)
2120
- }
2121
-
2122
- string_contents: none
2123
- {
2124
- line = prev_value_to_lineno _values.last
2125
- result = s(:str, +"").line line
2126
- }
2127
- | string_contents string_content
2128
- {
2129
- v1, v2 = val
2130
- result = literal_concat v1, v2
2131
- }
2132
-
2133
- xstring_contents: none
2134
- {
2135
- result = nil
2136
- }
2137
- | xstring_contents string_content
2138
- {
2139
- v1, v2 = val
2140
- result = literal_concat v1, v2
2141
- }
2142
-
2143
- regexp_contents: none
2144
- {
2145
- result = nil
2146
- }
2147
- | regexp_contents string_content
2148
- {
2149
- v1, v2 = val
2150
- result = literal_concat v1, v2
2151
- }
2152
-
2153
- string_content: tSTRING_CONTENT
2154
- {
2155
- result = new_string val
2156
- }
2157
- | tSTRING_DVAR
2158
- {
2159
- result = lexer.lex_strterm
2160
-
2161
- lexer.lex_strterm = nil
2162
- lexer.lex_state = EXPR_BEG
2163
- }
2164
- string_dvar
2165
- {
2166
- _, strterm, str = val
2167
- lexer.lex_strterm = strterm
2168
- result = s(:evstr, str).line str.line
2169
- }
2170
- | tSTRING_DBEG
2171
- {
2172
- result = [lexer.lex_strterm,
2173
- lexer.brace_nest,
2174
- lexer.string_nest, # TODO: remove
2175
- lexer.lex_state,
2176
- lexer.lineno,
2177
- ]
2178
-
2179
- lexer.cmdarg.push false
2180
- lexer.cond.push false
2181
-
2182
- lexer.lex_strterm = nil
2183
- lexer.brace_nest = 0
2184
- lexer.string_nest = 0
2185
-
2186
- lexer.lex_state = EXPR_BEG
2187
- }
2188
- compstmt
2189
- tSTRING_DEND
2190
- {
2191
- _, memo, stmt, _ = val
2192
-
2193
- lex_strterm, brace_nest, string_nest, oldlex_state, line = memo
2194
- # TODO: heredoc_indent
2195
-
2196
- lexer.lex_strterm = lex_strterm
2197
- lexer.brace_nest = brace_nest
2198
- lexer.string_nest = string_nest
2199
-
2200
- lexer.cond.pop
2201
- lexer.cmdarg.pop
2202
-
2203
- lexer.lex_state = oldlex_state
2204
-
2205
- case stmt
2206
- when Sexp then
2207
- case stmt.sexp_type
2208
- when :str, :dstr, :evstr then
2209
- result = stmt
2210
- else
2211
- result = s(:evstr, stmt).line line
2212
- end
2213
- when nil then
2214
- result = s(:evstr).line line
2215
- else
2216
- debug 38
2217
- raise "unknown string body: #{stmt.inspect}"
2218
- end
2219
- }
2220
-
2221
- string_dvar: tGVAR
2222
- {
2223
- result = wrap :gvar, val[0]
2224
- }
2225
- | tIVAR
2226
- {
2227
- result = wrap :ivar, val[0]
2228
- }
2229
- | tCVAR
2230
- {
2231
- result = wrap :cvar, val[0]
2232
- }
2233
- | backref
2234
-
2235
- symbol: ssym
2236
- | dsym
2237
-
2238
- ssym: tSYMBEG sym
2239
- {
2240
- lexer.lex_state = EXPR_END
2241
- result = wrap :lit, val[1]
2242
- }
2243
- | tSYMBOL
2244
- {
2245
- lexer.lex_state = EXPR_END
2246
- result = wrap :lit, val[0]
2247
- }
2248
-
2249
- sym: fname | tIVAR | tGVAR | tCVAR
2250
-
2251
- dsym: tSYMBEG string_contents tSTRING_END
2252
- {
2253
- _, result, _ = val
2254
-
2255
- lexer.lex_state = EXPR_END
2256
-
2257
- result ||= s(:str, "").line lexer.lineno
2258
-
2259
- case result.sexp_type
2260
- when :dstr then
2261
- result.sexp_type = :dsym
2262
- when :str then
2263
- result = s(:lit, result.last.to_sym).line result.line
2264
- when :evstr then
2265
- result = s(:dsym, "", result).line result.line
2266
- else
2267
- debug 39
2268
- end
2269
- }
2270
-
2271
- numeric: simple_numeric
2272
- | tUMINUS_NUM simple_numeric =tLOWEST
2273
- {
2274
- _, (num, line) = val
2275
- result = [-num, line]
2276
- }
2277
-
2278
- simple_numeric: tINTEGER
2279
- | tFLOAT
2280
- | tRATIONAL
2281
- | tIMAGINARY
2282
-
2283
- user_variable: tIDENTIFIER
2284
- | tIVAR
2285
- | tGVAR
2286
- | tCONSTANT
2287
- | tCVAR
2288
-
2289
- keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
2290
- | kSELF { result = s(:self).line lexer.lineno }
2291
- | kTRUE { result = s(:true).line lexer.lineno }
2292
- | kFALSE { result = s(:false).line lexer.lineno }
2293
- | k__FILE__ { result = s(:str, self.file).line lexer.lineno }
2294
- | k__LINE__ { result = s(:lit, lexer.lineno).line lexer.lineno }
2295
- | k__ENCODING__
2296
- {
2297
- l = lexer.lineno
2298
- result =
2299
- if defined? Encoding then
2300
- s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l
2301
- else
2302
- s(:str, "Unsupported!").line l
2303
- end
2304
- }
2305
-
2306
- var_ref: user_variable
2307
- {
2308
- raise "NO: #{val.inspect}" if Sexp === val.first
2309
- (var, line), = val
2310
- result = Sexp === var ? var : self.gettable(var)
2311
- result.line line
2312
- }
2313
- | keyword_variable
2314
- {
2315
- var = val[0]
2316
- result = Sexp === var ? var : self.gettable(var)
2317
- }
2318
-
2319
- var_lhs: user_variable
2320
- {
2321
- result = self.assignable val[0]
2322
- }
2323
- | keyword_variable
2324
- {
2325
- result = self.assignable val[0]
2326
- debug 40
2327
- }
2328
-
2329
- backref: tNTH_REF
2330
- {
2331
- (ref, line), = val
2332
- result = s(:nth_ref, ref).line line
2333
- }
2334
- | tBACK_REF
2335
- {
2336
- (ref, line), = val
2337
- result = s(:back_ref, ref).line line
2338
- }
2339
-
2340
- superclass: tLT
2341
- {
2342
- lexer.lex_state = EXPR_BEG
2343
- lexer.command_start = true
2344
- }
2345
- expr_value term
2346
- {
2347
- result = val[2]
2348
- }
2349
- | none
2350
- {
2351
- result = nil
2352
- }
2353
-
2354
- f_arglist: tLPAREN2 f_args rparen
2355
- {
2356
- result = end_args val
2357
- }
2358
- | {
2359
- result = self.in_kwarg
2360
- self.in_kwarg = true
2361
- self.lexer.lex_state |= EXPR_LABEL
2362
- }
2363
- f_args term
2364
- {
2365
- result = end_args val
2366
- }
2367
-
2368
- args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg
2369
- {
2370
- result = args val
2371
- }
2372
- | f_kwarg opt_f_block_arg
2373
- {
2374
- result = args val
2375
- }
2376
- | f_kwrest opt_f_block_arg
2377
- {
2378
- result = args val
2379
- }
2380
- | f_block_arg
2381
-
2382
- opt_args_tail: tCOMMA args_tail
2383
- {
2384
- result = val[1]
2385
- }
2386
- |
2387
- {
2388
- result = nil
2389
- }
2390
-
2391
- f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail
2392
- {
2393
- result = args val
2394
- }
2395
- | f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
2396
- {
2397
- result = args val
2398
- }
2399
- | f_arg tCOMMA f_optarg opt_args_tail
2400
- {
2401
- result = args val
2402
- }
2403
- | f_arg tCOMMA f_optarg tCOMMA f_arg opt_args_tail
2404
- {
2405
- result = args val
2406
- }
2407
- | f_arg tCOMMA f_rest_arg opt_args_tail
2408
- {
2409
- result = args val
2410
- }
2411
- | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
2412
- {
2413
- result = args val
2414
- }
2415
- | f_arg opt_args_tail
2416
- {
2417
- result = args val
2418
- }
2419
- | f_optarg tCOMMA f_rest_arg opt_args_tail
2420
- {
2421
- result = args val
2422
- }
2423
- | f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_args_tail
2424
- {
2425
- result = args val
2426
- }
2427
- | f_optarg opt_args_tail
2428
- {
2429
- result = args val
2430
- }
2431
- | f_optarg tCOMMA f_arg opt_args_tail
2432
- {
2433
- result = args val
2434
- }
2435
- | f_rest_arg opt_args_tail
2436
- {
2437
- result = args val
2438
- }
2439
- | f_rest_arg tCOMMA f_arg opt_args_tail
2440
- {
2441
- result = args val
2442
- }
2443
- | args_tail
2444
- {
2445
- result = args val
2446
- }
2447
- |
2448
- {
2449
- result = args val
2450
- # result.line lexer.lineno
2451
- }
2452
-
2453
-
2454
- f_bad_arg: tCONSTANT
2455
- {
2456
- yyerror "formal argument cannot be a constant"
2457
- }
2458
- | tIVAR
2459
- {
2460
- yyerror "formal argument cannot be an instance variable"
2461
- }
2462
- | tGVAR
2463
- {
2464
- yyerror "formal argument cannot be a global variable"
2465
- }
2466
- | tCVAR
2467
- {
2468
- yyerror "formal argument cannot be a class variable"
2469
- }
2470
-
2471
- f_norm_arg: f_bad_arg
2472
- | tIDENTIFIER
2473
- {
2474
- (id, line), = val
2475
- identifier = id.to_sym
2476
- self.env[identifier] = :lvar
2477
-
2478
- result = [identifier, line]
2479
- }
2480
-
2481
- f_arg_asgn: f_norm_arg
2482
-
2483
- f_arg_item: f_arg_asgn
2484
- | tLPAREN f_margs rparen
2485
- {
2486
- _, margs, _ = val
2487
-
2488
- result = margs
2489
- }
2490
-
2491
- f_arg: f_arg_item
2492
- {
2493
- result = new_arg val
2494
- }
2495
- | f_arg tCOMMA f_arg_item
2496
- {
2497
- list, _, item = val
2498
-
2499
- if list.sexp_type == :args then
2500
- result = list
2501
- else
2502
- result = s(:args, list).line list.line
2503
- end
2504
-
2505
- if Sexp === item then
2506
- line_max = item.line_max
2507
- else
2508
- item, line_max = item
2509
- end
2510
-
2511
- result << item
2512
- result.line_max = line_max
2513
- }
2514
-
2515
- f_label: tLABEL
2516
-
2517
- f_kw: f_label arg_value
2518
- {
2519
- # TODO: new_kw_arg
2520
- (label, line), arg = val
2521
-
2522
- identifier = label.to_sym
2523
- self.env[identifier] = :lvar
2524
-
2525
- kwarg = s(:kwarg, identifier, arg).line line
2526
- result = s(:array, kwarg).line line
2527
- }
2528
- | f_label
2529
- {
2530
- (label, line), = val
2531
-
2532
- id = label.to_sym
2533
- self.env[id] = :lvar
2534
-
2535
- result = s(:array, s(:kwarg, id).line(line)).line line
2536
- }
2537
-
2538
- f_block_kw: f_label primary_value
2539
- {
2540
- # TODO: new_kw_arg
2541
- (label, line), expr = val
2542
- id = label.to_sym
2543
- self.env[id] = :lvar
2544
-
2545
- result = s(:array, s(:kwarg, id, expr).line(line)).line line
2546
- }
2547
- | f_label
2548
- {
2549
- # TODO: new_kw_arg
2550
- (label, line), = val
2551
- id = label.to_sym
2552
- self.env[id] = :lvar
2553
-
2554
- result = s(:array, s(:kwarg, id).line(line)).line line
2555
- }
2556
-
2557
- f_block_kwarg: f_block_kw
2558
- | f_block_kwarg tCOMMA f_block_kw
2559
- {
2560
- list, _, item = val
2561
- result = list << item.last
2562
- }
2563
-
2564
- f_kwarg: f_kw
2565
- | f_kwarg tCOMMA f_kw
2566
- {
2567
- result = args val
2568
- }
2569
-
2570
- kwrest_mark: tPOW
2571
- | tDSTAR
2572
-
2573
-
2574
- f_kwrest: kwrest_mark tIDENTIFIER
2575
- {
2576
- _, (id, line) = val
2577
-
2578
- name = id.to_sym
2579
- self.assignable [name, line]
2580
- result = [:"**#{name}", line]
2581
- }
2582
- | kwrest_mark
2583
- {
2584
- id = :"**"
2585
- self.env[id] = :lvar # TODO: needed?!?
2586
- result = [id, lexer.lineno] # TODO: tPOW/tDSTAR include lineno
2587
- }
2588
-
2589
- f_opt: f_arg_asgn tEQL arg_value
2590
- {
2591
- lhs, _, rhs = val
2592
- result = self.assignable lhs, rhs
2593
- # TODO: detect duplicate names
2594
- }
2595
-
2596
- f_block_opt: f_arg_asgn tEQL primary_value
2597
- {
2598
- lhs, _, rhs = val
2599
- result = self.assignable lhs, rhs
2600
- }
2601
-
2602
- f_block_optarg: f_block_opt
2603
- {
2604
- optblk, = val
2605
- result = s(:block, optblk).line optblk.line
2606
- }
2607
- | f_block_optarg tCOMMA f_block_opt
2608
- {
2609
- optarg, _, optblk = val
2610
- result = optarg
2611
- result << optblk
2612
- }
2613
-
2614
- f_optarg: f_opt
2615
- {
2616
- opt, = val
2617
- result = s(:block, opt).line opt.line
2618
- }
2619
- | f_optarg tCOMMA f_opt
2620
- {
2621
- result = self.block_append val[0], val[2]
2622
- }
2623
-
2624
- restarg_mark: tSTAR2 | tSTAR
2625
-
2626
- f_rest_arg: restarg_mark tIDENTIFIER
2627
- {
2628
- # TODO: differs from parse.y - needs tests
2629
- _, (id, line) = val
2630
- name = id.to_sym
2631
- self.assignable [name, line]
2632
- result = [:"*#{name}", line]
2633
- }
2634
- | restarg_mark
2635
- {
2636
- name = :"*"
2637
- self.env[name] = :lvar
2638
- result = [name, lexer.lineno] # FIX: tSTAR to include lineno
2639
- }
2640
-
2641
- blkarg_mark: tAMPER2 | tAMPER
2642
-
2643
- f_block_arg: blkarg_mark tIDENTIFIER
2644
- {
2645
- _, (id, line) = val
2646
- identifier = id.to_sym
2647
-
2648
- self.env[identifier] = :lvar
2649
- result = ["&#{identifier}".to_sym, line]
2650
- }
2651
-
2652
- opt_f_block_arg: tCOMMA f_block_arg
2653
- {
2654
- _, arg = val
2655
- result = arg
2656
- }
2657
- |
2658
- {
2659
- result = nil
2660
- }
2661
-
2662
- singleton: var_ref
2663
- | tLPAREN2
2664
- {
2665
- lexer.lex_state = EXPR_BEG
2666
- }
2667
- expr rparen
2668
- {
2669
- result = val[2]
2670
- yyerror "Can't define single method for literals." if
2671
- result.sexp_type == :lit
2672
- }
2673
-
2674
- assoc_list: none
2675
- {
2676
- result = s(:array).line lexer.lineno
2677
- }
2678
- | assocs trailer
2679
-
2680
- assocs: assoc
2681
- | assocs tCOMMA assoc
2682
- {
2683
- list = val[0].dup
2684
- more = val[2].sexp_body
2685
- list.push(*more) unless more.empty?
2686
- result = list
2687
- result.sexp_type = :hash
2688
- }
2689
-
2690
- assoc: arg_value tASSOC arg_value
2691
- {
2692
- v1, _, v2 = val
2693
- result = s(:array, v1, v2).line v1.line
2694
- }
2695
- | tLABEL arg_value
2696
- {
2697
- label, arg = val
2698
-
2699
- lit = wrap :lit, label
2700
- result = s(:array, lit, arg).line lit.line
2701
- }
2702
- | tSTRING_BEG string_contents tLABEL_END arg_value
2703
- {
2704
- (_, line), sym, _, value = val
2705
-
2706
- sym.sexp_type = :dsym
2707
-
2708
- result = s(:array, sym, value).line line
2709
- }
2710
- | tDSTAR arg_value
2711
- {
2712
- _, arg = val
2713
- line = arg.line
2714
- result = s(:array, s(:kwsplat, arg).line(line)).line line
2715
- }
2716
-
2717
- operation: tIDENTIFIER | tCONSTANT | tFID
2718
- operation2: tIDENTIFIER | tCONSTANT | tFID | op
2719
- operation3: tIDENTIFIER | tFID | op
2720
- dot_or_colon: tDOT | tCOLON2
2721
- call_op: tDOT
2722
- | tLONELY # TODO: rename tANDDOT?
2723
-
2724
- call_op2: call_op
2725
- | tCOLON2
2726
-
2727
- opt_terms: | terms
2728
- opt_nl: | tNL
2729
- rparen: opt_nl tRPAREN
2730
- {
2731
- _, close = val
2732
- result = [close, lexer.lineno]
2733
- }
2734
- rbracket: opt_nl tRBRACK
2735
- {
2736
- _, close = val
2737
- result = [close, lexer.lineno]
2738
- }
2739
- trailer: | tNL | tCOMMA
2740
-
2741
- term: tSEMI { yyerrok }
2742
- | tNL
2743
-
2744
- terms: term
2745
- | terms tSEMI { yyerrok }
2746
-
2747
- none: { result = nil; }
2748
- end
2749
-
2750
- ---- inner
2751
-
2752
- require "ruby_lexer"
2753
- require "ruby_parser_extras"
2754
- include RubyLexer::State::Values
2755
-
2756
- # :stopdoc:
2757
-
2758
- # Local Variables: **
2759
- # racc-token-length-max:14 **
2760
- # End: **