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