regex-treetop 1.4.8

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 (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