ruby_parser 3.0.0 → 3.19.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 (58) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/.autotest +36 -19
  4. data/History.rdoc +1297 -0
  5. data/Manifest.txt +35 -7
  6. data/{README.txt → README.rdoc} +44 -14
  7. data/Rakefile +308 -110
  8. data/bin/ruby_parse +3 -1
  9. data/bin/ruby_parse_extract_error +36 -16
  10. data/compare/normalize.rb +218 -0
  11. data/debugging.md +190 -0
  12. data/gauntlet.md +107 -0
  13. data/lib/.document +1 -0
  14. data/lib/rp_extensions.rb +53 -0
  15. data/lib/rp_stringscanner.rb +33 -0
  16. data/lib/ruby20_parser.rb +10973 -0
  17. data/lib/ruby20_parser.y +2683 -0
  18. data/lib/ruby21_parser.rb +10980 -0
  19. data/lib/ruby21_parser.y +2700 -0
  20. data/lib/ruby22_parser.rb +11123 -0
  21. data/lib/ruby22_parser.y +2711 -0
  22. data/lib/ruby23_parser.rb +11132 -0
  23. data/lib/ruby23_parser.y +2713 -0
  24. data/lib/ruby24_parser.rb +11231 -0
  25. data/lib/ruby24_parser.y +2721 -0
  26. data/lib/ruby25_parser.rb +11231 -0
  27. data/lib/ruby25_parser.y +2721 -0
  28. data/lib/ruby26_parser.rb +11253 -0
  29. data/lib/ruby26_parser.y +2736 -0
  30. data/lib/ruby27_parser.rb +12980 -0
  31. data/lib/ruby27_parser.y +3324 -0
  32. data/lib/ruby30_parser.rb +13242 -0
  33. data/lib/ruby30_parser.y +3447 -0
  34. data/lib/ruby31_parser.rb +13622 -0
  35. data/lib/ruby31_parser.y +3481 -0
  36. data/lib/ruby3_parser.yy +3536 -0
  37. data/lib/ruby_lexer.rb +933 -1232
  38. data/lib/ruby_lexer.rex +185 -0
  39. data/lib/ruby_lexer.rex.rb +399 -0
  40. data/lib/ruby_lexer_strings.rb +638 -0
  41. data/lib/ruby_parser.rb +97 -3
  42. data/lib/ruby_parser.yy +3465 -0
  43. data/lib/ruby_parser_extras.rb +1216 -687
  44. data/test/test_ruby_lexer.rb +2249 -1092
  45. data/test/test_ruby_parser.rb +5156 -975
  46. data/test/test_ruby_parser_extras.rb +47 -77
  47. data/tools/munge.rb +250 -0
  48. data/tools/ripper.rb +44 -0
  49. data.tar.gz.sig +1 -1
  50. metadata +200 -155
  51. metadata.gz.sig +0 -0
  52. data/.gemtest +0 -0
  53. data/History.txt +0 -482
  54. data/lib/gauntlet_rubyparser.rb +0 -120
  55. data/lib/ruby18_parser.rb +0 -5747
  56. data/lib/ruby18_parser.y +0 -1873
  57. data/lib/ruby19_parser.rb +0 -6110
  58. data/lib/ruby19_parser.y +0 -2078
data/lib/ruby18_parser.y DELETED
@@ -1,1873 +0,0 @@
1
- # -*- racc -*-
2
-
3
- class Ruby18Parser
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 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__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT tCVAR tNTH_REF
11
- tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT tREGEXP_END tUPLUS
12
- tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ tGEQ tLEQ tANDOP
13
- tOROP tMATCH tNMATCH tDOT tDOT2 tDOT3 tAREF tASET tLSHFT tRSHFT
14
- tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN tLPAREN2 tRPAREN tLPAREN_ARG
15
- tLBRACK tLBRACK2 tRBRACK tLBRACE tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2
16
- tTILDE tPERCENT tDIVIDE tPLUS tMINUS tLT tGT tPIPE tBANG tCARET
17
- tLCURLY tRCURLY tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG
18
- tWORDS_BEG tQWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END tSTRING
19
- tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAST_TOKEN
20
-
21
- prechigh
22
- right tBANG tTILDE tUPLUS
23
- right tPOW
24
- right tUMINUS_NUM tUMINUS
25
- left tSTAR2 tDIVIDE tPERCENT
26
- left tPLUS tMINUS
27
- left tLSHFT tRSHFT
28
- left tAMPER2
29
- left tPIPE tCARET
30
- left tGT tGEQ tLT tLEQ
31
- nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
32
- left tANDOP
33
- left tOROP
34
- nonassoc tDOT2 tDOT3
35
- right tEH tCOLON
36
- left kRESCUE_MOD
37
- right tEQL tOP_ASGN
38
- nonassoc kDEFINED
39
- right kNOT
40
- left kOR kAND
41
- nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD
42
- nonassoc tLBRACE_ARG
43
- nonassoc tLOWEST
44
- preclow
45
-
46
- rule
47
-
48
- program: {
49
- self.lexer.lex_state = :expr_beg
50
- }
51
- compstmt
52
- {
53
- result = val[1]
54
- }
55
-
56
- bodystmt: compstmt opt_rescue opt_else opt_ensure
57
- {
58
- result = new_body val
59
- }
60
-
61
- compstmt: stmts opt_terms
62
- {
63
- result = new_compstmt val
64
- }
65
-
66
- stmts: none
67
- | stmt
68
- | stmts terms stmt
69
- {
70
- result = block_append val[0], val[2]
71
- }
72
- | error stmt
73
- {
74
- result = val[1]
75
- }
76
-
77
- stmt: kALIAS fitem
78
- {
79
- lexer.lex_state = :expr_fname
80
- result = self.lexer.lineno
81
- }
82
- fitem
83
- {
84
- result = s(:alias, val[1], val[3]).line(val[2])
85
- }
86
- | kALIAS tGVAR tGVAR
87
- {
88
- result = s(:valias, val[1].to_sym, val[2].to_sym)
89
- }
90
- | kALIAS tGVAR tBACK_REF
91
- {
92
- result = s(:valias, val[1].to_sym, :"$#{val[2]}")
93
- }
94
- | kALIAS tGVAR tNTH_REF
95
- {
96
- yyerror "can't make alias for the number variables"
97
- }
98
- | kUNDEF undef_list
99
- {
100
- result = val[1]
101
- }
102
- | stmt kIF_MOD expr_value
103
- {
104
- result = new_if val[2], val[0], nil
105
- }
106
- | stmt kUNLESS_MOD expr_value
107
- {
108
- result = new_if val[2], nil, val[0]
109
- }
110
- | stmt kWHILE_MOD expr_value
111
- {
112
- result = new_while val[0], val[2], true
113
- }
114
- | stmt kUNTIL_MOD expr_value
115
- {
116
- result = new_until val[0], val[2], true
117
- }
118
- | stmt kRESCUE_MOD stmt
119
- {
120
- result = s(:rescue, val[0], new_resbody(s(:array), val[2]))
121
- }
122
- | klBEGIN
123
- {
124
- if (in_def || in_single > 0) then
125
- yyerror "BEGIN in method"
126
- end
127
- self.env.extend
128
- }
129
- tLCURLY compstmt tRCURLY
130
- {
131
- result = new_iter s(:preexe), nil, val[3] # TODO: add test?
132
- result = nil # TODO: since it isn't supposed to go in the AST
133
- }
134
- | klEND tLCURLY compstmt tRCURLY
135
- {
136
- if (in_def || in_single > 0) then
137
- yyerror "END in method; use at_exit"
138
- end
139
- result = new_iter s(:postexe), nil, val[2]
140
- }
141
- | lhs tEQL command_call
142
- {
143
- result = node_assign val[0], val[2]
144
- }
145
- | mlhs tEQL command_call
146
- {
147
- result = new_masgn val[0], val[2], :wrap
148
- }
149
- | var_lhs tOP_ASGN command_call
150
- {
151
- result = new_op_asgn val
152
- }
153
- | primary_value tLBRACK2 aref_args tRBRACK tOP_ASGN command_call
154
- {
155
- result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
156
- }
157
- | primary_value tDOT tIDENTIFIER tOP_ASGN command_call
158
- {
159
- result = s(:op_asgn, val[0], val[4], val[2], val[3])
160
- }
161
- | primary_value tDOT tCONSTANT tOP_ASGN command_call
162
- {
163
- result = s(:op_asgn, val[0], val[4], val[2], val[3])
164
- }
165
- | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
166
- {
167
- result = s(:op_asgn, val[0], val[4], val[2], val[3])
168
- }
169
- | backref tOP_ASGN command_call
170
- {
171
- backref_assign_error val[0]
172
- }
173
- | lhs tEQL mrhs
174
- {
175
- result = node_assign val[0], s(:svalue, val[2])
176
- }
177
- | mlhs tEQL arg_value
178
- {
179
- result = new_masgn val[0], val[2], :wrap
180
- }
181
- | mlhs tEQL mrhs
182
- {
183
- result = new_masgn val[0], val[2]
184
- }
185
- | expr
186
-
187
- expr: command_call
188
- | expr kAND expr
189
- {
190
- result = logop(:and, val[0], val[2])
191
- }
192
- | expr kOR expr
193
- {
194
- result = logop(:or, val[0], val[2])
195
- }
196
- | kNOT expr
197
- {
198
- result = s(:not, val[1])
199
- }
200
- | tBANG command_call
201
- {
202
- result = s(:not, val[1])
203
- }
204
- | arg
205
-
206
- expr_value: expr
207
- {
208
- result = value_expr(val[0])
209
- }
210
-
211
- command_call: command
212
- | block_command
213
- | kRETURN call_args
214
- {
215
- line = val[0].last
216
- result = s(:return, ret_args(val[1])).line(line)
217
- }
218
- | kBREAK call_args
219
- {
220
- line = val[0].last
221
- result = s(:break, ret_args(val[1])).line(line)
222
- }
223
- | kNEXT call_args
224
- {
225
- line = val[0].last
226
- result = s(:next, ret_args(val[1])).line(line)
227
- }
228
-
229
- block_command: block_call
230
- | block_call tDOT operation2 command_args
231
- {
232
- result = new_call val[0], val[2], val[3]
233
- }
234
- | block_call tCOLON2 operation2 command_args
235
- {
236
- result = new_call val[0], val[2], val[3]
237
- }
238
-
239
- cmd_brace_block: tLBRACE_ARG
240
- {
241
- self.env.extend(:dynamic)
242
- result = self.lexer.lineno
243
- }
244
- opt_block_var
245
- {
246
- result = self.env.dynamic.keys
247
- }
248
- compstmt tRCURLY
249
- {
250
- result = new_iter nil, val[2], val[4]
251
- self.env.unextend
252
- }
253
-
254
- command: operation command_args =tLOWEST
255
- {
256
- result = new_call nil, val[0].to_sym, val[1]
257
- }
258
- | operation command_args cmd_brace_block
259
- {
260
- result = new_call nil, val[0].to_sym, val[1]
261
-
262
- if val[2] then
263
- block_dup_check result, val[2]
264
-
265
- result, operation = val[2], result
266
- result.insert 1, operation
267
- end
268
- }
269
- | primary_value tDOT operation2 command_args =tLOWEST
270
- {
271
- result = new_call val[0], val[2].to_sym, val[3]
272
- }
273
- | primary_value tDOT operation2 command_args cmd_brace_block
274
- {
275
- result = new_call val[0], val[2].to_sym, val[3]
276
- raise "no2"
277
-
278
- if val[4] then
279
- block_dup_check result, val[4]
280
-
281
- val[2] << result
282
- result = val[2]
283
- end
284
- }
285
- | primary_value tCOLON2 operation2 command_args =tLOWEST
286
- {
287
- result = new_call val[0], val[2].to_sym, val[3]
288
- }
289
- | primary_value tCOLON2 operation2 command_args cmd_brace_block
290
- {
291
- result = new_call val[0], val[2].to_sym, val[3]
292
- raise "no3"
293
-
294
- if val[4] then
295
- block_dup_check result, val[4]
296
-
297
- val[2] << result
298
- result = val[2]
299
- end
300
- }
301
- | kSUPER command_args
302
- {
303
- result = new_super val[1]
304
- }
305
- | kYIELD command_args
306
- {
307
- result = new_yield val[1]
308
- }
309
-
310
- mlhs: mlhs_basic
311
- | tLPAREN mlhs_entry tRPAREN
312
- {
313
- result = val[1]
314
- }
315
-
316
- mlhs_entry: mlhs_basic
317
- | tLPAREN mlhs_entry tRPAREN
318
- {
319
- result = s(:masgn, s(:array, val[1]))
320
- }
321
-
322
- mlhs_basic: mlhs_head
323
- {
324
- result = s(:masgn, val[0])
325
- }
326
- | mlhs_head mlhs_item
327
- {
328
- result = s(:masgn, val[0] << val[1].compact)
329
- }
330
- | mlhs_head tSTAR mlhs_node
331
- {
332
- result = s(:masgn, val[0] << s(:splat, val[2]))
333
- }
334
- | mlhs_head tSTAR
335
- {
336
- result = s(:masgn, val[0] << s(:splat))
337
- }
338
- | tSTAR mlhs_node
339
- {
340
- result = s(:masgn, s(:array, s(:splat, val[1])))
341
- }
342
- | tSTAR
343
- {
344
- result = s(:masgn, s(:array, s(:splat)))
345
- }
346
-
347
- mlhs_item: mlhs_node
348
- | tLPAREN mlhs_entry tRPAREN
349
- {
350
- result = val[1]
351
- }
352
-
353
- mlhs_head: mlhs_item tCOMMA
354
- {
355
- result = s(:array, val[0])
356
- }
357
- | mlhs_head mlhs_item tCOMMA
358
- {
359
- result = val[0] << val[1].compact
360
- }
361
-
362
- mlhs_node: variable
363
- {
364
- result = assignable val[0]
365
- }
366
- | primary_value tLBRACK2 aref_args tRBRACK
367
- {
368
- result = aryset val[0], val[2]
369
- }
370
- | primary_value tDOT tIDENTIFIER
371
- {
372
- result = s(:attrasgn, val[0], :"#{val[2]}=")
373
- }
374
- | primary_value tCOLON2 tIDENTIFIER
375
- {
376
- result = s(:attrasgn, val[0], :"#{val[2]}=")
377
- }
378
- | primary_value tDOT tCONSTANT
379
- {
380
- result = s(:attrasgn, val[0], :"#{val[2]}=")
381
- }
382
- | primary_value tCOLON2 tCONSTANT
383
- {
384
- if (in_def || in_single > 0) then
385
- yyerror "dynamic constant assignment"
386
- end
387
-
388
- result = s(:const, s(:colon2, val[0], val[2].to_sym), nil)
389
- }
390
- | tCOLON3 tCONSTANT
391
- {
392
- if (in_def || in_single > 0) then
393
- yyerror "dynamic constant assignment"
394
- end
395
-
396
- result = s(:const, nil, s(:colon3, val[1].to_sym))
397
- }
398
- | backref
399
- {
400
- backref_assign_error val[0]
401
- }
402
-
403
- lhs: variable
404
- {
405
- result = assignable val[0]
406
- }
407
- | primary_value tLBRACK2 aref_args tRBRACK
408
- {
409
- result = aryset val[0], val[2]
410
- }
411
- | primary_value tDOT tIDENTIFIER
412
- {
413
- result = s(:attrasgn, val[0], :"#{val[2]}=")
414
- }
415
- | primary_value tCOLON2 tIDENTIFIER
416
- {
417
- result = s(:attrasgn, val[0], :"#{val[2]}=")
418
- }
419
- | primary_value tDOT tCONSTANT
420
- {
421
- result = s(:attrasgn, val[0], :"#{val[2]}=")
422
- }
423
- | primary_value tCOLON2 tCONSTANT
424
- {
425
- if (in_def || in_single > 0) then
426
- yyerror "dynamic constant assignment"
427
- end
428
-
429
- result = s(:const, s(:colon2, val[0], val[2].to_sym))
430
- }
431
- | tCOLON3 tCONSTANT
432
- {
433
- if (in_def || in_single > 0) then
434
- yyerror "dynamic constant assignment"
435
- end
436
-
437
- result = s(:const, s(:colon3, val[1].to_sym))
438
- }
439
- | backref
440
- {
441
- backref_assign_error val[0]
442
- }
443
-
444
- cname: tIDENTIFIER
445
- {
446
- yyerror "class/module name must be CONSTANT"
447
- }
448
- | tCONSTANT
449
-
450
- cpath: tCOLON3 cname
451
- {
452
- result = s(:colon3, val[1].to_sym)
453
- }
454
- | cname
455
- {
456
- result = val[0].to_sym
457
- }
458
- | primary_value tCOLON2 cname
459
- {
460
- result = s(:colon2, val[0], val[2].to_sym)
461
- }
462
-
463
- fname: tIDENTIFIER | tCONSTANT | tFID
464
- | op
465
- {
466
- lexer.lex_state = :expr_end
467
- result = val[0]
468
- }
469
-
470
- | reswords
471
- {
472
- lexer.lex_state = :expr_end
473
- result = val[0]
474
- }
475
-
476
- fsym: fname | symbol
477
-
478
- fitem: fsym { result = s(:lit, val[0].to_sym) }
479
- | dsym
480
-
481
- undef_list: fitem
482
- {
483
- result = new_undef val[0]
484
- }
485
- |
486
- undef_list tCOMMA
487
- {
488
- lexer.lex_state = :expr_fname
489
- }
490
- fitem
491
- {
492
- result = new_undef val[0], val[3]
493
- }
494
-
495
- op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ
496
- | tMATCH | tGT | tGEQ | tLT | tLEQ | tLSHFT
497
- | tRSHFT | tPLUS | tMINUS | tSTAR2 | tSTAR | tDIVIDE
498
- | tPERCENT | tPOW | tTILDE | tUPLUS | tUMINUS | tAREF
499
- | tASET | tBACK_REF2
500
-
501
- reswords: k__LINE__ | k__FILE__ | klBEGIN | klEND | kALIAS | kAND
502
- | kBEGIN | kBREAK | kCASE | kCLASS | kDEF | kDEFINED
503
- | kDO | kELSE | kELSIF | kEND | kENSURE | kFALSE
504
- | kFOR | kIN | kMODULE | kNEXT | kNIL | kNOT
505
- | kOR | kREDO | kRESCUE | kRETRY | kRETURN | kSELF
506
- | kSUPER | kTHEN | kTRUE | kUNDEF | kWHEN | kYIELD
507
- | kIF | kUNLESS | kWHILE | kUNTIL
508
-
509
- arg: lhs tEQL arg
510
- {
511
- result = node_assign val[0], val[2]
512
- }
513
- | lhs tEQL arg kRESCUE_MOD arg
514
- {
515
- result = node_assign val[0], s(:rescue, val[2], new_resbody(s(:array), val[4]))
516
- # result.line = val[0].line
517
- }
518
- | var_lhs tOP_ASGN arg
519
- {
520
- result = new_op_asgn val
521
- }
522
- | primary_value tLBRACK2 aref_args tRBRACK tOP_ASGN arg
523
- {
524
- result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
525
- val[2][0] = :arglist
526
- }
527
- | primary_value tDOT tIDENTIFIER tOP_ASGN arg
528
- {
529
- result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4])
530
- }
531
- | primary_value tDOT tCONSTANT tOP_ASGN arg
532
- {
533
- result = s(:op_asgn2, val[0], :"#{val[2]}=", val[3].to_sym, val[4])
534
- }
535
- | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg
536
- {
537
- result = s(:op_asgn, val[0], val[4], val[2], val[3])
538
- }
539
- | primary_value tCOLON2 tCONSTANT tOP_ASGN arg
540
-
541
- {
542
- yyerror "constant re-assignment"
543
- }
544
- | tCOLON3 tCONSTANT tOP_ASGN arg
545
- {
546
- yyerror "constant re-assignment"
547
- }
548
- | backref tOP_ASGN arg
549
- {
550
- backref_assign_error val[0]
551
- }
552
- | arg tDOT2 arg
553
- {
554
- v1, v2 = val[0], val[2]
555
- if v1.node_type == :lit and v2.node_type == :lit and Fixnum === v1.last and Fixnum === v2.last then
556
- result = s(:lit, (v1.last)..(v2.last))
557
- else
558
- result = s(:dot2, v1, v2)
559
- end
560
- }
561
- | arg tDOT3 arg
562
- {
563
- v1, v2 = val[0], val[2]
564
- if v1.node_type == :lit and v2.node_type == :lit and Fixnum === v1.last and Fixnum === v2.last then
565
- result = s(:lit, (v1.last)...(v2.last))
566
- else
567
- result = s(:dot3, v1, v2)
568
- end
569
- }
570
- | arg tPLUS arg
571
- {
572
- result = new_call val[0], :+, argl(val[2])
573
- }
574
- | arg tMINUS arg
575
- {
576
- result = new_call val[0], :-, argl(val[2])
577
- }
578
- | arg tSTAR2 arg
579
- {
580
- result = new_call val[0], :*, argl(val[2])
581
- }
582
- | arg tDIVIDE arg
583
- {
584
- result = new_call val[0], :"/", argl(val[2])
585
- }
586
- | arg tPERCENT arg
587
- {
588
- result = new_call val[0], :"%", argl(val[2])
589
- }
590
- | arg tPOW arg
591
- {
592
- result = new_call val[0], :**, argl(val[2])
593
- }
594
- | tUMINUS_NUM tINTEGER tPOW arg
595
- {
596
- result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@")
597
- }
598
- | tUMINUS_NUM tFLOAT tPOW arg
599
- {
600
- result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@")
601
- }
602
- | tUPLUS arg
603
- {
604
- if val[1][0] == :lit then
605
- result = val[1]
606
- else
607
- result = new_call val[1], :"+@"
608
- end
609
- }
610
- | tUMINUS arg
611
- {
612
- result = new_call val[1], :"-@"
613
- }
614
- | arg tPIPE arg
615
- {
616
- result = new_call val[0], :"|", argl(val[2])
617
- }
618
- | arg tCARET arg
619
- {
620
- result = new_call val[0], :"^", argl(val[2])
621
- }
622
- | arg tAMPER2 arg
623
- {
624
- result = new_call val[0], :"&", argl(val[2])
625
- }
626
- | arg tCMP arg
627
- {
628
- result = new_call val[0], :"<=>", argl(val[2])
629
- }
630
- | arg tGT arg
631
- {
632
- result = new_call val[0], :">", argl(val[2])
633
- }
634
- | arg tGEQ arg
635
- {
636
- result = new_call val[0], :">=", argl(val[2])
637
- }
638
- | arg tLT arg
639
- {
640
- result = new_call val[0], :"<", argl(val[2])
641
- }
642
- | arg tLEQ arg
643
- {
644
- result = new_call val[0], :"<=", argl(val[2])
645
- }
646
- | arg tEQ arg
647
- {
648
- result = new_call val[0], :"==", argl(val[2])
649
- }
650
- | arg tEQQ arg
651
- {
652
- result = new_call val[0], :"===", argl(val[2])
653
- }
654
- | arg tNEQ arg
655
- {
656
- val[0] = value_expr val[0] # TODO: port call_op and clean these
657
- val[2] = value_expr val[2]
658
- result = s(:not, new_call(val[0], :"==", argl(val[2])))
659
- }
660
- | arg tMATCH arg
661
- {
662
- result = get_match_node val[0], val[2]
663
- }
664
- | arg tNMATCH arg
665
- {
666
- result = s(:not, get_match_node(val[0], val[2]))
667
- }
668
- | tBANG arg
669
- {
670
- result = s(:not, val[1])
671
- }
672
- | tTILDE arg
673
- {
674
- val[2] = value_expr val[2]
675
- result = new_call val[1], :"~"
676
- }
677
- | arg tLSHFT arg
678
- {
679
- val[0] = value_expr val[0]
680
- val[2] = value_expr val[2]
681
- result = new_call val[0], :"\<\<", argl(val[2])
682
- }
683
- | arg tRSHFT arg
684
- {
685
- val[0] = value_expr val[0]
686
- val[2] = value_expr val[2]
687
- result = new_call val[0], :">>", argl(val[2])
688
- }
689
- | arg tANDOP arg
690
- {
691
- result = logop(:and, val[0], val[2])
692
- }
693
- | arg tOROP arg
694
- {
695
- result = logop(:or, val[0], val[2])
696
- }
697
- | kDEFINED opt_nl arg
698
- {
699
- result = s(:defined, val[2])
700
- }
701
- | arg tEH arg tCOLON arg
702
- {
703
- lexer.tern.pop
704
- result = s(:if, val[0], val[2], val[4])
705
- }
706
- | primary
707
-
708
- arg_value: arg
709
- {
710
- result = value_expr(val[0])
711
- }
712
-
713
- aref_args: none
714
- | command opt_nl
715
- {
716
- warning 'parenthesize argument(s) for future version'
717
- result = s(:array, val[0])
718
- }
719
- | args trailer
720
- {
721
- result = val[0]
722
- }
723
- | args tCOMMA tSTAR arg opt_nl
724
- {
725
- result = arg_concat val[0], val[3]
726
- }
727
- | assocs trailer
728
- {
729
- result = s(:array, s(:hash, *val[0].values))
730
- }
731
- | tSTAR arg opt_nl
732
- {
733
- result = s(:array, s(:splat, val[1]))
734
- }
735
-
736
- paren_args: tLPAREN2 none tRPAREN
737
- {
738
- result = val[1]
739
- }
740
- | tLPAREN2 call_args opt_nl tRPAREN
741
- {
742
- result = val[1]
743
- }
744
- | tLPAREN2 block_call opt_nl tRPAREN
745
- {
746
- warning "parenthesize argument(s) for future version"
747
- result = s(:array, val[1])
748
- }
749
- | tLPAREN2 args tCOMMA block_call opt_nl tRPAREN
750
- {
751
- warning "parenthesize argument(s) for future version"
752
- result = val[1].add val[3]
753
- }
754
-
755
- opt_paren_args: none
756
- | paren_args
757
-
758
- call_args: command
759
- {
760
- warning "parenthesize argument(s) for future version"
761
- result = s(:array, val[0])
762
- }
763
- | args opt_block_arg
764
- {
765
- result = arg_blk_pass val[0], val[1]
766
- }
767
- | args tCOMMA tSTAR arg_value opt_block_arg
768
- {
769
- result = arg_concat val[0], val[3]
770
- result = arg_blk_pass result, val[4]
771
- }
772
- | assocs opt_block_arg
773
- {
774
- result = s(:array, s(:hash, *val[0].values))
775
- result = arg_blk_pass result, val[1]
776
- }
777
- | assocs tCOMMA tSTAR arg_value opt_block_arg
778
- {
779
- result = arg_concat s(:array, s(:hash, *val[0].values)), val[3]
780
- result = arg_blk_pass result, val[4]
781
- }
782
- | args tCOMMA assocs opt_block_arg
783
- {
784
- result = val[0] << s(:hash, *val[2].values)
785
- result = arg_blk_pass result, val[3]
786
- }
787
- | args tCOMMA assocs tCOMMA tSTAR arg opt_block_arg
788
- {
789
- val[0] << s(:hash, *val[2].values)
790
- result = arg_concat val[0], val[5]
791
- result = arg_blk_pass result, val[6]
792
- }
793
- | tSTAR arg_value opt_block_arg
794
- {
795
- result = arg_blk_pass s(:splat, val[1]), val[2]
796
- }
797
- | block_arg
798
-
799
- call_args2: arg_value tCOMMA args opt_block_arg
800
- {
801
- args = list_prepend val[0], val[2]
802
- result = arg_blk_pass args, val[3]
803
- }
804
- | arg_value tCOMMA block_arg
805
- {
806
- result = arg_blk_pass val[0], val[2]
807
- }
808
- | arg_value tCOMMA tSTAR arg_value opt_block_arg
809
- {
810
- result = arg_concat s(:array, val[0]), val[3]
811
- result = arg_blk_pass result, val[4]
812
- }
813
- | arg_value tCOMMA args tCOMMA tSTAR arg_value opt_block_arg
814
- {
815
- result = arg_concat s(:array, val[0], s(:hash, *val[2].values)), val[5]
816
- result = arg_blk_pass result, val[6]
817
- }
818
- | assocs opt_block_arg
819
- {
820
- result = s(:array, s(:hash, *val[0].values))
821
- result = arg_blk_pass result, val[1]
822
- }
823
- | assocs tCOMMA tSTAR arg_value opt_block_arg
824
- {
825
- result = s(:array, s(:hash, *val[0].values), val[3])
826
- result = arg_blk_pass result, val[4]
827
- }
828
- | arg_value tCOMMA assocs opt_block_arg
829
- {
830
- result = s(:array, val[0], s(:hash, *val[2].values))
831
- result = arg_blk_pass result, val[3]
832
- }
833
- | arg_value tCOMMA args tCOMMA assocs opt_block_arg
834
- {
835
- result = s(:array, val[0]).add_all(val[2]).add(s(:hash, *val[4].values))
836
- result = arg_blk_pass result, val[5]
837
- }
838
- | arg_value tCOMMA assocs tCOMMA tSTAR arg_value opt_block_arg
839
- {
840
- result = arg_concat s(:array, val[0]).add(s(:hash, *val[2].values)), val[5]
841
- result = arg_blk_pass result, val[6]
842
- }
843
- | arg_value tCOMMA args tCOMMA assocs tCOMMA tSTAR arg_value opt_block_arg
844
- {
845
- result = arg_concat s(:array, val[0]).add_all(val[2]).add(s(:hash, *val[4].values)), val[7]
846
- result = arg_blk_pass result, val[8]
847
- }
848
- | tSTAR arg_value opt_block_arg
849
- {
850
- result = arg_blk_pass s(:splat, val[1]), val[2]
851
- }
852
- | block_arg
853
-
854
- command_args: {
855
- result = lexer.cmdarg.stack.dup
856
- lexer.cmdarg.push true
857
- }
858
- open_args
859
- {
860
- lexer.cmdarg.stack.replace val[0]
861
- result = val[1]
862
- }
863
-
864
- open_args: call_args
865
- | tLPAREN_ARG
866
- {
867
- lexer.lex_state = :expr_endarg
868
- }
869
- tRPAREN
870
- {
871
- warning "don't put space before argument parentheses"
872
- result = nil
873
- }
874
- | tLPAREN_ARG call_args2
875
- {
876
- lexer.lex_state = :expr_endarg
877
- }
878
- tRPAREN
879
- {
880
- warning "don't put space before argument parentheses"
881
- result = val[1]
882
- }
883
-
884
- block_arg: tAMPER arg_value
885
- {
886
- result = s(:block_pass, val[1])
887
- }
888
-
889
- opt_block_arg: tCOMMA block_arg
890
- {
891
- result = val[1]
892
- }
893
- | none
894
-
895
- args: arg_value
896
- {
897
- result = s(:array, val[0])
898
- }
899
- | args tCOMMA arg_value
900
- {
901
- result = list_append val[0], val[2]
902
- }
903
-
904
- mrhs: args tCOMMA arg_value
905
- {
906
- result = val[0] << val[2]
907
- }
908
- | args tCOMMA tSTAR arg_value
909
- {
910
- result = arg_concat val[0], val[3]
911
- }
912
- | tSTAR arg_value
913
- {
914
- result = s(:splat, val[1])
915
- }
916
-
917
- primary: literal
918
- | strings
919
- | xstring
920
- | regexp
921
- | words
922
- | qwords
923
- | var_ref
924
- | backref
925
- | tFID
926
- {
927
- result = new_call nil, val[0].to_sym
928
- }
929
- | kBEGIN
930
- {
931
- result = self.lexer.lineno
932
- }
933
- bodystmt kEND
934
- {
935
- unless val[2] then
936
- result = s(:nil)
937
- else
938
- result = s(:begin, val[2])
939
- end
940
-
941
- result.line = val[1]
942
- }
943
- | tLPAREN_ARG expr
944
- {
945
- lexer.lex_state = :expr_endarg
946
- }
947
- opt_nl tRPAREN
948
- {
949
- warning "(...) interpreted as grouped expression"
950
- result = val[1]
951
- }
952
- | tLPAREN compstmt tRPAREN
953
- {
954
- result = val[1] || s(:nil)
955
- result.paren = true
956
- }
957
- | primary_value tCOLON2 tCONSTANT
958
- {
959
- result = s(:colon2, val[0], val[2].to_sym)
960
- }
961
- | tCOLON3 tCONSTANT
962
- {
963
- result = s(:colon3, val[1].to_sym)
964
- }
965
- | primary_value tLBRACK2 aref_args tRBRACK
966
- {
967
- result = new_aref val
968
- }
969
- | tLBRACK aref_args tRBRACK
970
- {
971
- result = val[1] || s(:array)
972
- }
973
- | tLBRACE assoc_list tRCURLY
974
- {
975
- result = s(:hash, *val[1].values)
976
- }
977
- | kRETURN
978
- {
979
- result = s(:return)
980
- }
981
- | kYIELD tLPAREN2 call_args tRPAREN
982
- {
983
- result = new_yield val[2]
984
- }
985
- | kYIELD tLPAREN2 tRPAREN
986
- {
987
- result = new_yield
988
- }
989
- | kYIELD
990
- {
991
- result = new_yield
992
- }
993
- | kDEFINED opt_nl tLPAREN2 expr tRPAREN
994
- {
995
- result = s(:defined, val[3])
996
- }
997
- | operation brace_block
998
- {
999
- oper, iter = val[0], val[1]
1000
- call = new_call(nil, oper.to_sym)
1001
- iter.insert 1, call
1002
- result = iter
1003
- call.line = iter.line
1004
- }
1005
- | method_call
1006
- | method_call brace_block
1007
- {
1008
- call, iter = val[0], val[1]
1009
- block_dup_check call, iter
1010
-
1011
- iter.insert 1, call
1012
- result = iter
1013
- }
1014
- | kIF expr_value then compstmt if_tail kEND
1015
- {
1016
- result = new_if val[1], val[3], val[4]
1017
- }
1018
- | kUNLESS expr_value then compstmt opt_else kEND
1019
- {
1020
- result = new_if val[1], val[4], val[3]
1021
- }
1022
- | kWHILE
1023
- {
1024
- lexer.cond.push true
1025
- }
1026
- expr_value do
1027
- {
1028
- lexer.cond.pop
1029
- }
1030
- compstmt kEND
1031
- {
1032
- result = new_while val[5], val[2], true
1033
- }
1034
- | kUNTIL
1035
- {
1036
- lexer.cond.push true
1037
- }
1038
- expr_value do
1039
- {
1040
- lexer.cond.pop
1041
- }
1042
- compstmt kEND
1043
- {
1044
- result = new_until val[5], val[2], true
1045
- }
1046
- | kCASE expr_value opt_terms case_body kEND
1047
- {
1048
- result = new_case val[1], val[3]
1049
- }
1050
- | kCASE opt_terms case_body kEND
1051
- {
1052
- result = new_case nil, val[2]
1053
- }
1054
- | kCASE opt_terms kELSE compstmt kEND # TODO: need a test
1055
- {
1056
- result = new_case nil, val[3]
1057
- }
1058
- | kFOR for_var kIN
1059
- {
1060
- lexer.cond.push true
1061
- }
1062
- expr_value do
1063
- {
1064
- lexer.cond.pop
1065
- }
1066
- compstmt kEND
1067
- {
1068
- result = new_for val[4], val[1], val[7]
1069
- }
1070
- | kCLASS
1071
- {
1072
- result = self.lexer.lineno
1073
- }
1074
- cpath superclass
1075
- {
1076
- self.comments.push self.lexer.comments
1077
- if (in_def || in_single > 0) then
1078
- yyerror "class definition in method body"
1079
- end
1080
- self.env.extend
1081
- }
1082
- bodystmt kEND
1083
- {
1084
- result = new_class val
1085
- self.env.unextend
1086
- }
1087
- | kCLASS tLSHFT
1088
- {
1089
- result = self.lexer.lineno
1090
- }
1091
- expr
1092
- {
1093
- result = in_def
1094
- self.in_def = false
1095
- }
1096
- term
1097
- {
1098
- result = in_single
1099
- self.in_single = 0
1100
- self.env.extend
1101
- }
1102
- bodystmt kEND
1103
- {
1104
- result = new_sclass val
1105
- self.env.unextend
1106
- }
1107
- | kMODULE
1108
- {
1109
- result = self.lexer.lineno
1110
- }
1111
- cpath
1112
- {
1113
- self.comments.push self.lexer.comments
1114
- yyerror "module definition in method body" if
1115
- in_def or in_single > 0
1116
-
1117
- self.env.extend
1118
- }
1119
- bodystmt kEND
1120
- {
1121
- result = new_module val
1122
- self.env.unextend
1123
- }
1124
- | kDEF fname
1125
- {
1126
- self.comments.push self.lexer.comments
1127
- self.in_def = true
1128
- self.env.extend
1129
- result = lexer.lineno, lexer.src.beginning_of_line?
1130
- }
1131
- f_arglist bodystmt kEND
1132
- {
1133
- result = new_defn val
1134
- self.env.unextend
1135
- self.in_def = false
1136
- }
1137
- | kDEF singleton dot_or_colon
1138
- {
1139
- self.comments.push self.lexer.comments
1140
- lexer.lex_state = :expr_fname
1141
- }
1142
- fname
1143
- {
1144
- self.in_single += 1
1145
- self.env.extend
1146
- lexer.lex_state = :expr_end # force for args
1147
- }
1148
- f_arglist bodystmt kEND
1149
- {
1150
- result = new_defs val
1151
-
1152
- self.env.unextend
1153
- self.in_single -= 1
1154
- }
1155
- | kBREAK
1156
- {
1157
- result = s(:break)
1158
- }
1159
- | kNEXT
1160
- {
1161
- result = s(:next)
1162
- }
1163
- | kREDO
1164
- {
1165
- result = s(:redo)
1166
- }
1167
- | kRETRY
1168
- {
1169
- result = s(:retry)
1170
- }
1171
-
1172
- primary_value: primary
1173
- {
1174
- result = value_expr(val[0])
1175
- }
1176
-
1177
- then: term
1178
- | tCOLON
1179
- | kTHEN
1180
- | term kTHEN
1181
-
1182
- do: term
1183
- | tCOLON
1184
- | kDO_COND
1185
-
1186
- if_tail: opt_else
1187
- | kELSIF expr_value then compstmt if_tail
1188
- {
1189
- result = s(:if, val[1], val[3], val[4])
1190
- }
1191
-
1192
- opt_else: none
1193
- | kELSE compstmt
1194
- {
1195
- result = val[1]
1196
- }
1197
-
1198
- for_var: lhs
1199
- | mlhs
1200
- {
1201
- val[0].delete_at 1 if val[0][1].nil? # HACK
1202
- }
1203
-
1204
- block_par: mlhs_item
1205
- {
1206
- result = s(:array, clean_mlhs(val[0]))
1207
- }
1208
- | block_par tCOMMA mlhs_item
1209
- {
1210
- result = list_append val[0], clean_mlhs(val[2])
1211
- }
1212
-
1213
- block_var: block_par
1214
- {
1215
- result = block_var18 val[0], nil, nil
1216
- }
1217
- | block_par tCOMMA
1218
- {
1219
- result = block_var18 val[0], nil, nil
1220
- }
1221
- | block_par tCOMMA tAMPER lhs
1222
- {
1223
- result = block_var18 val[0], nil, val[3]
1224
- }
1225
- | block_par tCOMMA tSTAR lhs tCOMMA tAMPER lhs
1226
- {
1227
- result = block_var18 val[0], val[3], val[6]
1228
- }
1229
- | block_par tCOMMA tSTAR tCOMMA tAMPER lhs
1230
- {
1231
- result = block_var18 val[0], s(:splat), val[5]
1232
- }
1233
- | block_par tCOMMA tSTAR lhs
1234
- {
1235
- result = block_var18 val[0], val[3], nil
1236
- }
1237
- | block_par tCOMMA tSTAR
1238
- {
1239
- result = block_var18 val[0], s(:splat), nil
1240
- }
1241
- | tSTAR lhs tCOMMA tAMPER lhs
1242
- {
1243
- result = block_var18 nil, val[1], val[4]
1244
- }
1245
- | tSTAR tCOMMA tAMPER lhs
1246
- {
1247
- result = block_var18 nil, s(:splat), val[3]
1248
- }
1249
- | tSTAR lhs
1250
- {
1251
- result = block_var18 nil, val[1], nil
1252
- }
1253
- | tSTAR
1254
- {
1255
- result = block_var18 nil, s(:splat), nil
1256
- }
1257
- | tAMPER lhs
1258
- {
1259
- result = block_var18 nil, nil, val[1]
1260
- }
1261
- ;
1262
-
1263
- opt_block_var: none
1264
- | tPIPE tPIPE
1265
- {
1266
- result = 0
1267
- self.lexer.command_start = true
1268
- }
1269
- | tOROP
1270
- {
1271
- result = 0
1272
- self.lexer.command_start = true
1273
- }
1274
- | tPIPE block_var tPIPE
1275
- {
1276
- result = val[1]
1277
- self.lexer.command_start = true
1278
- }
1279
-
1280
- do_block: kDO_BLOCK
1281
- {
1282
- self.env.extend :dynamic
1283
- result = self.lexer.lineno
1284
- }
1285
- opt_block_var
1286
- {
1287
- result = self.env.dynamic.keys
1288
- }
1289
- compstmt kEND
1290
- {
1291
- vars = val[2]
1292
- body = val[4]
1293
- result = new_iter nil, vars, body
1294
- result.line = val[1]
1295
-
1296
- self.env.unextend
1297
- }
1298
-
1299
- block_call: command do_block
1300
- {
1301
- block_dup_check val[0], val[1]
1302
-
1303
- result = val[1]
1304
- result.insert 1, val[0]
1305
- }
1306
- | block_call tDOT operation2 opt_paren_args
1307
- {
1308
- result = new_call val[0], val[2], val[3]
1309
- }
1310
- | block_call tCOLON2 operation2 opt_paren_args
1311
- {
1312
- result = new_call val[0], val[2], val[3]
1313
- }
1314
-
1315
- method_call: operation
1316
- {
1317
- result = self.lexer.lineno
1318
- }
1319
- paren_args
1320
- {
1321
- result = new_call nil, val[0].to_sym, val[2]
1322
- }
1323
- | primary_value tDOT operation2 opt_paren_args
1324
- {
1325
- result = new_call val[0], val[2].to_sym, val[3]
1326
- }
1327
- | primary_value tCOLON2 operation2 paren_args
1328
- {
1329
- result = new_call val[0], val[2].to_sym, val[3]
1330
- }
1331
- | primary_value tCOLON2 operation3
1332
- {
1333
- result = new_call val[0], val[2].to_sym
1334
- }
1335
- | kSUPER paren_args
1336
- {
1337
- result = new_super val[1]
1338
- }
1339
- | kSUPER
1340
- {
1341
- result = s(:zsuper)
1342
- }
1343
-
1344
- brace_block: tLCURLY
1345
- {
1346
- self.env.extend :dynamic
1347
- result = self.lexer.lineno
1348
- }
1349
- opt_block_var
1350
- {
1351
- result = self.env.dynamic.keys
1352
- }
1353
- compstmt tRCURLY
1354
- {
1355
- # REFACTOR
1356
- args = val[2]
1357
- body = val[4]
1358
- result = new_iter nil, args, body
1359
- self.env.unextend
1360
- result.line = val[1]
1361
- }
1362
- | kDO
1363
- {
1364
- self.env.extend :dynamic
1365
- result = self.lexer.lineno
1366
- }
1367
- opt_block_var
1368
- {
1369
- result = self.env.dynamic.keys
1370
- }
1371
- compstmt kEND
1372
- {
1373
- args = val[2]
1374
- body = val[4]
1375
- result = new_iter nil, args, body
1376
- self.env.unextend
1377
- result.line = val[1]
1378
- }
1379
-
1380
- case_body: kWHEN
1381
- {
1382
- result = self.lexer.lineno
1383
- }
1384
- when_args then compstmt cases
1385
- {
1386
- result = new_when(val[2], val[4])
1387
- result.line = val[1]
1388
- result << val[5] if val[5]
1389
- }
1390
-
1391
- when_args: args
1392
- | args tCOMMA tSTAR arg_value
1393
- {
1394
- result = list_append val[0], s(:splat, val[3])
1395
- }
1396
- | tSTAR arg_value
1397
- {
1398
- result = s(:array, s(:splat, val[1]))
1399
- }
1400
-
1401
- cases: opt_else | case_body
1402
-
1403
- opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue
1404
- {
1405
- klasses, var, body, rest = val[1], val[2], val[4], val[5]
1406
-
1407
- klasses ||= s(:array)
1408
- klasses << node_assign(var, s(:gvar, :"$!")) if var
1409
-
1410
- result = new_resbody(klasses, body)
1411
- result << rest if rest # UGH, rewritten above
1412
- }
1413
- |
1414
- {
1415
- result = nil
1416
- }
1417
-
1418
- exc_list: arg_value
1419
- {
1420
- result = s(:array, val[0])
1421
- }
1422
- | mrhs
1423
- | none
1424
-
1425
- exc_var: tASSOC lhs
1426
- {
1427
- result = val[1]
1428
- }
1429
- | none
1430
-
1431
- opt_ensure: kENSURE compstmt
1432
- {
1433
- if (val[1] != nil) then
1434
- result = val[1]
1435
- else
1436
- result = s(:nil)
1437
- end
1438
- }
1439
- | none
1440
-
1441
- literal: numeric { result = s(:lit, val[0]) }
1442
- | symbol { result = s(:lit, val[0]) }
1443
- | dsym
1444
-
1445
- strings: string
1446
- {
1447
- val[0] = s(:dstr, val[0].value) if val[0][0] == :evstr
1448
- result = val[0]
1449
- }
1450
-
1451
- string: string1
1452
- | string string1
1453
- {
1454
- result = literal_concat val[0], val[1]
1455
- }
1456
-
1457
- string1: tSTRING_BEG string_contents tSTRING_END
1458
- {
1459
- result = val[1]
1460
- }
1461
- | tSTRING
1462
- {
1463
- result = s(:str, val[0])
1464
- }
1465
-
1466
- xstring: tXSTRING_BEG xstring_contents tSTRING_END
1467
- {
1468
- result = new_xstring val[1]
1469
- }
1470
-
1471
- regexp: tREGEXP_BEG xstring_contents tREGEXP_END
1472
- {
1473
- result = new_regexp val
1474
- }
1475
-
1476
- words: tWORDS_BEG tSPACE tSTRING_END
1477
- {
1478
- result = s(:array)
1479
- }
1480
- | tWORDS_BEG word_list tSTRING_END
1481
- {
1482
- result = val[1]
1483
- }
1484
-
1485
- word_list: none
1486
- {
1487
- result = s(:array)
1488
- }
1489
- | word_list word tSPACE
1490
- {
1491
- word = val[1][0] == :evstr ? s(:dstr, "", val[1]) : val[1]
1492
- result = val[0] << word
1493
- }
1494
-
1495
- word: string_content
1496
- | word string_content
1497
- {
1498
- result = literal_concat val[0], val[1]
1499
- }
1500
-
1501
- qwords: tQWORDS_BEG tSPACE tSTRING_END
1502
- {
1503
- result = s(:array)
1504
- }
1505
- | tQWORDS_BEG qword_list tSTRING_END
1506
- {
1507
- result = val[1]
1508
- }
1509
-
1510
- qword_list: none
1511
- {
1512
- result = s(:array)
1513
- }
1514
- | qword_list tSTRING_CONTENT tSPACE
1515
- {
1516
- result = val[0] << s(:str, val[1])
1517
- }
1518
-
1519
- string_contents: none
1520
- {
1521
- result = s(:str, "")
1522
- }
1523
- | string_contents string_content
1524
- {
1525
- result = literal_concat(val[0], val[1])
1526
- }
1527
-
1528
- xstring_contents: none
1529
- {
1530
- result = nil
1531
- }
1532
- | xstring_contents string_content
1533
- {
1534
- result = literal_concat(val[0], val[1])
1535
- }
1536
-
1537
- string_content: tSTRING_CONTENT
1538
- {
1539
- result = s(:str, val[0])
1540
- }
1541
- | tSTRING_DVAR
1542
- {
1543
- result = lexer.lex_strterm
1544
- lexer.lex_strterm = nil
1545
- lexer.lex_state = :expr_beg
1546
- }
1547
- string_dvar
1548
- {
1549
- lexer.lex_strterm = val[1]
1550
- result = s(:evstr, val[2])
1551
- }
1552
- | tSTRING_DBEG
1553
- {
1554
- result = lexer.lex_strterm
1555
- lexer.lex_strterm = nil
1556
- lexer.lex_state = :expr_beg
1557
- lexer.cond.push false
1558
- lexer.cmdarg.push false
1559
- }
1560
- compstmt tRCURLY
1561
- {
1562
- lexer.lex_strterm = val[1]
1563
- lexer.cond.lexpop
1564
- lexer.cmdarg.lexpop
1565
-
1566
- case val[2]
1567
- when Sexp then
1568
- case val[2][0]
1569
- when :str, :dstr, :evstr then
1570
- result = val[2]
1571
- else
1572
- result = s(:evstr, val[2])
1573
- end
1574
- when nil then
1575
- result = s(:evstr)
1576
- else
1577
- raise "unknown rescue body: #{val[2].inspect}"
1578
- end
1579
- }
1580
-
1581
- string_dvar: tGVAR { result = s(:gvar, val[0].to_sym) }
1582
- | tIVAR { result = s(:ivar, val[0].to_sym) }
1583
- | tCVAR { result = s(:cvar, val[0].to_sym) }
1584
- | backref
1585
-
1586
-
1587
- symbol: tSYMBEG sym
1588
- {
1589
- lexer.lex_state = :expr_end
1590
- result = val[1].to_sym
1591
- }
1592
- | tSYMBOL
1593
- {
1594
- result = val[0].to_sym
1595
- }
1596
-
1597
- sym: fname | tIVAR | tGVAR | tCVAR
1598
-
1599
- dsym: tSYMBEG xstring_contents tSTRING_END
1600
- {
1601
- lexer.lex_state = :expr_end
1602
- result = val[1]
1603
-
1604
- yyerror "empty symbol literal" if
1605
- result.nil? or result.empty?
1606
-
1607
- case result[0]
1608
- when :dstr then
1609
- result[0] = :dsym
1610
- when :str then
1611
- result = s(:lit, result.last.intern)
1612
- else
1613
- result = s(:dsym, "", result)
1614
- end
1615
- }
1616
-
1617
- numeric: tINTEGER
1618
- | tFLOAT
1619
- | tUMINUS_NUM tINTEGER =tLOWEST
1620
- {
1621
- result = -val[1] # TODO: pt_testcase
1622
- }
1623
- | tUMINUS_NUM tFLOAT =tLOWEST
1624
- {
1625
- result = -val[1] # TODO: pt_testcase
1626
- }
1627
-
1628
- variable: tIDENTIFIER
1629
- | tIVAR
1630
- | tGVAR
1631
- | tCONSTANT
1632
- | tCVAR
1633
- | kNIL { result = s(:nil) }
1634
- | kSELF { result = s(:self) }
1635
- | kTRUE { result = s(:true) }
1636
- | kFALSE { result = s(:false) }
1637
- | k__FILE__ { result = s(:str, self.file) }
1638
- | k__LINE__ { result = s(:lit, lexer.src.current_line) }
1639
-
1640
- var_ref: variable
1641
- {
1642
- var = val[0]
1643
- result = Sexp === var ? var : self.gettable(var)
1644
- }
1645
-
1646
- var_lhs: variable
1647
- {
1648
- result = assignable val[0]
1649
- }
1650
-
1651
- backref: tNTH_REF { result = s(:nth_ref, val[0]) }
1652
- | tBACK_REF { result = s(:back_ref, val[0]) }
1653
-
1654
- superclass: term
1655
- {
1656
- result = nil
1657
- }
1658
- | tLT
1659
- {
1660
- lexer.lex_state = :expr_beg
1661
- }
1662
- expr_value term
1663
- {
1664
- result = val[2]
1665
- }
1666
- | error term
1667
- {
1668
- yyerrok
1669
- result = nil
1670
- }
1671
-
1672
- f_arglist: tLPAREN2 f_args opt_nl tRPAREN
1673
- {
1674
- result = val[1]
1675
- lexer.lex_state = :expr_beg
1676
- self.lexer.command_start = true
1677
- }
1678
- | f_args term
1679
- {
1680
- result = val[0]
1681
- }
1682
-
1683
- f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_f_block_arg
1684
- {
1685
- result = args val
1686
- }
1687
- | f_arg tCOMMA f_optarg opt_f_block_arg
1688
- {
1689
- result = args val
1690
- }
1691
- | f_arg tCOMMA f_rest_arg opt_f_block_arg
1692
- {
1693
- result = args val
1694
- }
1695
- | f_arg opt_f_block_arg
1696
- {
1697
- result = args val
1698
- }
1699
- | f_optarg tCOMMA f_rest_arg opt_f_block_arg
1700
- {
1701
- result = args val
1702
- }
1703
- | f_optarg opt_f_block_arg
1704
- {
1705
- result = args val
1706
- }
1707
- | f_rest_arg opt_f_block_arg
1708
- {
1709
- result = args val
1710
- }
1711
- | f_block_arg
1712
- {
1713
- result = args val
1714
- }
1715
- |
1716
- {
1717
- result = args val
1718
- }
1719
-
1720
- f_norm_arg: tCONSTANT
1721
- {
1722
- yyerror "formal argument cannot be a constant"
1723
- }
1724
- | tIVAR
1725
- {
1726
- yyerror "formal argument cannot be an instance variable"
1727
- }
1728
- | tGVAR
1729
- {
1730
- yyerror "formal argument cannot be a global variable"
1731
- }
1732
- | tCVAR
1733
- {
1734
- yyerror "formal argument cannot be a class variable"
1735
- }
1736
- | tIDENTIFIER
1737
- {
1738
- identifier = val[0].to_sym
1739
- self.env[identifier] = :lvar
1740
-
1741
- result = val[0]
1742
- }
1743
-
1744
- f_arg: f_norm_arg
1745
- {
1746
- result = s(:args)
1747
- result << val[0].to_sym
1748
- }
1749
- | f_arg tCOMMA f_norm_arg
1750
- {
1751
- val[0] << val[2].to_sym
1752
- result = val[0]
1753
- }
1754
-
1755
- f_opt: tIDENTIFIER tEQL arg_value
1756
- {
1757
- result = assignable val[0], val[2]
1758
- # TODO: detect duplicate names
1759
- }
1760
-
1761
- f_optarg: f_opt
1762
- {
1763
- result = s(:block, val[0])
1764
- }
1765
- | f_optarg tCOMMA f_opt
1766
- {
1767
- result = block_append val[0], val[2]
1768
- }
1769
-
1770
- restarg_mark: tSTAR2 | tSTAR
1771
-
1772
- f_rest_arg: restarg_mark tIDENTIFIER
1773
- {
1774
- # TODO: differs from parse.y - needs tests
1775
- name = val[1].to_sym
1776
- assignable name
1777
- result = :"*#{name}"
1778
- }
1779
- | restarg_mark
1780
- {
1781
- name = :"*"
1782
- self.env[name] = :lvar
1783
- result = name
1784
- }
1785
-
1786
- blkarg_mark: tAMPER2 | tAMPER
1787
-
1788
- f_block_arg: blkarg_mark tIDENTIFIER
1789
- {
1790
- identifier = val[1].to_sym
1791
-
1792
- self.env[identifier] = :lvar
1793
- result = s(:block_arg, identifier.to_sym)
1794
- }
1795
-
1796
- opt_f_block_arg: tCOMMA f_block_arg
1797
- {
1798
- result = val[1]
1799
- }
1800
- |
1801
- {
1802
- result = nil
1803
- }
1804
-
1805
- singleton: var_ref
1806
- | tLPAREN2
1807
- {
1808
- lexer.lex_state = :expr_beg
1809
- }
1810
- expr opt_nl tRPAREN
1811
- {
1812
- result = val[2]
1813
- yyerror "Can't define single method for literals." if
1814
- result[0] == :lit
1815
- }
1816
-
1817
- assoc_list: none # [!nil]
1818
- {
1819
- result = s(:array)
1820
- }
1821
- | assocs trailer # [!nil]
1822
- {
1823
- result = val[0]
1824
- }
1825
- | args trailer
1826
- {
1827
- size = val[0].size
1828
- if (size % 2 != 1) then # != 1 because of leading :array
1829
- yyerror "Odd number (#{size}) list for Hash. #{val[0].inspect}"
1830
- end
1831
- result = val[0]
1832
- }
1833
-
1834
- assocs: assoc
1835
- | assocs tCOMMA assoc
1836
- {
1837
- list = val[0].dup
1838
- more = val[2][1..-1]
1839
- list.push(*more) unless more.empty?
1840
- result = list
1841
- }
1842
-
1843
- assoc: arg_value tASSOC arg_value
1844
- {
1845
- result = s(:array, val[0], val[2])
1846
- }
1847
-
1848
- operation: tIDENTIFIER | tCONSTANT | tFID
1849
- operation2: tIDENTIFIER | tCONSTANT | tFID | op
1850
- operation3: tIDENTIFIER | tFID | op
1851
- dot_or_colon: tDOT | tCOLON2
1852
- opt_terms: | terms
1853
- opt_nl: | tNL
1854
- trailer: | tNL | tCOMMA
1855
-
1856
- term: tSEMI { yyerrok }
1857
- | tNL
1858
-
1859
- terms: term
1860
- | terms tSEMI { yyerrok }
1861
-
1862
- none: { result = nil }
1863
-
1864
- end
1865
-
1866
- ---- inner
1867
-
1868
- require "ruby_lexer"
1869
- require "ruby_parser_extras"
1870
-
1871
- # Local Variables: **
1872
- # racc-token-length-max:14 **
1873
- # End: **