regex-treetop 1.4.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. data/LICENSE +19 -0
  2. data/README.md +164 -0
  3. data/Rakefile +19 -0
  4. data/bin/tt +112 -0
  5. data/doc/contributing_and_planned_features.markdown +103 -0
  6. data/doc/grammar_composition.markdown +65 -0
  7. data/doc/index.markdown +90 -0
  8. data/doc/pitfalls_and_advanced_techniques.markdown +51 -0
  9. data/doc/semantic_interpretation.markdown +189 -0
  10. data/doc/site.rb +112 -0
  11. data/doc/sitegen.rb +65 -0
  12. data/doc/syntactic_recognition.markdown +100 -0
  13. data/doc/using_in_ruby.markdown +21 -0
  14. data/examples/lambda_calculus/arithmetic.rb +551 -0
  15. data/examples/lambda_calculus/arithmetic.treetop +97 -0
  16. data/examples/lambda_calculus/arithmetic_node_classes.rb +7 -0
  17. data/examples/lambda_calculus/arithmetic_test.rb +54 -0
  18. data/examples/lambda_calculus/lambda_calculus +0 -0
  19. data/examples/lambda_calculus/lambda_calculus.rb +718 -0
  20. data/examples/lambda_calculus/lambda_calculus.treetop +132 -0
  21. data/examples/lambda_calculus/lambda_calculus_node_classes.rb +5 -0
  22. data/examples/lambda_calculus/lambda_calculus_test.rb +89 -0
  23. data/examples/lambda_calculus/test_helper.rb +18 -0
  24. data/lib/treetop.rb +16 -0
  25. data/lib/treetop/bootstrap_gen_1_metagrammar.rb +45 -0
  26. data/lib/treetop/compiler.rb +6 -0
  27. data/lib/treetop/compiler/grammar_compiler.rb +44 -0
  28. data/lib/treetop/compiler/lexical_address_space.rb +17 -0
  29. data/lib/treetop/compiler/metagrammar.rb +3392 -0
  30. data/lib/treetop/compiler/metagrammar.treetop +454 -0
  31. data/lib/treetop/compiler/node_classes.rb +21 -0
  32. data/lib/treetop/compiler/node_classes/anything_symbol.rb +18 -0
  33. data/lib/treetop/compiler/node_classes/atomic_expression.rb +14 -0
  34. data/lib/treetop/compiler/node_classes/character_class.rb +28 -0
  35. data/lib/treetop/compiler/node_classes/choice.rb +31 -0
  36. data/lib/treetop/compiler/node_classes/declaration_sequence.rb +24 -0
  37. data/lib/treetop/compiler/node_classes/grammar.rb +28 -0
  38. data/lib/treetop/compiler/node_classes/inline_module.rb +27 -0
  39. data/lib/treetop/compiler/node_classes/nonterminal.rb +13 -0
  40. data/lib/treetop/compiler/node_classes/optional.rb +19 -0
  41. data/lib/treetop/compiler/node_classes/parenthesized_expression.rb +9 -0
  42. data/lib/treetop/compiler/node_classes/parsing_expression.rb +146 -0
  43. data/lib/treetop/compiler/node_classes/parsing_rule.rb +55 -0
  44. data/lib/treetop/compiler/node_classes/predicate.rb +45 -0
  45. data/lib/treetop/compiler/node_classes/predicate_block.rb +16 -0
  46. data/lib/treetop/compiler/node_classes/regex.rb +23 -0
  47. data/lib/treetop/compiler/node_classes/repetition.rb +55 -0
  48. data/lib/treetop/compiler/node_classes/sequence.rb +71 -0
  49. data/lib/treetop/compiler/node_classes/terminal.rb +20 -0
  50. data/lib/treetop/compiler/node_classes/transient_prefix.rb +9 -0
  51. data/lib/treetop/compiler/node_classes/treetop_file.rb +9 -0
  52. data/lib/treetop/compiler/ruby_builder.rb +113 -0
  53. data/lib/treetop/ruby_extensions.rb +2 -0
  54. data/lib/treetop/ruby_extensions/string.rb +42 -0
  55. data/lib/treetop/runtime.rb +5 -0
  56. data/lib/treetop/runtime/compiled_parser.rb +118 -0
  57. data/lib/treetop/runtime/interval_skip_list.rb +4 -0
  58. data/lib/treetop/runtime/interval_skip_list/head_node.rb +15 -0
  59. data/lib/treetop/runtime/interval_skip_list/interval_skip_list.rb +200 -0
  60. data/lib/treetop/runtime/interval_skip_list/node.rb +164 -0
  61. data/lib/treetop/runtime/syntax_node.rb +114 -0
  62. data/lib/treetop/runtime/terminal_parse_failure.rb +16 -0
  63. data/lib/treetop/runtime/terminal_syntax_node.rb +17 -0
  64. data/lib/treetop/version.rb +9 -0
  65. metadata +138 -0
@@ -0,0 +1,132 @@
1
+ grammar LambdaCalculus
2
+ include Arithmetic
3
+
4
+ rule program
5
+ expression more_expressions:(';' space expression)* {
6
+ def eval(env={})
7
+ env = env.clone
8
+ last_eval = nil
9
+ expressions.each do |exp|
10
+ last_eval = exp.eval(env)
11
+ end
12
+ last_eval
13
+ end
14
+
15
+ def expressions
16
+ [expression] + more_expressions.elements.map {|elt| elt.expression}
17
+ end
18
+ }
19
+ end
20
+
21
+ rule expression
22
+ definition / conditional / application / function / super
23
+ end
24
+
25
+ rule definition
26
+ 'def' space variable space expression {
27
+ def eval(env)
28
+ env[variable.name] = expression.eval(env)
29
+ end
30
+ }
31
+ end
32
+
33
+ rule conditional
34
+ 'if' space '(' space condition:expression space ')' space
35
+ true_case:expression space 'else' space false_case:expression {
36
+ def eval(env)
37
+ if condition.eval(env)
38
+ true_case.eval(env)
39
+ else
40
+ false_case.eval(env)
41
+ end
42
+ end
43
+ }
44
+ end
45
+
46
+ rule primary
47
+ application / super
48
+ end
49
+
50
+ rule application
51
+ operator space expression <Application> {
52
+ def eval(env={})
53
+ left_associative_apply(operator.eval(env), env)
54
+ end
55
+
56
+ def left_associative_apply(operator, env)
57
+ if expression.instance_of?(Application)
58
+ expression.left_associative_apply(operator.apply(expression.operator.eval(env)), env)
59
+ else
60
+ operator.apply(expression.eval(env))
61
+ end
62
+ end
63
+
64
+ def to_s(env={})
65
+ operator.to_s(env) + ' ' + expression.to_s(env)
66
+ end
67
+ }
68
+ end
69
+
70
+ rule operator
71
+ function / variable
72
+ end
73
+
74
+ rule non_application
75
+ function / variable
76
+ end
77
+
78
+ rule function
79
+ '\\' param:variable '(' body:expression ')' {
80
+ class Closure
81
+ attr_reader :env, :function
82
+
83
+ def initialize(function, env)
84
+ @function = function
85
+ @env = env
86
+ end
87
+
88
+ def apply(arg)
89
+ function.body.eval(function.param.bind(arg, env))
90
+ end
91
+
92
+ def to_s(other_env={})
93
+ "\\#{function.param.to_s}(#{function.body.to_s(other_env.merge(env))})"
94
+ end
95
+ end
96
+
97
+ def eval(env={})
98
+ Closure.new(self, env)
99
+ end
100
+
101
+ def to_s(env={})
102
+ eval(env).to_s
103
+ end
104
+ }
105
+ end
106
+
107
+ rule variable
108
+ !keyword (
109
+ super {
110
+ def bind(value, env)
111
+ env.merge(name => value)
112
+ end
113
+
114
+ def to_s(env={})
115
+ env.has_key?(name) ? env[name].to_s : name
116
+ end
117
+ }
118
+ )
119
+ end
120
+
121
+ rule keyword
122
+ ('if' / 'else') !non_space_char
123
+ end
124
+
125
+ rule non_space_char
126
+ ![ \n] .
127
+ end
128
+
129
+ rule space
130
+ [ \n]*
131
+ end
132
+ end
@@ -0,0 +1,5 @@
1
+ module LambdaCalculus
2
+ class Application < Treetop::Runtime::SyntaxNode
3
+
4
+ end
5
+ end
@@ -0,0 +1,89 @@
1
+ dir = File.dirname(__FILE__)
2
+ require File.expand_path("#{dir}/test_helper")
3
+ require File.expand_path("#{dir}/arithmetic_node_classes")
4
+ require File.expand_path("#{dir}/lambda_calculus_node_classes")
5
+ Treetop.load File.expand_path("#{dir}/arithmetic")
6
+ Treetop.load File.expand_path("#{dir}/lambda_calculus")
7
+
8
+ class Treetop::Runtime::SyntaxNode
9
+ def method_missing(method, *args)
10
+ raise "Node representing #{text_value} does not respond to #{method}"
11
+ end
12
+ end
13
+
14
+ class LambdaCalculusParserTest < Test::Unit::TestCase
15
+ include ParserTestHelper
16
+
17
+ def setup
18
+ @parser = LambdaCalculusParser.new
19
+ end
20
+
21
+ def test_free_variable
22
+ assert_equal 'x', parse('x').eval.to_s
23
+ end
24
+
25
+ def test_variable_binding
26
+ variable = parse('x').eval
27
+ env = variable.bind(1, {})
28
+ assert_equal 1, env['x']
29
+ end
30
+
31
+ def test_bound_variable_evaluation
32
+ assert_equal 1, parse('x').eval({'x' => 1})
33
+ end
34
+
35
+ def test_identity_function
36
+ assert_equal '\x(x)', parse('\x(x)').eval.to_s
37
+ end
38
+
39
+ def test_function_returning_constant_function
40
+ assert_equal '\x(\y(x))', parse('\x(\y(x))').eval.to_s
41
+ end
42
+
43
+ def test_identity_function_application
44
+ assert_equal 1, parse('\x(x) 1').eval
45
+ assert_equal '\y(y)', parse('\x(x) \y(y)').eval.to_s
46
+ end
47
+
48
+ def test_constant_function_construction
49
+ assert_equal '\y(1)', parse('\x(\y(x)) 1').eval.to_s
50
+ end
51
+
52
+ def test_multiple_argument_application_is_left_associative
53
+ assert_equal '\b(b)', parse('\x(\y(x y)) \a(a) \b(b)').eval.to_s
54
+ end
55
+
56
+ def test_parentheses_override_application_order
57
+ assert_equal '\y(\b(b) y)', parse('\x(\y(x y)) (\a(a) \b(b))').eval.to_s
58
+ end
59
+
60
+ def test_arithmetic_in_function_body
61
+ assert_equal 10, parse('\x(x + 5) 5').eval
62
+ end
63
+
64
+ def test_addition_of_function_results
65
+ assert_equal 20, parse('\x(x + 5) 5 + \x(15 - x) 5').eval
66
+ end
67
+
68
+ def test_conditional
69
+ result = parse('if (x) 1 else 2')
70
+ assert_equal 1, result.eval({'x' => true})
71
+ assert_equal 2, result.eval({'x' => false})
72
+ end
73
+
74
+ def test_keyword
75
+ assert @parser.parse('if').failure?
76
+ assert @parser.parse('else').failure?
77
+ assert parse('elsee').success?
78
+ assert parse('iff').success?
79
+ end
80
+
81
+ def test_program
82
+ result = parse('def fact \x(if (x == 0)
83
+ 1
84
+ else
85
+ x * fact (x - 1));
86
+ fact(5)').eval
87
+ assert_equal 5 * 4 * 3 * 2, result
88
+ end
89
+ end
@@ -0,0 +1,18 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require 'treetop'
4
+
5
+ module ParserTestHelper
6
+ def assert_evals_to_self(input)
7
+ assert_evals_to(input, input)
8
+ end
9
+
10
+ def parse(input)
11
+ result = @parser.parse(input)
12
+ unless result
13
+ puts @parser.terminal_failures.join("\n")
14
+ end
15
+ assert !result.nil?
16
+ result
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ require 'rubygems'
2
+
3
+ module Treetop
4
+ VALID_GRAMMAR_EXT = ['treetop', 'tt']
5
+ VALID_GRAMMAR_EXT_REGEXP = /\.(#{VALID_GRAMMAR_EXT.join('|')})\Z/o
6
+ end
7
+
8
+ dir = File.dirname(__FILE__)
9
+
10
+ TREETOP_ROOT = File.join(dir, 'treetop')
11
+ require File.join(TREETOP_ROOT, "ruby_extensions")
12
+ require File.join(TREETOP_ROOT, "runtime")
13
+ require File.join(TREETOP_ROOT, "compiler")
14
+
15
+ require 'polyglot'
16
+ Polyglot.register(Treetop::VALID_GRAMMAR_EXT, Treetop)
@@ -0,0 +1,45 @@
1
+ # This file's job is to load a Treetop::Compiler::Metagrammar and Treetop::Compiler::MetagrammarParser
2
+ # into the environment by compiling the current metagrammar.treetop using a trusted version of Treetop.
3
+
4
+ require 'rubygems'
5
+ dir = File.dirname(__FILE__)
6
+
7
+ TREETOP_VERSION_REQUIRED_TO_BOOTSTRAP = '>= 1.1.5'
8
+
9
+ # Loading trusted version of Treetop to compile the compiler
10
+ gem_spec = Gem.source_index.find_name('treetop', TREETOP_VERSION_REQUIRED_TO_BOOTSTRAP).last
11
+ raise "Install a Treetop Gem version #{TREETOP_VERSION_REQUIRED_TO_BOOTSTRAP} to bootstrap." unless gem_spec
12
+ trusted_treetop_path = gem_spec.full_gem_path
13
+ require File.join(trusted_treetop_path, 'lib', 'treetop')
14
+
15
+ # Relocating trusted version of Treetop to Trusted::Treetop
16
+ Trusted = Module.new
17
+ Trusted::Treetop = Treetop
18
+ Object.send(:remove_const, :Treetop)
19
+ Object.send(:remove_const, :TREETOP_ROOT)
20
+
21
+ # Requiring version of Treetop that is under test
22
+ $exclude_metagrammar = true
23
+ require File.expand_path(File.join(dir, '..', 'treetop'))
24
+
25
+ # Compile and evaluate freshly generated metagrammar source
26
+ METAGRAMMAR_PATH = File.join(TREETOP_ROOT, 'compiler', 'metagrammar.treetop')
27
+ compiled_metagrammar_source = Trusted::Treetop::Compiler::GrammarCompiler.new.ruby_source(METAGRAMMAR_PATH)
28
+ Object.class_eval(compiled_metagrammar_source)
29
+
30
+ # The compiler under test was compiled with the trusted grammar and therefore depends on its runtime
31
+ # But the runtime in the global namespace is the new runtime. We therefore inject the trusted runtime
32
+ # into the compiler so its parser functions correctly. It will still not work for custom classes that
33
+ # explicitly subclass the wrong runtime. For now I am working around this by keeping 1 generation of
34
+ # backward compatibility in these cases.
35
+ # Treetop::Compiler::Metagrammar.module_eval do
36
+ # include Trusted::Treetop::Runtime
37
+ # end
38
+ #
39
+ # Treetop::Compiler.send(:remove_const, :MetagrammarParser)
40
+ # class Treetop::Compiler::MetagrammarParser < Trusted::Treetop::Runtime::CompiledParser
41
+ # include Treetop::Compiler::Metagrammar
42
+ # include Trusted::Treetop::Runtime
43
+ # end
44
+
45
+ $bootstrapped_gen_1_metagrammar = true
@@ -0,0 +1,6 @@
1
+ dir = File.dirname(__FILE__)
2
+ require File.join(dir, *%w[compiler lexical_address_space])
3
+ require File.join(dir, *%w[compiler ruby_builder])
4
+ require File.join(dir, *%w[compiler node_classes])
5
+ require File.join(dir, *%w[compiler metagrammar]) unless defined?($exclude_metagrammar)
6
+ require File.join(dir, *%w[compiler grammar_compiler])
@@ -0,0 +1,44 @@
1
+ module Treetop
2
+ module Compiler
3
+ AUTOGENERATED = "# Autogenerated from a Treetop grammar. Edits may be lost.\n"
4
+ class GrammarCompiler
5
+ def compile(source_path, target_path = source_path.gsub(/\.(treetop|tt)\Z/, '.rb'))
6
+ File.open(target_path, 'w') do |target_file|
7
+ target_file.write(AUTOGENERATED+"\n\n")
8
+ target_file.write(ruby_source(source_path))
9
+ end
10
+ end
11
+
12
+ # compile a treetop file into ruby
13
+ def ruby_source(source_path)
14
+ ruby_source_from_string(File.read(source_path))
15
+ end
16
+
17
+ # compile a string containing treetop source into ruby
18
+ def ruby_source_from_string(s)
19
+ parser = MetagrammarParser.new
20
+ result = parser.parse(s)
21
+ unless result
22
+ raise RuntimeError.new(parser.failure_reason)
23
+ end
24
+ result.compile
25
+ end
26
+ end
27
+ end
28
+
29
+ # compile a treetop source file and load it
30
+ def self.load(path)
31
+ adjusted_path = path =~ /\.(treetop|tt)\Z/ ? path : path + '.treetop'
32
+ File.open(adjusted_path) do |source_file|
33
+ source = source_file.read
34
+ source.gsub!(/\b__FILE__\b/, %Q{"#{adjusted_path}"})
35
+ load_from_string(source)
36
+ end
37
+ end
38
+
39
+ # compile a treetop source string and load it
40
+ def self.load_from_string(s)
41
+ compiler = Treetop::Compiler::GrammarCompiler.new
42
+ Object.class_eval(compiler.ruby_source_from_string(s))
43
+ end
44
+ end
@@ -0,0 +1,17 @@
1
+ module Treetop
2
+ module Compiler
3
+ class LexicalAddressSpace
4
+ def initialize
5
+ reset_addresses
6
+ end
7
+
8
+ def next_address
9
+ @next_address += 1
10
+ end
11
+
12
+ def reset_addresses
13
+ @next_address = -1
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,3392 @@
1
+ module Treetop
2
+ module Compiler
3
+ module Metagrammar
4
+ include Treetop::Runtime
5
+
6
+ def root
7
+ @root || :treetop_file
8
+ end
9
+
10
+ module TreetopFile0
11
+ def require_statement
12
+ elements[1]
13
+ end
14
+ end
15
+
16
+ module TreetopFile1
17
+ def requires
18
+ elements[0]
19
+ end
20
+
21
+ def prefix
22
+ elements[1]
23
+ end
24
+
25
+ def module_or_grammar
26
+ elements[2]
27
+ end
28
+
29
+ def suffix
30
+ elements[3]
31
+ end
32
+ end
33
+
34
+ module TreetopFile2
35
+ def compile
36
+ requires.text_value + prefix.text_value + module_or_grammar.compile + suffix.text_value
37
+ end
38
+ end
39
+
40
+ def _nt_treetop_file
41
+ start_index = index
42
+ if node_cache[:treetop_file].has_key?(index)
43
+ cached = node_cache[:treetop_file][index]
44
+ @index = cached.interval.end if cached
45
+ return cached
46
+ end
47
+
48
+ i0, s0 = index, []
49
+ s1, i1 = [], index
50
+ loop do
51
+ i2, s2 = index, []
52
+ r4 = _nt_space
53
+ if r4
54
+ r3 = r4
55
+ else
56
+ r3 = instantiate_node(SyntaxNode,input, index...index)
57
+ end
58
+ s2 << r3
59
+ if r3
60
+ r5 = _nt_require_statement
61
+ s2 << r5
62
+ end
63
+ if s2.last
64
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
65
+ r2.extend(TreetopFile0)
66
+ else
67
+ @index = i2
68
+ r2 = nil
69
+ end
70
+ if r2
71
+ s1 << r2
72
+ else
73
+ break
74
+ end
75
+ end
76
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
77
+ s0 << r1
78
+ if r1
79
+ r7 = _nt_space
80
+ if r7
81
+ r6 = r7
82
+ else
83
+ r6 = instantiate_node(SyntaxNode,input, index...index)
84
+ end
85
+ s0 << r6
86
+ if r6
87
+ i8 = index
88
+ r9 = _nt_module_declaration
89
+ if r9
90
+ r8 = r9
91
+ else
92
+ r10 = _nt_grammar
93
+ if r10
94
+ r8 = r10
95
+ else
96
+ @index = i8
97
+ r8 = nil
98
+ end
99
+ end
100
+ s0 << r8
101
+ if r8
102
+ r12 = _nt_space
103
+ if r12
104
+ r11 = r12
105
+ else
106
+ r11 = instantiate_node(SyntaxNode,input, index...index)
107
+ end
108
+ s0 << r11
109
+ end
110
+ end
111
+ end
112
+ if s0.last
113
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
114
+ r0.extend(TreetopFile1)
115
+ r0.extend(TreetopFile2)
116
+ else
117
+ @index = i0
118
+ r0 = nil
119
+ end
120
+
121
+ node_cache[:treetop_file][start_index] = r0
122
+
123
+ r0
124
+ end
125
+
126
+ module RequireStatement0
127
+ def prefix
128
+ elements[0]
129
+ end
130
+
131
+ end
132
+
133
+ def _nt_require_statement
134
+ start_index = index
135
+ if node_cache[:require_statement].has_key?(index)
136
+ cached = node_cache[:require_statement][index]
137
+ @index = cached.interval.end if cached
138
+ return cached
139
+ end
140
+
141
+ i0, s0 = index, []
142
+ r2 = _nt_space
143
+ if r2
144
+ r1 = r2
145
+ else
146
+ r1 = instantiate_node(SyntaxNode,input, index...index)
147
+ end
148
+ s0 << r1
149
+ if r1
150
+ if has_terminal?("require", false, index)
151
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 7))
152
+ @index += 7
153
+ else
154
+ terminal_parse_failure("require")
155
+ r3 = nil
156
+ end
157
+ s0 << r3
158
+ if r3
159
+ s4, i4 = [], index
160
+ loop do
161
+ if has_terminal?('\G[ \\t]', true, index)
162
+ r5 = true
163
+ @index += 1
164
+ else
165
+ r5 = nil
166
+ end
167
+ if r5
168
+ s4 << r5
169
+ else
170
+ break
171
+ end
172
+ end
173
+ if s4.empty?
174
+ @index = i4
175
+ r4 = nil
176
+ else
177
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
178
+ end
179
+ s0 << r4
180
+ if r4
181
+ s6, i6 = [], index
182
+ loop do
183
+ if has_terminal?('\G[^\\n\\r]', true, index)
184
+ r7 = true
185
+ @index += 1
186
+ else
187
+ r7 = nil
188
+ end
189
+ if r7
190
+ s6 << r7
191
+ else
192
+ break
193
+ end
194
+ end
195
+ if s6.empty?
196
+ @index = i6
197
+ r6 = nil
198
+ else
199
+ r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
200
+ end
201
+ s0 << r6
202
+ if r6
203
+ if has_terminal?('\G[\\n\\r]', true, index)
204
+ r8 = true
205
+ @index += 1
206
+ else
207
+ r8 = nil
208
+ end
209
+ s0 << r8
210
+ end
211
+ end
212
+ end
213
+ end
214
+ if s0.last
215
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
216
+ r0.extend(RequireStatement0)
217
+ else
218
+ @index = i0
219
+ r0 = nil
220
+ end
221
+
222
+ node_cache[:require_statement][start_index] = r0
223
+
224
+ r0
225
+ end
226
+
227
+ module ModuleDeclaration0
228
+ def space1
229
+ elements[1]
230
+ end
231
+
232
+ def space2
233
+ elements[4]
234
+ end
235
+ end
236
+
237
+ module ModuleDeclaration1
238
+ def space
239
+ elements[0]
240
+ end
241
+
242
+ end
243
+
244
+ module ModuleDeclaration2
245
+ def prefix
246
+ elements[0]
247
+ end
248
+
249
+ def module_contents
250
+ elements[1]
251
+ end
252
+
253
+ def suffix
254
+ elements[2]
255
+ end
256
+ end
257
+
258
+ module ModuleDeclaration3
259
+ def compile
260
+ prefix.text_value + module_contents.compile + suffix.text_value
261
+ end
262
+ end
263
+
264
+ def _nt_module_declaration
265
+ start_index = index
266
+ if node_cache[:module_declaration].has_key?(index)
267
+ cached = node_cache[:module_declaration][index]
268
+ @index = cached.interval.end if cached
269
+ return cached
270
+ end
271
+
272
+ i0, s0 = index, []
273
+ i1, s1 = index, []
274
+ if has_terminal?('module', false, index)
275
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 6))
276
+ @index += 6
277
+ else
278
+ terminal_parse_failure('module')
279
+ r2 = nil
280
+ end
281
+ s1 << r2
282
+ if r2
283
+ r3 = _nt_space
284
+ s1 << r3
285
+ if r3
286
+ if has_terminal?('\G[A-Z]', true, index)
287
+ r4 = true
288
+ @index += 1
289
+ else
290
+ r4 = nil
291
+ end
292
+ s1 << r4
293
+ if r4
294
+ s5, i5 = [], index
295
+ loop do
296
+ r6 = _nt_alphanumeric_char
297
+ if r6
298
+ s5 << r6
299
+ else
300
+ break
301
+ end
302
+ end
303
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
304
+ s1 << r5
305
+ if r5
306
+ r7 = _nt_space
307
+ s1 << r7
308
+ end
309
+ end
310
+ end
311
+ end
312
+ if s1.last
313
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
314
+ r1.extend(ModuleDeclaration0)
315
+ else
316
+ @index = i1
317
+ r1 = nil
318
+ end
319
+ s0 << r1
320
+ if r1
321
+ i8 = index
322
+ r9 = _nt_module_declaration
323
+ if r9
324
+ r8 = r9
325
+ else
326
+ r10 = _nt_grammar
327
+ if r10
328
+ r8 = r10
329
+ else
330
+ @index = i8
331
+ r8 = nil
332
+ end
333
+ end
334
+ s0 << r8
335
+ if r8
336
+ i11, s11 = index, []
337
+ r12 = _nt_space
338
+ s11 << r12
339
+ if r12
340
+ if has_terminal?('end', false, index)
341
+ r13 = instantiate_node(SyntaxNode,input, index...(index + 3))
342
+ @index += 3
343
+ else
344
+ terminal_parse_failure('end')
345
+ r13 = nil
346
+ end
347
+ s11 << r13
348
+ end
349
+ if s11.last
350
+ r11 = instantiate_node(SyntaxNode,input, i11...index, s11)
351
+ r11.extend(ModuleDeclaration1)
352
+ else
353
+ @index = i11
354
+ r11 = nil
355
+ end
356
+ s0 << r11
357
+ end
358
+ end
359
+ if s0.last
360
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
361
+ r0.extend(ModuleDeclaration2)
362
+ r0.extend(ModuleDeclaration3)
363
+ else
364
+ @index = i0
365
+ r0 = nil
366
+ end
367
+
368
+ node_cache[:module_declaration][start_index] = r0
369
+
370
+ r0
371
+ end
372
+
373
+ module Grammar0
374
+ def space
375
+ elements[1]
376
+ end
377
+ end
378
+
379
+ module Grammar1
380
+ def space1
381
+ elements[1]
382
+ end
383
+
384
+ def grammar_name
385
+ elements[2]
386
+ end
387
+
388
+ def space2
389
+ elements[3]
390
+ end
391
+
392
+ def declaration_sequence
393
+ elements[5]
394
+ end
395
+
396
+ end
397
+
398
+ def _nt_grammar
399
+ start_index = index
400
+ if node_cache[:grammar].has_key?(index)
401
+ cached = node_cache[:grammar][index]
402
+ @index = cached.interval.end if cached
403
+ return cached
404
+ end
405
+
406
+ i0, s0 = index, []
407
+ if has_terminal?('grammar', false, index)
408
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 7))
409
+ @index += 7
410
+ else
411
+ terminal_parse_failure('grammar')
412
+ r1 = nil
413
+ end
414
+ s0 << r1
415
+ if r1
416
+ r2 = _nt_space
417
+ s0 << r2
418
+ if r2
419
+ r3 = _nt_grammar_name
420
+ s0 << r3
421
+ if r3
422
+ r4 = _nt_space
423
+ s0 << r4
424
+ if r4
425
+ i6, s6 = index, []
426
+ if has_terminal?('do', false, index)
427
+ r7 = instantiate_node(SyntaxNode,input, index...(index + 2))
428
+ @index += 2
429
+ else
430
+ terminal_parse_failure('do')
431
+ r7 = nil
432
+ end
433
+ s6 << r7
434
+ if r7
435
+ r8 = _nt_space
436
+ s6 << r8
437
+ end
438
+ if s6.last
439
+ r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
440
+ r6.extend(Grammar0)
441
+ else
442
+ @index = i6
443
+ r6 = nil
444
+ end
445
+ if r6
446
+ r5 = r6
447
+ else
448
+ r5 = instantiate_node(SyntaxNode,input, index...index)
449
+ end
450
+ s0 << r5
451
+ if r5
452
+ r9 = _nt_declaration_sequence
453
+ s0 << r9
454
+ if r9
455
+ r11 = _nt_space
456
+ if r11
457
+ r10 = r11
458
+ else
459
+ r10 = instantiate_node(SyntaxNode,input, index...index)
460
+ end
461
+ s0 << r10
462
+ if r10
463
+ if has_terminal?('end', false, index)
464
+ r12 = instantiate_node(SyntaxNode,input, index...(index + 3))
465
+ @index += 3
466
+ else
467
+ terminal_parse_failure('end')
468
+ r12 = nil
469
+ end
470
+ s0 << r12
471
+ end
472
+ end
473
+ end
474
+ end
475
+ end
476
+ end
477
+ end
478
+ if s0.last
479
+ r0 = instantiate_node(Grammar,input, i0...index, s0)
480
+ r0.extend(Grammar1)
481
+ else
482
+ @index = i0
483
+ r0 = nil
484
+ end
485
+
486
+ node_cache[:grammar][start_index] = r0
487
+
488
+ r0
489
+ end
490
+
491
+ module GrammarName0
492
+ end
493
+
494
+ def _nt_grammar_name
495
+ start_index = index
496
+ if node_cache[:grammar_name].has_key?(index)
497
+ cached = node_cache[:grammar_name][index]
498
+ @index = cached.interval.end if cached
499
+ return cached
500
+ end
501
+
502
+ i0, s0 = index, []
503
+ if has_terminal?('\G[A-Z]', true, index)
504
+ r1 = true
505
+ @index += 1
506
+ else
507
+ r1 = nil
508
+ end
509
+ s0 << r1
510
+ if r1
511
+ s2, i2 = [], index
512
+ loop do
513
+ r3 = _nt_alphanumeric_char
514
+ if r3
515
+ s2 << r3
516
+ else
517
+ break
518
+ end
519
+ end
520
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
521
+ s0 << r2
522
+ end
523
+ if s0.last
524
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
525
+ r0.extend(GrammarName0)
526
+ else
527
+ @index = i0
528
+ r0 = nil
529
+ end
530
+
531
+ node_cache[:grammar_name][start_index] = r0
532
+
533
+ r0
534
+ end
535
+
536
+ module DeclarationSequence0
537
+ def space
538
+ elements[0]
539
+ end
540
+
541
+ def declaration
542
+ elements[1]
543
+ end
544
+ end
545
+
546
+ module DeclarationSequence1
547
+ def head
548
+ elements[0]
549
+ end
550
+
551
+ def tail
552
+ elements[1]
553
+ end
554
+ end
555
+
556
+ module DeclarationSequence2
557
+ def declarations
558
+ [head] + tail
559
+ end
560
+
561
+ def tail
562
+ super.elements.map { |elt| elt.declaration }
563
+ end
564
+ end
565
+
566
+ module DeclarationSequence3
567
+ def compile(builder)
568
+ end
569
+ end
570
+
571
+ def _nt_declaration_sequence
572
+ start_index = index
573
+ if node_cache[:declaration_sequence].has_key?(index)
574
+ cached = node_cache[:declaration_sequence][index]
575
+ @index = cached.interval.end if cached
576
+ return cached
577
+ end
578
+
579
+ i0 = index
580
+ i1, s1 = index, []
581
+ r2 = _nt_declaration
582
+ s1 << r2
583
+ if r2
584
+ s3, i3 = [], index
585
+ loop do
586
+ i4, s4 = index, []
587
+ r5 = _nt_space
588
+ s4 << r5
589
+ if r5
590
+ r6 = _nt_declaration
591
+ s4 << r6
592
+ end
593
+ if s4.last
594
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
595
+ r4.extend(DeclarationSequence0)
596
+ else
597
+ @index = i4
598
+ r4 = nil
599
+ end
600
+ if r4
601
+ s3 << r4
602
+ else
603
+ break
604
+ end
605
+ end
606
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
607
+ s1 << r3
608
+ end
609
+ if s1.last
610
+ r1 = instantiate_node(DeclarationSequence,input, i1...index, s1)
611
+ r1.extend(DeclarationSequence1)
612
+ r1.extend(DeclarationSequence2)
613
+ else
614
+ @index = i1
615
+ r1 = nil
616
+ end
617
+ if r1
618
+ r0 = r1
619
+ else
620
+ if has_terminal?('', false, index)
621
+ r7 = instantiate_node(SyntaxNode,input, index...(index + 0))
622
+ r7.extend(DeclarationSequence3)
623
+ @index += 0
624
+ else
625
+ terminal_parse_failure('')
626
+ r7 = nil
627
+ end
628
+ if r7
629
+ r0 = r7
630
+ else
631
+ @index = i0
632
+ r0 = nil
633
+ end
634
+ end
635
+
636
+ node_cache[:declaration_sequence][start_index] = r0
637
+
638
+ r0
639
+ end
640
+
641
+ def _nt_declaration
642
+ start_index = index
643
+ if node_cache[:declaration].has_key?(index)
644
+ cached = node_cache[:declaration][index]
645
+ @index = cached.interval.end if cached
646
+ return cached
647
+ end
648
+
649
+ i0 = index
650
+ r1 = _nt_parsing_rule
651
+ if r1
652
+ r0 = r1
653
+ else
654
+ r2 = _nt_include_declaration
655
+ if r2
656
+ r0 = r2
657
+ else
658
+ @index = i0
659
+ r0 = nil
660
+ end
661
+ end
662
+
663
+ node_cache[:declaration][start_index] = r0
664
+
665
+ r0
666
+ end
667
+
668
+ module IncludeDeclaration0
669
+ def space
670
+ elements[1]
671
+ end
672
+
673
+ end
674
+
675
+ module IncludeDeclaration1
676
+ def compile(builder)
677
+ builder << text_value
678
+ end
679
+ end
680
+
681
+ def _nt_include_declaration
682
+ start_index = index
683
+ if node_cache[:include_declaration].has_key?(index)
684
+ cached = node_cache[:include_declaration][index]
685
+ @index = cached.interval.end if cached
686
+ return cached
687
+ end
688
+
689
+ i0, s0 = index, []
690
+ if has_terminal?('include', false, index)
691
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 7))
692
+ @index += 7
693
+ else
694
+ terminal_parse_failure('include')
695
+ r1 = nil
696
+ end
697
+ s0 << r1
698
+ if r1
699
+ r2 = _nt_space
700
+ s0 << r2
701
+ if r2
702
+ if has_terminal?('\G[A-Z]', true, index)
703
+ r3 = true
704
+ @index += 1
705
+ else
706
+ r3 = nil
707
+ end
708
+ s0 << r3
709
+ if r3
710
+ s4, i4 = [], index
711
+ loop do
712
+ i5 = index
713
+ r6 = _nt_alphanumeric_char
714
+ if r6
715
+ r5 = r6
716
+ else
717
+ if has_terminal?('::', false, index)
718
+ r7 = instantiate_node(SyntaxNode,input, index...(index + 2))
719
+ @index += 2
720
+ else
721
+ terminal_parse_failure('::')
722
+ r7 = nil
723
+ end
724
+ if r7
725
+ r5 = r7
726
+ else
727
+ @index = i5
728
+ r5 = nil
729
+ end
730
+ end
731
+ if r5
732
+ s4 << r5
733
+ else
734
+ break
735
+ end
736
+ end
737
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
738
+ s0 << r4
739
+ end
740
+ end
741
+ end
742
+ if s0.last
743
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
744
+ r0.extend(IncludeDeclaration0)
745
+ r0.extend(IncludeDeclaration1)
746
+ else
747
+ @index = i0
748
+ r0 = nil
749
+ end
750
+
751
+ node_cache[:include_declaration][start_index] = r0
752
+
753
+ r0
754
+ end
755
+
756
+ module ParsingRule0
757
+ def space
758
+ elements[1]
759
+ end
760
+ end
761
+
762
+ module ParsingRule1
763
+ def space1
764
+ elements[1]
765
+ end
766
+
767
+ def nonterminal
768
+ elements[2]
769
+ end
770
+
771
+ def space2
772
+ elements[3]
773
+ end
774
+
775
+ def parsing_expression
776
+ elements[5]
777
+ end
778
+
779
+ def space3
780
+ elements[6]
781
+ end
782
+
783
+ end
784
+
785
+ def _nt_parsing_rule
786
+ start_index = index
787
+ if node_cache[:parsing_rule].has_key?(index)
788
+ cached = node_cache[:parsing_rule][index]
789
+ @index = cached.interval.end if cached
790
+ return cached
791
+ end
792
+
793
+ i0, s0 = index, []
794
+ if has_terminal?('rule', false, index)
795
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 4))
796
+ @index += 4
797
+ else
798
+ terminal_parse_failure('rule')
799
+ r1 = nil
800
+ end
801
+ s0 << r1
802
+ if r1
803
+ r2 = _nt_space
804
+ s0 << r2
805
+ if r2
806
+ r3 = _nt_nonterminal
807
+ s0 << r3
808
+ if r3
809
+ r4 = _nt_space
810
+ s0 << r4
811
+ if r4
812
+ i6, s6 = index, []
813
+ if has_terminal?('do', false, index)
814
+ r7 = instantiate_node(SyntaxNode,input, index...(index + 2))
815
+ @index += 2
816
+ else
817
+ terminal_parse_failure('do')
818
+ r7 = nil
819
+ end
820
+ s6 << r7
821
+ if r7
822
+ r8 = _nt_space
823
+ s6 << r8
824
+ end
825
+ if s6.last
826
+ r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
827
+ r6.extend(ParsingRule0)
828
+ else
829
+ @index = i6
830
+ r6 = nil
831
+ end
832
+ if r6
833
+ r5 = r6
834
+ else
835
+ r5 = instantiate_node(SyntaxNode,input, index...index)
836
+ end
837
+ s0 << r5
838
+ if r5
839
+ r9 = _nt_parsing_expression
840
+ s0 << r9
841
+ if r9
842
+ r10 = _nt_space
843
+ s0 << r10
844
+ if r10
845
+ if has_terminal?('end', false, index)
846
+ r11 = instantiate_node(SyntaxNode,input, index...(index + 3))
847
+ @index += 3
848
+ else
849
+ terminal_parse_failure('end')
850
+ r11 = nil
851
+ end
852
+ s0 << r11
853
+ end
854
+ end
855
+ end
856
+ end
857
+ end
858
+ end
859
+ end
860
+ if s0.last
861
+ r0 = instantiate_node(ParsingRule,input, i0...index, s0)
862
+ r0.extend(ParsingRule1)
863
+ else
864
+ @index = i0
865
+ r0 = nil
866
+ end
867
+
868
+ node_cache[:parsing_rule][start_index] = r0
869
+
870
+ r0
871
+ end
872
+
873
+ def _nt_parsing_expression
874
+ start_index = index
875
+ if node_cache[:parsing_expression].has_key?(index)
876
+ cached = node_cache[:parsing_expression][index]
877
+ @index = cached.interval.end if cached
878
+ return cached
879
+ end
880
+
881
+ i0 = index
882
+ r1 = _nt_choice
883
+ if r1
884
+ r0 = r1
885
+ else
886
+ r2 = _nt_sequence
887
+ if r2
888
+ r0 = r2
889
+ else
890
+ r3 = _nt_primary
891
+ if r3
892
+ r0 = r3
893
+ else
894
+ @index = i0
895
+ r0 = nil
896
+ end
897
+ end
898
+ end
899
+
900
+ node_cache[:parsing_expression][start_index] = r0
901
+
902
+ r0
903
+ end
904
+
905
+ module Choice0
906
+ def alternative
907
+ elements[3]
908
+ end
909
+ end
910
+
911
+ module Choice1
912
+ def head
913
+ elements[0]
914
+ end
915
+
916
+ def tail
917
+ elements[1]
918
+ end
919
+ end
920
+
921
+ module Choice2
922
+ def alternatives
923
+ [head] + tail
924
+ end
925
+
926
+ def tail
927
+ super.elements.map {|elt| elt.alternative}
928
+ end
929
+
930
+ def inline_modules
931
+ (alternatives.map {|alt| alt.inline_modules }).flatten
932
+ end
933
+ end
934
+
935
+ def _nt_choice
936
+ start_index = index
937
+ if node_cache[:choice].has_key?(index)
938
+ cached = node_cache[:choice][index]
939
+ @index = cached.interval.end if cached
940
+ return cached
941
+ end
942
+
943
+ i0, s0 = index, []
944
+ r1 = _nt_alternative
945
+ s0 << r1
946
+ if r1
947
+ s2, i2 = [], index
948
+ loop do
949
+ i3, s3 = index, []
950
+ r5 = _nt_space
951
+ if r5
952
+ r4 = r5
953
+ else
954
+ r4 = instantiate_node(SyntaxNode,input, index...index)
955
+ end
956
+ s3 << r4
957
+ if r4
958
+ if has_terminal?('/', false, index)
959
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
960
+ @index += 1
961
+ else
962
+ terminal_parse_failure('/')
963
+ r6 = nil
964
+ end
965
+ s3 << r6
966
+ if r6
967
+ r8 = _nt_space
968
+ if r8
969
+ r7 = r8
970
+ else
971
+ r7 = instantiate_node(SyntaxNode,input, index...index)
972
+ end
973
+ s3 << r7
974
+ if r7
975
+ r9 = _nt_alternative
976
+ s3 << r9
977
+ end
978
+ end
979
+ end
980
+ if s3.last
981
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
982
+ r3.extend(Choice0)
983
+ else
984
+ @index = i3
985
+ r3 = nil
986
+ end
987
+ if r3
988
+ s2 << r3
989
+ else
990
+ break
991
+ end
992
+ end
993
+ if s2.empty?
994
+ @index = i2
995
+ r2 = nil
996
+ else
997
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
998
+ end
999
+ s0 << r2
1000
+ end
1001
+ if s0.last
1002
+ r0 = instantiate_node(Choice,input, i0...index, s0)
1003
+ r0.extend(Choice1)
1004
+ r0.extend(Choice2)
1005
+ else
1006
+ @index = i0
1007
+ r0 = nil
1008
+ end
1009
+
1010
+ node_cache[:choice][start_index] = r0
1011
+
1012
+ r0
1013
+ end
1014
+
1015
+ module Sequence0
1016
+ def space
1017
+ elements[0]
1018
+ end
1019
+
1020
+ def labeled_sequence_primary
1021
+ elements[1]
1022
+ end
1023
+ end
1024
+
1025
+ module Sequence1
1026
+ def head
1027
+ elements[0]
1028
+ end
1029
+
1030
+ def tail
1031
+ elements[1]
1032
+ end
1033
+
1034
+ def node_class_declarations
1035
+ elements[2]
1036
+ end
1037
+ end
1038
+
1039
+ module Sequence2
1040
+ def sequence_elements
1041
+ [head] + tail
1042
+ end
1043
+
1044
+ def tail
1045
+ super.elements.map {|elt| elt.labeled_sequence_primary }
1046
+ end
1047
+
1048
+ def inline_modules
1049
+ (sequence_elements.map {|elt| elt.inline_modules}).flatten +
1050
+ [sequence_element_accessor_module] +
1051
+ node_class_declarations.inline_modules
1052
+ end
1053
+
1054
+ def inline_module_name
1055
+ node_class_declarations.inline_module_name
1056
+ end
1057
+ end
1058
+
1059
+ def _nt_sequence
1060
+ start_index = index
1061
+ if node_cache[:sequence].has_key?(index)
1062
+ cached = node_cache[:sequence][index]
1063
+ @index = cached.interval.end if cached
1064
+ return cached
1065
+ end
1066
+
1067
+ i0, s0 = index, []
1068
+ r1 = _nt_labeled_sequence_primary
1069
+ s0 << r1
1070
+ if r1
1071
+ s2, i2 = [], index
1072
+ loop do
1073
+ i3, s3 = index, []
1074
+ r4 = _nt_space
1075
+ s3 << r4
1076
+ if r4
1077
+ r5 = _nt_labeled_sequence_primary
1078
+ s3 << r5
1079
+ end
1080
+ if s3.last
1081
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
1082
+ r3.extend(Sequence0)
1083
+ else
1084
+ @index = i3
1085
+ r3 = nil
1086
+ end
1087
+ if r3
1088
+ s2 << r3
1089
+ else
1090
+ break
1091
+ end
1092
+ end
1093
+ if s2.empty?
1094
+ @index = i2
1095
+ r2 = nil
1096
+ else
1097
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
1098
+ end
1099
+ s0 << r2
1100
+ if r2
1101
+ r6 = _nt_node_class_declarations
1102
+ s0 << r6
1103
+ end
1104
+ end
1105
+ if s0.last
1106
+ r0 = instantiate_node(Sequence,input, i0...index, s0)
1107
+ r0.extend(Sequence1)
1108
+ r0.extend(Sequence2)
1109
+ else
1110
+ @index = i0
1111
+ r0 = nil
1112
+ end
1113
+
1114
+ node_cache[:sequence][start_index] = r0
1115
+
1116
+ r0
1117
+ end
1118
+
1119
+ def _nt_alternative
1120
+ start_index = index
1121
+ if node_cache[:alternative].has_key?(index)
1122
+ cached = node_cache[:alternative][index]
1123
+ @index = cached.interval.end if cached
1124
+ return cached
1125
+ end
1126
+
1127
+ i0 = index
1128
+ r1 = _nt_sequence
1129
+ if r1
1130
+ r0 = r1
1131
+ else
1132
+ r2 = _nt_primary
1133
+ if r2
1134
+ r0 = r2
1135
+ else
1136
+ @index = i0
1137
+ r0 = nil
1138
+ end
1139
+ end
1140
+
1141
+ node_cache[:alternative][start_index] = r0
1142
+
1143
+ r0
1144
+ end
1145
+
1146
+ module Primary0
1147
+ def prefix
1148
+ elements[0]
1149
+ end
1150
+
1151
+ def atomic
1152
+ elements[1]
1153
+ end
1154
+ end
1155
+
1156
+ module Primary1
1157
+ def compile(address, builder, parent_expression=nil)
1158
+ prefix.compile(address, builder, self)
1159
+ end
1160
+
1161
+ def prefixed_expression
1162
+ atomic
1163
+ end
1164
+
1165
+ def inline_modules
1166
+ atomic.inline_modules
1167
+ end
1168
+
1169
+ def inline_module_name
1170
+ nil
1171
+ end
1172
+ end
1173
+
1174
+ module Primary2
1175
+ def prefix
1176
+ elements[0]
1177
+ end
1178
+
1179
+ def predicate_block
1180
+ elements[2]
1181
+ end
1182
+ end
1183
+
1184
+ module Primary3
1185
+ def compile(address, builder, parent_expression=nil)
1186
+ prefix.compile(address, builder, self)
1187
+ end
1188
+ def prefixed_expression
1189
+ predicate_block
1190
+ end
1191
+ def inline_modules
1192
+ []
1193
+ end
1194
+ end
1195
+
1196
+ module Primary4
1197
+ def atomic
1198
+ elements[0]
1199
+ end
1200
+
1201
+ def suffix
1202
+ elements[1]
1203
+ end
1204
+
1205
+ def node_class_declarations
1206
+ elements[2]
1207
+ end
1208
+ end
1209
+
1210
+ module Primary5
1211
+ def compile(address, builder, parent_expression=nil)
1212
+ suffix.compile(address, builder, self)
1213
+ end
1214
+
1215
+ def optional_expression
1216
+ atomic
1217
+ end
1218
+
1219
+ def node_class_name
1220
+ node_class_declarations.node_class_name
1221
+ end
1222
+
1223
+ def inline_modules
1224
+ atomic.inline_modules + node_class_declarations.inline_modules
1225
+ end
1226
+
1227
+ def inline_module_name
1228
+ node_class_declarations.inline_module_name
1229
+ end
1230
+ end
1231
+
1232
+ module Primary6
1233
+ def atomic
1234
+ elements[0]
1235
+ end
1236
+
1237
+ def node_class_declarations
1238
+ elements[1]
1239
+ end
1240
+ end
1241
+
1242
+ module Primary7
1243
+ def compile(address, builder, parent_expression=nil)
1244
+ atomic.compile(address, builder, self)
1245
+ end
1246
+
1247
+ def node_class_name
1248
+ node_class_declarations.node_class_name
1249
+ end
1250
+
1251
+ def inline_modules
1252
+ atomic.inline_modules + node_class_declarations.inline_modules
1253
+ end
1254
+
1255
+ def inline_module_name
1256
+ node_class_declarations.inline_module_name
1257
+ end
1258
+ end
1259
+
1260
+ def _nt_primary
1261
+ start_index = index
1262
+ if node_cache[:primary].has_key?(index)
1263
+ cached = node_cache[:primary][index]
1264
+ @index = cached.interval.end if cached
1265
+ return cached
1266
+ end
1267
+
1268
+ i0 = index
1269
+ i1, s1 = index, []
1270
+ r2 = _nt_prefix
1271
+ s1 << r2
1272
+ if r2
1273
+ r3 = _nt_atomic
1274
+ s1 << r3
1275
+ end
1276
+ if s1.last
1277
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
1278
+ r1.extend(Primary0)
1279
+ r1.extend(Primary1)
1280
+ else
1281
+ @index = i1
1282
+ r1 = nil
1283
+ end
1284
+ if r1
1285
+ r0 = r1
1286
+ else
1287
+ i4, s4 = index, []
1288
+ r5 = _nt_prefix
1289
+ s4 << r5
1290
+ if r5
1291
+ r7 = _nt_space
1292
+ if r7
1293
+ r6 = r7
1294
+ else
1295
+ r6 = instantiate_node(SyntaxNode,input, index...index)
1296
+ end
1297
+ s4 << r6
1298
+ if r6
1299
+ r8 = _nt_predicate_block
1300
+ s4 << r8
1301
+ end
1302
+ end
1303
+ if s4.last
1304
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
1305
+ r4.extend(Primary2)
1306
+ r4.extend(Primary3)
1307
+ else
1308
+ @index = i4
1309
+ r4 = nil
1310
+ end
1311
+ if r4
1312
+ r0 = r4
1313
+ else
1314
+ i9, s9 = index, []
1315
+ r10 = _nt_atomic
1316
+ s9 << r10
1317
+ if r10
1318
+ r11 = _nt_suffix
1319
+ s9 << r11
1320
+ if r11
1321
+ r12 = _nt_node_class_declarations
1322
+ s9 << r12
1323
+ end
1324
+ end
1325
+ if s9.last
1326
+ r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
1327
+ r9.extend(Primary4)
1328
+ r9.extend(Primary5)
1329
+ else
1330
+ @index = i9
1331
+ r9 = nil
1332
+ end
1333
+ if r9
1334
+ r0 = r9
1335
+ else
1336
+ i13, s13 = index, []
1337
+ r14 = _nt_atomic
1338
+ s13 << r14
1339
+ if r14
1340
+ r15 = _nt_node_class_declarations
1341
+ s13 << r15
1342
+ end
1343
+ if s13.last
1344
+ r13 = instantiate_node(SyntaxNode,input, i13...index, s13)
1345
+ r13.extend(Primary6)
1346
+ r13.extend(Primary7)
1347
+ else
1348
+ @index = i13
1349
+ r13 = nil
1350
+ end
1351
+ if r13
1352
+ r0 = r13
1353
+ else
1354
+ @index = i0
1355
+ r0 = nil
1356
+ end
1357
+ end
1358
+ end
1359
+ end
1360
+
1361
+ node_cache[:primary][start_index] = r0
1362
+
1363
+ r0
1364
+ end
1365
+
1366
+ module LabeledSequencePrimary0
1367
+ def label
1368
+ elements[0]
1369
+ end
1370
+
1371
+ def sequence_primary
1372
+ elements[1]
1373
+ end
1374
+ end
1375
+
1376
+ module LabeledSequencePrimary1
1377
+ def compile(lexical_address, builder)
1378
+ sequence_primary.compile(lexical_address, builder)
1379
+ end
1380
+
1381
+ def inline_modules
1382
+ sequence_primary.inline_modules
1383
+ end
1384
+
1385
+ def label_name
1386
+ if label.name
1387
+ label.name
1388
+ elsif sequence_primary.instance_of?(Nonterminal)
1389
+ sequence_primary.text_value
1390
+ else
1391
+ nil
1392
+ end
1393
+ end
1394
+ end
1395
+
1396
+ def _nt_labeled_sequence_primary
1397
+ start_index = index
1398
+ if node_cache[:labeled_sequence_primary].has_key?(index)
1399
+ cached = node_cache[:labeled_sequence_primary][index]
1400
+ @index = cached.interval.end if cached
1401
+ return cached
1402
+ end
1403
+
1404
+ i0, s0 = index, []
1405
+ r1 = _nt_label
1406
+ s0 << r1
1407
+ if r1
1408
+ r2 = _nt_sequence_primary
1409
+ s0 << r2
1410
+ end
1411
+ if s0.last
1412
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1413
+ r0.extend(LabeledSequencePrimary0)
1414
+ r0.extend(LabeledSequencePrimary1)
1415
+ else
1416
+ @index = i0
1417
+ r0 = nil
1418
+ end
1419
+
1420
+ node_cache[:labeled_sequence_primary][start_index] = r0
1421
+
1422
+ r0
1423
+ end
1424
+
1425
+ module Label0
1426
+ def alpha_char
1427
+ elements[0]
1428
+ end
1429
+
1430
+ end
1431
+
1432
+ module Label1
1433
+ end
1434
+
1435
+ module Label2
1436
+ def name
1437
+ elements[0].text_value
1438
+ end
1439
+ end
1440
+
1441
+ module Label3
1442
+ def name
1443
+ nil
1444
+ end
1445
+ end
1446
+
1447
+ def _nt_label
1448
+ start_index = index
1449
+ if node_cache[:label].has_key?(index)
1450
+ cached = node_cache[:label][index]
1451
+ @index = cached.interval.end if cached
1452
+ return cached
1453
+ end
1454
+
1455
+ i0 = index
1456
+ i1, s1 = index, []
1457
+ i2, s2 = index, []
1458
+ r3 = _nt_alpha_char
1459
+ s2 << r3
1460
+ if r3
1461
+ s4, i4 = [], index
1462
+ loop do
1463
+ r5 = _nt_alphanumeric_char
1464
+ if r5
1465
+ s4 << r5
1466
+ else
1467
+ break
1468
+ end
1469
+ end
1470
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
1471
+ s2 << r4
1472
+ end
1473
+ if s2.last
1474
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
1475
+ r2.extend(Label0)
1476
+ else
1477
+ @index = i2
1478
+ r2 = nil
1479
+ end
1480
+ s1 << r2
1481
+ if r2
1482
+ if has_terminal?(':', false, index)
1483
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
1484
+ @index += 1
1485
+ else
1486
+ terminal_parse_failure(':')
1487
+ r6 = nil
1488
+ end
1489
+ s1 << r6
1490
+ end
1491
+ if s1.last
1492
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
1493
+ r1.extend(Label1)
1494
+ r1.extend(Label2)
1495
+ else
1496
+ @index = i1
1497
+ r1 = nil
1498
+ end
1499
+ if r1
1500
+ r0 = r1
1501
+ else
1502
+ if has_terminal?('', false, index)
1503
+ r7 = instantiate_node(SyntaxNode,input, index...(index + 0))
1504
+ r7.extend(Label3)
1505
+ @index += 0
1506
+ else
1507
+ terminal_parse_failure('')
1508
+ r7 = nil
1509
+ end
1510
+ if r7
1511
+ r0 = r7
1512
+ else
1513
+ @index = i0
1514
+ r0 = nil
1515
+ end
1516
+ end
1517
+
1518
+ node_cache[:label][start_index] = r0
1519
+
1520
+ r0
1521
+ end
1522
+
1523
+ module SequencePrimary0
1524
+ def prefix
1525
+ elements[0]
1526
+ end
1527
+
1528
+ def atomic
1529
+ elements[1]
1530
+ end
1531
+ end
1532
+
1533
+ module SequencePrimary1
1534
+ def compile(lexical_address, builder)
1535
+ prefix.compile(lexical_address, builder, self)
1536
+ end
1537
+
1538
+ def prefixed_expression
1539
+ elements[1]
1540
+ end
1541
+
1542
+ def inline_modules
1543
+ atomic.inline_modules
1544
+ end
1545
+
1546
+ def inline_module_name
1547
+ nil
1548
+ end
1549
+ end
1550
+
1551
+ module SequencePrimary2
1552
+ def prefix
1553
+ elements[0]
1554
+ end
1555
+
1556
+ def predicate_block
1557
+ elements[2]
1558
+ end
1559
+ end
1560
+
1561
+ module SequencePrimary3
1562
+ def compile(address, builder, parent_expression=nil)
1563
+ prefix.compile(address, builder, self)
1564
+ end
1565
+ def prefixed_expression
1566
+ predicate_block
1567
+ end
1568
+ def inline_modules
1569
+ []
1570
+ end
1571
+ end
1572
+
1573
+ module SequencePrimary4
1574
+ def atomic
1575
+ elements[0]
1576
+ end
1577
+
1578
+ def suffix
1579
+ elements[1]
1580
+ end
1581
+ end
1582
+
1583
+ module SequencePrimary5
1584
+ def compile(lexical_address, builder)
1585
+ suffix.compile(lexical_address, builder, self)
1586
+ end
1587
+
1588
+ def node_class_name
1589
+ nil
1590
+ end
1591
+
1592
+ def inline_modules
1593
+ atomic.inline_modules
1594
+ end
1595
+
1596
+ def inline_module_name
1597
+ nil
1598
+ end
1599
+ end
1600
+
1601
+ def _nt_sequence_primary
1602
+ start_index = index
1603
+ if node_cache[:sequence_primary].has_key?(index)
1604
+ cached = node_cache[:sequence_primary][index]
1605
+ @index = cached.interval.end if cached
1606
+ return cached
1607
+ end
1608
+
1609
+ i0 = index
1610
+ i1, s1 = index, []
1611
+ r2 = _nt_prefix
1612
+ s1 << r2
1613
+ if r2
1614
+ r3 = _nt_atomic
1615
+ s1 << r3
1616
+ end
1617
+ if s1.last
1618
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
1619
+ r1.extend(SequencePrimary0)
1620
+ r1.extend(SequencePrimary1)
1621
+ else
1622
+ @index = i1
1623
+ r1 = nil
1624
+ end
1625
+ if r1
1626
+ r0 = r1
1627
+ else
1628
+ i4, s4 = index, []
1629
+ r5 = _nt_prefix
1630
+ s4 << r5
1631
+ if r5
1632
+ r7 = _nt_space
1633
+ if r7
1634
+ r6 = r7
1635
+ else
1636
+ r6 = instantiate_node(SyntaxNode,input, index...index)
1637
+ end
1638
+ s4 << r6
1639
+ if r6
1640
+ r8 = _nt_predicate_block
1641
+ s4 << r8
1642
+ end
1643
+ end
1644
+ if s4.last
1645
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
1646
+ r4.extend(SequencePrimary2)
1647
+ r4.extend(SequencePrimary3)
1648
+ else
1649
+ @index = i4
1650
+ r4 = nil
1651
+ end
1652
+ if r4
1653
+ r0 = r4
1654
+ else
1655
+ i9, s9 = index, []
1656
+ r10 = _nt_atomic
1657
+ s9 << r10
1658
+ if r10
1659
+ r11 = _nt_suffix
1660
+ s9 << r11
1661
+ end
1662
+ if s9.last
1663
+ r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
1664
+ r9.extend(SequencePrimary4)
1665
+ r9.extend(SequencePrimary5)
1666
+ else
1667
+ @index = i9
1668
+ r9 = nil
1669
+ end
1670
+ if r9
1671
+ r0 = r9
1672
+ else
1673
+ r12 = _nt_atomic
1674
+ if r12
1675
+ r0 = r12
1676
+ else
1677
+ @index = i0
1678
+ r0 = nil
1679
+ end
1680
+ end
1681
+ end
1682
+ end
1683
+
1684
+ node_cache[:sequence_primary][start_index] = r0
1685
+
1686
+ r0
1687
+ end
1688
+
1689
+ def _nt_suffix
1690
+ start_index = index
1691
+ if node_cache[:suffix].has_key?(index)
1692
+ cached = node_cache[:suffix][index]
1693
+ @index = cached.interval.end if cached
1694
+ return cached
1695
+ end
1696
+
1697
+ i0 = index
1698
+ r1 = _nt_repetition_suffix
1699
+ if r1
1700
+ r0 = r1
1701
+ else
1702
+ r2 = _nt_optional_suffix
1703
+ if r2
1704
+ r0 = r2
1705
+ else
1706
+ @index = i0
1707
+ r0 = nil
1708
+ end
1709
+ end
1710
+
1711
+ node_cache[:suffix][start_index] = r0
1712
+
1713
+ r0
1714
+ end
1715
+
1716
+ def _nt_optional_suffix
1717
+ start_index = index
1718
+ if node_cache[:optional_suffix].has_key?(index)
1719
+ cached = node_cache[:optional_suffix][index]
1720
+ @index = cached.interval.end if cached
1721
+ return cached
1722
+ end
1723
+
1724
+ if has_terminal?('?', false, index)
1725
+ r0 = instantiate_node(Optional,input, index...(index + 1))
1726
+ @index += 1
1727
+ else
1728
+ terminal_parse_failure('?')
1729
+ r0 = nil
1730
+ end
1731
+
1732
+ node_cache[:optional_suffix][start_index] = r0
1733
+
1734
+ r0
1735
+ end
1736
+
1737
+ module NodeClassDeclarations0
1738
+ def node_class_expression
1739
+ elements[0]
1740
+ end
1741
+
1742
+ def trailing_inline_module
1743
+ elements[1]
1744
+ end
1745
+ end
1746
+
1747
+ module NodeClassDeclarations1
1748
+ def node_class_name
1749
+ node_class_expression.node_class_name
1750
+ end
1751
+
1752
+ def inline_modules
1753
+ trailing_inline_module.inline_modules
1754
+ end
1755
+
1756
+ def inline_module
1757
+ trailing_inline_module.inline_module
1758
+ end
1759
+
1760
+ def inline_module_name
1761
+ inline_module.module_name if inline_module
1762
+ end
1763
+ end
1764
+
1765
+ def _nt_node_class_declarations
1766
+ start_index = index
1767
+ if node_cache[:node_class_declarations].has_key?(index)
1768
+ cached = node_cache[:node_class_declarations][index]
1769
+ @index = cached.interval.end if cached
1770
+ return cached
1771
+ end
1772
+
1773
+ i0, s0 = index, []
1774
+ r1 = _nt_node_class_expression
1775
+ s0 << r1
1776
+ if r1
1777
+ r2 = _nt_trailing_inline_module
1778
+ s0 << r2
1779
+ end
1780
+ if s0.last
1781
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1782
+ r0.extend(NodeClassDeclarations0)
1783
+ r0.extend(NodeClassDeclarations1)
1784
+ else
1785
+ @index = i0
1786
+ r0 = nil
1787
+ end
1788
+
1789
+ node_cache[:node_class_declarations][start_index] = r0
1790
+
1791
+ r0
1792
+ end
1793
+
1794
+ def _nt_repetition_suffix
1795
+ start_index = index
1796
+ if node_cache[:repetition_suffix].has_key?(index)
1797
+ cached = node_cache[:repetition_suffix][index]
1798
+ @index = cached.interval.end if cached
1799
+ return cached
1800
+ end
1801
+
1802
+ i0 = index
1803
+ if has_terminal?('+', false, index)
1804
+ r1 = instantiate_node(OneOrMore,input, index...(index + 1))
1805
+ @index += 1
1806
+ else
1807
+ terminal_parse_failure('+')
1808
+ r1 = nil
1809
+ end
1810
+ if r1
1811
+ r0 = r1
1812
+ else
1813
+ if has_terminal?('*', false, index)
1814
+ r2 = instantiate_node(ZeroOrMore,input, index...(index + 1))
1815
+ @index += 1
1816
+ else
1817
+ terminal_parse_failure('*')
1818
+ r2 = nil
1819
+ end
1820
+ if r2
1821
+ r0 = r2
1822
+ else
1823
+ @index = i0
1824
+ r0 = nil
1825
+ end
1826
+ end
1827
+
1828
+ node_cache[:repetition_suffix][start_index] = r0
1829
+
1830
+ r0
1831
+ end
1832
+
1833
+ def _nt_prefix
1834
+ start_index = index
1835
+ if node_cache[:prefix].has_key?(index)
1836
+ cached = node_cache[:prefix][index]
1837
+ @index = cached.interval.end if cached
1838
+ return cached
1839
+ end
1840
+
1841
+ i0 = index
1842
+ if has_terminal?('&', false, index)
1843
+ r1 = instantiate_node(AndPredicate,input, index...(index + 1))
1844
+ @index += 1
1845
+ else
1846
+ terminal_parse_failure('&')
1847
+ r1 = nil
1848
+ end
1849
+ if r1
1850
+ r0 = r1
1851
+ else
1852
+ if has_terminal?('!', false, index)
1853
+ r2 = instantiate_node(NotPredicate,input, index...(index + 1))
1854
+ @index += 1
1855
+ else
1856
+ terminal_parse_failure('!')
1857
+ r2 = nil
1858
+ end
1859
+ if r2
1860
+ r0 = r2
1861
+ else
1862
+ if has_terminal?('~', false, index)
1863
+ r3 = instantiate_node(TransientPrefix,input, index...(index + 1))
1864
+ @index += 1
1865
+ else
1866
+ terminal_parse_failure('~')
1867
+ r3 = nil
1868
+ end
1869
+ if r3
1870
+ r0 = r3
1871
+ else
1872
+ @index = i0
1873
+ r0 = nil
1874
+ end
1875
+ end
1876
+ end
1877
+
1878
+ node_cache[:prefix][start_index] = r0
1879
+
1880
+ r0
1881
+ end
1882
+
1883
+ def _nt_atomic
1884
+ start_index = index
1885
+ if node_cache[:atomic].has_key?(index)
1886
+ cached = node_cache[:atomic][index]
1887
+ @index = cached.interval.end if cached
1888
+ return cached
1889
+ end
1890
+
1891
+ i0 = index
1892
+ r1 = _nt_regex
1893
+ if r1
1894
+ r0 = r1
1895
+ else
1896
+ r2 = _nt_terminal
1897
+ if r2
1898
+ r0 = r2
1899
+ else
1900
+ r3 = _nt_nonterminal
1901
+ if r3
1902
+ r0 = r3
1903
+ else
1904
+ r4 = _nt_parenthesized_expression
1905
+ if r4
1906
+ r0 = r4
1907
+ else
1908
+ @index = i0
1909
+ r0 = nil
1910
+ end
1911
+ end
1912
+ end
1913
+ end
1914
+
1915
+ node_cache[:atomic][start_index] = r0
1916
+
1917
+ r0
1918
+ end
1919
+
1920
+ module Regex0
1921
+ def regex_body
1922
+ elements[1]
1923
+ end
1924
+
1925
+ end
1926
+
1927
+ module Regex1
1928
+ def inline_modules
1929
+ []
1930
+ end
1931
+ end
1932
+
1933
+ def _nt_regex
1934
+ start_index = index
1935
+ if node_cache[:regex].has_key?(index)
1936
+ cached = node_cache[:regex][index]
1937
+ @index = cached.interval.end if cached
1938
+ return cached
1939
+ end
1940
+
1941
+ i0, s0 = index, []
1942
+ if has_terminal?('r(', false, index)
1943
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 2))
1944
+ @index += 2
1945
+ else
1946
+ terminal_parse_failure('r(')
1947
+ r1 = nil
1948
+ end
1949
+ s0 << r1
1950
+ if r1
1951
+ r2 = _nt_regex_body
1952
+ s0 << r2
1953
+ if r2
1954
+ if has_terminal?(')', false, index)
1955
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
1956
+ @index += 1
1957
+ else
1958
+ terminal_parse_failure(')')
1959
+ r3 = nil
1960
+ end
1961
+ s0 << r3
1962
+ end
1963
+ end
1964
+ if s0.last
1965
+ r0 = instantiate_node(Regex,input, i0...index, s0)
1966
+ r0.extend(Regex0)
1967
+ r0.extend(Regex1)
1968
+ else
1969
+ @index = i0
1970
+ r0 = nil
1971
+ end
1972
+
1973
+ node_cache[:regex][start_index] = r0
1974
+
1975
+ r0
1976
+ end
1977
+
1978
+ def _nt_regex_body
1979
+ start_index = index
1980
+ if node_cache[:regex_body].has_key?(index)
1981
+ cached = node_cache[:regex_body][index]
1982
+ @index = cached.interval.end if cached
1983
+ return cached
1984
+ end
1985
+
1986
+ s0, i0 = [], index
1987
+ loop do
1988
+ i1 = index
1989
+ r2 = _nt_nested_parens_in_regex
1990
+ if r2
1991
+ r1 = r2
1992
+ else
1993
+ if has_terminal?('\G[^)]', true, index)
1994
+ r3 = true
1995
+ @index += 1
1996
+ else
1997
+ r3 = nil
1998
+ end
1999
+ if r3
2000
+ r1 = r3
2001
+ else
2002
+ @index = i1
2003
+ r1 = nil
2004
+ end
2005
+ end
2006
+ if r1
2007
+ s0 << r1
2008
+ else
2009
+ break
2010
+ end
2011
+ end
2012
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
2013
+
2014
+ node_cache[:regex_body][start_index] = r0
2015
+
2016
+ r0
2017
+ end
2018
+
2019
+ module NestedParensInRegex0
2020
+ def regex_body
2021
+ elements[1]
2022
+ end
2023
+
2024
+ end
2025
+
2026
+ def _nt_nested_parens_in_regex
2027
+ start_index = index
2028
+ if node_cache[:nested_parens_in_regex].has_key?(index)
2029
+ cached = node_cache[:nested_parens_in_regex][index]
2030
+ @index = cached.interval.end if cached
2031
+ return cached
2032
+ end
2033
+
2034
+ i0, s0 = index, []
2035
+ if has_terminal?('(', false, index)
2036
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
2037
+ @index += 1
2038
+ else
2039
+ terminal_parse_failure('(')
2040
+ r1 = nil
2041
+ end
2042
+ s0 << r1
2043
+ if r1
2044
+ r2 = _nt_regex_body
2045
+ s0 << r2
2046
+ if r2
2047
+ if has_terminal?(')', false, index)
2048
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
2049
+ @index += 1
2050
+ else
2051
+ terminal_parse_failure(')')
2052
+ r3 = nil
2053
+ end
2054
+ s0 << r3
2055
+ end
2056
+ end
2057
+ if s0.last
2058
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
2059
+ r0.extend(NestedParensInRegex0)
2060
+ else
2061
+ @index = i0
2062
+ r0 = nil
2063
+ end
2064
+
2065
+ node_cache[:nested_parens_in_regex][start_index] = r0
2066
+
2067
+ r0
2068
+ end
2069
+
2070
+ module ParenthesizedExpression0
2071
+ def parsing_expression
2072
+ elements[2]
2073
+ end
2074
+
2075
+ end
2076
+
2077
+ module ParenthesizedExpression1
2078
+ def inline_modules
2079
+ parsing_expression.inline_modules
2080
+ end
2081
+ end
2082
+
2083
+ def _nt_parenthesized_expression
2084
+ start_index = index
2085
+ if node_cache[:parenthesized_expression].has_key?(index)
2086
+ cached = node_cache[:parenthesized_expression][index]
2087
+ @index = cached.interval.end if cached
2088
+ return cached
2089
+ end
2090
+
2091
+ i0, s0 = index, []
2092
+ if has_terminal?('(', false, index)
2093
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
2094
+ @index += 1
2095
+ else
2096
+ terminal_parse_failure('(')
2097
+ r1 = nil
2098
+ end
2099
+ s0 << r1
2100
+ if r1
2101
+ r3 = _nt_space
2102
+ if r3
2103
+ r2 = r3
2104
+ else
2105
+ r2 = instantiate_node(SyntaxNode,input, index...index)
2106
+ end
2107
+ s0 << r2
2108
+ if r2
2109
+ r4 = _nt_parsing_expression
2110
+ s0 << r4
2111
+ if r4
2112
+ r6 = _nt_space
2113
+ if r6
2114
+ r5 = r6
2115
+ else
2116
+ r5 = instantiate_node(SyntaxNode,input, index...index)
2117
+ end
2118
+ s0 << r5
2119
+ if r5
2120
+ if has_terminal?(')', false, index)
2121
+ r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
2122
+ @index += 1
2123
+ else
2124
+ terminal_parse_failure(')')
2125
+ r7 = nil
2126
+ end
2127
+ s0 << r7
2128
+ end
2129
+ end
2130
+ end
2131
+ end
2132
+ if s0.last
2133
+ r0 = instantiate_node(ParenthesizedExpression,input, i0...index, s0)
2134
+ r0.extend(ParenthesizedExpression0)
2135
+ r0.extend(ParenthesizedExpression1)
2136
+ else
2137
+ @index = i0
2138
+ r0 = nil
2139
+ end
2140
+
2141
+ node_cache[:parenthesized_expression][start_index] = r0
2142
+
2143
+ r0
2144
+ end
2145
+
2146
+ module Nonterminal0
2147
+ def alpha_char
2148
+ elements[0]
2149
+ end
2150
+
2151
+ end
2152
+
2153
+ module Nonterminal1
2154
+ end
2155
+
2156
+ def _nt_nonterminal
2157
+ start_index = index
2158
+ if node_cache[:nonterminal].has_key?(index)
2159
+ cached = node_cache[:nonterminal][index]
2160
+ @index = cached.interval.end if cached
2161
+ return cached
2162
+ end
2163
+
2164
+ i0, s0 = index, []
2165
+ i1 = index
2166
+ r2 = _nt_keyword_inside_grammar
2167
+ if r2
2168
+ r1 = nil
2169
+ else
2170
+ @index = i1
2171
+ r1 = instantiate_node(SyntaxNode,input, index...index)
2172
+ end
2173
+ s0 << r1
2174
+ if r1
2175
+ i3, s3 = index, []
2176
+ r4 = _nt_alpha_char
2177
+ s3 << r4
2178
+ if r4
2179
+ s5, i5 = [], index
2180
+ loop do
2181
+ r6 = _nt_alphanumeric_char
2182
+ if r6
2183
+ s5 << r6
2184
+ else
2185
+ break
2186
+ end
2187
+ end
2188
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
2189
+ s3 << r5
2190
+ end
2191
+ if s3.last
2192
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
2193
+ r3.extend(Nonterminal0)
2194
+ else
2195
+ @index = i3
2196
+ r3 = nil
2197
+ end
2198
+ s0 << r3
2199
+ end
2200
+ if s0.last
2201
+ r0 = instantiate_node(Nonterminal,input, i0...index, s0)
2202
+ r0.extend(Nonterminal1)
2203
+ else
2204
+ @index = i0
2205
+ r0 = nil
2206
+ end
2207
+
2208
+ node_cache[:nonterminal][start_index] = r0
2209
+
2210
+ r0
2211
+ end
2212
+
2213
+ def _nt_terminal
2214
+ start_index = index
2215
+ if node_cache[:terminal].has_key?(index)
2216
+ cached = node_cache[:terminal][index]
2217
+ @index = cached.interval.end if cached
2218
+ return cached
2219
+ end
2220
+
2221
+ i0 = index
2222
+ r1 = _nt_quoted_string
2223
+ if r1
2224
+ r0 = r1
2225
+ else
2226
+ r2 = _nt_character_class
2227
+ if r2
2228
+ r0 = r2
2229
+ else
2230
+ r3 = _nt_anything_symbol
2231
+ if r3
2232
+ r0 = r3
2233
+ else
2234
+ @index = i0
2235
+ r0 = nil
2236
+ end
2237
+ end
2238
+ end
2239
+
2240
+ node_cache[:terminal][start_index] = r0
2241
+
2242
+ r0
2243
+ end
2244
+
2245
+ module QuotedString0
2246
+ def string
2247
+ super.text_value
2248
+ end
2249
+ end
2250
+
2251
+ def _nt_quoted_string
2252
+ start_index = index
2253
+ if node_cache[:quoted_string].has_key?(index)
2254
+ cached = node_cache[:quoted_string][index]
2255
+ @index = cached.interval.end if cached
2256
+ return cached
2257
+ end
2258
+
2259
+ i0 = index
2260
+ r1 = _nt_single_quoted_string
2261
+ if r1
2262
+ r0 = r1
2263
+ r0.extend(QuotedString0)
2264
+ else
2265
+ r2 = _nt_double_quoted_string
2266
+ if r2
2267
+ r0 = r2
2268
+ r0.extend(QuotedString0)
2269
+ else
2270
+ @index = i0
2271
+ r0 = nil
2272
+ end
2273
+ end
2274
+
2275
+ node_cache[:quoted_string][start_index] = r0
2276
+
2277
+ r0
2278
+ end
2279
+
2280
+ module DoubleQuotedString0
2281
+ end
2282
+
2283
+ module DoubleQuotedString1
2284
+ def string
2285
+ elements[1]
2286
+ end
2287
+
2288
+ end
2289
+
2290
+ def _nt_double_quoted_string
2291
+ start_index = index
2292
+ if node_cache[:double_quoted_string].has_key?(index)
2293
+ cached = node_cache[:double_quoted_string][index]
2294
+ @index = cached.interval.end if cached
2295
+ return cached
2296
+ end
2297
+
2298
+ i0, s0 = index, []
2299
+ if has_terminal?('"', false, index)
2300
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
2301
+ @index += 1
2302
+ else
2303
+ terminal_parse_failure('"')
2304
+ r1 = nil
2305
+ end
2306
+ s0 << r1
2307
+ if r1
2308
+ s2, i2 = [], index
2309
+ loop do
2310
+ i3, s3 = index, []
2311
+ i4 = index
2312
+ if has_terminal?('"', false, index)
2313
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
2314
+ @index += 1
2315
+ else
2316
+ terminal_parse_failure('"')
2317
+ r5 = nil
2318
+ end
2319
+ if r5
2320
+ r4 = nil
2321
+ else
2322
+ @index = i4
2323
+ r4 = instantiate_node(SyntaxNode,input, index...index)
2324
+ end
2325
+ s3 << r4
2326
+ if r4
2327
+ i6 = index
2328
+ if has_terminal?("\\\\", false, index)
2329
+ r7 = instantiate_node(SyntaxNode,input, index...(index + 2))
2330
+ @index += 2
2331
+ else
2332
+ terminal_parse_failure("\\\\")
2333
+ r7 = nil
2334
+ end
2335
+ if r7
2336
+ r6 = r7
2337
+ else
2338
+ if has_terminal?('\"', false, index)
2339
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 2))
2340
+ @index += 2
2341
+ else
2342
+ terminal_parse_failure('\"')
2343
+ r8 = nil
2344
+ end
2345
+ if r8
2346
+ r6 = r8
2347
+ else
2348
+ if index < input_length
2349
+ r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
2350
+ @index += 1
2351
+ else
2352
+ terminal_parse_failure("any character")
2353
+ r9 = nil
2354
+ end
2355
+ if r9
2356
+ r6 = r9
2357
+ else
2358
+ @index = i6
2359
+ r6 = nil
2360
+ end
2361
+ end
2362
+ end
2363
+ s3 << r6
2364
+ end
2365
+ if s3.last
2366
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
2367
+ r3.extend(DoubleQuotedString0)
2368
+ else
2369
+ @index = i3
2370
+ r3 = nil
2371
+ end
2372
+ if r3
2373
+ s2 << r3
2374
+ else
2375
+ break
2376
+ end
2377
+ end
2378
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
2379
+ s0 << r2
2380
+ if r2
2381
+ if has_terminal?('"', false, index)
2382
+ r10 = instantiate_node(SyntaxNode,input, index...(index + 1))
2383
+ @index += 1
2384
+ else
2385
+ terminal_parse_failure('"')
2386
+ r10 = nil
2387
+ end
2388
+ s0 << r10
2389
+ end
2390
+ end
2391
+ if s0.last
2392
+ r0 = instantiate_node(Terminal,input, i0...index, s0)
2393
+ r0.extend(DoubleQuotedString1)
2394
+ else
2395
+ @index = i0
2396
+ r0 = nil
2397
+ end
2398
+
2399
+ node_cache[:double_quoted_string][start_index] = r0
2400
+
2401
+ r0
2402
+ end
2403
+
2404
+ module SingleQuotedString0
2405
+ end
2406
+
2407
+ module SingleQuotedString1
2408
+ def string
2409
+ elements[1]
2410
+ end
2411
+
2412
+ end
2413
+
2414
+ def _nt_single_quoted_string
2415
+ start_index = index
2416
+ if node_cache[:single_quoted_string].has_key?(index)
2417
+ cached = node_cache[:single_quoted_string][index]
2418
+ @index = cached.interval.end if cached
2419
+ return cached
2420
+ end
2421
+
2422
+ i0, s0 = index, []
2423
+ if has_terminal?("'", false, index)
2424
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
2425
+ @index += 1
2426
+ else
2427
+ terminal_parse_failure("'")
2428
+ r1 = nil
2429
+ end
2430
+ s0 << r1
2431
+ if r1
2432
+ s2, i2 = [], index
2433
+ loop do
2434
+ i3, s3 = index, []
2435
+ i4 = index
2436
+ if has_terminal?("'", false, index)
2437
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
2438
+ @index += 1
2439
+ else
2440
+ terminal_parse_failure("'")
2441
+ r5 = nil
2442
+ end
2443
+ if r5
2444
+ r4 = nil
2445
+ else
2446
+ @index = i4
2447
+ r4 = instantiate_node(SyntaxNode,input, index...index)
2448
+ end
2449
+ s3 << r4
2450
+ if r4
2451
+ i6 = index
2452
+ if has_terminal?("\\\\", false, index)
2453
+ r7 = instantiate_node(SyntaxNode,input, index...(index + 2))
2454
+ @index += 2
2455
+ else
2456
+ terminal_parse_failure("\\\\")
2457
+ r7 = nil
2458
+ end
2459
+ if r7
2460
+ r6 = r7
2461
+ else
2462
+ if has_terminal?("\\'", false, index)
2463
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 2))
2464
+ @index += 2
2465
+ else
2466
+ terminal_parse_failure("\\'")
2467
+ r8 = nil
2468
+ end
2469
+ if r8
2470
+ r6 = r8
2471
+ else
2472
+ if index < input_length
2473
+ r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
2474
+ @index += 1
2475
+ else
2476
+ terminal_parse_failure("any character")
2477
+ r9 = nil
2478
+ end
2479
+ if r9
2480
+ r6 = r9
2481
+ else
2482
+ @index = i6
2483
+ r6 = nil
2484
+ end
2485
+ end
2486
+ end
2487
+ s3 << r6
2488
+ end
2489
+ if s3.last
2490
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
2491
+ r3.extend(SingleQuotedString0)
2492
+ else
2493
+ @index = i3
2494
+ r3 = nil
2495
+ end
2496
+ if r3
2497
+ s2 << r3
2498
+ else
2499
+ break
2500
+ end
2501
+ end
2502
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
2503
+ s0 << r2
2504
+ if r2
2505
+ if has_terminal?("'", false, index)
2506
+ r10 = instantiate_node(SyntaxNode,input, index...(index + 1))
2507
+ @index += 1
2508
+ else
2509
+ terminal_parse_failure("'")
2510
+ r10 = nil
2511
+ end
2512
+ s0 << r10
2513
+ end
2514
+ end
2515
+ if s0.last
2516
+ r0 = instantiate_node(Terminal,input, i0...index, s0)
2517
+ r0.extend(SingleQuotedString1)
2518
+ else
2519
+ @index = i0
2520
+ r0 = nil
2521
+ end
2522
+
2523
+ node_cache[:single_quoted_string][start_index] = r0
2524
+
2525
+ r0
2526
+ end
2527
+
2528
+ module CharacterClass0
2529
+ end
2530
+
2531
+ module CharacterClass1
2532
+ end
2533
+
2534
+ module CharacterClass2
2535
+ end
2536
+
2537
+ module CharacterClass3
2538
+ def characters
2539
+ elements[1]
2540
+ end
2541
+
2542
+ end
2543
+
2544
+ module CharacterClass4
2545
+ def characters
2546
+ super.text_value
2547
+ end
2548
+ end
2549
+
2550
+ def _nt_character_class
2551
+ start_index = index
2552
+ if node_cache[:character_class].has_key?(index)
2553
+ cached = node_cache[:character_class][index]
2554
+ @index = cached.interval.end if cached
2555
+ return cached
2556
+ end
2557
+
2558
+ i0, s0 = index, []
2559
+ if has_terminal?('[', false, index)
2560
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
2561
+ @index += 1
2562
+ else
2563
+ terminal_parse_failure('[')
2564
+ r1 = nil
2565
+ end
2566
+ s0 << r1
2567
+ if r1
2568
+ s2, i2 = [], index
2569
+ loop do
2570
+ i3, s3 = index, []
2571
+ i4 = index
2572
+ if has_terminal?(']', false, index)
2573
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
2574
+ @index += 1
2575
+ else
2576
+ terminal_parse_failure(']')
2577
+ r5 = nil
2578
+ end
2579
+ if r5
2580
+ r4 = nil
2581
+ else
2582
+ @index = i4
2583
+ r4 = instantiate_node(SyntaxNode,input, index...index)
2584
+ end
2585
+ s3 << r4
2586
+ if r4
2587
+ i6 = index
2588
+ i7, s7 = index, []
2589
+ if has_terminal?('\\', false, index)
2590
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
2591
+ @index += 1
2592
+ else
2593
+ terminal_parse_failure('\\')
2594
+ r8 = nil
2595
+ end
2596
+ s7 << r8
2597
+ if r8
2598
+ if index < input_length
2599
+ r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
2600
+ @index += 1
2601
+ else
2602
+ terminal_parse_failure("any character")
2603
+ r9 = nil
2604
+ end
2605
+ s7 << r9
2606
+ end
2607
+ if s7.last
2608
+ r7 = instantiate_node(SyntaxNode,input, i7...index, s7)
2609
+ r7.extend(CharacterClass0)
2610
+ else
2611
+ @index = i7
2612
+ r7 = nil
2613
+ end
2614
+ if r7
2615
+ r6 = r7
2616
+ else
2617
+ i10, s10 = index, []
2618
+ i11 = index
2619
+ if has_terminal?('\\', false, index)
2620
+ r12 = instantiate_node(SyntaxNode,input, index...(index + 1))
2621
+ @index += 1
2622
+ else
2623
+ terminal_parse_failure('\\')
2624
+ r12 = nil
2625
+ end
2626
+ if r12
2627
+ r11 = nil
2628
+ else
2629
+ @index = i11
2630
+ r11 = instantiate_node(SyntaxNode,input, index...index)
2631
+ end
2632
+ s10 << r11
2633
+ if r11
2634
+ if index < input_length
2635
+ r13 = instantiate_node(SyntaxNode,input, index...(index + 1))
2636
+ @index += 1
2637
+ else
2638
+ terminal_parse_failure("any character")
2639
+ r13 = nil
2640
+ end
2641
+ s10 << r13
2642
+ end
2643
+ if s10.last
2644
+ r10 = instantiate_node(SyntaxNode,input, i10...index, s10)
2645
+ r10.extend(CharacterClass1)
2646
+ else
2647
+ @index = i10
2648
+ r10 = nil
2649
+ end
2650
+ if r10
2651
+ r6 = r10
2652
+ else
2653
+ @index = i6
2654
+ r6 = nil
2655
+ end
2656
+ end
2657
+ s3 << r6
2658
+ end
2659
+ if s3.last
2660
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
2661
+ r3.extend(CharacterClass2)
2662
+ else
2663
+ @index = i3
2664
+ r3 = nil
2665
+ end
2666
+ if r3
2667
+ s2 << r3
2668
+ else
2669
+ break
2670
+ end
2671
+ end
2672
+ if s2.empty?
2673
+ @index = i2
2674
+ r2 = nil
2675
+ else
2676
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
2677
+ end
2678
+ s0 << r2
2679
+ if r2
2680
+ if has_terminal?(']', false, index)
2681
+ r14 = instantiate_node(SyntaxNode,input, index...(index + 1))
2682
+ @index += 1
2683
+ else
2684
+ terminal_parse_failure(']')
2685
+ r14 = nil
2686
+ end
2687
+ s0 << r14
2688
+ end
2689
+ end
2690
+ if s0.last
2691
+ r0 = instantiate_node(CharacterClass,input, i0...index, s0)
2692
+ r0.extend(CharacterClass3)
2693
+ r0.extend(CharacterClass4)
2694
+ else
2695
+ @index = i0
2696
+ r0 = nil
2697
+ end
2698
+
2699
+ node_cache[:character_class][start_index] = r0
2700
+
2701
+ r0
2702
+ end
2703
+
2704
+ def _nt_anything_symbol
2705
+ start_index = index
2706
+ if node_cache[:anything_symbol].has_key?(index)
2707
+ cached = node_cache[:anything_symbol][index]
2708
+ @index = cached.interval.end if cached
2709
+ return cached
2710
+ end
2711
+
2712
+ if has_terminal?('.', false, index)
2713
+ r0 = instantiate_node(AnythingSymbol,input, index...(index + 1))
2714
+ @index += 1
2715
+ else
2716
+ terminal_parse_failure('.')
2717
+ r0 = nil
2718
+ end
2719
+
2720
+ node_cache[:anything_symbol][start_index] = r0
2721
+
2722
+ r0
2723
+ end
2724
+
2725
+ module NodeClassExpression0
2726
+ end
2727
+
2728
+ module NodeClassExpression1
2729
+ def space
2730
+ elements[0]
2731
+ end
2732
+
2733
+ end
2734
+
2735
+ module NodeClassExpression2
2736
+ def node_class_name
2737
+ elements[2].text_value
2738
+ end
2739
+ end
2740
+
2741
+ module NodeClassExpression3
2742
+ def node_class_name
2743
+ nil
2744
+ end
2745
+ end
2746
+
2747
+ def _nt_node_class_expression
2748
+ start_index = index
2749
+ if node_cache[:node_class_expression].has_key?(index)
2750
+ cached = node_cache[:node_class_expression][index]
2751
+ @index = cached.interval.end if cached
2752
+ return cached
2753
+ end
2754
+
2755
+ i0 = index
2756
+ i1, s1 = index, []
2757
+ r2 = _nt_space
2758
+ s1 << r2
2759
+ if r2
2760
+ if has_terminal?('<', false, index)
2761
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
2762
+ @index += 1
2763
+ else
2764
+ terminal_parse_failure('<')
2765
+ r3 = nil
2766
+ end
2767
+ s1 << r3
2768
+ if r3
2769
+ s4, i4 = [], index
2770
+ loop do
2771
+ i5, s5 = index, []
2772
+ i6 = index
2773
+ if has_terminal?('>', false, index)
2774
+ r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
2775
+ @index += 1
2776
+ else
2777
+ terminal_parse_failure('>')
2778
+ r7 = nil
2779
+ end
2780
+ if r7
2781
+ r6 = nil
2782
+ else
2783
+ @index = i6
2784
+ r6 = instantiate_node(SyntaxNode,input, index...index)
2785
+ end
2786
+ s5 << r6
2787
+ if r6
2788
+ if index < input_length
2789
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
2790
+ @index += 1
2791
+ else
2792
+ terminal_parse_failure("any character")
2793
+ r8 = nil
2794
+ end
2795
+ s5 << r8
2796
+ end
2797
+ if s5.last
2798
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
2799
+ r5.extend(NodeClassExpression0)
2800
+ else
2801
+ @index = i5
2802
+ r5 = nil
2803
+ end
2804
+ if r5
2805
+ s4 << r5
2806
+ else
2807
+ break
2808
+ end
2809
+ end
2810
+ if s4.empty?
2811
+ @index = i4
2812
+ r4 = nil
2813
+ else
2814
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
2815
+ end
2816
+ s1 << r4
2817
+ if r4
2818
+ if has_terminal?('>', false, index)
2819
+ r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
2820
+ @index += 1
2821
+ else
2822
+ terminal_parse_failure('>')
2823
+ r9 = nil
2824
+ end
2825
+ s1 << r9
2826
+ end
2827
+ end
2828
+ end
2829
+ if s1.last
2830
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
2831
+ r1.extend(NodeClassExpression1)
2832
+ r1.extend(NodeClassExpression2)
2833
+ else
2834
+ @index = i1
2835
+ r1 = nil
2836
+ end
2837
+ if r1
2838
+ r0 = r1
2839
+ else
2840
+ if has_terminal?('', false, index)
2841
+ r10 = instantiate_node(SyntaxNode,input, index...(index + 0))
2842
+ r10.extend(NodeClassExpression3)
2843
+ @index += 0
2844
+ else
2845
+ terminal_parse_failure('')
2846
+ r10 = nil
2847
+ end
2848
+ if r10
2849
+ r0 = r10
2850
+ else
2851
+ @index = i0
2852
+ r0 = nil
2853
+ end
2854
+ end
2855
+
2856
+ node_cache[:node_class_expression][start_index] = r0
2857
+
2858
+ r0
2859
+ end
2860
+
2861
+ module TrailingInlineModule0
2862
+ def space
2863
+ elements[0]
2864
+ end
2865
+
2866
+ def inline_module
2867
+ elements[1]
2868
+ end
2869
+ end
2870
+
2871
+ module TrailingInlineModule1
2872
+ def inline_modules
2873
+ [inline_module]
2874
+ end
2875
+
2876
+ def inline_module_name
2877
+ inline_module.module_name
2878
+ end
2879
+ end
2880
+
2881
+ module TrailingInlineModule2
2882
+ def inline_modules
2883
+ []
2884
+ end
2885
+
2886
+ def inline_module
2887
+ nil
2888
+ end
2889
+
2890
+ def inline_module_name
2891
+ nil
2892
+ end
2893
+ end
2894
+
2895
+ def _nt_trailing_inline_module
2896
+ start_index = index
2897
+ if node_cache[:trailing_inline_module].has_key?(index)
2898
+ cached = node_cache[:trailing_inline_module][index]
2899
+ @index = cached.interval.end if cached
2900
+ return cached
2901
+ end
2902
+
2903
+ i0 = index
2904
+ i1, s1 = index, []
2905
+ r2 = _nt_space
2906
+ s1 << r2
2907
+ if r2
2908
+ r3 = _nt_inline_module
2909
+ s1 << r3
2910
+ end
2911
+ if s1.last
2912
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
2913
+ r1.extend(TrailingInlineModule0)
2914
+ r1.extend(TrailingInlineModule1)
2915
+ else
2916
+ @index = i1
2917
+ r1 = nil
2918
+ end
2919
+ if r1
2920
+ r0 = r1
2921
+ else
2922
+ if has_terminal?('', false, index)
2923
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 0))
2924
+ r4.extend(TrailingInlineModule2)
2925
+ @index += 0
2926
+ else
2927
+ terminal_parse_failure('')
2928
+ r4 = nil
2929
+ end
2930
+ if r4
2931
+ r0 = r4
2932
+ else
2933
+ @index = i0
2934
+ r0 = nil
2935
+ end
2936
+ end
2937
+
2938
+ node_cache[:trailing_inline_module][start_index] = r0
2939
+
2940
+ r0
2941
+ end
2942
+
2943
+ module PredicateBlock0
2944
+ def inline_module
2945
+ elements[1]
2946
+ end
2947
+ end
2948
+
2949
+ def _nt_predicate_block
2950
+ start_index = index
2951
+ if node_cache[:predicate_block].has_key?(index)
2952
+ cached = node_cache[:predicate_block][index]
2953
+ @index = cached.interval.end if cached
2954
+ return cached
2955
+ end
2956
+
2957
+ i0, s0 = index, []
2958
+ if has_terminal?('', false, index)
2959
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 0))
2960
+ @index += 0
2961
+ else
2962
+ terminal_parse_failure('')
2963
+ r1 = nil
2964
+ end
2965
+ s0 << r1
2966
+ if r1
2967
+ r2 = _nt_inline_module
2968
+ s0 << r2
2969
+ end
2970
+ if s0.last
2971
+ r0 = instantiate_node(PredicateBlock,input, i0...index, s0)
2972
+ r0.extend(PredicateBlock0)
2973
+ else
2974
+ @index = i0
2975
+ r0 = nil
2976
+ end
2977
+
2978
+ node_cache[:predicate_block][start_index] = r0
2979
+
2980
+ r0
2981
+ end
2982
+
2983
+ module InlineModule0
2984
+ end
2985
+
2986
+ module InlineModule1
2987
+ end
2988
+
2989
+ def _nt_inline_module
2990
+ start_index = index
2991
+ if node_cache[:inline_module].has_key?(index)
2992
+ cached = node_cache[:inline_module][index]
2993
+ @index = cached.interval.end if cached
2994
+ return cached
2995
+ end
2996
+
2997
+ i0, s0 = index, []
2998
+ if has_terminal?('{', false, index)
2999
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
3000
+ @index += 1
3001
+ else
3002
+ terminal_parse_failure('{')
3003
+ r1 = nil
3004
+ end
3005
+ s0 << r1
3006
+ if r1
3007
+ s2, i2 = [], index
3008
+ loop do
3009
+ i3 = index
3010
+ r4 = _nt_inline_module
3011
+ if r4
3012
+ r3 = r4
3013
+ else
3014
+ i5, s5 = index, []
3015
+ i6 = index
3016
+ if has_terminal?('\G[{}]', true, index)
3017
+ r7 = true
3018
+ @index += 1
3019
+ else
3020
+ r7 = nil
3021
+ end
3022
+ if r7
3023
+ r6 = nil
3024
+ else
3025
+ @index = i6
3026
+ r6 = instantiate_node(SyntaxNode,input, index...index)
3027
+ end
3028
+ s5 << r6
3029
+ if r6
3030
+ if index < input_length
3031
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
3032
+ @index += 1
3033
+ else
3034
+ terminal_parse_failure("any character")
3035
+ r8 = nil
3036
+ end
3037
+ s5 << r8
3038
+ end
3039
+ if s5.last
3040
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
3041
+ r5.extend(InlineModule0)
3042
+ else
3043
+ @index = i5
3044
+ r5 = nil
3045
+ end
3046
+ if r5
3047
+ r3 = r5
3048
+ else
3049
+ @index = i3
3050
+ r3 = nil
3051
+ end
3052
+ end
3053
+ if r3
3054
+ s2 << r3
3055
+ else
3056
+ break
3057
+ end
3058
+ end
3059
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
3060
+ s0 << r2
3061
+ if r2
3062
+ if has_terminal?('}', false, index)
3063
+ r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
3064
+ @index += 1
3065
+ else
3066
+ terminal_parse_failure('}')
3067
+ r9 = nil
3068
+ end
3069
+ s0 << r9
3070
+ end
3071
+ end
3072
+ if s0.last
3073
+ r0 = instantiate_node(InlineModule,input, i0...index, s0)
3074
+ r0.extend(InlineModule1)
3075
+ else
3076
+ @index = i0
3077
+ r0 = nil
3078
+ end
3079
+
3080
+ node_cache[:inline_module][start_index] = r0
3081
+
3082
+ r0
3083
+ end
3084
+
3085
+ module KeywordInsideGrammar0
3086
+ end
3087
+
3088
+ def _nt_keyword_inside_grammar
3089
+ start_index = index
3090
+ if node_cache[:keyword_inside_grammar].has_key?(index)
3091
+ cached = node_cache[:keyword_inside_grammar][index]
3092
+ @index = cached.interval.end if cached
3093
+ return cached
3094
+ end
3095
+
3096
+ i0, s0 = index, []
3097
+ i1 = index
3098
+ if has_terminal?('rule', false, index)
3099
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 4))
3100
+ @index += 4
3101
+ else
3102
+ terminal_parse_failure('rule')
3103
+ r2 = nil
3104
+ end
3105
+ if r2
3106
+ r1 = r2
3107
+ else
3108
+ if has_terminal?('end', false, index)
3109
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 3))
3110
+ @index += 3
3111
+ else
3112
+ terminal_parse_failure('end')
3113
+ r3 = nil
3114
+ end
3115
+ if r3
3116
+ r1 = r3
3117
+ else
3118
+ @index = i1
3119
+ r1 = nil
3120
+ end
3121
+ end
3122
+ s0 << r1
3123
+ if r1
3124
+ i4 = index
3125
+ r5 = _nt_non_space_char
3126
+ if r5
3127
+ r4 = nil
3128
+ else
3129
+ @index = i4
3130
+ r4 = instantiate_node(SyntaxNode,input, index...index)
3131
+ end
3132
+ s0 << r4
3133
+ end
3134
+ if s0.last
3135
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
3136
+ r0.extend(KeywordInsideGrammar0)
3137
+ else
3138
+ @index = i0
3139
+ r0 = nil
3140
+ end
3141
+
3142
+ node_cache[:keyword_inside_grammar][start_index] = r0
3143
+
3144
+ r0
3145
+ end
3146
+
3147
+ module NonSpaceChar0
3148
+ end
3149
+
3150
+ def _nt_non_space_char
3151
+ start_index = index
3152
+ if node_cache[:non_space_char].has_key?(index)
3153
+ cached = node_cache[:non_space_char][index]
3154
+ @index = cached.interval.end if cached
3155
+ return cached
3156
+ end
3157
+
3158
+ i0, s0 = index, []
3159
+ i1 = index
3160
+ r2 = _nt_space
3161
+ if r2
3162
+ r1 = nil
3163
+ else
3164
+ @index = i1
3165
+ r1 = instantiate_node(SyntaxNode,input, index...index)
3166
+ end
3167
+ s0 << r1
3168
+ if r1
3169
+ if index < input_length
3170
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
3171
+ @index += 1
3172
+ else
3173
+ terminal_parse_failure("any character")
3174
+ r3 = nil
3175
+ end
3176
+ s0 << r3
3177
+ end
3178
+ if s0.last
3179
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
3180
+ r0.extend(NonSpaceChar0)
3181
+ else
3182
+ @index = i0
3183
+ r0 = nil
3184
+ end
3185
+
3186
+ node_cache[:non_space_char][start_index] = r0
3187
+
3188
+ r0
3189
+ end
3190
+
3191
+ def _nt_alpha_char
3192
+ start_index = index
3193
+ if node_cache[:alpha_char].has_key?(index)
3194
+ cached = node_cache[:alpha_char][index]
3195
+ @index = cached.interval.end if cached
3196
+ return cached
3197
+ end
3198
+
3199
+ if has_terminal?('\G[A-Za-z_]', true, index)
3200
+ r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
3201
+ @index += 1
3202
+ else
3203
+ r0 = nil
3204
+ end
3205
+
3206
+ node_cache[:alpha_char][start_index] = r0
3207
+
3208
+ r0
3209
+ end
3210
+
3211
+ def _nt_alphanumeric_char
3212
+ start_index = index
3213
+ if node_cache[:alphanumeric_char].has_key?(index)
3214
+ cached = node_cache[:alphanumeric_char][index]
3215
+ @index = cached.interval.end if cached
3216
+ return cached
3217
+ end
3218
+
3219
+ i0 = index
3220
+ r1 = _nt_alpha_char
3221
+ if r1
3222
+ r0 = r1
3223
+ else
3224
+ if has_terminal?('\G[0-9]', true, index)
3225
+ r2 = true
3226
+ @index += 1
3227
+ else
3228
+ r2 = nil
3229
+ end
3230
+ if r2
3231
+ r0 = r2
3232
+ else
3233
+ @index = i0
3234
+ r0 = nil
3235
+ end
3236
+ end
3237
+
3238
+ node_cache[:alphanumeric_char][start_index] = r0
3239
+
3240
+ r0
3241
+ end
3242
+
3243
+ def _nt_space
3244
+ start_index = index
3245
+ if node_cache[:space].has_key?(index)
3246
+ cached = node_cache[:space][index]
3247
+ @index = cached.interval.end if cached
3248
+ return cached
3249
+ end
3250
+
3251
+ s0, i0 = [], index
3252
+ loop do
3253
+ i1 = index
3254
+ r2 = _nt_white
3255
+ if r2
3256
+ r1 = r2
3257
+ else
3258
+ r3 = _nt_comment_to_eol
3259
+ if r3
3260
+ r1 = r3
3261
+ else
3262
+ @index = i1
3263
+ r1 = nil
3264
+ end
3265
+ end
3266
+ if r1
3267
+ s0 << r1
3268
+ else
3269
+ break
3270
+ end
3271
+ end
3272
+ if s0.empty?
3273
+ @index = i0
3274
+ r0 = nil
3275
+ else
3276
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
3277
+ end
3278
+
3279
+ node_cache[:space][start_index] = r0
3280
+
3281
+ r0
3282
+ end
3283
+
3284
+ module CommentToEol0
3285
+ end
3286
+
3287
+ module CommentToEol1
3288
+ end
3289
+
3290
+ def _nt_comment_to_eol
3291
+ start_index = index
3292
+ if node_cache[:comment_to_eol].has_key?(index)
3293
+ cached = node_cache[:comment_to_eol][index]
3294
+ @index = cached.interval.end if cached
3295
+ return cached
3296
+ end
3297
+
3298
+ i0, s0 = index, []
3299
+ if has_terminal?('#', false, index)
3300
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
3301
+ @index += 1
3302
+ else
3303
+ terminal_parse_failure('#')
3304
+ r1 = nil
3305
+ end
3306
+ s0 << r1
3307
+ if r1
3308
+ s2, i2 = [], index
3309
+ loop do
3310
+ i3, s3 = index, []
3311
+ i4 = index
3312
+ if has_terminal?("\n", false, index)
3313
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
3314
+ @index += 1
3315
+ else
3316
+ terminal_parse_failure("\n")
3317
+ r5 = nil
3318
+ end
3319
+ if r5
3320
+ r4 = nil
3321
+ else
3322
+ @index = i4
3323
+ r4 = instantiate_node(SyntaxNode,input, index...index)
3324
+ end
3325
+ s3 << r4
3326
+ if r4
3327
+ if index < input_length
3328
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
3329
+ @index += 1
3330
+ else
3331
+ terminal_parse_failure("any character")
3332
+ r6 = nil
3333
+ end
3334
+ s3 << r6
3335
+ end
3336
+ if s3.last
3337
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
3338
+ r3.extend(CommentToEol0)
3339
+ else
3340
+ @index = i3
3341
+ r3 = nil
3342
+ end
3343
+ if r3
3344
+ s2 << r3
3345
+ else
3346
+ break
3347
+ end
3348
+ end
3349
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
3350
+ s0 << r2
3351
+ end
3352
+ if s0.last
3353
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
3354
+ r0.extend(CommentToEol1)
3355
+ else
3356
+ @index = i0
3357
+ r0 = nil
3358
+ end
3359
+
3360
+ node_cache[:comment_to_eol][start_index] = r0
3361
+
3362
+ r0
3363
+ end
3364
+
3365
+ def _nt_white
3366
+ start_index = index
3367
+ if node_cache[:white].has_key?(index)
3368
+ cached = node_cache[:white][index]
3369
+ @index = cached.interval.end if cached
3370
+ return cached
3371
+ end
3372
+
3373
+ if has_terminal?('\G[ \\t\\n\\r]', true, index)
3374
+ r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
3375
+ @index += 1
3376
+ else
3377
+ r0 = nil
3378
+ end
3379
+
3380
+ node_cache[:white][start_index] = r0
3381
+
3382
+ r0
3383
+ end
3384
+
3385
+ end
3386
+
3387
+ class MetagrammarParser < Treetop::Runtime::CompiledParser
3388
+ include Metagrammar
3389
+ end
3390
+
3391
+ end
3392
+ end