ruby_parser 3.13.1 → 3.21.0

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