racc 1.4.14-java → 1.4.15-java

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 (61) hide show
  1. checksums.yaml +5 -5
  2. data/Manifest.txt +50 -0
  3. data/ext/racc/com/headius/racc/Cparse.java +66 -23
  4. data/ext/racc/cparse.c +1 -1
  5. data/ext/racc/depend +1 -1
  6. data/lib/racc/cparse-jruby.jar +0 -0
  7. data/lib/racc/info.rb +2 -2
  8. data/test/assets/bibtex.y +141 -0
  9. data/test/assets/cadenza.y +170 -0
  10. data/test/assets/cast.y +926 -0
  11. data/test/assets/csspool.y +729 -0
  12. data/test/assets/edtf.y +583 -0
  13. data/test/assets/huia.y +318 -0
  14. data/test/assets/journey.y +47 -0
  15. data/test/assets/liquor.y +313 -0
  16. data/test/assets/machete.y +423 -0
  17. data/test/assets/macruby.y +2197 -0
  18. data/test/assets/mediacloth.y +599 -0
  19. data/test/assets/mof.y +649 -0
  20. data/test/assets/namae.y +302 -0
  21. data/test/assets/nasl.y +626 -0
  22. data/test/assets/nokogiri-css.y +255 -0
  23. data/test/assets/opal.y +1807 -0
  24. data/test/assets/php_serialization.y +98 -0
  25. data/test/assets/rdblockparser.y +576 -0
  26. data/test/assets/rdinlineparser.y +561 -0
  27. data/test/assets/riml.y +665 -0
  28. data/test/assets/ruby18.y +1943 -0
  29. data/test/assets/ruby19.y +2174 -0
  30. data/test/assets/ruby20.y +2350 -0
  31. data/test/assets/ruby21.y +2359 -0
  32. data/test/assets/ruby22.y +2381 -0
  33. data/test/assets/tp_plus.y +622 -0
  34. data/test/assets/twowaysql.y +278 -0
  35. data/test/helper.rb +50 -34
  36. data/test/regress/bibtex +474 -0
  37. data/test/regress/cadenza +796 -0
  38. data/test/regress/cast +3425 -0
  39. data/test/regress/csspool +2318 -0
  40. data/test/regress/edtf +1794 -0
  41. data/test/regress/huia +1392 -0
  42. data/test/regress/journey +222 -0
  43. data/test/regress/liquor +885 -0
  44. data/test/regress/machete +833 -0
  45. data/test/regress/mediacloth +1463 -0
  46. data/test/regress/mof +1368 -0
  47. data/test/regress/namae +634 -0
  48. data/test/regress/nasl +2058 -0
  49. data/test/regress/nokogiri-css +836 -0
  50. data/test/regress/opal +6429 -0
  51. data/test/regress/php_serialization +336 -0
  52. data/test/regress/rdblockparser +1061 -0
  53. data/test/regress/rdinlineparser +1243 -0
  54. data/test/regress/riml +3297 -0
  55. data/test/regress/ruby18 +6351 -0
  56. data/test/regress/ruby22 +7456 -0
  57. data/test/regress/tp_plus +1933 -0
  58. data/test/regress/twowaysql +556 -0
  59. data/test/test_racc_command.rb +177 -0
  60. metadata +80 -25
  61. data/.gemtest +0 -0
@@ -0,0 +1,255 @@
1
+ class Nokogiri::CSS::Parser
2
+
3
+ token FUNCTION INCLUDES DASHMATCH LBRACE HASH PLUS GREATER S STRING IDENT
4
+ token COMMA NUMBER PREFIXMATCH SUFFIXMATCH SUBSTRINGMATCH TILDE NOT_EQUAL
5
+ token SLASH DOUBLESLASH NOT EQUAL RPAREN LSQUARE RSQUARE HAS
6
+
7
+ rule
8
+ selector
9
+ : selector COMMA simple_selector_1toN {
10
+ result = [val.first, val.last].flatten
11
+ }
12
+ | prefixless_combinator_selector { result = val.flatten }
13
+ | optional_S simple_selector_1toN { result = [val.last].flatten }
14
+ ;
15
+ combinator
16
+ : PLUS { result = :DIRECT_ADJACENT_SELECTOR }
17
+ | GREATER { result = :CHILD_SELECTOR }
18
+ | TILDE { result = :FOLLOWING_SELECTOR }
19
+ | DOUBLESLASH { result = :DESCENDANT_SELECTOR }
20
+ | SLASH { result = :CHILD_SELECTOR }
21
+ ;
22
+ simple_selector
23
+ : element_name hcap_0toN {
24
+ result = if val[1].nil?
25
+ val.first
26
+ else
27
+ Node.new(:CONDITIONAL_SELECTOR, [val.first, val[1]])
28
+ end
29
+ }
30
+ | function
31
+ | function pseudo {
32
+ result = Node.new(:CONDITIONAL_SELECTOR, val)
33
+ }
34
+ | function attrib {
35
+ result = Node.new(:CONDITIONAL_SELECTOR, val)
36
+ }
37
+ | hcap_1toN {
38
+ result = Node.new(:CONDITIONAL_SELECTOR,
39
+ [Node.new(:ELEMENT_NAME, ['*']), val.first]
40
+ )
41
+ }
42
+ ;
43
+ prefixless_combinator_selector
44
+ : combinator simple_selector_1toN {
45
+ result = Node.new(val.first, [nil, val.last])
46
+ }
47
+ ;
48
+ simple_selector_1toN
49
+ : simple_selector combinator simple_selector_1toN {
50
+ result = Node.new(val[1], [val.first, val.last])
51
+ }
52
+ | simple_selector S simple_selector_1toN {
53
+ result = Node.new(:DESCENDANT_SELECTOR, [val.first, val.last])
54
+ }
55
+ | simple_selector
56
+ ;
57
+ class
58
+ : '.' IDENT { result = Node.new(:CLASS_CONDITION, [val[1]]) }
59
+ ;
60
+ element_name
61
+ : namespaced_ident
62
+ | '*' { result = Node.new(:ELEMENT_NAME, val) }
63
+ ;
64
+ namespaced_ident
65
+ : namespace '|' IDENT {
66
+ result = Node.new(:ELEMENT_NAME,
67
+ [[val.first, val.last].compact.join(':')]
68
+ )
69
+ }
70
+ | IDENT {
71
+ name = @namespaces.key?('xmlns') ? "xmlns:#{val.first}" : val.first
72
+ result = Node.new(:ELEMENT_NAME, [name])
73
+ }
74
+ ;
75
+ namespace
76
+ : IDENT { result = val[0] }
77
+ |
78
+ ;
79
+ attrib
80
+ : LSQUARE attrib_name attrib_val_0or1 RSQUARE {
81
+ result = Node.new(:ATTRIBUTE_CONDITION,
82
+ [val[1]] + (val[2] || [])
83
+ )
84
+ }
85
+ | LSQUARE function attrib_val_0or1 RSQUARE {
86
+ result = Node.new(:ATTRIBUTE_CONDITION,
87
+ [val[1]] + (val[2] || [])
88
+ )
89
+ }
90
+ | LSQUARE NUMBER RSQUARE {
91
+ # Non standard, but hpricot supports it.
92
+ result = Node.new(:PSEUDO_CLASS,
93
+ [Node.new(:FUNCTION, ['nth-child(', val[1]])]
94
+ )
95
+ }
96
+ ;
97
+ attrib_name
98
+ : namespace '|' IDENT {
99
+ result = Node.new(:ELEMENT_NAME,
100
+ [[val.first, val.last].compact.join(':')]
101
+ )
102
+ }
103
+ | IDENT {
104
+ # Default namespace is not applied to attributes.
105
+ # So we don't add prefix "xmlns:" as in namespaced_ident.
106
+ result = Node.new(:ELEMENT_NAME, [val.first])
107
+ }
108
+ ;
109
+ function
110
+ : FUNCTION RPAREN {
111
+ result = Node.new(:FUNCTION, [val.first.strip])
112
+ }
113
+ | FUNCTION expr RPAREN {
114
+ result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten)
115
+ }
116
+ | FUNCTION nth RPAREN {
117
+ result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten)
118
+ }
119
+ | NOT expr RPAREN {
120
+ result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten)
121
+ }
122
+ | HAS selector RPAREN {
123
+ result = Node.new(:FUNCTION, [val.first.strip, val[1]].flatten)
124
+ }
125
+ ;
126
+ expr
127
+ : NUMBER COMMA expr { result = [val.first, val.last] }
128
+ | STRING COMMA expr { result = [val.first, val.last] }
129
+ | IDENT COMMA expr { result = [val.first, val.last] }
130
+ | NUMBER
131
+ | STRING
132
+ | IDENT # even, odd
133
+ {
134
+ case val[0]
135
+ when 'even'
136
+ result = Node.new(:NTH, ['2','n','+','0'])
137
+ when 'odd'
138
+ result = Node.new(:NTH, ['2','n','+','1'])
139
+ when 'n'
140
+ result = Node.new(:NTH, ['1','n','+','0'])
141
+ else
142
+ # This is not CSS standard. It allows us to support this:
143
+ # assert_xpath("//a[foo(., @href)]", @parser.parse('a:foo(@href)'))
144
+ # assert_xpath("//a[foo(., @a, b)]", @parser.parse('a:foo(@a, b)'))
145
+ # assert_xpath("//a[foo(., a, 10)]", @parser.parse('a:foo(a, 10)'))
146
+ result = val
147
+ end
148
+ }
149
+ ;
150
+ nth
151
+ : NUMBER IDENT PLUS NUMBER # 5n+3 -5n+3
152
+ {
153
+ if val[1] == 'n'
154
+ result = Node.new(:NTH, val)
155
+ else
156
+ raise Racc::ParseError, "parse error on IDENT '#{val[1]}'"
157
+ end
158
+ }
159
+ | IDENT PLUS NUMBER { # n+3, -n+3
160
+ if val[0] == 'n'
161
+ val.unshift("1")
162
+ result = Node.new(:NTH, val)
163
+ elsif val[0] == '-n'
164
+ val[0] = 'n'
165
+ val.unshift("-1")
166
+ result = Node.new(:NTH, val)
167
+ else
168
+ raise Racc::ParseError, "parse error on IDENT '#{val[1]}'"
169
+ end
170
+ }
171
+ | NUMBER IDENT { # 5n, -5n, 10n-1
172
+ n = val[1]
173
+ if n[0, 2] == 'n-'
174
+ val[1] = 'n'
175
+ val << "-"
176
+ # b is contained in n as n is the string "n-b"
177
+ val << n[2, n.size]
178
+ result = Node.new(:NTH, val)
179
+ elsif n == 'n'
180
+ val << "+"
181
+ val << "0"
182
+ result = Node.new(:NTH, val)
183
+ else
184
+ raise Racc::ParseError, "parse error on IDENT '#{val[1]}'"
185
+ end
186
+ }
187
+ ;
188
+ pseudo
189
+ : ':' function {
190
+ result = Node.new(:PSEUDO_CLASS, [val[1]])
191
+ }
192
+ | ':' IDENT { result = Node.new(:PSEUDO_CLASS, [val[1]]) }
193
+ ;
194
+ hcap_0toN
195
+ : hcap_1toN
196
+ |
197
+ ;
198
+ hcap_1toN
199
+ : attribute_id hcap_1toN {
200
+ result = Node.new(:COMBINATOR, val)
201
+ }
202
+ | class hcap_1toN {
203
+ result = Node.new(:COMBINATOR, val)
204
+ }
205
+ | attrib hcap_1toN {
206
+ result = Node.new(:COMBINATOR, val)
207
+ }
208
+ | pseudo hcap_1toN {
209
+ result = Node.new(:COMBINATOR, val)
210
+ }
211
+ | negation hcap_1toN {
212
+ result = Node.new(:COMBINATOR, val)
213
+ }
214
+ | attribute_id
215
+ | class
216
+ | attrib
217
+ | pseudo
218
+ | negation
219
+ ;
220
+ attribute_id
221
+ : HASH { result = Node.new(:ID, val) }
222
+ ;
223
+ attrib_val_0or1
224
+ : eql_incl_dash IDENT { result = [val.first, val[1]] }
225
+ | eql_incl_dash STRING { result = [val.first, val[1]] }
226
+ |
227
+ ;
228
+ eql_incl_dash
229
+ : EQUAL { result = :equal }
230
+ | PREFIXMATCH { result = :prefix_match }
231
+ | SUFFIXMATCH { result = :suffix_match }
232
+ | SUBSTRINGMATCH { result = :substring_match }
233
+ | NOT_EQUAL { result = :not_equal }
234
+ | INCLUDES { result = :includes }
235
+ | DASHMATCH { result = :dash_match }
236
+ ;
237
+ negation
238
+ : NOT negation_arg RPAREN {
239
+ result = Node.new(:NOT, [val[1]])
240
+ }
241
+ ;
242
+ negation_arg
243
+ : element_name
244
+ | element_name hcap_1toN
245
+ | hcap_1toN
246
+ ;
247
+ optional_S
248
+ : S
249
+ |
250
+ ;
251
+ end
252
+
253
+ ---- header
254
+
255
+ require 'nokogiri/css/parser_extras'
@@ -0,0 +1,1807 @@
1
+ # Copyright (C) 2013 by Adam Beynon
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ class Opal::Parser
22
+
23
+ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
24
+ kTHEN kELSIF kELSE kCASE kWHEN kWHILE kUNTIL kFOR kBREAK kNEXT
25
+ kREDO kRETRY kIN kDO kDO_COND kDO_BLOCK kDO_LAMBDA kRETURN kYIELD kSUPER
26
+ kSELF kNIL kTRUE kFALSE kAND kOR kNOT kIF_MOD kUNLESS_MOD kWHILE_MOD
27
+ kUNTIL_MOD kRESCUE_MOD kALIAS kDEFINED klBEGIN klEND k__LINE__
28
+ k__FILE__ k__ENCODING__ tIDENTIFIER tFID tGVAR tIVAR tCONSTANT
29
+ tLABEL tCVAR tNTH_REF tBACK_REF tSTRING_CONTENT tINTEGER tFLOAT
30
+ tREGEXP_END tUPLUS tUMINUS tUMINUS_NUM tPOW tCMP tEQ tEQQ tNEQ tGEQ tLEQ tANDOP
31
+ tOROP tMATCH tNMATCH tJSDOT tDOT tDOT2 tDOT3 tAREF tASET tLSHFT tRSHFT
32
+ tCOLON2 tCOLON3 tOP_ASGN tASSOC tLPAREN tLPAREN2 tRPAREN tLPAREN_ARG
33
+ ARRAY_BEG tRBRACK tLBRACE tLBRACE_ARG tSTAR tSTAR2 tAMPER tAMPER2
34
+ tTILDE tPERCENT tDIVIDE tPLUS tMINUS tLT tGT tPIPE tBANG tCARET
35
+ tLCURLY tRCURLY tBACK_REF2 tSYMBEG tSTRING_BEG tXSTRING_BEG tREGEXP_BEG
36
+ tWORDS_BEG tAWORDS_BEG tSTRING_DBEG tSTRING_DVAR tSTRING_END tSTRING
37
+ tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA tLAMBEG
38
+ tLBRACK2 tLBRACK tJSLBRACK tDSTAR
39
+
40
+ prechigh
41
+ right tBANG tTILDE tUPLUS
42
+ right tPOW
43
+ right tUMINUS_NUM tUMINUS
44
+ left tSTAR2 tDIVIDE tPERCENT
45
+ left tPLUS tMINUS
46
+ left tLSHFT tRSHFT
47
+ left tAMPER2
48
+ left tPIPE tCARET
49
+ left tGT tGEQ tLT tLEQ
50
+ nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
51
+ left tANDOP
52
+ left tOROP
53
+ nonassoc tDOT2 tDOT3
54
+ right tEH tCOLON
55
+ left kRESCUE_MOD
56
+ right tEQL tOP_ASGN
57
+ nonassoc kDEFINED
58
+ right kNOT
59
+ left kOR kAND
60
+ nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD
61
+ nonassoc tLBRACE_ARG
62
+ nonassoc tLOWEST
63
+ preclow
64
+
65
+ rule
66
+
67
+ program: top_compstmt
68
+
69
+ top_compstmt: top_stmts opt_terms
70
+ {
71
+ result = new_compstmt val[0]
72
+ }
73
+
74
+ top_stmts: # none
75
+ {
76
+ result = new_block
77
+ }
78
+ | top_stmt
79
+ {
80
+ result = new_block val[0]
81
+ }
82
+ | top_stmts terms top_stmt
83
+ {
84
+ val[0] << val[2]
85
+ result = val[0]
86
+ }
87
+
88
+ top_stmt: stmt
89
+ | klBEGIN tLCURLY top_compstmt tRCURLY
90
+ {
91
+ result = val[2]
92
+ }
93
+
94
+ bodystmt: compstmt opt_rescue opt_else opt_ensure
95
+ {
96
+ result = new_body(val[0], val[1], val[2], val[3])
97
+ }
98
+
99
+ compstmt: stmts opt_terms
100
+ {
101
+ result = new_compstmt val[0]
102
+ }
103
+
104
+ stmts: # none
105
+ {
106
+ result = new_block
107
+ }
108
+ | stmt
109
+ {
110
+ result = new_block val[0]
111
+ }
112
+ | stmts terms stmt
113
+ {
114
+ val[0] << val[2]
115
+ result = val[0]
116
+ }
117
+
118
+ stmt: kALIAS fitem
119
+ {
120
+ lexer.lex_state = :expr_fname
121
+ }
122
+ fitem
123
+ {
124
+ result = new_alias(val[0], val[1], val[3])
125
+ }
126
+ | kALIAS tGVAR tGVAR
127
+ {
128
+ result = s(:valias, value(val[1]).to_sym, value(val[2]).to_sym)
129
+ }
130
+ | kALIAS tGVAR tBACK_REF
131
+ | kALIAS tGVAR tNTH_REF
132
+ {
133
+ result = s(:valias, value(val[1]).to_sym, value(val[2]).to_sym)
134
+ }
135
+ | kUNDEF undef_list
136
+ {
137
+ result = val[1]
138
+ }
139
+ | stmt kIF_MOD expr_value
140
+ {
141
+ result = new_if(val[1], val[2], val[0], nil)
142
+ }
143
+ | stmt kUNLESS_MOD expr_value
144
+ {
145
+ result = new_if(val[1], val[2], nil, val[0])
146
+ }
147
+ | stmt kWHILE_MOD expr_value
148
+ {
149
+ result = new_while(val[1], val[2], val[0])
150
+ }
151
+ | stmt kUNTIL_MOD expr_value
152
+ {
153
+ result = new_until(val[1], val[2], val[0])
154
+ }
155
+ | stmt kRESCUE_MOD stmt
156
+ {
157
+ result = new_rescue_mod(val[1], val[0], val[2])
158
+ }
159
+ | klEND tLCURLY compstmt tRCURLY
160
+ | lhs tEQL command_call
161
+ {
162
+ result = new_assign(val[0], val[1], val[2])
163
+ }
164
+ | mlhs tEQL command_call
165
+ {
166
+ result = s(:masgn, val[0], s(:to_ary, val[2]))
167
+ }
168
+ | var_lhs tOP_ASGN command_call
169
+ {
170
+ result = new_op_asgn val[1], val[0], val[2]
171
+ }
172
+ | primary_value tLBRACK2 aref_args tRBRACK tOP_ASGN command_call
173
+ | primary_value tJSLBRACK aref_args tRBRACK tOP_ASGN command_call
174
+ | primary_value tDOT tIDENTIFIER tOP_ASGN command_call
175
+ {
176
+ result = s(:op_asgn2, val[0], op_to_setter(val[2]), value(val[3]).to_sym, val[4])
177
+ }
178
+ | primary_value tDOT tCONSTANT tOP_ASGN command_call
179
+ | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_call
180
+ | backref tOP_ASGN command_call
181
+ | lhs tEQL mrhs
182
+ {
183
+ result = new_assign val[0], val[1], s(:svalue, val[2])
184
+ }
185
+ | mlhs tEQL arg_value
186
+ {
187
+ result = s(:masgn, val[0], s(:to_ary, val[2]))
188
+ }
189
+ | mlhs tEQL mrhs
190
+ {
191
+ result = s(:masgn, val[0], val[2])
192
+ }
193
+ | expr
194
+
195
+ expr: command_call
196
+ | expr kAND expr
197
+ {
198
+ result = s(:and, val[0], val[2])
199
+ }
200
+ | expr kOR expr
201
+ {
202
+ result = s(:or, val[0], val[2])
203
+ }
204
+ | kNOT expr
205
+ {
206
+ result = new_unary_call(['!', []], val[1])
207
+ }
208
+ | tBANG command_call
209
+ {
210
+ result = new_unary_call(val[0], val[1])
211
+ }
212
+ | arg
213
+
214
+ expr_value: expr
215
+
216
+ command_call: command
217
+ | block_command
218
+ | kRETURN call_args
219
+ {
220
+ result = new_return(val[0], val[1])
221
+ }
222
+ | kBREAK call_args
223
+ {
224
+ result = new_break(val[0], val[1])
225
+ }
226
+ | kNEXT call_args
227
+ {
228
+ result = new_next(val[0], val[1])
229
+ }
230
+
231
+ block_command: block_call
232
+ | block_call tJSDOT operation2 command_args
233
+ | block_call tDOT operation2 command_args
234
+ | block_call tCOLON2 operation2 command_args
235
+
236
+ cmd_brace_block: tLBRACE_ARG opt_block_var compstmt tRCURLY
237
+
238
+ command: operation command_args =tLOWEST
239
+ {
240
+ result = new_call(nil, val[0], val[1])
241
+ }
242
+ | operation command_args cmd_brace_block
243
+ | primary_value tJSDOT operation2 command_args =tLOWEST
244
+ {
245
+ result = new_js_call(val[0], val[2], val[3])
246
+ }
247
+ | primary_value tJSDOT operation2 command_args cmd_brace_block
248
+ | primary_value tDOT operation2 command_args =tLOWEST
249
+ {
250
+ result = new_call(val[0], val[2], val[3])
251
+ }
252
+ | primary_value tDOT operation2 command_args cmd_brace_block
253
+ | primary_value tCOLON2 operation2 command_args =tLOWEST
254
+ {
255
+ result = new_call(val[0], val[2], val[3])
256
+ }
257
+ | primary_value tCOLON2 operation2 command_args cmd_brace_block
258
+ | kSUPER command_args
259
+ {
260
+ result = new_super(val[0], val[1])
261
+ }
262
+ | kYIELD command_args
263
+ {
264
+ result = new_yield val[1]
265
+ }
266
+
267
+ mlhs: mlhs_basic
268
+ {
269
+ result = val[0]
270
+ }
271
+ | tLPAREN mlhs_entry tRPAREN
272
+ {
273
+ result = val[1]
274
+ }
275
+
276
+ mlhs_entry: mlhs_basic
277
+ {
278
+ result = val[0]
279
+ }
280
+ | tLPAREN mlhs_entry tRPAREN
281
+ {
282
+ result = val[1]
283
+ }
284
+
285
+ mlhs_basic: mlhs_head
286
+ {
287
+ result = val[0]
288
+ }
289
+ | mlhs_head mlhs_item
290
+ {
291
+ result = val[0] << val[1]
292
+ }
293
+ | mlhs_head tSTAR mlhs_node
294
+ {
295
+ result = val[0] << s(:splat, val[2])
296
+ }
297
+ | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post
298
+ | mlhs_head tSTAR
299
+ {
300
+ result = val[0] << s(:splat)
301
+ }
302
+ | mlhs_head tSTAR tCOMMA mlhs_post
303
+ | tSTAR mlhs_node
304
+ {
305
+ result = s(:array, s(:splat, val[1]))
306
+ }
307
+ | tSTAR
308
+ {
309
+ result = s(:array, s(:splat))
310
+ }
311
+ | tSTAR tCOMMA mlhs_post
312
+
313
+ mlhs_item: mlhs_node
314
+ {
315
+ result = val[0]
316
+ }
317
+ | tLPAREN mlhs_entry tRPAREN
318
+ {
319
+ result = val[1]
320
+ }
321
+
322
+ mlhs_head: mlhs_item tCOMMA
323
+ {
324
+ result = s(:array, val[0])
325
+ }
326
+ | mlhs_head mlhs_item tCOMMA
327
+ {
328
+ result = val[0] << val[1]
329
+ }
330
+
331
+ mlhs_post: mlhs_item
332
+ | mlhs_post tCOMMA mlhs_item
333
+
334
+ mlhs_node: variable
335
+ {
336
+ result = new_assignable val[0]
337
+ }
338
+ | primary_value tLBRACK2 aref_args tRBRACK
339
+ {
340
+ args = val[2] ? val[2] : []
341
+ result = s(:attrasgn, val[0], :[]=, s(:arglist, *args))
342
+ }
343
+ | primary_value tDOT tIDENTIFIER
344
+ {
345
+ result = new_call val[0], val[2], []
346
+ }
347
+ | primary_value tCOLON2 tIDENTIFIER
348
+ | primary_value tDOT tCONSTANT
349
+ | primary_value tCOLON2 tCONSTANT
350
+ | tCOLON3 tCONSTANT
351
+ | backref
352
+
353
+ lhs: variable
354
+ {
355
+ result = new_assignable val[0]
356
+ }
357
+ | primary_value tJSLBRACK aref_args tRBRACK
358
+ {
359
+ result = new_js_attrasgn(val[0], val[2])
360
+ }
361
+ | primary_value tLBRACK2 aref_args tRBRACK
362
+ {
363
+ result = new_attrasgn(val[0], :[]=, val[2])
364
+ }
365
+ | primary_value tDOT tIDENTIFIER
366
+ {
367
+ result = new_attrasgn(val[0], op_to_setter(val[2]))
368
+ }
369
+ | primary_value tCOLON2 tIDENTIFIER
370
+ {
371
+ result = new_attrasgn(val[0], op_to_setter(val[2]))
372
+ }
373
+ | primary_value tDOT tCONSTANT
374
+ {
375
+ result = new_attrasgn(val[0], op_to_setter(val[2]))
376
+ }
377
+ | primary_value tCOLON2 tCONSTANT
378
+ {
379
+ result = new_colon2(val[0], val[1], val[2])
380
+ }
381
+ | tCOLON3 tCONSTANT
382
+ {
383
+ result = new_colon3(val[0], val[1])
384
+ }
385
+ | backref
386
+
387
+ cname: tCONSTANT
388
+
389
+ cpath: tCOLON3 cname
390
+ {
391
+ result = new_colon3(val[0], val[1])
392
+ }
393
+ | cname
394
+ {
395
+ result = new_const(val[0])
396
+ }
397
+ | primary_value tCOLON2 cname
398
+ {
399
+ result = new_colon2(val[0], val[1], val[2])
400
+ }
401
+
402
+ fname: tIDENTIFIER
403
+ | tCONSTANT
404
+ | tFID
405
+ | op
406
+ {
407
+ lexer.lex_state = :expr_end
408
+ result = val[0]
409
+ }
410
+ | reswords
411
+ {
412
+ lexer.lex_state = :expr_end
413
+ result = val[0]
414
+ }
415
+
416
+ fitem: fname
417
+ {
418
+ result = new_sym(val[0])
419
+ }
420
+ | symbol
421
+
422
+ undef_list: fitem
423
+ {
424
+ result = s(:undef, val[0])
425
+ }
426
+ | undef_list tCOMMA fitem
427
+ {
428
+ result = val[0] << val[2]
429
+ }
430
+
431
+ op: tPIPE | tCARET | tAMPER2 | tCMP | tEQ | tEQQ
432
+ | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ
433
+ | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
434
+ | tSTAR | tDIVIDE | tPERCENT | tPOW | tBANG | tTILDE
435
+ | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2
436
+
437
+ reswords: k__LINE__ | k__FILE__ | klBEGIN | klEND | kALIAS | kAND
438
+ | kBEGIN | kBREAK | kCASE | kCLASS | kDEF | kDEFINED
439
+ | kDO | kELSE | kELSIF | kEND | kENSURE | kFALSE
440
+ | kFOR | kIN | kMODULE | kNEXT | kNIL | kNOT
441
+ | kOR | kREDO | kRESCUE | kRETRY | kRETURN | kSELF
442
+ | kSUPER | kTHEN | kTRUE | kUNDEF | kWHEN | kYIELD
443
+ | kIF_MOD | kUNLESS_MOD | kWHILE_MOD | kUNTIL_MOD | kRESCUE_MOD
444
+ | kIF | kWHILE | kUNTIL | kUNLESS
445
+
446
+ arg: lhs tEQL arg
447
+ {
448
+ result = new_assign(val[0], val[1], val[2])
449
+ }
450
+ | lhs tEQL arg kRESCUE_MOD arg
451
+ {
452
+ result = new_assign val[0], val[1], s(:rescue_mod, val[2], val[4])
453
+ }
454
+ | var_lhs tOP_ASGN arg
455
+ {
456
+ result = new_op_asgn val[1], val[0], val[2]
457
+ }
458
+ | primary_value tLBRACK2 aref_args tRBRACK tOP_ASGN arg
459
+ {
460
+ result = new_op_asgn1(val[0], val[2], val[4], val[5])
461
+ }
462
+ | primary_value tJSLBRACK aref_args tRBRACK tOP_ASGN arg
463
+ {
464
+ raise ".JS[...] #{val[4]} is not supported"
465
+ }
466
+ | primary_value tDOT tIDENTIFIER tOP_ASGN arg
467
+ {
468
+ result = s(:op_asgn2, val[0], op_to_setter(val[2]), value(val[3]).to_sym, val[4])
469
+ }
470
+ | primary_value tDOT tCONSTANT tOP_ASGN arg
471
+ | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg
472
+ | primary_value tCOLON2 tCONSTANT tOP_ASGN arg
473
+ | tCOLON3 tCONSTANT tOP_ASGN arg
474
+ | backref tOP_ASGN arg
475
+ | arg tDOT2 arg
476
+ {
477
+ result = new_irange(val[0], val[1], val[2])
478
+ }
479
+ | arg tDOT3 arg
480
+ {
481
+ result = new_erange(val[0], val[1], val[2])
482
+ }
483
+ | arg tPLUS arg
484
+ {
485
+ result = new_binary_call(val[0], val[1], val[2])
486
+ }
487
+ | arg tMINUS arg
488
+ {
489
+ result = new_binary_call(val[0], val[1], val[2])
490
+ }
491
+ | arg tSTAR2 arg
492
+ {
493
+ result = new_binary_call(val[0], val[1], val[2])
494
+ }
495
+ | arg tDIVIDE arg
496
+ {
497
+ result = new_binary_call(val[0], val[1], val[2])
498
+ }
499
+ | arg tPERCENT arg
500
+ {
501
+ result = new_binary_call(val[0], val[1], val[2])
502
+ }
503
+ | arg tPOW arg
504
+ {
505
+ result = new_binary_call(val[0], val[1], val[2])
506
+ }
507
+ | '-@NUM' tINTEGER tPOW arg
508
+ {
509
+ result = new_call new_binary_call(new_int(val[1]), val[2], val[3]), [:"-@", []], []
510
+ }
511
+ | '-@NUM' tFLOAT tPOW arg
512
+ {
513
+ result = new_call new_binary_call(new_float(val[1]), val[2], val[3]), [:"-@", []], []
514
+ }
515
+ | tUPLUS arg
516
+ {
517
+ result = new_call val[1], [:"+@", []], []
518
+ if [:int, :float].include? val[1].type
519
+ result = val[1]
520
+ end
521
+ }
522
+ | tUMINUS arg
523
+ {
524
+ result = new_call val[1], [:"-@", []], []
525
+ if val[1].type == :int
526
+ val[1][1] = -val[1][1]
527
+ result = val[1]
528
+ elsif val[1].type == :float
529
+ val[1][1] = -val[1][1].to_f
530
+ result = val[1]
531
+ end
532
+ }
533
+ | arg tPIPE arg
534
+ {
535
+ result = new_binary_call(val[0], val[1], val[2])
536
+ }
537
+ | arg tCARET arg
538
+ {
539
+ result = new_binary_call(val[0], val[1], val[2])
540
+ }
541
+ | arg tAMPER2 arg
542
+ {
543
+ result = new_binary_call(val[0], val[1], val[2])
544
+ }
545
+ | arg tCMP arg
546
+ {
547
+ result = new_binary_call(val[0], val[1], val[2])
548
+ }
549
+ | arg tGT arg
550
+ {
551
+ result = new_binary_call(val[0], val[1], val[2])
552
+ }
553
+ | arg tGEQ arg
554
+ {
555
+ result = new_binary_call(val[0], val[1], val[2])
556
+ }
557
+ | arg tLT arg
558
+ {
559
+ result = new_binary_call(val[0], val[1], val[2])
560
+ }
561
+ | arg tLEQ arg
562
+ {
563
+ result = new_binary_call(val[0], val[1], val[2])
564
+ }
565
+ | arg tEQ arg
566
+ {
567
+ result = new_binary_call(val[0], val[1], val[2])
568
+ }
569
+ | arg tEQQ arg
570
+ {
571
+ result = new_binary_call(val[0], val[1], val[2])
572
+ }
573
+ | arg tNEQ arg
574
+ {
575
+ result = new_binary_call(val[0], val[1], val[2])
576
+ }
577
+ | arg tMATCH arg
578
+ {
579
+ result = new_binary_call(val[0], val[1], val[2])
580
+ }
581
+ | arg tNMATCH arg
582
+ {
583
+ result = new_binary_call(val[0], val[1], val[2])
584
+ }
585
+ | tBANG arg
586
+ {
587
+ result = new_unary_call(val[0], val[1])
588
+ }
589
+ | tTILDE arg
590
+ {
591
+ result = new_unary_call(val[0], val[1])
592
+ }
593
+ | arg tLSHFT arg
594
+ {
595
+ result = new_binary_call(val[0], val[1], val[2])
596
+ }
597
+ | arg tRSHFT arg
598
+ {
599
+ result = new_binary_call(val[0], val[1], val[2])
600
+ }
601
+ | arg tANDOP arg
602
+ {
603
+ result = new_and(val[0], val[1], val[2])
604
+ }
605
+ | arg tOROP arg
606
+ {
607
+ result = new_or(val[0], val[1], val[2])
608
+ }
609
+ | kDEFINED opt_nl arg
610
+ {
611
+ result = s(:defined, val[2])
612
+ }
613
+ | arg tEH arg tCOLON arg
614
+ {
615
+ result = new_if(val[1], val[0], val[2], val[4])
616
+ }
617
+ | primary
618
+
619
+ arg_value: arg
620
+
621
+ aref_args: none
622
+ {
623
+ result = nil
624
+ }
625
+ | command opt_nl
626
+ {
627
+ result = [val[0]]
628
+ }
629
+ | args trailer
630
+ {
631
+ result = val[0]
632
+ }
633
+ | args tCOMMA assocs trailer
634
+ {
635
+ val[0] << s(:hash, *val[2])
636
+ result = val[0]
637
+ }
638
+ | assocs trailer
639
+ {
640
+ result = [s(:hash, *val[0])]
641
+ }
642
+
643
+ paren_args: tLPAREN2 opt_call_args rparen
644
+ {
645
+ result = val[1]
646
+ }
647
+
648
+ rparen: opt_nl tRPAREN
649
+
650
+ opt_paren_args: none
651
+ {
652
+ result = []
653
+ }
654
+ | paren_args
655
+
656
+ opt_call_args: none
657
+ {
658
+ result = []
659
+ }
660
+ | call_args
661
+ | args tCOMMA
662
+ {
663
+ result = val[0]
664
+ }
665
+ | args tCOMMA assocs tCOMMA
666
+ {
667
+ result = val[0]
668
+ result << new_hash(nil, val[2], nil)
669
+ }
670
+ | assocs tCOMMA
671
+ {
672
+ result = [new_hash(nil, val[0], nil)]
673
+ }
674
+
675
+ call_args: command
676
+ {
677
+ result = [val[0]]
678
+ }
679
+ | args opt_block_arg
680
+ {
681
+ result = val[0]
682
+ add_block_pass val[0], val[1]
683
+ }
684
+ | assocs opt_block_arg
685
+ {
686
+ result = [new_hash(nil, val[0], nil)]
687
+ add_block_pass result, val[1]
688
+ }
689
+ | args tCOMMA assocs opt_block_arg
690
+ {
691
+ result = val[0]
692
+ result << new_hash(nil, val[2], nil)
693
+ result << val[3] if val[3]
694
+ }
695
+ | block_arg
696
+ {
697
+ result = []
698
+ add_block_pass result, val[0]
699
+ }
700
+
701
+ call_args2: arg_value tCOMMA args opt_block_arg
702
+ | block_arg
703
+
704
+ command_args: {
705
+ lexer.cmdarg_push 1
706
+ }
707
+ open_args
708
+ {
709
+ lexer.cmdarg_pop
710
+ result = val[1]
711
+ }
712
+
713
+ open_args: call_args
714
+ | tLPAREN_ARG tRPAREN
715
+ {
716
+ result = nil
717
+ }
718
+ | tLPAREN_ARG call_args2 tRPAREN
719
+ {
720
+ result = val[1]
721
+ }
722
+
723
+ block_arg: tAMPER arg_value
724
+ {
725
+ result = new_block_pass(val[0], val[1])
726
+ }
727
+
728
+ opt_block_arg: tCOMMA block_arg
729
+ {
730
+ result = val[1]
731
+ }
732
+ | # none
733
+ {
734
+ result = nil
735
+ }
736
+
737
+ args: arg_value
738
+ {
739
+ result = [val[0]]
740
+ }
741
+ | tSTAR arg_value
742
+ {
743
+ result = [new_splat(val[0], val[1])]
744
+ }
745
+ | args tCOMMA arg_value
746
+ {
747
+ result = val[0] << val[2]
748
+ }
749
+ | args tCOMMA tSTAR arg_value
750
+ {
751
+ result = val[0] << new_splat(val[2], val[3])
752
+ }
753
+
754
+ mrhs: args tCOMMA arg_value
755
+ {
756
+ val[0] << val[2]
757
+ result = s(:array, *val[0])
758
+ }
759
+ | args tCOMMA tSTAR arg_value
760
+ {
761
+ val[0] << s(:splat, val[3])
762
+ result = s(:array, *val[0])
763
+ }
764
+ | tSTAR arg_value
765
+ {
766
+ result = s(:splat, val[1])
767
+ }
768
+
769
+ primary: literal
770
+ | strings
771
+ | xstring
772
+ | regexp
773
+ | words
774
+ | awords
775
+ | var_ref
776
+ | backref
777
+ | tFID
778
+ | kBEGIN
779
+ {
780
+ result = lexer.line
781
+ }
782
+ bodystmt kEND
783
+ {
784
+ result = s(:begin, val[2])
785
+ }
786
+ | tLPAREN_ARG expr opt_nl tRPAREN
787
+ {
788
+ result = val[1]
789
+ }
790
+ | tLPAREN compstmt tRPAREN
791
+ {
792
+ result = new_paren(val[0], val[1], val[2])
793
+ }
794
+ | primary_value tCOLON2 tCONSTANT
795
+ {
796
+ result = new_colon2(val[0], val[1], val[2])
797
+ }
798
+ | tCOLON3 tCONSTANT
799
+ {
800
+ result = new_colon3(val[0], val[1])
801
+ }
802
+ | primary_value tLBRACK2 aref_args tRBRACK
803
+ {
804
+ result = new_call val[0], [:[], []], val[2]
805
+ }
806
+ | primary_value tJSLBRACK aref_args tRBRACK
807
+ {
808
+ result = new_js_call val[0], [:[], []], val[2]
809
+ }
810
+ | tLBRACK aref_args tRBRACK
811
+ {
812
+ result = new_array(val[0], val[1], val[2])
813
+ }
814
+ | tLBRACE assoc_list tRCURLY
815
+ {
816
+ result = new_hash(val[0], val[1], val[2])
817
+ }
818
+ | kRETURN
819
+ {
820
+ result = new_return(val[0])
821
+ }
822
+ | kYIELD tLPAREN2 call_args tRPAREN
823
+ {
824
+ result = new_yield val[2]
825
+ }
826
+ | kYIELD tLPAREN2 tRPAREN
827
+ {
828
+ result = s(:yield)
829
+ }
830
+ | kYIELD
831
+ {
832
+ result = s(:yield)
833
+ }
834
+ | kDEFINED opt_nl tLPAREN2 expr tRPAREN
835
+ {
836
+ result = s(:defined, val[3])
837
+ }
838
+ | kNOT tLPAREN2 expr tRPAREN
839
+ {
840
+ result = new_unary_call(['!', []], val[2])
841
+ }
842
+ | kNOT tLPAREN2 tRPAREN
843
+ {
844
+ result = new_unary_call(['!', []], new_nil(val[0]))
845
+ }
846
+ | operation brace_block
847
+ {
848
+ result = new_call(nil, val[0], [])
849
+ result << val[1]
850
+ }
851
+ | method_call
852
+ | method_call brace_block
853
+ {
854
+ val[0] << val[1]
855
+ result = val[0]
856
+ }
857
+ | tLAMBDA lambda
858
+ {
859
+ result = val[1]
860
+ }
861
+ | kIF expr_value then compstmt if_tail kEND
862
+ {
863
+ result = new_if(val[0], val[1], val[3], val[4])
864
+ }
865
+ | kUNLESS expr_value then compstmt opt_else kEND
866
+ {
867
+ result = new_if(val[0], val[1], val[4], val[3])
868
+ }
869
+ | kWHILE
870
+ {
871
+ lexer.cond_push 1
872
+ result = lexer.line
873
+ }
874
+ expr_value do
875
+ {
876
+ lexer.cond_pop
877
+ }
878
+ compstmt kEND
879
+ {
880
+ result = s(:while, val[2], val[5])
881
+ }
882
+ | kUNTIL
883
+ {
884
+ lexer.cond_push 1
885
+ result = lexer.line
886
+ }
887
+ expr_value do
888
+ {
889
+ lexer.cond_pop
890
+ }
891
+ compstmt kEND
892
+ {
893
+ result = s(:until, val[2], val[5])
894
+ }
895
+ | kCASE expr_value opt_terms case_body kEND
896
+ {
897
+ result = s(:case, val[1], *val[3])
898
+ }
899
+ | kCASE opt_terms case_body kEND
900
+ {
901
+ result = s(:case, nil, *val[2])
902
+ }
903
+ | kCASE opt_terms kELSE compstmt kEND
904
+ {
905
+ result = s(:case, nil, val[3])
906
+ }
907
+ | kFOR for_var kIN
908
+ {
909
+ lexer.cond_push 1
910
+ result = lexer.line
911
+ }
912
+ expr_value do
913
+ {
914
+ lexer.cond_pop
915
+ }
916
+ compstmt kEND
917
+ {
918
+ result = s(:for, val[4], val[1], val[7])
919
+ }
920
+ | kCLASS cpath superclass
921
+ {
922
+ # ...
923
+ }
924
+ bodystmt kEND
925
+ {
926
+ result = new_class val[0], val[1], val[2], val[4], val[5]
927
+ }
928
+ | kCLASS tLSHFT
929
+ {
930
+ result = lexer.line
931
+ }
932
+ expr term
933
+ {
934
+ # ...
935
+ }
936
+ bodystmt kEND
937
+ {
938
+ result = new_sclass(val[0], val[3], val[6], val[7])
939
+ }
940
+ | kMODULE
941
+ {
942
+ result = lexer.line
943
+ }
944
+ cpath
945
+ {
946
+ # ...
947
+ }
948
+ bodystmt kEND
949
+ {
950
+ result = new_module(val[0], val[2], val[4], val[5])
951
+ }
952
+ | kDEF fname
953
+ {
954
+ push_scope
955
+ lexer.lex_state = :expr_endfn
956
+ }
957
+ f_arglist bodystmt kEND
958
+ {
959
+ result = new_def(val[0], nil, val[1], val[3], val[4], val[5])
960
+ pop_scope
961
+ }
962
+ | kDEF singleton dot_or_colon
963
+ {
964
+ lexer.lex_state = :expr_fname
965
+ }
966
+ fname
967
+ {
968
+ push_scope
969
+ lexer.lex_state = :expr_endfn
970
+ }
971
+ f_arglist bodystmt kEND
972
+ {
973
+ result = new_def(val[0], val[1], val[4], val[6], val[7], val[8])
974
+ pop_scope
975
+ }
976
+ | kBREAK
977
+ {
978
+ result = new_break(val[0])
979
+ }
980
+ | kNEXT
981
+ {
982
+ result = s(:next)
983
+ }
984
+ | kREDO
985
+ {
986
+ result = s(:redo)
987
+ }
988
+ | kRETRY
989
+
990
+ primary_value: primary
991
+
992
+ then: term
993
+ | tCOLON
994
+ | kTHEN
995
+ | term kTHEN
996
+
997
+ do: term
998
+ | tCOLON
999
+ | kDO_COND
1000
+
1001
+ lambda: f_larglist lambda_body
1002
+ {
1003
+ result = new_call nil, [:lambda, []], []
1004
+ result << new_iter(val[0], val[1])
1005
+ }
1006
+
1007
+ f_larglist: tLPAREN2 block_param tRPAREN
1008
+ {
1009
+ result = val[1]
1010
+ }
1011
+ | tLPAREN2 tRPAREN
1012
+ {
1013
+ result = nil
1014
+ }
1015
+ | block_param
1016
+ | none
1017
+
1018
+ lambda_body: tLAMBEG compstmt tRCURLY
1019
+ {
1020
+ result = val[1]
1021
+ }
1022
+ | kDO_LAMBDA compstmt kEND
1023
+ {
1024
+ result = val[1]
1025
+ }
1026
+
1027
+ if_tail: opt_else
1028
+ {
1029
+ result = val[0]
1030
+ }
1031
+ | kELSIF expr_value then compstmt if_tail
1032
+ {
1033
+ result = new_if(val[0], val[1], val[3], val[4])
1034
+ }
1035
+
1036
+ opt_else: none
1037
+ | kELSE compstmt
1038
+ {
1039
+ result = val[1]
1040
+ }
1041
+
1042
+ f_block_optarg: f_block_opt
1043
+ {
1044
+ result = s(:block, val[0])
1045
+ }
1046
+ | f_block_optarg tCOMMA f_block_opt
1047
+ {
1048
+ val[0] << val[2]
1049
+ result = val[0]
1050
+ }
1051
+
1052
+ f_block_opt: tIDENTIFIER tEQL primary_value
1053
+ {
1054
+ result = new_assign(new_assignable(new_ident(
1055
+ val[0])), val[1], val[2])
1056
+ }
1057
+
1058
+ opt_block_var: none
1059
+ | tPIPE tPIPE
1060
+ {
1061
+ result = nil
1062
+ }
1063
+ | tOROP
1064
+ {
1065
+ result = nil
1066
+ }
1067
+ | tPIPE block_param tPIPE
1068
+ {
1069
+ result = val[1]
1070
+ }
1071
+
1072
+ block_args_tail: f_block_arg
1073
+ {
1074
+ result = val[0]
1075
+ }
1076
+
1077
+ opt_block_args_tail: tCOMMA block_args_tail
1078
+ {
1079
+ result = val[1]
1080
+ }
1081
+ | none
1082
+ {
1083
+ nil
1084
+ }
1085
+
1086
+ block_param: f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1087
+ {
1088
+ result = new_block_args(val[0], val[2], val[4], val[5])
1089
+ }
1090
+ | f_arg tCOMMA f_block_optarg opt_block_args_tail
1091
+ {
1092
+ result = new_block_args(val[0], val[2], nil, val[3])
1093
+ }
1094
+ | f_arg tCOMMA f_rest_arg opt_block_args_tail
1095
+ {
1096
+ result = new_block_args(val[0], nil, val[2], val[3])
1097
+ }
1098
+ | f_arg tCOMMA
1099
+ {
1100
+ result = new_block_args(val[0], nil, nil, nil)
1101
+ }
1102
+ | f_arg opt_block_args_tail
1103
+ {
1104
+ result = new_block_args(val[0], nil, nil, val[1])
1105
+ }
1106
+ | f_block_optarg tCOMMA f_rest_arg opt_block_args_tail
1107
+ {
1108
+ result = new_block_args(nil, val[0], val[2], val[3])
1109
+ }
1110
+ | f_block_optarg opt_block_args_tail
1111
+ {
1112
+ result = new_block_args(nil, val[0], nil, val[1])
1113
+ }
1114
+ | f_rest_arg opt_block_args_tail
1115
+ {
1116
+ result = new_block_args(nil, nil, val[0], val[1])
1117
+ }
1118
+ | block_args_tail
1119
+ {
1120
+ result = new_block_args(nil, nil, nil, val[0])
1121
+ }
1122
+
1123
+ do_block: kDO_BLOCK
1124
+ {
1125
+ push_scope :block
1126
+ result = lexer.line
1127
+ }
1128
+ opt_block_var compstmt kEND
1129
+ {
1130
+ result = new_iter val[2], val[3]
1131
+ pop_scope
1132
+ }
1133
+
1134
+ block_call: command do_block
1135
+ {
1136
+ val[0] << val[1]
1137
+ result = val[0]
1138
+ }
1139
+ | block_call tJSDOT operation2 opt_paren_args
1140
+ | block_call tDOT operation2 opt_paren_args
1141
+ | block_call tCOLON2 operation2 opt_paren_args
1142
+
1143
+ method_call: operation paren_args
1144
+ {
1145
+ result = new_call(nil, val[0], val[1])
1146
+ }
1147
+ | primary_value tDOT operation2 opt_paren_args
1148
+ {
1149
+ result = new_call(val[0], val[2], val[3])
1150
+ }
1151
+ | primary_value tJSDOT operation2 opt_paren_args
1152
+ {
1153
+ result = new_js_call(val[0], val[2], val[3])
1154
+ }
1155
+ | primary_value tDOT paren_args
1156
+ {
1157
+ result = new_call(val[0], [:call, []], val[2])
1158
+ }
1159
+ | primary_value tCOLON2 operation2 paren_args
1160
+ {
1161
+ result = new_call(val[0], val[2], val[3])
1162
+ }
1163
+ | primary_value tCOLON2 operation3
1164
+ {
1165
+ result = new_call(val[0], val[2])
1166
+ }
1167
+ | kSUPER paren_args
1168
+ {
1169
+ result = new_super(val[0], val[1])
1170
+ }
1171
+ | kSUPER
1172
+ {
1173
+ result = new_super(val[0], nil)
1174
+ }
1175
+
1176
+ brace_block: tLCURLY
1177
+ {
1178
+ push_scope :block
1179
+ result = lexer.line
1180
+ }
1181
+ opt_block_var compstmt tRCURLY
1182
+ {
1183
+ result = new_iter val[2], val[3]
1184
+ pop_scope
1185
+ }
1186
+ | kDO
1187
+ {
1188
+ push_scope :block
1189
+ result = lexer.line
1190
+ }
1191
+ opt_block_var compstmt kEND
1192
+ {
1193
+ result = new_iter val[2], val[3]
1194
+ pop_scope
1195
+ }
1196
+
1197
+ case_body: kWHEN
1198
+ {
1199
+ result = lexer.line
1200
+ }
1201
+ args then compstmt cases
1202
+ {
1203
+ part = s(:when, s(:array, *val[2]), val[4])
1204
+ result = [part]
1205
+ result.push(*val[5]) if val[5]
1206
+ }
1207
+
1208
+ cases: opt_else
1209
+ {
1210
+ result = [val[0]]
1211
+ }
1212
+ | case_body
1213
+
1214
+ opt_rescue: kRESCUE exc_list exc_var then compstmt opt_rescue
1215
+ {
1216
+ exc = val[1] || s(:array)
1217
+ exc << new_assign(val[2], val[2], s(:gvar, '$!'.intern)) if val[2]
1218
+ result = [s(:resbody, exc, val[4])]
1219
+ result.push val[5].first if val[5]
1220
+ }
1221
+ | # none
1222
+ {
1223
+ result = nil
1224
+ }
1225
+
1226
+ exc_list: arg_value
1227
+ {
1228
+ result = s(:array, val[0])
1229
+ }
1230
+ | mrhs
1231
+ | none
1232
+
1233
+ exc_var: tASSOC lhs
1234
+ {
1235
+ result = val[1]
1236
+ }
1237
+ | none
1238
+ {
1239
+ result = nil
1240
+ }
1241
+
1242
+ opt_ensure: kENSURE compstmt
1243
+ {
1244
+ result = val[1].nil? ? s(:nil) : val[1]
1245
+ }
1246
+ | none
1247
+
1248
+ literal: numeric
1249
+ | symbol
1250
+ | dsym
1251
+
1252
+ strings: string
1253
+ {
1254
+ result = new_str val[0]
1255
+ }
1256
+
1257
+ string: string1
1258
+ | string string1
1259
+ {
1260
+ result = str_append val[0], val[1]
1261
+ }
1262
+
1263
+ string1: tSTRING_BEG string_contents tSTRING_END
1264
+ {
1265
+ result = val[1]
1266
+ }
1267
+ | tSTRING
1268
+ {
1269
+ result = s(:str, value(val[0]))
1270
+ }
1271
+
1272
+ xstring: tXSTRING_BEG xstring_contents tSTRING_END
1273
+ {
1274
+ result = new_xstr(val[0], val[1], val[2])
1275
+ }
1276
+
1277
+ regexp: tREGEXP_BEG xstring_contents tREGEXP_END
1278
+ {
1279
+ result = new_regexp val[1], val[2]
1280
+ }
1281
+
1282
+ words: tWORDS_BEG tSPACE tSTRING_END
1283
+ {
1284
+ result = s(:array)
1285
+ }
1286
+ | tWORDS_BEG word_list tSTRING_END
1287
+ {
1288
+ result = val[1]
1289
+ }
1290
+
1291
+ word_list: none
1292
+ {
1293
+ result = s(:array)
1294
+ }
1295
+ | word_list word tSPACE
1296
+ {
1297
+ part = val[1]
1298
+ part = s(:dstr, "", val[1]) if part.type == :evstr
1299
+ result = val[0] << part
1300
+ }
1301
+
1302
+ word: string_content
1303
+ {
1304
+ result = val[0]
1305
+ }
1306
+ | word string_content
1307
+ {
1308
+ result = val[0].concat([val[1]])
1309
+ }
1310
+
1311
+ awords: tAWORDS_BEG tSPACE tSTRING_END
1312
+ {
1313
+ result = s(:array)
1314
+ }
1315
+ | tAWORDS_BEG qword_list tSTRING_END
1316
+ {
1317
+ result = val[1]
1318
+ }
1319
+
1320
+ qword_list: none
1321
+ {
1322
+ result = s(:array)
1323
+ }
1324
+ | qword_list tSTRING_CONTENT tSPACE
1325
+ {
1326
+ result = val[0] << s(:str, value(val[1]))
1327
+ }
1328
+
1329
+ string_contents: none
1330
+ {
1331
+ result = nil
1332
+ }
1333
+ | string_contents string_content
1334
+ {
1335
+ result = str_append val[0], val[1]
1336
+ }
1337
+
1338
+ xstring_contents: none
1339
+ {
1340
+ result = nil
1341
+ }
1342
+ | xstring_contents string_content
1343
+ {
1344
+ result = str_append val[0], val[1]
1345
+ }
1346
+
1347
+ string_content: tSTRING_CONTENT
1348
+ {
1349
+ result = new_str_content(val[0])
1350
+ }
1351
+ | tSTRING_DVAR
1352
+ {
1353
+ result = lexer.strterm
1354
+ lexer.strterm = nil
1355
+ }
1356
+ string_dvar
1357
+ {
1358
+ lexer.strterm = val[1]
1359
+ result = new_evstr(val[2])
1360
+ }
1361
+ | tSTRING_DBEG
1362
+ {
1363
+ lexer.cond_push 0
1364
+ lexer.cmdarg_push 0
1365
+ result = lexer.strterm
1366
+ lexer.strterm = nil
1367
+ lexer.lex_state = :expr_beg
1368
+ }
1369
+ compstmt tRCURLY
1370
+ {
1371
+ lexer.strterm = val[1]
1372
+ lexer.cond_lexpop
1373
+ lexer.cmdarg_lexpop
1374
+ result = new_evstr(val[2])
1375
+ }
1376
+
1377
+ string_dvar: tGVAR
1378
+ {
1379
+ result = new_gvar(val[0])
1380
+ }
1381
+ | tIVAR
1382
+ {
1383
+ result = new_ivar(val[0])
1384
+ }
1385
+ | tCVAR
1386
+ {
1387
+ result = new_cvar(val[0])
1388
+ }
1389
+ | backref
1390
+
1391
+
1392
+ symbol: tSYMBEG sym
1393
+ {
1394
+ result = new_sym(val[1])
1395
+ lexer.lex_state = :expr_end
1396
+ }
1397
+ | tSYMBOL
1398
+ {
1399
+ result = new_sym(val[0])
1400
+ }
1401
+
1402
+ sym: fname
1403
+ | tIVAR
1404
+ | tGVAR
1405
+ | tCVAR
1406
+
1407
+ dsym: tSYMBEG xstring_contents tSTRING_END
1408
+ {
1409
+ result = new_dsym val[1]
1410
+ }
1411
+
1412
+ numeric: tINTEGER
1413
+ {
1414
+ result = new_int(val[0])
1415
+ }
1416
+ | tFLOAT
1417
+ {
1418
+ result = new_float(val[0])
1419
+ }
1420
+ | '-@NUM' tINTEGER =tLOWEST
1421
+ {
1422
+ result = negate_num(new_int(val[1]))
1423
+ }
1424
+ | '-@NUM' tFLOAT =tLOWEST
1425
+ {
1426
+ result = negate_num(new_float(val[1]))
1427
+ }
1428
+ | '+@NUM' tINTEGER =tLOWEST
1429
+ {
1430
+ result = new_int(val[1])
1431
+ }
1432
+ | '+@NUM' tFLOAT =tLOWEST
1433
+ {
1434
+ result = new_float(val[1])
1435
+ }
1436
+
1437
+ variable: tIDENTIFIER
1438
+ {
1439
+ result = new_ident(val[0])
1440
+ }
1441
+ | tIVAR
1442
+ {
1443
+ result = new_ivar(val[0])
1444
+ }
1445
+ | tGVAR
1446
+ {
1447
+ result = new_gvar(val[0])
1448
+ }
1449
+ | tCONSTANT
1450
+ {
1451
+ result = new_const(val[0])
1452
+ }
1453
+ | tCVAR
1454
+ {
1455
+ result = new_cvar(val[0])
1456
+ }
1457
+ | kNIL
1458
+ {
1459
+ result = new_nil(val[0])
1460
+ }
1461
+ | kSELF
1462
+ {
1463
+ result = new_self(val[0])
1464
+ }
1465
+ | kTRUE
1466
+ {
1467
+ result = new_true(val[0])
1468
+ }
1469
+ | kFALSE
1470
+ {
1471
+ result = new_false(val[0])
1472
+ }
1473
+ | k__FILE__
1474
+ {
1475
+ result = new___FILE__(val[0])
1476
+ }
1477
+ | k__LINE__
1478
+ {
1479
+ result = new___LINE__(val[0])
1480
+ }
1481
+
1482
+ var_ref: variable
1483
+ {
1484
+ result = new_var_ref(val[0])
1485
+ }
1486
+
1487
+ var_lhs: variable
1488
+ {
1489
+ result = new_assignable val[0]
1490
+ }
1491
+
1492
+ backref: tNTH_REF
1493
+ {
1494
+ result = s(:nth_ref, value(val[0]))
1495
+ }
1496
+ | tBACK_REF
1497
+
1498
+ superclass: term
1499
+ {
1500
+ result = nil
1501
+ }
1502
+ | tLT expr_value term
1503
+ {
1504
+ result = val[1]
1505
+ }
1506
+ | error term
1507
+ {
1508
+ result = nil
1509
+ }
1510
+
1511
+ f_arglist: tLPAREN2 f_args opt_nl tRPAREN
1512
+ {
1513
+ result = val[1]
1514
+ lexer.lex_state = :expr_beg
1515
+ }
1516
+ | f_args term
1517
+ {
1518
+ result = val[0]
1519
+ lexer.lex_state = :expr_beg
1520
+ }
1521
+
1522
+ kwrest_mark: tPOW
1523
+ | tDSTAR
1524
+
1525
+ f_kwrest: kwrest_mark tIDENTIFIER
1526
+ {
1527
+ result = new_kwrestarg(val[1])
1528
+ }
1529
+ | kwrest_mark
1530
+ {
1531
+ result = new_kwrestarg()
1532
+ }
1533
+
1534
+ f_label: tLABEL
1535
+ {
1536
+ result = new_sym(val[0])
1537
+ }
1538
+
1539
+ f_kw: f_label arg_value
1540
+ {
1541
+ result = new_kwoptarg(val[0], val[1])
1542
+ }
1543
+ | f_label
1544
+ {
1545
+ result = new_kwarg(val[0])
1546
+ }
1547
+
1548
+ f_kwarg: f_kw
1549
+ {
1550
+ result = [val[0]]
1551
+ }
1552
+ | f_kwarg tCOMMA f_kw
1553
+ {
1554
+ result = val[0]
1555
+ result << val[2]
1556
+ }
1557
+
1558
+ args_tail: f_kwarg tCOMMA f_kwrest opt_f_block_arg
1559
+ {
1560
+ result = new_args_tail(val[0], val[2], val[3])
1561
+ }
1562
+ | f_kwarg opt_f_block_arg
1563
+ {
1564
+ result = new_args_tail(val[0], nil, val[1])
1565
+ }
1566
+ | f_kwrest opt_f_block_arg
1567
+ {
1568
+ result = new_args_tail(nil, val[0], val[1])
1569
+ }
1570
+ | f_block_arg
1571
+ {
1572
+ result = new_args_tail(nil, nil, val[0])
1573
+ }
1574
+
1575
+ opt_args_tail: tCOMMA args_tail
1576
+ {
1577
+ result = val[1]
1578
+ }
1579
+ | # none
1580
+ {
1581
+ result = new_args_tail(nil, nil, nil)
1582
+ }
1583
+
1584
+ f_args: f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_args_tail
1585
+ {
1586
+ result = new_args(val[0], val[2], val[4], val[5])
1587
+ }
1588
+ | f_arg tCOMMA f_optarg opt_args_tail
1589
+ {
1590
+ result = new_args(val[0], val[2], nil, val[3])
1591
+ }
1592
+ | f_arg tCOMMA f_rest_arg opt_args_tail
1593
+ {
1594
+ result = new_args(val[0], nil, val[2], val[3])
1595
+ }
1596
+ | f_arg opt_args_tail
1597
+ {
1598
+ result = new_args(val[0], nil, nil, val[1])
1599
+ }
1600
+ | f_optarg tCOMMA f_rest_arg opt_args_tail
1601
+ {
1602
+ result = new_args(nil, val[0], val[2], val[3])
1603
+ }
1604
+ | f_optarg opt_args_tail
1605
+ {
1606
+ result = new_args(nil, val[0], nil, val[1])
1607
+ }
1608
+ | f_rest_arg opt_args_tail
1609
+ {
1610
+ result = new_args(nil, nil, val[0], val[1])
1611
+ }
1612
+ | args_tail
1613
+ {
1614
+ result = new_args(nil, nil, nil, val[0])
1615
+ }
1616
+ | # none
1617
+ {
1618
+ result = new_args(nil, nil, nil, nil)
1619
+ }
1620
+
1621
+ f_norm_arg: f_bad_arg
1622
+ | tIDENTIFIER
1623
+ {
1624
+ result = value(val[0]).to_sym
1625
+ scope.add_local result
1626
+ }
1627
+
1628
+ f_bad_arg: tCONSTANT
1629
+ {
1630
+ raise 'formal argument cannot be a constant'
1631
+ }
1632
+ | tIVAR
1633
+ {
1634
+ raise 'formal argument cannot be an instance variable'
1635
+ }
1636
+ | tCVAR
1637
+ {
1638
+ raise 'formal argument cannot be a class variable'
1639
+ }
1640
+ | tGVAR
1641
+ {
1642
+ raise 'formal argument cannot be a global variable'
1643
+ }
1644
+
1645
+ f_arg_item: f_norm_arg
1646
+ {
1647
+ result = val[0]
1648
+ }
1649
+ | tLPAREN f_margs tRPAREN
1650
+ {
1651
+ result = val[1]
1652
+ }
1653
+
1654
+ for_var: lhs
1655
+ | mlhs
1656
+
1657
+ f_marg: f_norm_arg
1658
+ {
1659
+ result = s(:lasgn, val[0])
1660
+ }
1661
+ | tLPAREN f_margs tRPAREN
1662
+
1663
+ f_marg_list: f_marg
1664
+ {
1665
+ result = s(:array, val[0])
1666
+ }
1667
+ | f_marg_list tCOMMA f_marg
1668
+ {
1669
+ val[0] << val[2]
1670
+ result = val[0]
1671
+ }
1672
+
1673
+ f_margs: f_marg_list
1674
+ | f_marg_list tCOMMA tSTAR f_norm_arg
1675
+ | f_marg_list tCOMMA tSTAR
1676
+ | tSTAR f_norm_arg
1677
+ | tSTAR
1678
+
1679
+ f_arg: f_arg_item
1680
+ {
1681
+ result = [val[0]]
1682
+ }
1683
+ | f_arg tCOMMA f_arg_item
1684
+ {
1685
+ val[0] << val[2]
1686
+ result = val[0]
1687
+ }
1688
+
1689
+ f_opt: tIDENTIFIER tEQL arg_value
1690
+ {
1691
+ result = new_assign(new_assignable(new_ident(val[0])), val[1], val[2])
1692
+ }
1693
+
1694
+ f_optarg: f_opt
1695
+ {
1696
+ result = s(:block, val[0])
1697
+ }
1698
+ | f_optarg tCOMMA f_opt
1699
+ {
1700
+ result = val[0]
1701
+ val[0] << val[2]
1702
+ }
1703
+
1704
+ restarg_mark: tSTAR2
1705
+ | tSTAR
1706
+
1707
+ f_rest_arg: restarg_mark tIDENTIFIER
1708
+ {
1709
+ result = "*#{value(val[1])}".to_sym
1710
+ }
1711
+ | restarg_mark
1712
+ {
1713
+ result = :"*"
1714
+ }
1715
+
1716
+ blkarg_mark: tAMPER2
1717
+ | tAMPER
1718
+
1719
+ f_block_arg: blkarg_mark tIDENTIFIER
1720
+ {
1721
+ result = "&#{value(val[1])}".to_sym
1722
+ }
1723
+
1724
+ opt_f_block_arg: tCOMMA f_block_arg
1725
+ {
1726
+ result = val[1]
1727
+ }
1728
+ | # none
1729
+ {
1730
+ result = nil
1731
+ }
1732
+
1733
+ singleton: var_ref
1734
+ {
1735
+ result = val[0]
1736
+ }
1737
+ | tLPAREN2 expr opt_nl tRPAREN
1738
+ {
1739
+ result = val[1]
1740
+ }
1741
+
1742
+ assoc_list: # none
1743
+ {
1744
+ result = []
1745
+ }
1746
+ | assocs trailer
1747
+ {
1748
+ result = val[0]
1749
+ }
1750
+
1751
+ assocs: assoc
1752
+ {
1753
+ result = val[0]
1754
+ }
1755
+ | assocs tCOMMA assoc
1756
+ {
1757
+ result = val[0].push(*val[2])
1758
+ }
1759
+
1760
+ assoc: arg_value tASSOC arg_value
1761
+ {
1762
+ result = [val[0], val[2]]
1763
+ }
1764
+ | tLABEL arg_value
1765
+ {
1766
+ result = [new_sym(val[0]), val[1]]
1767
+ }
1768
+
1769
+ operation: tIDENTIFIER
1770
+ | tCONSTANT
1771
+ | tFID
1772
+
1773
+ operation2: tIDENTIFIER
1774
+ | tCONSTANT
1775
+ | tFID
1776
+ | op
1777
+
1778
+ operation3: tIDENTIFIER
1779
+ | tFID
1780
+ | op
1781
+
1782
+ dot_or_colon: tDOT
1783
+ | tCOLON2
1784
+
1785
+ opt_terms: # none
1786
+ | terms
1787
+
1788
+ opt_nl: # none
1789
+ | tNL
1790
+
1791
+ trailer: # none
1792
+ | tNL
1793
+ | tCOMMA
1794
+
1795
+ term: tSEMI
1796
+ | tNL
1797
+
1798
+ terms: term
1799
+ | terms tSEMI
1800
+
1801
+ none: # none
1802
+ {
1803
+ result = nil
1804
+ }
1805
+ end
1806
+
1807
+ ---- inner