racc 1.5.2-java → 1.6.0-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 (123) hide show
  1. checksums.yaml +4 -4
  2. data/README.ja.rdoc +0 -1
  3. data/README.rdoc +6 -7
  4. data/{rdoc → doc}/en/NEWS.en.rdoc +0 -0
  5. data/{rdoc → doc}/en/grammar.en.rdoc +27 -31
  6. data/doc/en/grammar2.en.rdoc +219 -0
  7. data/{rdoc → doc}/ja/NEWS.ja.rdoc +0 -0
  8. data/{rdoc → doc}/ja/command.ja.html +0 -0
  9. data/{rdoc → doc}/ja/debug.ja.rdoc +0 -0
  10. data/{rdoc → doc}/ja/grammar.ja.rdoc +0 -0
  11. data/{rdoc → doc}/ja/index.ja.html +0 -0
  12. data/{rdoc → doc}/ja/parser.ja.rdoc +0 -0
  13. data/{rdoc → doc}/ja/usage.ja.html +0 -0
  14. data/ext/racc/cparse/cparse.c +1 -1
  15. data/ext/racc/cparse/extconf.rb +1 -0
  16. data/lib/racc/cparse-jruby.jar +0 -0
  17. data/lib/racc/info.rb +1 -1
  18. data/lib/racc/parser-text.rb +1 -1
  19. data/lib/racc/parser.rb +1 -1
  20. data/lib/racc/parserfilegenerator.rb +0 -44
  21. data/lib/racc/statetransitiontable.rb +2 -8
  22. metadata +15 -121
  23. data/Rakefile +0 -79
  24. data/ext/racc/com/headius/racc/Cparse.java +0 -849
  25. data/lib/racc/pre-setup +0 -13
  26. data/sample/array.y +0 -67
  27. data/sample/array2.y +0 -59
  28. data/sample/calc-ja.y +0 -66
  29. data/sample/calc.y +0 -65
  30. data/sample/conflict.y +0 -15
  31. data/sample/hash.y +0 -60
  32. data/sample/lalr.y +0 -17
  33. data/sample/lists.y +0 -57
  34. data/sample/syntax.y +0 -46
  35. data/sample/yyerr.y +0 -46
  36. data/test/assets/cadenza.y +0 -170
  37. data/test/assets/cast.y +0 -926
  38. data/test/assets/chk.y +0 -126
  39. data/test/assets/conf.y +0 -16
  40. data/test/assets/csspool.y +0 -729
  41. data/test/assets/digraph.y +0 -29
  42. data/test/assets/echk.y +0 -118
  43. data/test/assets/edtf.y +0 -583
  44. data/test/assets/err.y +0 -60
  45. data/test/assets/error_recovery.y +0 -35
  46. data/test/assets/expect.y +0 -7
  47. data/test/assets/firstline.y +0 -4
  48. data/test/assets/huia.y +0 -318
  49. data/test/assets/ichk.y +0 -102
  50. data/test/assets/intp.y +0 -546
  51. data/test/assets/journey.y +0 -47
  52. data/test/assets/liquor.y +0 -313
  53. data/test/assets/machete.y +0 -423
  54. data/test/assets/macruby.y +0 -2197
  55. data/test/assets/mailp.y +0 -437
  56. data/test/assets/mediacloth.y +0 -599
  57. data/test/assets/mof.y +0 -649
  58. data/test/assets/namae.y +0 -302
  59. data/test/assets/nasl.y +0 -626
  60. data/test/assets/newsyn.y +0 -25
  61. data/test/assets/noend.y +0 -4
  62. data/test/assets/nokogiri-css.y +0 -255
  63. data/test/assets/nonass.y +0 -41
  64. data/test/assets/normal.y +0 -27
  65. data/test/assets/norule.y +0 -4
  66. data/test/assets/nullbug1.y +0 -25
  67. data/test/assets/nullbug2.y +0 -15
  68. data/test/assets/opal.y +0 -1807
  69. data/test/assets/opt.y +0 -123
  70. data/test/assets/percent.y +0 -35
  71. data/test/assets/php_serialization.y +0 -98
  72. data/test/assets/recv.y +0 -97
  73. data/test/assets/riml.y +0 -665
  74. data/test/assets/rrconf.y +0 -14
  75. data/test/assets/ruby18.y +0 -1943
  76. data/test/assets/ruby19.y +0 -2174
  77. data/test/assets/ruby20.y +0 -2350
  78. data/test/assets/ruby21.y +0 -2359
  79. data/test/assets/ruby22.y +0 -2381
  80. data/test/assets/scan.y +0 -72
  81. data/test/assets/syntax.y +0 -50
  82. data/test/assets/tp_plus.y +0 -622
  83. data/test/assets/twowaysql.y +0 -278
  84. data/test/assets/unterm.y +0 -5
  85. data/test/assets/useless.y +0 -12
  86. data/test/assets/yyerr.y +0 -46
  87. data/test/bench.y +0 -36
  88. data/test/helper.rb +0 -115
  89. data/test/infini.y +0 -8
  90. data/test/regress/cadenza +0 -796
  91. data/test/regress/cast +0 -3428
  92. data/test/regress/csspool +0 -2314
  93. data/test/regress/edtf +0 -1794
  94. data/test/regress/huia +0 -1392
  95. data/test/regress/journey +0 -222
  96. data/test/regress/liquor +0 -885
  97. data/test/regress/machete +0 -833
  98. data/test/regress/mediacloth +0 -1463
  99. data/test/regress/mof +0 -1368
  100. data/test/regress/namae +0 -634
  101. data/test/regress/nasl +0 -2058
  102. data/test/regress/nokogiri-css +0 -836
  103. data/test/regress/opal +0 -6431
  104. data/test/regress/php_serialization +0 -336
  105. data/test/regress/riml +0 -3283
  106. data/test/regress/ruby18 +0 -6344
  107. data/test/regress/ruby22 +0 -7460
  108. data/test/regress/tp_plus +0 -1933
  109. data/test/regress/twowaysql +0 -556
  110. data/test/scandata/brace +0 -7
  111. data/test/scandata/gvar +0 -1
  112. data/test/scandata/normal +0 -4
  113. data/test/scandata/percent +0 -18
  114. data/test/scandata/slash +0 -10
  115. data/test/src.intp +0 -34
  116. data/test/start.y +0 -20
  117. data/test/test_chk_y.rb +0 -52
  118. data/test/test_grammar_file_parser.rb +0 -15
  119. data/test/test_racc_command.rb +0 -339
  120. data/test/test_scan_y.rb +0 -52
  121. data/test/testscanner.rb +0 -51
  122. data/web/racc.en.rhtml +0 -42
  123. data/web/racc.ja.rhtml +0 -51
data/test/assets/riml.y DELETED
@@ -1,665 +0,0 @@
1
- # Copyright (c) 2012-2014 by Luke Gruber
2
- #
3
- # Permission is hereby granted, free of charge, to any person obtaining
4
- # a copy of this software and associated documentation files (the
5
- # "Software"), to deal in the Software without restriction, including
6
- # without limitation the rights to use, copy, modify, merge, publish,
7
- # distribute, sublicense, and/or sell copies of the Software, and to
8
- # permit persons to whom the Software is furnished to do so, subject to
9
- # the following conditions:
10
- #
11
- # The above copyright notice and this permission notice shall be included
12
- # in all copies or substantial portions of the Software.
13
- #
14
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17
- # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18
- # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19
- # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20
- # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
-
22
- class Riml::Parser
23
-
24
- token IF ELSE ELSEIF THEN UNLESS END
25
- token WHILE UNTIL BREAK CONTINUE
26
- token TRY CATCH FINALLY
27
- token FOR IN
28
- token DEF DEF_BANG SPLAT_PARAM SPLAT_ARG CALL BUILTIN_COMMAND # such as echo "hi"
29
- token CLASS NEW DEFM DEFM_BANG SUPER
30
- token RIML_FILE_COMMAND RIML_CLASS_COMMAND
31
- token RETURN
32
- token NEWLINE
33
- token NUMBER
34
- token STRING_D STRING_S # single- and double-quoted
35
- token EX_LITERAL
36
- token REGEXP
37
- token TRUE FALSE
38
- token LET UNLET UNLET_BANG IDENTIFIER
39
- token DICT_VAL # like dict.key, 'key' is a DICT_VAL
40
- token SCOPE_MODIFIER SCOPE_MODIFIER_LITERAL SPECIAL_VAR_PREFIX
41
- token FINISH
42
-
43
- prechigh
44
- right '!'
45
- left '*' '/' '%'
46
- left '+' '-' '.'
47
- left '>' '>#' '>?' '<' '<#' '<?' '>=' '>=#' '>=?' '<=' '<=#' '<=?'
48
- left '==' '==?' '==#' '=~' '=~?' '=~#' '!~' '!~?' '!~#' '!=' '!=?' '!=#'
49
- left IS ISNOT
50
- left '&&'
51
- left '||'
52
- right '?'
53
- right '=' '+=' '-=' '.='
54
- left ','
55
- left IF UNLESS
56
- preclow
57
-
58
- # All rules
59
- rule
60
-
61
- Root:
62
- /* nothing */ { result = make_node(val) { |_| Riml::Nodes.new([]) } }
63
- | Terminator { result = make_node(val) { |_| Riml::Nodes.new([]) } }
64
- | Statements { result = val[0] }
65
- ;
66
-
67
- # any list of expressions
68
- Statements:
69
- Statement { result = make_node(val) { |v| Riml::Nodes.new([ v[0] ]) } }
70
- | Statements Terminator Statement { result = val[0] << val[2] }
71
- | Statements Terminator { result = val[0] }
72
- | Terminator Statements { result = make_node(val) { |v| Riml::Nodes.new(v[1]) } }
73
- ;
74
-
75
- # All types of expressions in Riml
76
- Statement:
77
- ExplicitCall { result = val[0] }
78
- | Def { result = val[0] }
79
- | Return { result = val[0] }
80
- | UnletVariable { result = val[0] }
81
- | ExLiteral { result = val[0] }
82
- | For { result = val[0] }
83
- | While { result = val[0] }
84
- | Until { result = val[0] }
85
- | Try { result = val[0] }
86
- | ClassDefinition { result = val[0] }
87
- | LoopKeyword { result = val[0] }
88
- | EndScript { result = val[0] }
89
- | RimlFileCommand { result = val[0] }
90
- | RimlClassCommand { result = val[0] }
91
- | MultiAssign { result = val[0] }
92
- | If { result = val[0] }
93
- | Unless { result = val[0] }
94
- | Expression { result = val[0] }
95
- ;
96
-
97
- Expression:
98
- ExpressionWithoutDictLiteral { result = val[0] }
99
- | Dictionary { result = val[0] }
100
- | Dictionary DictGetWithDotLiteral { result = make_node(val) { |v| Riml::DictGetDotNode.new(v[0], v[1]) } }
101
- | BinaryOperator { result = val[0] }
102
- | Ternary { result = val[0] }
103
- | Assign { result = val[0] }
104
- | Super { result = val[0] }
105
- | '(' Expression ')' { result = make_node(val) { |v| Riml::WrapInParensNode.new(v[1]) } }
106
- ;
107
-
108
- ExpressionWithoutDictLiteral:
109
- UnaryOperator { result = val[0] }
110
- | DictGet { result = val[0] }
111
- | ListOrDictGet { result = val[0] }
112
- | AllVariableRetrieval { result = val[0] }
113
- | LiteralWithoutDictLiteral { result = val[0] }
114
- | Call { result = val[0] }
115
- | ObjectInstantiation { result = val[0] }
116
- | '(' ExpressionWithoutDictLiteral ')' { result = make_node(val) { |v| Riml::WrapInParensNode.new(v[1]) } }
117
- ;
118
-
119
- # for inside curly-brace variable names
120
- PossibleStringValue:
121
- String { result = val[0] }
122
- | DictGet { result = val[0] }
123
- | ListOrDictGet { result = val[0] }
124
- | AllVariableRetrieval { result = val[0] }
125
- | BinaryOperator { result = val[0] }
126
- | Ternary { result = val[0] }
127
- | Call { result = val[0] }
128
- ;
129
-
130
- Terminator:
131
- NEWLINE { result = nil }
132
- | ';' { result = nil }
133
- ;
134
-
135
- LiteralWithoutDictLiteral:
136
- Number { result = val[0] }
137
- | String { result = val[0] }
138
- | Regexp { result = val[0] }
139
- | List { result = val[0] }
140
- | ScopeModifierLiteral { result = val[0] }
141
- | TRUE { result = make_node(val) { |_| Riml::TrueNode.new } }
142
- | FALSE { result = make_node(val) { |_| Riml::FalseNode.new } }
143
- ;
144
-
145
- Number:
146
- NUMBER { result = make_node(val) { |v| Riml::NumberNode.new(v[0]) } }
147
- ;
148
-
149
- String:
150
- STRING_S { result = make_node(val) { |v| Riml::StringNode.new(v[0], :s) } }
151
- | STRING_D { result = make_node(val) { |v| Riml::StringNode.new(v[0], :d) } }
152
- | String STRING_S { result = make_node(val) { |v| Riml::StringLiteralConcatNode.new(v[0], Riml::StringNode.new(v[1], :s)) } }
153
- | String STRING_D { result = make_node(val) { |v| Riml::StringLiteralConcatNode.new(v[0], Riml::StringNode.new(v[1], :d)) } }
154
- ;
155
-
156
- Regexp:
157
- REGEXP { result = make_node(val) { |v| Riml::RegexpNode.new(v[0]) } }
158
- ;
159
-
160
- ScopeModifierLiteral:
161
- SCOPE_MODIFIER_LITERAL { result = make_node(val) { |v| Riml::ScopeModifierLiteralNode.new(v[0]) } }
162
- ;
163
-
164
- List:
165
- ListLiteral { result = make_node(val) { |v| Riml::ListNode.new(v[0]) } }
166
- ;
167
-
168
- ListUnpack:
169
- '[' ListItems ';' Expression ']' { result = make_node(val) { |v| Riml::ListUnpackNode.new(v[1] << v[3]) } }
170
- ;
171
-
172
- ListLiteral:
173
- '[' ListItems ']' { result = val[1] }
174
- | '[' ListItems ',' ']' { result = val[1] }
175
- ;
176
-
177
- ListItems:
178
- /* nothing */ { result = [] }
179
- | Expression { result = [val[0]] }
180
- | ListItems ',' Expression { result = val[0] << val[2] }
181
- ;
182
-
183
- Dictionary:
184
- DictionaryLiteral { result = make_node(val) { |v| Riml::DictionaryNode.new(v[0]) } }
185
- ;
186
-
187
- # {'key': 'value', 'key2': 'value2'}
188
- # Save as [['key', 'value'], ['key2', 'value2']] because ruby-1.8.7 offers
189
- # no guarantee for key-value pair ordering.
190
- DictionaryLiteral:
191
- '{' DictItems '}' { result = val[1] }
192
- | '{' DictItems ',' '}' { result = val[1] }
193
- ;
194
-
195
- # [[key, value], [key, value]]
196
- DictItems:
197
- /* nothing */ { result = [] }
198
- | DictItem { result = val }
199
- | DictItems ',' DictItem { result = val[0] << val[2] }
200
- ;
201
-
202
- # [key, value]
203
- DictItem:
204
- Expression ':' Expression { result = [val[0], val[2]] }
205
- ;
206
-
207
- DictGet:
208
- AllVariableRetrieval DictGetWithDot { result = make_node(val) { |v| Riml::DictGetDotNode.new(v[0], v[1]) } }
209
- | ListOrDictGet DictGetWithDot { result = make_node(val) { |v| Riml::DictGetDotNode.new(v[0], v[1]) } }
210
- | Call DictGetWithDot { result = make_node(val) { |v| Riml::DictGetDotNode.new(v[0], v[1]) } }
211
- | '(' Expression ')' DictGetWithDot { result = make_node(val) { |v| Riml::DictGetDotNode.new(Riml::WrapInParensNode.new(v[1]), v[3]) } }
212
- ;
213
-
214
- ListOrDictGet:
215
- ExpressionWithoutDictLiteral ListOrDictGetWithBrackets { result = make_node(val) { |v| Riml::ListOrDictGetNode.new(v[0], v[1]) } }
216
- | '(' Expression ')' ListOrDictGetWithBrackets { result = make_node(val) { |v| Riml::ListOrDictGetNode.new(Riml::WrapInParensNode.new(v[1]), v[3]) } }
217
- ;
218
-
219
- ListOrDictGetAssign:
220
- ExpressionWithoutDictLiteral ListOrDictGetWithBrackets { result = make_node(val) { |v| Riml::ListOrDictGetNode.new(v[0], v[1]) } }
221
- ;
222
-
223
- ListOrDictGetWithBrackets:
224
- '[' Expression ']' { result = [val[1]] }
225
- | '[' SubList ']' { result = [val[1]] }
226
- | ListOrDictGetWithBrackets '[' Expression ']' { result = val[0] << val[2] }
227
- | ListOrDictGetWithBrackets '[' SubList ']' { result = val[0] << val[2] }
228
- ;
229
-
230
- SubList:
231
- Expression ':' Expression { result = make_node(val) { |v| Riml::SublistNode.new([v[0], Riml::LiteralNode.new(' : '), v[2]]) } }
232
- | Expression ':' { result = make_node(val) { |v| Riml::SublistNode.new([v[0], Riml::LiteralNode.new(' :')]) } }
233
- | ':' Expression { result = make_node(val) { |v| Riml::SublistNode.new([Riml::LiteralNode.new(': '), v[1]]) } }
234
- | ':' { result = make_node(val) { |_| Riml::SublistNode.new([Riml::LiteralNode.new(':')]) } }
235
- ;
236
-
237
- DictGetWithDot:
238
- DICT_VAL { result = [val[0]] }
239
- | DictGetWithDot DICT_VAL { result = val[0] << val[1] }
240
- ;
241
-
242
- DictGetWithDotLiteral:
243
- '.' IDENTIFIER { result = [val[1]] }
244
- | DictGetWithDotLiteral DICT_VAL { result = val[0] << val[1] }
245
- ;
246
-
247
- Call:
248
- Scope DefCallIdentifier '(' ArgList ')' { result = make_node(val) { |v| Riml::CallNode.new(v[0], v[1], v[3]) } }
249
- | DictGet '(' ArgList ')' { result = make_node(val) { |v| Riml::CallNode.new(nil, v[0], v[2]) } }
250
- | BUILTIN_COMMAND '(' ArgList ')' { result = make_node(val) { |v| Riml::CallNode.new(nil, v[0], v[2]) } }
251
- | BUILTIN_COMMAND ArgListWithoutNothing { result = make_node(val) { |v| Riml::CallNode.new(nil, v[0], v[1]) } }
252
- | BUILTIN_COMMAND NEWLINE { result = make_node(val) { |v| Riml::CallNode.new(nil, v[0], []) } }
253
- | CALL '(' ArgList ')' { result = make_node(val) { |v| Riml::ExplicitCallNode.new(nil, nil, v[2]) } }
254
- ;
255
-
256
- ObjectInstantiationCall:
257
- Scope DefCallIdentifier '(' ArgList ')' { result = make_node(val) { |v| Riml::CallNode.new(v[0], v[1], v[3]) } }
258
- | Scope DefCallIdentifier { result = make_node(val) { |v| Riml::CallNode.new(v[0], v[1], []) } }
259
- ;
260
-
261
- RimlFileCommand:
262
- RIML_FILE_COMMAND '(' ArgList ')' { result = make_node(val) { |v| Riml::RimlFileCommandNode.new(nil, v[0], v[2]) } }
263
- | RIML_FILE_COMMAND ArgList { result = make_node(val) { |v| Riml::RimlFileCommandNode.new(nil, v[0], v[1]) } }
264
- ;
265
-
266
- RimlClassCommand:
267
- RIML_CLASS_COMMAND '(' ClassArgList ')' { result = make_node(val) { |v| Riml::RimlClassCommandNode.new(nil, v[0], v[2]) } }
268
- | RIML_CLASS_COMMAND ClassArgList { result = make_node(val) { |v| Riml::RimlClassCommandNode.new(nil, v[0], v[1]) } }
269
- ;
270
-
271
- ClassArgList:
272
- Scope IDENTIFIER { result = ["#{val[0]}#{val[1]}"] }
273
- | String { result = val }
274
- | ClassArgList ',' Scope IDENTIFIER { result = val[0].concat ["#{val[2]}#{val[3]}"] }
275
- ;
276
-
277
- ExplicitCall:
278
- CALL Scope DefCallIdentifier '(' ArgList ')' { result = make_node(val) { |v| Riml::ExplicitCallNode.new(v[1], v[2], v[4]) } }
279
- | CALL DictGet '(' ArgList ')' { result = make_node(val) { |v| Riml::ExplicitCallNode.new(nil, v[1], v[3]) } }
280
- ;
281
-
282
- Scope:
283
- SCOPE_MODIFIER { result = val[0] }
284
- | /* nothing */ { result = nil }
285
- ;
286
-
287
- # [SID, scope_modifier]
288
- SIDAndScope:
289
- Scope { result = [ nil, val[0] ] }
290
- | '<' IDENTIFIER '>' Scope { result = [ make_node(val) { |v| Riml::SIDNode.new(v[1]) }, val[3] ] }
291
- ;
292
-
293
- ArgList:
294
- /* nothing */ { result = [] }
295
- | ArgListWithoutNothingWithSplat { result = val[0] }
296
- ;
297
-
298
- ArgListWithSplat:
299
- /* nothing */ { result = [] }
300
- | ArgListWithoutNothingWithSplat { result = val[0] }
301
- ;
302
-
303
- ArgListWithoutNothingWithSplat:
304
- Expression { result = val }
305
- | SPLAT_ARG Expression { result = [ make_node(val) { |v| Riml::SplatNode.new(v[1]) } ] }
306
- | ArgListWithoutNothingWithSplat "," Expression { result = val[0] << val[2] }
307
- | ArgListWithoutNothingWithSplat "," SPLAT_ARG Expression { result = val[0] << make_node(val) { |v| Riml::SplatNode.new(v[3]) } }
308
- ;
309
-
310
- ArgListWithoutNothing:
311
- Expression { result = val }
312
- | ArgListWithoutNothing "," Expression { result = val[0] << val[2] }
313
- ;
314
-
315
- BinaryOperator:
316
- Expression '||' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
317
- | Expression '&&' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
318
-
319
- | Expression '==' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
320
- | Expression '==#' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
321
- | Expression '==?' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
322
-
323
- # added by riml
324
- | Expression '===' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
325
-
326
- | Expression '!=' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
327
- | Expression '!=#' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
328
- | Expression '!=?' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
329
-
330
- | Expression '=~' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
331
- | Expression '=~#' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
332
- | Expression '=~?' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
333
-
334
- | Expression '!~' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
335
- | Expression '!~#' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
336
- | Expression '!~?' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
337
-
338
- | Expression '>' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
339
- | Expression '>#' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
340
- | Expression '>?' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
341
-
342
- | Expression '>=' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
343
- | Expression '>=#' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
344
- | Expression '>=?' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
345
-
346
- | Expression '<' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
347
- | Expression '<#' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
348
- | Expression '<?' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
349
-
350
- | Expression '<=' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
351
- | Expression '<=#' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
352
- | Expression '<=?' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
353
-
354
- | Expression '+' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
355
- | Expression '-' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
356
- | Expression '*' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
357
- | Expression '/' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
358
- | Expression '.' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
359
- | Expression '%' Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
360
-
361
- | Expression IS Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
362
- | Expression ISNOT Expression { result = make_node(val) { |v| Riml::BinaryOperatorNode.new(v[1], [v[0], v[2]]) } }
363
- ;
364
-
365
- UnaryOperator:
366
- '!' Expression { result = make_node(val) { |v| Riml::UnaryOperatorNode.new(val[0], [val[1]]) } }
367
- | '+' Expression { result = make_node(val) { |v| Riml::UnaryOperatorNode.new(val[0], [val[1]]) } }
368
- | '-' Expression { result = make_node(val) { |v| Riml::UnaryOperatorNode.new(val[0], [val[1]]) } }
369
- ;
370
-
371
- # ['=', LHS, RHS]
372
- Assign:
373
- LET AssignExpression { result = make_node(val) { |v| Riml::AssignNode.new(v[1][0], v[1][1], v[1][2]) } }
374
- | AssignExpression { result = make_node(val) { |v| Riml::AssignNode.new(v[0][0], v[0][1], v[0][2]) } }
375
- ;
376
-
377
- MultiAssign:
378
- Assign ',' Assign { result = make_node(val) { |v| Riml::MultiAssignNode.new([v[0], v[2]]) } }
379
- | MultiAssign ',' Assign { val[0].assigns << val[2]; result = val[0] }
380
- ;
381
-
382
- # ['=', AssignLHS, Expression]
383
- AssignExpression:
384
- AssignLHS '=' Expression { result = [val[1], val[0], val[2]] }
385
- | AssignLHS '+=' Expression { result = [val[1], val[0], val[2]] }
386
- | AssignLHS '-=' Expression { result = [val[1], val[0], val[2]] }
387
- | AssignLHS '.=' Expression { result = [val[1], val[0], val[2]] }
388
- ;
389
-
390
- AssignLHS:
391
- AllVariableRetrieval { result = val[0] }
392
- | List { result = val[0] }
393
- | ListUnpack { result = val[0] }
394
- | DictGet { result = val[0] }
395
- | ListOrDictGetAssign { result = val[0] }
396
- ;
397
-
398
- # retrieving the value of a variable
399
- VariableRetrieval:
400
- SimpleVariableRetrieval { result = val[0] }
401
- | SPECIAL_VAR_PREFIX IDENTIFIER { result = make_node(val) { |v| Riml::GetSpecialVariableNode.new(v[0], v[1]) } }
402
- | ScopeModifierLiteral ListOrDictGetWithBrackets { result = make_node(val) { |v| Riml::GetVariableByScopeAndDictNameNode.new(v[0], v[1]) } }
403
- ;
404
-
405
- SimpleVariableRetrieval:
406
- Scope IDENTIFIER { result = make_node(val) { |v| Riml::GetVariableNode.new(v[0], v[1]) } }
407
- ;
408
-
409
- AllVariableRetrieval:
410
- VariableRetrieval { result = val[0] }
411
- | Scope CurlyBraceName { result = make_node(val) { |v| Riml::GetCurlyBraceNameNode.new(v[0], v[1]) } }
412
- ;
413
-
414
- UnletVariable:
415
- UNLET VariableRetrieval { result = make_node(val) { |v| Riml::UnletVariableNode.new('!', [ v[1] ]) } }
416
- | UNLET_BANG VariableRetrieval { result = make_node(val) { |v| Riml::UnletVariableNode.new('!', [ v[1] ]) } }
417
- | UnletVariable VariableRetrieval { result = val[0] << val[1] }
418
- ;
419
-
420
- CurlyBraceName:
421
- CurlyBraceVarPart { result = make_node(val) { |v| Riml::CurlyBraceVariable.new([ v[0] ]) } }
422
- | IDENTIFIER CurlyBraceName { result = make_node(val) { |v| Riml::CurlyBraceVariable.new([ Riml::CurlyBracePart.new(v[0]), v[1] ]) } }
423
- | CurlyBraceName IDENTIFIER { result = val[0] << make_node(val) { |v| Riml::CurlyBracePart.new(v[1]) } }
424
- | CurlyBraceName CurlyBraceVarPart { result = val[0] << val[1] }
425
- ;
426
-
427
- CurlyBraceVarPart:
428
- '{' PossibleStringValue '}' { result = make_node(val) { |v| Riml::CurlyBracePart.new(v[1]) } }
429
- | '{' PossibleStringValue CurlyBraceVarPart '}' { result = make_node(val) { |v| Riml::CurlyBracePart.new([v[1], v[2]]) } }
430
- | '{' CurlyBraceVarPart PossibleStringValue '}' { result = make_node(val) { |v| Riml::CurlyBracePart.new([v[1], v[2]]) } }
431
- ;
432
-
433
- # Method definition
434
- # [SID, scope_modifier, name, parameters, keyword, expressions]
435
- Def:
436
- FunctionType SIDAndScope DefCallIdentifier DefKeywords Block END { result = make_node(val) { |v| Riml.const_get(val[0]).new('!', v[1][0], v[1][1], v[2], [], v[3], v[4]) } }
437
- | FunctionType SIDAndScope DefCallIdentifier '(' ParamList ')' DefKeywords Block END { result = make_node(val) { |v| Riml.const_get(val[0]).new('!', v[1][0], v[1][1], v[2], v[4], v[6], v[7]) } }
438
- | FunctionType SIDAndScope DefCallIdentifier '(' SPLAT_PARAM ')' DefKeywords Block END { result = make_node(val) { |v| Riml.const_get(val[0]).new('!', v[1][0], v[1][1], v[2], [v[4]], v[6], v[7]) } }
439
- | FunctionType SIDAndScope DefCallIdentifier '(' ParamList ',' SPLAT_PARAM ')' DefKeywords Block END { result = make_node(val) { |v| Riml.const_get(val[0]).new('!', v[1][0], v[1][1], v[2], v[4] << v[6], v[8], v[9]) } }
440
- ;
441
-
442
- FunctionType:
443
- DEF { result = "DefNode" }
444
- | DEF_BANG { result = "DefNode" }
445
- | DEFM { result = "DefMethodNode" }
446
- ;
447
-
448
- DefCallIdentifier:
449
- # use '' for first argument instead of nil in order to avoid a double scope-modifier
450
- CurlyBraceName { result = make_node(val) { |v| Riml::GetCurlyBraceNameNode.new('', v[0]) } }
451
- | IDENTIFIER { result = val[0] }
452
- ;
453
-
454
- # Example: 'range', 'dict' or 'abort' after function definition
455
- DefKeywords:
456
- IDENTIFIER { result = [val[0]] }
457
- | DefKeywords IDENTIFIER { result = val[0] << val[1] }
458
- | /* nothing */ { result = nil }
459
- ;
460
-
461
- ParamList:
462
- /* nothing */ { result = [] }
463
- | IDENTIFIER { result = val }
464
- | DefaultParam { result = val }
465
- | ParamList ',' IDENTIFIER { result = val[0] << val[2] }
466
- | ParamList ',' DefaultParam { result = val[0] << val[2] }
467
- ;
468
-
469
- DefaultParam:
470
- IDENTIFIER '=' Expression { result = make_node(val) { |v| Riml::DefaultParamNode.new(v[0], v[2]) } }
471
- ;
472
-
473
- Return:
474
- RETURN Returnable { result = make_node(val) { |v| Riml::ReturnNode.new(v[1]) } }
475
- | RETURN Returnable IF Expression { result = make_node(val) { |v| Riml::IfNode.new(v[3], Nodes.new([ReturnNode.new(v[1])])) } }
476
- | RETURN Returnable UNLESS Expression { result = make_node(val) { |v| Riml::UnlessNode.new(v[3], Nodes.new([ReturnNode.new(v[1])])) } }
477
- ;
478
-
479
- Returnable:
480
- /* nothing */ { result = nil }
481
- | Expression { result = val[0] }
482
- ;
483
-
484
- EndScript:
485
- FINISH { result = make_node(val) { |_| Riml::FinishNode.new } }
486
- ;
487
-
488
- # [expression, expressions]
489
- If:
490
- IF Expression IfBlock END { result = make_node(val) { |v| Riml::IfNode.new(v[1], v[2]) } }
491
- | IF Expression THEN Expression END { result = make_node(val) { |v| Riml::IfNode.new(v[1], Riml::Nodes.new([v[3]])) } }
492
- | Expression IF Expression { result = make_node(val) { |v| Riml::IfNode.new(v[2], Riml::Nodes.new([v[0]])) } }
493
- ;
494
-
495
- Unless:
496
- UNLESS Expression IfBlock END { result = make_node(val) { |v| Riml::UnlessNode.new(v[1], v[2]) } }
497
- | UNLESS Expression THEN Expression END { result = make_node(val) { |v| Riml::UnlessNode.new(v[1], Riml::Nodes.new([v[3]])) } }
498
- | Expression UNLESS Expression { result = make_node(val) { |v| Riml::UnlessNode.new(v[2], Riml::Nodes.new([v[0]])) } }
499
- ;
500
-
501
- Ternary:
502
- Expression '?' Expression ':' Expression { result = make_node(val) { |v| Riml::TernaryOperatorNode.new([v[0], v[2], v[4]]) } }
503
- ;
504
-
505
- While:
506
- WHILE Expression Block END { result = make_node(val) { |v| Riml::WhileNode.new(v[1], v[2]) } }
507
- ;
508
-
509
- LoopKeyword:
510
- BREAK { result = make_node(val) { |_| Riml::BreakNode.new } }
511
- | CONTINUE { result = make_node(val) { |_| Riml::ContinueNode.new } }
512
- ;
513
-
514
- Until:
515
- UNTIL Expression Block END { result = make_node(val) { |v| Riml::UntilNode.new(v[1], v[2]) } }
516
- ;
517
-
518
- For:
519
- FOR SimpleVariableRetrieval IN Expression Block END { result = make_node(val) { |v| Riml::ForNode.new(v[1], v[3], v[4]) } }
520
- | FOR List IN Expression Block END { result = make_node(val) { |v| Riml::ForNode.new(v[1], v[3], v[4]) } }
521
- | FOR ListUnpack IN Expression Block END { result = make_node(val) { |v| Riml::ForNode.new(v[1], v[3], v[4]) } }
522
- ;
523
-
524
- Try:
525
- TRY Block END { result = make_node(val) { |v| Riml::TryNode.new(v[1], nil, nil) } }
526
- | TRY Block Catch END { result = make_node(val) { |v| Riml::TryNode.new(v[1], v[2], nil) } }
527
- | TRY Block Catch FINALLY Block END { result = make_node(val) { |v| Riml::TryNode.new(v[1], v[2], v[4]) } }
528
- ;
529
-
530
- Catch:
531
- /* nothing */ { result = nil }
532
- | CATCH Block { result = [ make_node(val) { |v| Riml::CatchNode.new(nil, v[1]) } ] }
533
- | CATCH Catchable Block { result = [ make_node(val) { |v| Riml::CatchNode.new(v[1], v[2]) } ] }
534
- | Catch CATCH Block { result = val[0] << make_node(val) { |v| Riml::CatchNode.new(nil, v[2]) } }
535
- | Catch CATCH Catchable Block { result = val[0] << make_node(val) { |v| Riml::CatchNode.new(v[2], v[3]) } }
536
- ;
537
-
538
- Catchable:
539
- Regexp { result = val[0] }
540
- | String { result = val[0] }
541
- ;
542
-
543
- # [expressions]
544
- # expressions list could contain an ElseNode, which contains expressions
545
- # itself
546
- Block:
547
- NEWLINE Statements { result = val[1] }
548
- | NEWLINE { result = make_node(val) { |_| Riml::Nodes.new([]) } }
549
- ;
550
-
551
- IfBlock:
552
- Block { result = val[0] }
553
- | NEWLINE Statements ElseBlock { result = val[1] << val[2] }
554
- | NEWLINE Statements ElseifBlock { result = val[1] << val[2] }
555
- | NEWLINE Statements ElseifBlock ElseBlock { result = val[1] << val[2] << val[3] }
556
- ;
557
-
558
- ElseBlock:
559
- ELSE NEWLINE Statements { result = make_node(val) { |v| Riml::ElseNode.new(v[2]) } }
560
- ;
561
-
562
- ElseifBlock:
563
- ELSEIF Expression NEWLINE Statements { result = make_node(val) { |v| Riml::Nodes.new([Riml::ElseifNode.new(v[1], v[3])]) } }
564
- | ElseifBlock ELSEIF Expression NEWLINE Statements { result = val[0] << make_node(val) { |v| Riml::ElseifNode.new(v[2], v[4]) } }
565
- ;
566
-
567
- ClassDefinition:
568
- CLASS Scope IDENTIFIER Block END { result = make_node(val) { |v| Riml::ClassDefinitionNode.new(v[1], v[2], nil, v[3]) } }
569
- | CLASS Scope IDENTIFIER '<' Scope IDENTIFIER Block END { result = make_node(val) { |v| Riml::ClassDefinitionNode.new(v[1], v[2], (v[4] || ClassDefinitionNode::DEFAULT_SCOPE_MODIFIER) + v[5], v[6]) } }
570
- ;
571
-
572
- ObjectInstantiation:
573
- NEW ObjectInstantiationCall { result = make_node(val) { |v| Riml::ObjectInstantiationNode.new(v[1]) } }
574
- ;
575
-
576
- Super:
577
- SUPER '(' ArgListWithSplat ')' { result = make_node(val) { |v| Riml::SuperNode.new(v[2], true) } }
578
- | SUPER { result = make_node(val) { |_| Riml::SuperNode.new([], false) } }
579
- ;
580
-
581
- ExLiteral:
582
- EX_LITERAL { result = make_node(val) { |v| Riml::ExLiteralNode.new(v[0]) } }
583
- ;
584
- end
585
-
586
- ---- header
587
- require File.expand_path("../lexer", __FILE__)
588
- require File.expand_path("../nodes", __FILE__)
589
- require File.expand_path("../errors", __FILE__)
590
- require File.expand_path("../ast_rewriter", __FILE__)
591
- ---- inner
592
- # This code will be put as-is in the parser class
593
-
594
- attr_accessor :ast_rewriter
595
- attr_writer :options
596
-
597
- # The Parser and AST_Rewriter share this same hash of options
598
- def options
599
- @options ||= {}
600
- end
601
-
602
- def self.ast_cache
603
- @ast_cache
604
- end
605
- @ast_cache = {}
606
-
607
- # parses tokens or code into output nodes
608
- def parse(object, ast_rewriter = Riml::AST_Rewriter.new, filename = nil, included = false)
609
- if (ast = self.class.ast_cache[filename])
610
- else
611
- if tokens?(object)
612
- @tokens = object
613
- elsif code?(object)
614
- @lexer = Riml::Lexer.new(object, filename, true)
615
- end
616
-
617
- begin
618
- ast = do_parse
619
- rescue Racc::ParseError => e
620
- raise unless @lexer
621
- if (invalid_token = @lexer.prev_token_is_keyword?)
622
- warning = "#{invalid_token.inspect} is a keyword, and cannot " \
623
- "be used as a variable name"
624
- end
625
- error_msg = e.message
626
- error_msg << "\nWARNING: #{warning}" if warning
627
- error = Riml::ParseError.new(error_msg, @lexer.filename, @lexer.lineno)
628
- raise error
629
- end
630
- self.class.ast_cache[filename] = ast if filename
631
- end
632
- @ast_rewriter ||= ast_rewriter
633
- return ast unless @ast_rewriter
634
- @ast_rewriter.ast = ast.dup
635
- @ast_rewriter.options ||= options
636
- @ast_rewriter.rewrite(filename, included)
637
- @ast_rewriter.ast
638
- end
639
-
640
- # get the next token from either the list of tokens provided, or
641
- # the lexer getting the next token
642
- def next_token
643
- return @tokens.shift unless @lexer
644
- token = @lexer.next_token
645
- if token && @lexer.parser_info
646
- @current_parser_info = token.pop
647
- end
648
- token
649
- end
650
-
651
- private
652
-
653
- def tokens?(object)
654
- Array === object
655
- end
656
-
657
- def code?(object)
658
- String === object
659
- end
660
-
661
- def make_node(racc_val)
662
- node = yield racc_val
663
- node.parser_info = @current_parser_info
664
- node
665
- end
data/test/assets/rrconf.y DELETED
@@ -1,14 +0,0 @@
1
- # 1 s/r conflict and 1 r/r conflict
2
-
3
- class A
4
- rule
5
-
6
- target: a
7
-
8
- a :
9
- | a list
10
-
11
- list :
12
- | list ITEM
13
-
14
- end