rookout 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +12 -0
  3. data/bin/rookout +30 -0
  4. data/lib/rookout.rb +18 -0
  5. data/lib/rookout/augs/actions/action.rb +11 -0
  6. data/lib/rookout/augs/actions/action_run_processor.rb +29 -0
  7. data/lib/rookout/augs/aug.rb +121 -0
  8. data/lib/rookout/augs/aug_factory.rb +69 -0
  9. data/lib/rookout/augs/aug_rate_limiter.rb +96 -0
  10. data/lib/rookout/augs/augs_manager.rb +77 -0
  11. data/lib/rookout/augs/conditions/condition.rb +15 -0
  12. data/lib/rookout/augs/locations/location.rb +11 -0
  13. data/lib/rookout/augs/locations/location_file_line.rb +26 -0
  14. data/lib/rookout/com_ws/agent_com_ws.rb +221 -0
  15. data/lib/rookout/com_ws/backoff.rb +35 -0
  16. data/lib/rookout/com_ws/command_handler.rb +22 -0
  17. data/lib/rookout/com_ws/git.rb +53 -0
  18. data/lib/rookout/com_ws/information.rb +85 -0
  19. data/lib/rookout/com_ws/output.rb +135 -0
  20. data/lib/rookout/com_ws/token_bucket.rb +36 -0
  21. data/lib/rookout/config.rb +55 -0
  22. data/lib/rookout/exceptions.rb +140 -0
  23. data/lib/rookout/interface.rb +140 -0
  24. data/lib/rookout/logger.rb +158 -0
  25. data/lib/rookout/processor/namespace_serializer.rb +26 -0
  26. data/lib/rookout/processor/namespaces/container_namespace.rb +45 -0
  27. data/lib/rookout/processor/namespaces/frame_namespace.rb +65 -0
  28. data/lib/rookout/processor/namespaces/namespace.rb +28 -0
  29. data/lib/rookout/processor/namespaces/noop_namespace.rb +32 -0
  30. data/lib/rookout/processor/namespaces/ruby_object_namespace.rb +97 -0
  31. data/lib/rookout/processor/namespaces/ruby_object_serializer.rb +208 -0
  32. data/lib/rookout/processor/namespaces/ruby_utils_namespace.rb +65 -0
  33. data/lib/rookout/processor/namespaces/stack_namespace.rb +30 -0
  34. data/lib/rookout/processor/namespaces/traceback_namespace.rb +40 -0
  35. data/lib/rookout/processor/operations/operation.rb +11 -0
  36. data/lib/rookout/processor/operations/set_operation.rb +48 -0
  37. data/lib/rookout/processor/paths/arithmetic_path.rb +84 -0
  38. data/lib/rookout/processor/paths/canopy/actions.rb +184 -0
  39. data/lib/rookout/processor/paths/canopy/consts.rb +82 -0
  40. data/lib/rookout/processor/paths/canopy/maps.rb +2837 -0
  41. data/lib/rookout/processor/paths/canopy/markers.rb +186 -0
  42. data/lib/rookout/processor/paths/path.rb +15 -0
  43. data/lib/rookout/processor/processor.rb +34 -0
  44. data/lib/rookout/processor/processor_factory.rb +23 -0
  45. data/lib/rookout/processor/rook_error.rb +45 -0
  46. data/lib/rookout/protobuf/.gitignore +0 -0
  47. data/lib/rookout/protobuf/agent_info_pb.rb +68 -0
  48. data/lib/rookout/protobuf/controller_info_pb.rb +29 -0
  49. data/lib/rookout/protobuf/envelope_pb.rb +21 -0
  50. data/lib/rookout/protobuf/messages_pb.rb +189 -0
  51. data/lib/rookout/protobuf/variant_pb.rb +139 -0
  52. data/lib/rookout/rookout_singleton.rb +73 -0
  53. data/lib/rookout/services/position.rb +163 -0
  54. data/lib/rookout/services/tracer.rb +83 -0
  55. data/lib/rookout/trigger_services.rb +34 -0
  56. data/lib/rookout/user_warnings.rb +25 -0
  57. data/lib/rookout/version.rb +4 -0
  58. metadata +269 -0
@@ -0,0 +1,184 @@
1
+ module Rookout
2
+ module Processor
3
+ module Paths
4
+ module Canopy
5
+ require_relative "../../../exceptions"
6
+
7
+ require_relative "markers"
8
+ require_relative "consts"
9
+
10
+ class Actions
11
+ def initialize namespace
12
+ @namespace = namespace
13
+ @operations = []
14
+ end
15
+
16
+ attr_reader :operations
17
+
18
+ def make_lookup_operation input, start, finish, _elements
19
+ LookupOperation.new input[start + 1...finish - 1]
20
+ end
21
+
22
+ def make_function_operation _input, _start, _finish, elements
23
+ name = elements[0].text + elements[1].text
24
+ return elements[3] if elements[3].is_a? Exceptions::ToolException
25
+
26
+ args = elements[3].text
27
+ FunctionOperation.new name, args
28
+ end
29
+
30
+ def make_function_operation_access _input, _start, _finish, elements
31
+ # To build the function name, we will merge the unicode_set and all the unicode_set_with_numbers
32
+ # To build the args we will simply read the atom at index 4
33
+ # which can be result of another operation; thus checking for exception
34
+ # For further explanation, check ArithmeticPath.peg
35
+
36
+ return elements[4] if elements[4].is_a? ToolExceptionMarker
37
+
38
+ function_name = elements[1].text + elements[2].text
39
+ args = elements[4].text
40
+ FunctionOperation.new function_name, args
41
+ end
42
+
43
+ def make_attribute_operation input, start, finish, _elements
44
+ AttributeOperation.new input[start + 1...finish]
45
+ end
46
+
47
+ def make_attribute input, start, finish, _elements
48
+ AttributeOperation.new input[start...finish]
49
+ end
50
+
51
+ def make_and_execute_namespace_operation input, start, finish, elements
52
+ # Element 1 will not be null
53
+ # Element 2 is a list of another elements (can be empty)
54
+ # element1.(element2.element3.element4)
55
+ # For further explanation, check ArithmeticPath.peg
56
+ @operations = []
57
+ @operations.push elements[1]
58
+
59
+ elements[2].elements.each { |e| @operations.push e }
60
+
61
+ @operations.each do |op|
62
+ return op if op.is_a? ToolExceptionMarker
63
+ end
64
+
65
+ result = elements[1].read @namespace, false
66
+ elements[2].elements.each do |e|
67
+ result = e.read result, false
68
+ end
69
+
70
+ NamespaceResult.new result, input[start...finish]
71
+ rescue StandardError => e
72
+ ToolExceptionMarker.new e
73
+ end
74
+
75
+ def make_comp_exp_ex _input, _start, _finish, elements
76
+ # Element 2 is the actual expression
77
+ # For further explanation, check ArithmeticPath.peg
78
+ elements[2]
79
+ end
80
+
81
+ # rubocop:disable Metrics/AbcSize
82
+ def make_comp_exp _input, _start, _finish, elements
83
+ # We can assume the following: atom ( opt_ atom )*
84
+ # the first (which must be) will be simple atom
85
+ # the second and so forth will always be pair <Opt, Atom>
86
+ # Its important to remember that this execution will handle the inner brackets if exist
87
+ # In order to handle priority (which i could not figure out if available with canopy library):
88
+ # 1. lets make the tree flat
89
+ # 2. handle priority ourselves - (atom opt1 atom) will be handled before (atom opt2 atom)
90
+ # and will return TreeNode with result
91
+ # For further explanation, check ArithmeticPath.peg
92
+
93
+ # handle case the size is 1
94
+ return elements[0] if elements[1].elements.empty? || elements[0].is_a?(ToolExceptionMarker)
95
+
96
+ flat_elements = [elements[0]]
97
+ elements[1].elements.each do |it|
98
+ return it.elements[1] if it.elements[1].is_a? ToolExceptionMarker
99
+
100
+ flat_elements.push it.elements[0]
101
+ flat_elements.push it.elements[1]
102
+ end
103
+
104
+ until flat_elements.length == 1
105
+ restart_scan = false
106
+
107
+ ALL_LEVELS.each_with_index do |_, level|
108
+ flat_elements.each_with_index do |e, index|
109
+ if e.is_a?(Opt) && e.level == level
110
+ result = e.execute_operation flat_elements[index - 1], flat_elements[index + 1]
111
+ flat_elements = flat_elements[0...index - 1] + [result] + flat_elements[index + 2..-1]
112
+ restart_scan = true
113
+ break
114
+ end
115
+
116
+ break if restart_scan
117
+ end
118
+
119
+ break if restart_scan
120
+ end
121
+ end
122
+
123
+ flat_elements[0]
124
+ end
125
+ # rubocop:enable Metrics/AbcSize
126
+
127
+ def make_opt _input, _start, _finish, elements
128
+ Opt.new elements[1].text
129
+ end
130
+
131
+ def make_apostrophe_string _input, _start, _finish, elements
132
+ Text.new elements[2].text
133
+ end
134
+
135
+ def make_string _input, _start, _finish, elements
136
+ Text.new elements[2].text
137
+ end
138
+
139
+ def make_list input, start, finish, elements
140
+ list = []
141
+ items_to_scan = [elements[3]]
142
+ until items_to_scan.empty?
143
+ item = items_to_scan.pop
144
+
145
+ if item.is_a? Marker
146
+ list.push item
147
+ else
148
+ item.elements.each do |e|
149
+ items_to_scan.push e
150
+ end
151
+ end
152
+ end
153
+
154
+ List.new list, input[start...finish]
155
+ end
156
+
157
+ def make_float input, start, finish, _elements
158
+ FloatNumber.new input[start...finish].delete " "
159
+ end
160
+
161
+ def make_number input, start, finish, _elements
162
+ Number.new input[start...finish].delete " "
163
+ end
164
+
165
+ def make_char input, start, finish, _elements
166
+ Char.new input[start...finish].delete " "
167
+ end
168
+
169
+ def make_bool input, start, finish, _elements
170
+ Bool.new input[start...finish].delete " "
171
+ end
172
+
173
+ def make_null _input, _start, _finish, _elements
174
+ Nil.new
175
+ end
176
+
177
+ def make_undefined _input, _start, _finish, _elements
178
+ Nil.new
179
+ end
180
+ end
181
+ end
182
+ end
183
+ end
184
+ end
@@ -0,0 +1,82 @@
1
+ module Rookout
2
+ module Processor
3
+ module Paths
4
+ module Canopy
5
+ require "bigdecimal"
6
+
7
+ LEVEL1 = ["*", "/"].freeze
8
+ LEVEL2 = ["+", "-"].freeze
9
+ LEVEL3 = ["<=", ">=", "!=", "=", "==", ">", "<", "LT", "GT", "LE", "GE", "EQ", "NE", "lt", "gt", "le", "ge",
10
+ "eq", "ne"].freeze
11
+ LEVEL4 = ["in"].freeze
12
+ LEVEL5 = ["or", "OR", "||", "and", "AND", "&&"].freeze
13
+
14
+ ALL_LEVELS = [LEVEL1, LEVEL2, LEVEL3, LEVEL4, LEVEL5].freeze
15
+
16
+ PRIMITIVES = [Array, Hash, TrueClass, FalseClass, Symbol, Integer, Float, Complex, Rational, BigDecimal,
17
+ String].freeze
18
+
19
+ OPS_ALTERNATIVES = {
20
+ "NE" => "!=",
21
+ "=" => "==",
22
+ "EQ" => "==",
23
+ "LT" => "<",
24
+ "GT" => ">",
25
+ "GE" => ">=",
26
+ "LE" => "<=",
27
+ "AND" => "and",
28
+ "OR" => "or",
29
+ "&&" => "and",
30
+ "IN" => "in",
31
+ "||" => "or"
32
+ }.freeze
33
+
34
+ OPS_FUNCTIONS = {
35
+ "+" => ->(a, b) { a + b },
36
+ "-" => ->(a, b) { a - b },
37
+ "/" => ->(a, b) { a / b },
38
+ "*" => ->(a, b) { a * b },
39
+ "<" => ->(a, b) { a < b },
40
+ "<=" => ->(a, b) { a <= b },
41
+ ">" => ->(a, b) { a > b },
42
+ ">=" => ->(a, b) { a >= b },
43
+ "!=" => ->(a, b) { a != b },
44
+ "=" => ->(a, b) { a == b },
45
+ "==" => ->(a, b) { a == b },
46
+ "in" => lambda do |a, b|
47
+ # If both are strings, just call include
48
+ return b.include? a if b.is_a?(String) && a.is_a?(String)
49
+
50
+ # If it's a dict, scan the keys, compensating for additional abstraction
51
+ if b.is_a? Hash
52
+ b.each_key do |key|
53
+ if key.is_a? ObjectMarker
54
+ return true if key.obj == a
55
+ elsif key == a
56
+ return true
57
+ end
58
+ end
59
+ return false
60
+ end
61
+
62
+ # If it's an array, scan the value, compensating for additional abstraction
63
+ if b.is_a? Array
64
+ b.each do |value|
65
+ if value.is_a? ObjectMarker
66
+ return true if value.obj == a
67
+ elsif value == a
68
+ return true
69
+ end
70
+ end
71
+ return false
72
+ end
73
+
74
+ false
75
+ end,
76
+ "and" => ->(a, b) { a && b },
77
+ "or" => ->(a, b) { a || b }
78
+ }.freeze
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,2837 @@
1
+ # This file was generated from ../rookout/canopy/ArithmeticPath.peg
2
+ # See http://canopy.jcoglan.com/ for documentation.
3
+
4
+ module Maps
5
+ class TreeNode
6
+ include Enumerable
7
+ attr_reader :text, :offset, :elements
8
+
9
+ def initialize(text, offset, elements)
10
+ @text = text
11
+ @offset = offset
12
+ @elements = elements
13
+ end
14
+
15
+ def each(&block)
16
+ @elements.each(&block)
17
+ end
18
+ end
19
+
20
+ class TreeNode1 < TreeNode
21
+ attr_reader :atom
22
+
23
+ def initialize(text, offset, elements)
24
+ super
25
+ @atom = elements[0]
26
+ end
27
+ end
28
+
29
+ class TreeNode2 < TreeNode
30
+ attr_reader :opt_, :atom
31
+
32
+ def initialize(text, offset, elements)
33
+ super
34
+ @opt_ = elements[0]
35
+ @atom = elements[1]
36
+ end
37
+ end
38
+
39
+ class TreeNode3 < TreeNode
40
+ attr_reader :unicode_set
41
+
42
+ def initialize(text, offset, elements)
43
+ super
44
+ @unicode_set = elements[0]
45
+ end
46
+ end
47
+
48
+ class TreeNode4 < TreeNode
49
+ attr_reader :variable
50
+
51
+ def initialize(text, offset, elements)
52
+ super
53
+ @variable = elements[1]
54
+ end
55
+ end
56
+
57
+ class TreeNode5 < TreeNode
58
+ attr_reader :unicode_set
59
+
60
+ def initialize(text, offset, elements)
61
+ super
62
+ @unicode_set = elements[0]
63
+ end
64
+ end
65
+
66
+ class TreeNode6 < TreeNode
67
+ attr_reader :unicode_set
68
+
69
+ def initialize(text, offset, elements)
70
+ super
71
+ @unicode_set = elements[1]
72
+ end
73
+ end
74
+
75
+ class TreeNode7 < TreeNode
76
+ attr_reader :__
77
+
78
+ def initialize(text, offset, elements)
79
+ super
80
+ @__ = elements[3]
81
+ end
82
+ end
83
+
84
+ class TreeNode8 < TreeNode
85
+ attr_reader :__, :comp_expression
86
+
87
+ def initialize(text, offset, elements)
88
+ super
89
+ @__ = elements[4]
90
+ @comp_expression = elements[2]
91
+ end
92
+ end
93
+
94
+ class TreeNode9 < TreeNode
95
+ attr_reader :__
96
+
97
+ def initialize(text, offset, elements)
98
+ super
99
+ @__ = elements[4]
100
+ end
101
+ end
102
+
103
+ class TreeNode10 < TreeNode
104
+ attr_reader :__
105
+
106
+ def initialize(text, offset, elements)
107
+ super
108
+ @__ = elements[4]
109
+ end
110
+ end
111
+
112
+ class TreeNode11 < TreeNode
113
+ attr_reader :__
114
+
115
+ def initialize(text, offset, elements)
116
+ super
117
+ @__ = elements[6]
118
+ end
119
+ end
120
+
121
+ class TreeNode12 < TreeNode
122
+ attr_reader :atom, :__
123
+
124
+ def initialize(text, offset, elements)
125
+ super
126
+ @atom = elements[0]
127
+ @__ = elements[1]
128
+ end
129
+ end
130
+
131
+ class TreeNode13 < TreeNode
132
+ attr_reader :__, :atom
133
+
134
+ def initialize(text, offset, elements)
135
+ super
136
+ @__ = elements[3]
137
+ @atom = elements[2]
138
+ end
139
+ end
140
+
141
+ class TreeNode14 < TreeNode
142
+ attr_reader :__
143
+
144
+ def initialize(text, offset, elements)
145
+ super
146
+ @__ = elements[4]
147
+ end
148
+ end
149
+
150
+ class TreeNode15 < TreeNode
151
+ attr_reader :__
152
+
153
+ def initialize(text, offset, elements)
154
+ super
155
+ @__ = elements[3]
156
+ end
157
+ end
158
+
159
+ class TreeNode16 < TreeNode
160
+ attr_reader :__
161
+
162
+ def initialize(text, offset, elements)
163
+ super
164
+ @__ = elements[5]
165
+ end
166
+ end
167
+
168
+ class TreeNode17 < TreeNode
169
+ attr_reader :__, :data
170
+
171
+ def initialize(text, offset, elements)
172
+ super
173
+ @__ = elements[2]
174
+ @data = elements[1]
175
+ end
176
+ end
177
+
178
+ class TreeNode18 < TreeNode
179
+ attr_reader :__, :data
180
+
181
+ def initialize(text, offset, elements)
182
+ super
183
+ @__ = elements[2]
184
+ @data = elements[1]
185
+ end
186
+ end
187
+
188
+ class TreeNode19 < TreeNode
189
+ attr_reader :__, :data
190
+
191
+ def initialize(text, offset, elements)
192
+ super
193
+ @__ = elements[2]
194
+ @data = elements[1]
195
+ end
196
+ end
197
+
198
+ class TreeNode20 < TreeNode
199
+ attr_reader :__, :data
200
+
201
+ def initialize(text, offset, elements)
202
+ super
203
+ @__ = elements[2]
204
+ @data = elements[1]
205
+ end
206
+ end
207
+
208
+ ParseError = Class.new(StandardError)
209
+
210
+ FAILURE = Object.new
211
+
212
+ module Grammar
213
+ def _read_comp_expression
214
+ address0, index0 = FAILURE, @offset
215
+ cached = @cache[:comp_expression][index0]
216
+ if cached
217
+ @offset = cached[1]
218
+ return cached[0]
219
+ end
220
+ index1, elements0 = @offset, []
221
+ address1 = FAILURE
222
+ address1 = _read_atom
223
+ unless address1 == FAILURE
224
+ elements0 << address1
225
+ address2 = FAILURE
226
+ remaining0, index2, elements1, address3 = 0, @offset, [], true
227
+ until address3 == FAILURE
228
+ index3, elements2 = @offset, []
229
+ address4 = FAILURE
230
+ address4 = _read_opt_
231
+ unless address4 == FAILURE
232
+ elements2 << address4
233
+ address5 = FAILURE
234
+ address5 = _read_atom
235
+ unless address5 == FAILURE
236
+ elements2 << address5
237
+ else
238
+ elements2 = nil
239
+ @offset = index3
240
+ end
241
+ else
242
+ elements2 = nil
243
+ @offset = index3
244
+ end
245
+ if elements2.nil?
246
+ address3 = FAILURE
247
+ else
248
+ address3 = TreeNode2.new(@input[index3...@offset], index3, elements2)
249
+ @offset = @offset
250
+ end
251
+ unless address3 == FAILURE
252
+ elements1 << address3
253
+ remaining0 -= 1
254
+ end
255
+ end
256
+ if remaining0 <= 0
257
+ address2 = TreeNode.new(@input[index2...@offset], index2, elements1)
258
+ @offset = @offset
259
+ else
260
+ address2 = FAILURE
261
+ end
262
+ unless address2 == FAILURE
263
+ elements0 << address2
264
+ else
265
+ elements0 = nil
266
+ @offset = index1
267
+ end
268
+ else
269
+ elements0 = nil
270
+ @offset = index1
271
+ end
272
+ if elements0.nil?
273
+ address0 = FAILURE
274
+ else
275
+ address0 = @actions.make_comp_exp(@input, index1, @offset, elements0)
276
+ @offset = @offset
277
+ end
278
+ @cache[:comp_expression][index0] = [address0, @offset]
279
+ return address0
280
+ end
281
+
282
+ def _read_atom
283
+ address0, index0 = FAILURE, @offset
284
+ cached = @cache[:atom][index0]
285
+ if cached
286
+ @offset = cached[1]
287
+ return cached[0]
288
+ end
289
+ index1 = @offset
290
+ address0 = _read_float_
291
+ if address0 == FAILURE
292
+ @offset = index1
293
+ address0 = _read_number
294
+ if address0 == FAILURE
295
+ @offset = index1
296
+ address0 = _read_string
297
+ if address0 == FAILURE
298
+ @offset = index1
299
+ address0 = _read_apostrophe_string
300
+ if address0 == FAILURE
301
+ @offset = index1
302
+ address0 = _read_list
303
+ if address0 == FAILURE
304
+ @offset = index1
305
+ address0 = _read_chr
306
+ if address0 == FAILURE
307
+ @offset = index1
308
+ address0 = _read_boolean_
309
+ if address0 == FAILURE
310
+ @offset = index1
311
+ address0 = _read_null_
312
+ if address0 == FAILURE
313
+ @offset = index1
314
+ address0 = _read_undefined_
315
+ if address0 == FAILURE
316
+ @offset = index1
317
+ address0 = _read_comp_expression_ex
318
+ if address0 == FAILURE
319
+ @offset = index1
320
+ address0 = _read_namespace
321
+ if address0 == FAILURE
322
+ @offset = index1
323
+ end
324
+ end
325
+ end
326
+ end
327
+ end
328
+ end
329
+ end
330
+ end
331
+ end
332
+ end
333
+ end
334
+ @cache[:atom][index0] = [address0, @offset]
335
+ return address0
336
+ end
337
+
338
+ def _read_unicode_set
339
+ address0, index0 = FAILURE, @offset
340
+ cached = @cache[:unicode_set][index0]
341
+ if cached
342
+ @offset = cached[1]
343
+ return cached[0]
344
+ end
345
+ chunk0, max0 = nil, @offset + 1
346
+ if max0 <= @input_size
347
+ chunk0 = @input[@offset...max0]
348
+ end
349
+ if chunk0 =~ /\A[a-zA-Z_$@]/
350
+ address0 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
351
+ @offset = @offset + 1
352
+ else
353
+ address0 = FAILURE
354
+ if @offset > @failure
355
+ @failure = @offset
356
+ @expected = []
357
+ end
358
+ if @offset == @failure
359
+ @expected << "[a-zA-Z_$@]"
360
+ end
361
+ end
362
+ @cache[:unicode_set][index0] = [address0, @offset]
363
+ return address0
364
+ end
365
+
366
+ def _read_unicode_set_with_numbers
367
+ address0, index0 = FAILURE, @offset
368
+ cached = @cache[:unicode_set_with_numbers][index0]
369
+ if cached
370
+ @offset = cached[1]
371
+ return cached[0]
372
+ end
373
+ chunk0, max0 = nil, @offset + 1
374
+ if max0 <= @input_size
375
+ chunk0 = @input[@offset...max0]
376
+ end
377
+ if chunk0 =~ /\A[a-zA-Z0-9_$@]/
378
+ address0 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
379
+ @offset = @offset + 1
380
+ else
381
+ address0 = FAILURE
382
+ if @offset > @failure
383
+ @failure = @offset
384
+ @expected = []
385
+ end
386
+ if @offset == @failure
387
+ @expected << "[a-zA-Z0-9_$@]"
388
+ end
389
+ end
390
+ @cache[:unicode_set_with_numbers][index0] = [address0, @offset]
391
+ return address0
392
+ end
393
+
394
+ def _read_variable
395
+ address0, index0 = FAILURE, @offset
396
+ cached = @cache[:variable][index0]
397
+ if cached
398
+ @offset = cached[1]
399
+ return cached[0]
400
+ end
401
+ index1, elements0 = @offset, []
402
+ address1 = FAILURE
403
+ address1 = _read_unicode_set
404
+ unless address1 == FAILURE
405
+ elements0 << address1
406
+ address2 = FAILURE
407
+ remaining0, index2, elements1, address3 = 0, @offset, [], true
408
+ until address3 == FAILURE
409
+ address3 = _read_unicode_set_with_numbers
410
+ unless address3 == FAILURE
411
+ elements1 << address3
412
+ remaining0 -= 1
413
+ end
414
+ end
415
+ if remaining0 <= 0
416
+ address2 = TreeNode.new(@input[index2...@offset], index2, elements1)
417
+ @offset = @offset
418
+ else
419
+ address2 = FAILURE
420
+ end
421
+ unless address2 == FAILURE
422
+ elements0 << address2
423
+ else
424
+ elements0 = nil
425
+ @offset = index1
426
+ end
427
+ else
428
+ elements0 = nil
429
+ @offset = index1
430
+ end
431
+ if elements0.nil?
432
+ address0 = FAILURE
433
+ else
434
+ address0 = @actions.make_attribute(@input, index1, @offset, elements0)
435
+ @offset = @offset
436
+ end
437
+ @cache[:variable][index0] = [address0, @offset]
438
+ return address0
439
+ end
440
+
441
+ def _read_variable_access
442
+ address0, index0 = FAILURE, @offset
443
+ cached = @cache[:variable_access][index0]
444
+ if cached
445
+ @offset = cached[1]
446
+ return cached[0]
447
+ end
448
+ index1, elements0 = @offset, []
449
+ address1 = FAILURE
450
+ chunk0, max0 = nil, @offset + 1
451
+ if max0 <= @input_size
452
+ chunk0 = @input[@offset...max0]
453
+ end
454
+ if chunk0 == "."
455
+ address1 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
456
+ @offset = @offset + 1
457
+ else
458
+ address1 = FAILURE
459
+ if @offset > @failure
460
+ @failure = @offset
461
+ @expected = []
462
+ end
463
+ if @offset == @failure
464
+ @expected << "\".\""
465
+ end
466
+ end
467
+ unless address1 == FAILURE
468
+ elements0 << address1
469
+ address2 = FAILURE
470
+ address2 = _read_variable
471
+ unless address2 == FAILURE
472
+ elements0 << address2
473
+ else
474
+ elements0 = nil
475
+ @offset = index1
476
+ end
477
+ else
478
+ elements0 = nil
479
+ @offset = index1
480
+ end
481
+ if elements0.nil?
482
+ address0 = FAILURE
483
+ else
484
+ address0 = @actions.make_attribute_operation(@input, index1, @offset, elements0)
485
+ @offset = @offset
486
+ end
487
+ @cache[:variable_access][index0] = [address0, @offset]
488
+ return address0
489
+ end
490
+
491
+ def _read_map_access
492
+ address0, index0 = FAILURE, @offset
493
+ cached = @cache[:map_access][index0]
494
+ if cached
495
+ @offset = cached[1]
496
+ return cached[0]
497
+ end
498
+ index1, elements0 = @offset, []
499
+ address1 = FAILURE
500
+ chunk0, max0 = nil, @offset + 1
501
+ if max0 <= @input_size
502
+ chunk0 = @input[@offset...max0]
503
+ end
504
+ if chunk0 == "["
505
+ address1 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
506
+ @offset = @offset + 1
507
+ else
508
+ address1 = FAILURE
509
+ if @offset > @failure
510
+ @failure = @offset
511
+ @expected = []
512
+ end
513
+ if @offset == @failure
514
+ @expected << "\"[\""
515
+ end
516
+ end
517
+ unless address1 == FAILURE
518
+ elements0 << address1
519
+ address2 = FAILURE
520
+ index2 = @offset
521
+ address2 = _read_chr
522
+ if address2 == FAILURE
523
+ @offset = index2
524
+ address2 = _read_string
525
+ if address2 == FAILURE
526
+ @offset = index2
527
+ address2 = _read_apostrophe_string
528
+ if address2 == FAILURE
529
+ @offset = index2
530
+ address2 = _read_number
531
+ if address2 == FAILURE
532
+ @offset = index2
533
+ end
534
+ end
535
+ end
536
+ end
537
+ unless address2 == FAILURE
538
+ elements0 << address2
539
+ address3 = FAILURE
540
+ chunk1, max1 = nil, @offset + 1
541
+ if max1 <= @input_size
542
+ chunk1 = @input[@offset...max1]
543
+ end
544
+ if chunk1 == "]"
545
+ address3 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
546
+ @offset = @offset + 1
547
+ else
548
+ address3 = FAILURE
549
+ if @offset > @failure
550
+ @failure = @offset
551
+ @expected = []
552
+ end
553
+ if @offset == @failure
554
+ @expected << "\"]\""
555
+ end
556
+ end
557
+ unless address3 == FAILURE
558
+ elements0 << address3
559
+ else
560
+ elements0 = nil
561
+ @offset = index1
562
+ end
563
+ else
564
+ elements0 = nil
565
+ @offset = index1
566
+ end
567
+ else
568
+ elements0 = nil
569
+ @offset = index1
570
+ end
571
+ if elements0.nil?
572
+ address0 = FAILURE
573
+ else
574
+ address0 = @actions.make_lookup_operation(@input, index1, @offset, elements0)
575
+ @offset = @offset
576
+ end
577
+ @cache[:map_access][index0] = [address0, @offset]
578
+ return address0
579
+ end
580
+
581
+ def _read_func_call
582
+ address0, index0 = FAILURE, @offset
583
+ cached = @cache[:func_call][index0]
584
+ if cached
585
+ @offset = cached[1]
586
+ return cached[0]
587
+ end
588
+ index1, elements0 = @offset, []
589
+ address1 = FAILURE
590
+ address1 = _read_unicode_set
591
+ unless address1 == FAILURE
592
+ elements0 << address1
593
+ address2 = FAILURE
594
+ remaining0, index2, elements1, address3 = 0, @offset, [], true
595
+ until address3 == FAILURE
596
+ address3 = _read_unicode_set_with_numbers
597
+ unless address3 == FAILURE
598
+ elements1 << address3
599
+ remaining0 -= 1
600
+ end
601
+ end
602
+ if remaining0 <= 0
603
+ address2 = TreeNode.new(@input[index2...@offset], index2, elements1)
604
+ @offset = @offset
605
+ else
606
+ address2 = FAILURE
607
+ end
608
+ unless address2 == FAILURE
609
+ elements0 << address2
610
+ address4 = FAILURE
611
+ chunk0, max0 = nil, @offset + 1
612
+ if max0 <= @input_size
613
+ chunk0 = @input[@offset...max0]
614
+ end
615
+ if chunk0 == "("
616
+ address4 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
617
+ @offset = @offset + 1
618
+ else
619
+ address4 = FAILURE
620
+ if @offset > @failure
621
+ @failure = @offset
622
+ @expected = []
623
+ end
624
+ if @offset == @failure
625
+ @expected << "\"(\""
626
+ end
627
+ end
628
+ unless address4 == FAILURE
629
+ elements0 << address4
630
+ address5 = FAILURE
631
+ index3 = @offset
632
+ address5 = _read_atom
633
+ if address5 == FAILURE
634
+ address5 = TreeNode.new(@input[index3...index3], index3, [])
635
+ @offset = index3
636
+ end
637
+ unless address5 == FAILURE
638
+ elements0 << address5
639
+ address6 = FAILURE
640
+ chunk1, max1 = nil, @offset + 1
641
+ if max1 <= @input_size
642
+ chunk1 = @input[@offset...max1]
643
+ end
644
+ if chunk1 == ")"
645
+ address6 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
646
+ @offset = @offset + 1
647
+ else
648
+ address6 = FAILURE
649
+ if @offset > @failure
650
+ @failure = @offset
651
+ @expected = []
652
+ end
653
+ if @offset == @failure
654
+ @expected << "\")\""
655
+ end
656
+ end
657
+ unless address6 == FAILURE
658
+ elements0 << address6
659
+ else
660
+ elements0 = nil
661
+ @offset = index1
662
+ end
663
+ else
664
+ elements0 = nil
665
+ @offset = index1
666
+ end
667
+ else
668
+ elements0 = nil
669
+ @offset = index1
670
+ end
671
+ else
672
+ elements0 = nil
673
+ @offset = index1
674
+ end
675
+ else
676
+ elements0 = nil
677
+ @offset = index1
678
+ end
679
+ if elements0.nil?
680
+ address0 = FAILURE
681
+ else
682
+ address0 = @actions.make_function_operation(@input, index1, @offset, elements0)
683
+ @offset = @offset
684
+ end
685
+ @cache[:func_call][index0] = [address0, @offset]
686
+ return address0
687
+ end
688
+
689
+ def _read_func_call_access
690
+ address0, index0 = FAILURE, @offset
691
+ cached = @cache[:func_call_access][index0]
692
+ if cached
693
+ @offset = cached[1]
694
+ return cached[0]
695
+ end
696
+ index1, elements0 = @offset, []
697
+ address1 = FAILURE
698
+ chunk0, max0 = nil, @offset + 1
699
+ if max0 <= @input_size
700
+ chunk0 = @input[@offset...max0]
701
+ end
702
+ if chunk0 == "."
703
+ address1 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
704
+ @offset = @offset + 1
705
+ else
706
+ address1 = FAILURE
707
+ if @offset > @failure
708
+ @failure = @offset
709
+ @expected = []
710
+ end
711
+ if @offset == @failure
712
+ @expected << "\".\""
713
+ end
714
+ end
715
+ unless address1 == FAILURE
716
+ elements0 << address1
717
+ address2 = FAILURE
718
+ address2 = _read_unicode_set
719
+ unless address2 == FAILURE
720
+ elements0 << address2
721
+ address3 = FAILURE
722
+ remaining0, index2, elements1, address4 = 0, @offset, [], true
723
+ until address4 == FAILURE
724
+ address4 = _read_unicode_set_with_numbers
725
+ unless address4 == FAILURE
726
+ elements1 << address4
727
+ remaining0 -= 1
728
+ end
729
+ end
730
+ if remaining0 <= 0
731
+ address3 = TreeNode.new(@input[index2...@offset], index2, elements1)
732
+ @offset = @offset
733
+ else
734
+ address3 = FAILURE
735
+ end
736
+ unless address3 == FAILURE
737
+ elements0 << address3
738
+ address5 = FAILURE
739
+ chunk1, max1 = nil, @offset + 1
740
+ if max1 <= @input_size
741
+ chunk1 = @input[@offset...max1]
742
+ end
743
+ if chunk1 == "("
744
+ address5 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
745
+ @offset = @offset + 1
746
+ else
747
+ address5 = FAILURE
748
+ if @offset > @failure
749
+ @failure = @offset
750
+ @expected = []
751
+ end
752
+ if @offset == @failure
753
+ @expected << "\"(\""
754
+ end
755
+ end
756
+ unless address5 == FAILURE
757
+ elements0 << address5
758
+ address6 = FAILURE
759
+ index3 = @offset
760
+ address6 = _read_atom
761
+ if address6 == FAILURE
762
+ address6 = TreeNode.new(@input[index3...index3], index3, [])
763
+ @offset = index3
764
+ end
765
+ unless address6 == FAILURE
766
+ elements0 << address6
767
+ address7 = FAILURE
768
+ chunk2, max2 = nil, @offset + 1
769
+ if max2 <= @input_size
770
+ chunk2 = @input[@offset...max2]
771
+ end
772
+ if chunk2 == ")"
773
+ address7 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
774
+ @offset = @offset + 1
775
+ else
776
+ address7 = FAILURE
777
+ if @offset > @failure
778
+ @failure = @offset
779
+ @expected = []
780
+ end
781
+ if @offset == @failure
782
+ @expected << "\")\""
783
+ end
784
+ end
785
+ unless address7 == FAILURE
786
+ elements0 << address7
787
+ else
788
+ elements0 = nil
789
+ @offset = index1
790
+ end
791
+ else
792
+ elements0 = nil
793
+ @offset = index1
794
+ end
795
+ else
796
+ elements0 = nil
797
+ @offset = index1
798
+ end
799
+ else
800
+ elements0 = nil
801
+ @offset = index1
802
+ end
803
+ else
804
+ elements0 = nil
805
+ @offset = index1
806
+ end
807
+ else
808
+ elements0 = nil
809
+ @offset = index1
810
+ end
811
+ if elements0.nil?
812
+ address0 = FAILURE
813
+ else
814
+ address0 = @actions.make_function_operation_access(@input, index1, @offset, elements0)
815
+ @offset = @offset
816
+ end
817
+ @cache[:func_call_access][index0] = [address0, @offset]
818
+ return address0
819
+ end
820
+
821
+ def _read_namespace
822
+ address0, index0 = FAILURE, @offset
823
+ cached = @cache[:namespace][index0]
824
+ if cached
825
+ @offset = cached[1]
826
+ return cached[0]
827
+ end
828
+ index1, elements0 = @offset, []
829
+ address1 = FAILURE
830
+ address1 = _read___
831
+ unless address1 == FAILURE
832
+ elements0 << address1
833
+ address2 = FAILURE
834
+ index2 = @offset
835
+ address2 = _read_func_call
836
+ if address2 == FAILURE
837
+ @offset = index2
838
+ address2 = _read_variable
839
+ if address2 == FAILURE
840
+ @offset = index2
841
+ end
842
+ end
843
+ unless address2 == FAILURE
844
+ elements0 << address2
845
+ address3 = FAILURE
846
+ remaining0, index3, elements1, address4 = 0, @offset, [], true
847
+ until address4 == FAILURE
848
+ index4 = @offset
849
+ address4 = _read_func_call_access
850
+ if address4 == FAILURE
851
+ @offset = index4
852
+ address4 = _read_map_access
853
+ if address4 == FAILURE
854
+ @offset = index4
855
+ address4 = _read_variable_access
856
+ if address4 == FAILURE
857
+ @offset = index4
858
+ end
859
+ end
860
+ end
861
+ unless address4 == FAILURE
862
+ elements1 << address4
863
+ remaining0 -= 1
864
+ end
865
+ end
866
+ if remaining0 <= 0
867
+ address3 = TreeNode.new(@input[index3...@offset], index3, elements1)
868
+ @offset = @offset
869
+ else
870
+ address3 = FAILURE
871
+ end
872
+ unless address3 == FAILURE
873
+ elements0 << address3
874
+ address5 = FAILURE
875
+ address5 = _read___
876
+ unless address5 == FAILURE
877
+ elements0 << address5
878
+ else
879
+ elements0 = nil
880
+ @offset = index1
881
+ end
882
+ else
883
+ elements0 = nil
884
+ @offset = index1
885
+ end
886
+ else
887
+ elements0 = nil
888
+ @offset = index1
889
+ end
890
+ else
891
+ elements0 = nil
892
+ @offset = index1
893
+ end
894
+ if elements0.nil?
895
+ address0 = FAILURE
896
+ else
897
+ address0 = @actions.make_and_execute_namespace_operation(@input, index1, @offset, elements0)
898
+ @offset = @offset
899
+ end
900
+ @cache[:namespace][index0] = [address0, @offset]
901
+ return address0
902
+ end
903
+
904
+ def _read_comp_expression_ex
905
+ address0, index0 = FAILURE, @offset
906
+ cached = @cache[:comp_expression_ex][index0]
907
+ if cached
908
+ @offset = cached[1]
909
+ return cached[0]
910
+ end
911
+ index1, elements0 = @offset, []
912
+ address1 = FAILURE
913
+ address1 = _read___
914
+ unless address1 == FAILURE
915
+ elements0 << address1
916
+ address2 = FAILURE
917
+ chunk0, max0 = nil, @offset + 1
918
+ if max0 <= @input_size
919
+ chunk0 = @input[@offset...max0]
920
+ end
921
+ if chunk0 == "("
922
+ address2 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
923
+ @offset = @offset + 1
924
+ else
925
+ address2 = FAILURE
926
+ if @offset > @failure
927
+ @failure = @offset
928
+ @expected = []
929
+ end
930
+ if @offset == @failure
931
+ @expected << "\"(\""
932
+ end
933
+ end
934
+ unless address2 == FAILURE
935
+ elements0 << address2
936
+ address3 = FAILURE
937
+ address3 = _read_comp_expression
938
+ unless address3 == FAILURE
939
+ elements0 << address3
940
+ address4 = FAILURE
941
+ chunk1, max1 = nil, @offset + 1
942
+ if max1 <= @input_size
943
+ chunk1 = @input[@offset...max1]
944
+ end
945
+ if chunk1 == ")"
946
+ address4 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
947
+ @offset = @offset + 1
948
+ else
949
+ address4 = FAILURE
950
+ if @offset > @failure
951
+ @failure = @offset
952
+ @expected = []
953
+ end
954
+ if @offset == @failure
955
+ @expected << "\")\""
956
+ end
957
+ end
958
+ unless address4 == FAILURE
959
+ elements0 << address4
960
+ address5 = FAILURE
961
+ address5 = _read___
962
+ unless address5 == FAILURE
963
+ elements0 << address5
964
+ else
965
+ elements0 = nil
966
+ @offset = index1
967
+ end
968
+ else
969
+ elements0 = nil
970
+ @offset = index1
971
+ end
972
+ else
973
+ elements0 = nil
974
+ @offset = index1
975
+ end
976
+ else
977
+ elements0 = nil
978
+ @offset = index1
979
+ end
980
+ else
981
+ elements0 = nil
982
+ @offset = index1
983
+ end
984
+ if elements0.nil?
985
+ address0 = FAILURE
986
+ else
987
+ address0 = @actions.make_comp_exp_ex(@input, index1, @offset, elements0)
988
+ @offset = @offset
989
+ end
990
+ @cache[:comp_expression_ex][index0] = [address0, @offset]
991
+ return address0
992
+ end
993
+
994
+ def _read_string
995
+ address0, index0 = FAILURE, @offset
996
+ cached = @cache[:string][index0]
997
+ if cached
998
+ @offset = cached[1]
999
+ return cached[0]
1000
+ end
1001
+ index1, elements0 = @offset, []
1002
+ address1 = FAILURE
1003
+ address1 = _read___
1004
+ unless address1 == FAILURE
1005
+ elements0 << address1
1006
+ address2 = FAILURE
1007
+ chunk0, max0 = nil, @offset + 1
1008
+ if max0 <= @input_size
1009
+ chunk0 = @input[@offset...max0]
1010
+ end
1011
+ if chunk0 =~ /\A[\"]/
1012
+ address2 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
1013
+ @offset = @offset + 1
1014
+ else
1015
+ address2 = FAILURE
1016
+ if @offset > @failure
1017
+ @failure = @offset
1018
+ @expected = []
1019
+ end
1020
+ if @offset == @failure
1021
+ @expected << "[\\\"]"
1022
+ end
1023
+ end
1024
+ unless address2 == FAILURE
1025
+ elements0 << address2
1026
+ address3 = FAILURE
1027
+ remaining0, index2, elements1, address4 = 0, @offset, [], true
1028
+ until address4 == FAILURE
1029
+ chunk1, max1 = nil, @offset + 1
1030
+ if max1 <= @input_size
1031
+ chunk1 = @input[@offset...max1]
1032
+ end
1033
+ if chunk1 =~ /\A[ !#-~]/
1034
+ address4 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
1035
+ @offset = @offset + 1
1036
+ else
1037
+ address4 = FAILURE
1038
+ if @offset > @failure
1039
+ @failure = @offset
1040
+ @expected = []
1041
+ end
1042
+ if @offset == @failure
1043
+ @expected << "[ !#-~]"
1044
+ end
1045
+ end
1046
+ unless address4 == FAILURE
1047
+ elements1 << address4
1048
+ remaining0 -= 1
1049
+ end
1050
+ end
1051
+ if remaining0 <= 0
1052
+ address3 = TreeNode.new(@input[index2...@offset], index2, elements1)
1053
+ @offset = @offset
1054
+ else
1055
+ address3 = FAILURE
1056
+ end
1057
+ unless address3 == FAILURE
1058
+ elements0 << address3
1059
+ address5 = FAILURE
1060
+ chunk2, max2 = nil, @offset + 1
1061
+ if max2 <= @input_size
1062
+ chunk2 = @input[@offset...max2]
1063
+ end
1064
+ if chunk2 =~ /\A[\"]/
1065
+ address5 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
1066
+ @offset = @offset + 1
1067
+ else
1068
+ address5 = FAILURE
1069
+ if @offset > @failure
1070
+ @failure = @offset
1071
+ @expected = []
1072
+ end
1073
+ if @offset == @failure
1074
+ @expected << "[\\\"]"
1075
+ end
1076
+ end
1077
+ unless address5 == FAILURE
1078
+ elements0 << address5
1079
+ address6 = FAILURE
1080
+ address6 = _read___
1081
+ unless address6 == FAILURE
1082
+ elements0 << address6
1083
+ else
1084
+ elements0 = nil
1085
+ @offset = index1
1086
+ end
1087
+ else
1088
+ elements0 = nil
1089
+ @offset = index1
1090
+ end
1091
+ else
1092
+ elements0 = nil
1093
+ @offset = index1
1094
+ end
1095
+ else
1096
+ elements0 = nil
1097
+ @offset = index1
1098
+ end
1099
+ else
1100
+ elements0 = nil
1101
+ @offset = index1
1102
+ end
1103
+ if elements0.nil?
1104
+ address0 = FAILURE
1105
+ else
1106
+ address0 = @actions.make_string(@input, index1, @offset, elements0)
1107
+ @offset = @offset
1108
+ end
1109
+ @cache[:string][index0] = [address0, @offset]
1110
+ return address0
1111
+ end
1112
+
1113
+ def _read_apostrophe_string
1114
+ address0, index0 = FAILURE, @offset
1115
+ cached = @cache[:apostrophe_string][index0]
1116
+ if cached
1117
+ @offset = cached[1]
1118
+ return cached[0]
1119
+ end
1120
+ index1, elements0 = @offset, []
1121
+ address1 = FAILURE
1122
+ address1 = _read___
1123
+ unless address1 == FAILURE
1124
+ elements0 << address1
1125
+ address2 = FAILURE
1126
+ chunk0, max0 = nil, @offset + 1
1127
+ if max0 <= @input_size
1128
+ chunk0 = @input[@offset...max0]
1129
+ end
1130
+ if chunk0 == "'"
1131
+ address2 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
1132
+ @offset = @offset + 1
1133
+ else
1134
+ address2 = FAILURE
1135
+ if @offset > @failure
1136
+ @failure = @offset
1137
+ @expected = []
1138
+ end
1139
+ if @offset == @failure
1140
+ @expected << "\"'\""
1141
+ end
1142
+ end
1143
+ unless address2 == FAILURE
1144
+ elements0 << address2
1145
+ address3 = FAILURE
1146
+ remaining0, index2, elements1, address4 = 0, @offset, [], true
1147
+ until address4 == FAILURE
1148
+ chunk1, max1 = nil, @offset + 1
1149
+ if max1 <= @input_size
1150
+ chunk1 = @input[@offset...max1]
1151
+ end
1152
+ if chunk1 =~ /\A[^']/
1153
+ address4 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
1154
+ @offset = @offset + 1
1155
+ else
1156
+ address4 = FAILURE
1157
+ if @offset > @failure
1158
+ @failure = @offset
1159
+ @expected = []
1160
+ end
1161
+ if @offset == @failure
1162
+ @expected << "[^']"
1163
+ end
1164
+ end
1165
+ unless address4 == FAILURE
1166
+ elements1 << address4
1167
+ remaining0 -= 1
1168
+ end
1169
+ end
1170
+ if remaining0 <= 0
1171
+ address3 = TreeNode.new(@input[index2...@offset], index2, elements1)
1172
+ @offset = @offset
1173
+ else
1174
+ address3 = FAILURE
1175
+ end
1176
+ unless address3 == FAILURE
1177
+ elements0 << address3
1178
+ address5 = FAILURE
1179
+ chunk2, max2 = nil, @offset + 1
1180
+ if max2 <= @input_size
1181
+ chunk2 = @input[@offset...max2]
1182
+ end
1183
+ if chunk2 == "'"
1184
+ address5 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
1185
+ @offset = @offset + 1
1186
+ else
1187
+ address5 = FAILURE
1188
+ if @offset > @failure
1189
+ @failure = @offset
1190
+ @expected = []
1191
+ end
1192
+ if @offset == @failure
1193
+ @expected << "\"'\""
1194
+ end
1195
+ end
1196
+ unless address5 == FAILURE
1197
+ elements0 << address5
1198
+ address6 = FAILURE
1199
+ address6 = _read___
1200
+ unless address6 == FAILURE
1201
+ elements0 << address6
1202
+ else
1203
+ elements0 = nil
1204
+ @offset = index1
1205
+ end
1206
+ else
1207
+ elements0 = nil
1208
+ @offset = index1
1209
+ end
1210
+ else
1211
+ elements0 = nil
1212
+ @offset = index1
1213
+ end
1214
+ else
1215
+ elements0 = nil
1216
+ @offset = index1
1217
+ end
1218
+ else
1219
+ elements0 = nil
1220
+ @offset = index1
1221
+ end
1222
+ if elements0.nil?
1223
+ address0 = FAILURE
1224
+ else
1225
+ address0 = @actions.make_apostrophe_string(@input, index1, @offset, elements0)
1226
+ @offset = @offset
1227
+ end
1228
+ @cache[:apostrophe_string][index0] = [address0, @offset]
1229
+ return address0
1230
+ end
1231
+
1232
+ def _read_list
1233
+ address0, index0 = FAILURE, @offset
1234
+ cached = @cache[:list][index0]
1235
+ if cached
1236
+ @offset = cached[1]
1237
+ return cached[0]
1238
+ end
1239
+ index1, elements0 = @offset, []
1240
+ address1 = FAILURE
1241
+ address1 = _read___
1242
+ unless address1 == FAILURE
1243
+ elements0 << address1
1244
+ address2 = FAILURE
1245
+ chunk0, max0 = nil, @offset + 1
1246
+ if max0 <= @input_size
1247
+ chunk0 = @input[@offset...max0]
1248
+ end
1249
+ if chunk0 == "["
1250
+ address2 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
1251
+ @offset = @offset + 1
1252
+ else
1253
+ address2 = FAILURE
1254
+ if @offset > @failure
1255
+ @failure = @offset
1256
+ @expected = []
1257
+ end
1258
+ if @offset == @failure
1259
+ @expected << "\"[\""
1260
+ end
1261
+ end
1262
+ unless address2 == FAILURE
1263
+ elements0 << address2
1264
+ address3 = FAILURE
1265
+ address3 = _read___
1266
+ unless address3 == FAILURE
1267
+ elements0 << address3
1268
+ address4 = FAILURE
1269
+ index2 = @offset
1270
+ index3, elements1 = @offset, []
1271
+ address5 = FAILURE
1272
+ address5 = _read_atom
1273
+ unless address5 == FAILURE
1274
+ elements1 << address5
1275
+ address6 = FAILURE
1276
+ address6 = _read___
1277
+ unless address6 == FAILURE
1278
+ elements1 << address6
1279
+ address7 = FAILURE
1280
+ remaining0, index4, elements2, address8 = 0, @offset, [], true
1281
+ until address8 == FAILURE
1282
+ index5, elements3 = @offset, []
1283
+ address9 = FAILURE
1284
+ chunk1, max1 = nil, @offset + 1
1285
+ if max1 <= @input_size
1286
+ chunk1 = @input[@offset...max1]
1287
+ end
1288
+ if chunk1 == ","
1289
+ address9 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
1290
+ @offset = @offset + 1
1291
+ else
1292
+ address9 = FAILURE
1293
+ if @offset > @failure
1294
+ @failure = @offset
1295
+ @expected = []
1296
+ end
1297
+ if @offset == @failure
1298
+ @expected << "\",\""
1299
+ end
1300
+ end
1301
+ unless address9 == FAILURE
1302
+ elements3 << address9
1303
+ address10 = FAILURE
1304
+ address10 = _read___
1305
+ unless address10 == FAILURE
1306
+ elements3 << address10
1307
+ address11 = FAILURE
1308
+ address11 = _read_atom
1309
+ unless address11 == FAILURE
1310
+ elements3 << address11
1311
+ address12 = FAILURE
1312
+ address12 = _read___
1313
+ unless address12 == FAILURE
1314
+ elements3 << address12
1315
+ else
1316
+ elements3 = nil
1317
+ @offset = index5
1318
+ end
1319
+ else
1320
+ elements3 = nil
1321
+ @offset = index5
1322
+ end
1323
+ else
1324
+ elements3 = nil
1325
+ @offset = index5
1326
+ end
1327
+ else
1328
+ elements3 = nil
1329
+ @offset = index5
1330
+ end
1331
+ if elements3.nil?
1332
+ address8 = FAILURE
1333
+ else
1334
+ address8 = TreeNode13.new(@input[index5...@offset], index5, elements3)
1335
+ @offset = @offset
1336
+ end
1337
+ unless address8 == FAILURE
1338
+ elements2 << address8
1339
+ remaining0 -= 1
1340
+ end
1341
+ end
1342
+ if remaining0 <= 0
1343
+ address7 = TreeNode.new(@input[index4...@offset], index4, elements2)
1344
+ @offset = @offset
1345
+ else
1346
+ address7 = FAILURE
1347
+ end
1348
+ unless address7 == FAILURE
1349
+ elements1 << address7
1350
+ else
1351
+ elements1 = nil
1352
+ @offset = index3
1353
+ end
1354
+ else
1355
+ elements1 = nil
1356
+ @offset = index3
1357
+ end
1358
+ else
1359
+ elements1 = nil
1360
+ @offset = index3
1361
+ end
1362
+ if elements1.nil?
1363
+ address4 = FAILURE
1364
+ else
1365
+ address4 = TreeNode12.new(@input[index3...@offset], index3, elements1)
1366
+ @offset = @offset
1367
+ end
1368
+ if address4 == FAILURE
1369
+ address4 = TreeNode.new(@input[index2...index2], index2, [])
1370
+ @offset = index2
1371
+ end
1372
+ unless address4 == FAILURE
1373
+ elements0 << address4
1374
+ address13 = FAILURE
1375
+ address13 = _read___
1376
+ unless address13 == FAILURE
1377
+ elements0 << address13
1378
+ address14 = FAILURE
1379
+ chunk2, max2 = nil, @offset + 1
1380
+ if max2 <= @input_size
1381
+ chunk2 = @input[@offset...max2]
1382
+ end
1383
+ if chunk2 == "]"
1384
+ address14 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
1385
+ @offset = @offset + 1
1386
+ else
1387
+ address14 = FAILURE
1388
+ if @offset > @failure
1389
+ @failure = @offset
1390
+ @expected = []
1391
+ end
1392
+ if @offset == @failure
1393
+ @expected << "\"]\""
1394
+ end
1395
+ end
1396
+ unless address14 == FAILURE
1397
+ elements0 << address14
1398
+ address15 = FAILURE
1399
+ address15 = _read___
1400
+ unless address15 == FAILURE
1401
+ elements0 << address15
1402
+ else
1403
+ elements0 = nil
1404
+ @offset = index1
1405
+ end
1406
+ else
1407
+ elements0 = nil
1408
+ @offset = index1
1409
+ end
1410
+ else
1411
+ elements0 = nil
1412
+ @offset = index1
1413
+ end
1414
+ else
1415
+ elements0 = nil
1416
+ @offset = index1
1417
+ end
1418
+ else
1419
+ elements0 = nil
1420
+ @offset = index1
1421
+ end
1422
+ else
1423
+ elements0 = nil
1424
+ @offset = index1
1425
+ end
1426
+ else
1427
+ elements0 = nil
1428
+ @offset = index1
1429
+ end
1430
+ if elements0.nil?
1431
+ address0 = FAILURE
1432
+ else
1433
+ address0 = @actions.make_list(@input, index1, @offset, elements0)
1434
+ @offset = @offset
1435
+ end
1436
+ @cache[:list][index0] = [address0, @offset]
1437
+ return address0
1438
+ end
1439
+
1440
+ def _read_chr
1441
+ address0, index0 = FAILURE, @offset
1442
+ cached = @cache[:chr][index0]
1443
+ if cached
1444
+ @offset = cached[1]
1445
+ return cached[0]
1446
+ end
1447
+ index1, elements0 = @offset, []
1448
+ address1 = FAILURE
1449
+ address1 = _read___
1450
+ unless address1 == FAILURE
1451
+ elements0 << address1
1452
+ address2 = FAILURE
1453
+ chunk0, max0 = nil, @offset + 1
1454
+ if max0 <= @input_size
1455
+ chunk0 = @input[@offset...max0]
1456
+ end
1457
+ if chunk0 =~ /\A[']/
1458
+ address2 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
1459
+ @offset = @offset + 1
1460
+ else
1461
+ address2 = FAILURE
1462
+ if @offset > @failure
1463
+ @failure = @offset
1464
+ @expected = []
1465
+ end
1466
+ if @offset == @failure
1467
+ @expected << "[']"
1468
+ end
1469
+ end
1470
+ unless address2 == FAILURE
1471
+ elements0 << address2
1472
+ address3 = FAILURE
1473
+ chunk1, max1 = nil, @offset + 1
1474
+ if max1 <= @input_size
1475
+ chunk1 = @input[@offset...max1]
1476
+ end
1477
+ if chunk1 =~ /\A[ !#-~]/
1478
+ address3 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
1479
+ @offset = @offset + 1
1480
+ else
1481
+ address3 = FAILURE
1482
+ if @offset > @failure
1483
+ @failure = @offset
1484
+ @expected = []
1485
+ end
1486
+ if @offset == @failure
1487
+ @expected << "[ !#-~]"
1488
+ end
1489
+ end
1490
+ unless address3 == FAILURE
1491
+ elements0 << address3
1492
+ address4 = FAILURE
1493
+ chunk2, max2 = nil, @offset + 1
1494
+ if max2 <= @input_size
1495
+ chunk2 = @input[@offset...max2]
1496
+ end
1497
+ if chunk2 =~ /\A[']/
1498
+ address4 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
1499
+ @offset = @offset + 1
1500
+ else
1501
+ address4 = FAILURE
1502
+ if @offset > @failure
1503
+ @failure = @offset
1504
+ @expected = []
1505
+ end
1506
+ if @offset == @failure
1507
+ @expected << "[']"
1508
+ end
1509
+ end
1510
+ unless address4 == FAILURE
1511
+ elements0 << address4
1512
+ address5 = FAILURE
1513
+ address5 = _read___
1514
+ unless address5 == FAILURE
1515
+ elements0 << address5
1516
+ else
1517
+ elements0 = nil
1518
+ @offset = index1
1519
+ end
1520
+ else
1521
+ elements0 = nil
1522
+ @offset = index1
1523
+ end
1524
+ else
1525
+ elements0 = nil
1526
+ @offset = index1
1527
+ end
1528
+ else
1529
+ elements0 = nil
1530
+ @offset = index1
1531
+ end
1532
+ else
1533
+ elements0 = nil
1534
+ @offset = index1
1535
+ end
1536
+ if elements0.nil?
1537
+ address0 = FAILURE
1538
+ else
1539
+ address0 = @actions.make_char(@input, index1, @offset, elements0)
1540
+ @offset = @offset
1541
+ end
1542
+ @cache[:chr][index0] = [address0, @offset]
1543
+ return address0
1544
+ end
1545
+
1546
+ def _read_number
1547
+ address0, index0 = FAILURE, @offset
1548
+ cached = @cache[:number][index0]
1549
+ if cached
1550
+ @offset = cached[1]
1551
+ return cached[0]
1552
+ end
1553
+ index1, elements0 = @offset, []
1554
+ address1 = FAILURE
1555
+ address1 = _read___
1556
+ unless address1 == FAILURE
1557
+ elements0 << address1
1558
+ address2 = FAILURE
1559
+ index2 = @offset
1560
+ chunk0, max0 = nil, @offset + 1
1561
+ if max0 <= @input_size
1562
+ chunk0 = @input[@offset...max0]
1563
+ end
1564
+ if chunk0 == "-"
1565
+ address2 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
1566
+ @offset = @offset + 1
1567
+ else
1568
+ address2 = FAILURE
1569
+ if @offset > @failure
1570
+ @failure = @offset
1571
+ @expected = []
1572
+ end
1573
+ if @offset == @failure
1574
+ @expected << "\"-\""
1575
+ end
1576
+ end
1577
+ if address2 == FAILURE
1578
+ address2 = TreeNode.new(@input[index2...index2], index2, [])
1579
+ @offset = index2
1580
+ end
1581
+ unless address2 == FAILURE
1582
+ elements0 << address2
1583
+ address3 = FAILURE
1584
+ remaining0, index3, elements1, address4 = 1, @offset, [], true
1585
+ until address4 == FAILURE
1586
+ chunk1, max1 = nil, @offset + 1
1587
+ if max1 <= @input_size
1588
+ chunk1 = @input[@offset...max1]
1589
+ end
1590
+ if chunk1 =~ /\A[0-9]/
1591
+ address4 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
1592
+ @offset = @offset + 1
1593
+ else
1594
+ address4 = FAILURE
1595
+ if @offset > @failure
1596
+ @failure = @offset
1597
+ @expected = []
1598
+ end
1599
+ if @offset == @failure
1600
+ @expected << "[0-9]"
1601
+ end
1602
+ end
1603
+ unless address4 == FAILURE
1604
+ elements1 << address4
1605
+ remaining0 -= 1
1606
+ end
1607
+ end
1608
+ if remaining0 <= 0
1609
+ address3 = TreeNode.new(@input[index3...@offset], index3, elements1)
1610
+ @offset = @offset
1611
+ else
1612
+ address3 = FAILURE
1613
+ end
1614
+ unless address3 == FAILURE
1615
+ elements0 << address3
1616
+ address5 = FAILURE
1617
+ address5 = _read___
1618
+ unless address5 == FAILURE
1619
+ elements0 << address5
1620
+ else
1621
+ elements0 = nil
1622
+ @offset = index1
1623
+ end
1624
+ else
1625
+ elements0 = nil
1626
+ @offset = index1
1627
+ end
1628
+ else
1629
+ elements0 = nil
1630
+ @offset = index1
1631
+ end
1632
+ else
1633
+ elements0 = nil
1634
+ @offset = index1
1635
+ end
1636
+ if elements0.nil?
1637
+ address0 = FAILURE
1638
+ else
1639
+ address0 = @actions.make_number(@input, index1, @offset, elements0)
1640
+ @offset = @offset
1641
+ end
1642
+ @cache[:number][index0] = [address0, @offset]
1643
+ return address0
1644
+ end
1645
+
1646
+ def _read_float_
1647
+ address0, index0 = FAILURE, @offset
1648
+ cached = @cache[:float_][index0]
1649
+ if cached
1650
+ @offset = cached[1]
1651
+ return cached[0]
1652
+ end
1653
+ index1, elements0 = @offset, []
1654
+ address1 = FAILURE
1655
+ address1 = _read___
1656
+ unless address1 == FAILURE
1657
+ elements0 << address1
1658
+ address2 = FAILURE
1659
+ index2 = @offset
1660
+ chunk0, max0 = nil, @offset + 1
1661
+ if max0 <= @input_size
1662
+ chunk0 = @input[@offset...max0]
1663
+ end
1664
+ if chunk0 == "-"
1665
+ address2 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
1666
+ @offset = @offset + 1
1667
+ else
1668
+ address2 = FAILURE
1669
+ if @offset > @failure
1670
+ @failure = @offset
1671
+ @expected = []
1672
+ end
1673
+ if @offset == @failure
1674
+ @expected << "\"-\""
1675
+ end
1676
+ end
1677
+ if address2 == FAILURE
1678
+ address2 = TreeNode.new(@input[index2...index2], index2, [])
1679
+ @offset = index2
1680
+ end
1681
+ unless address2 == FAILURE
1682
+ elements0 << address2
1683
+ address3 = FAILURE
1684
+ remaining0, index3, elements1, address4 = 1, @offset, [], true
1685
+ until address4 == FAILURE
1686
+ chunk1, max1 = nil, @offset + 1
1687
+ if max1 <= @input_size
1688
+ chunk1 = @input[@offset...max1]
1689
+ end
1690
+ if chunk1 =~ /\A[0-9]/
1691
+ address4 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
1692
+ @offset = @offset + 1
1693
+ else
1694
+ address4 = FAILURE
1695
+ if @offset > @failure
1696
+ @failure = @offset
1697
+ @expected = []
1698
+ end
1699
+ if @offset == @failure
1700
+ @expected << "[0-9]"
1701
+ end
1702
+ end
1703
+ unless address4 == FAILURE
1704
+ elements1 << address4
1705
+ remaining0 -= 1
1706
+ end
1707
+ end
1708
+ if remaining0 <= 0
1709
+ address3 = TreeNode.new(@input[index3...@offset], index3, elements1)
1710
+ @offset = @offset
1711
+ else
1712
+ address3 = FAILURE
1713
+ end
1714
+ unless address3 == FAILURE
1715
+ elements0 << address3
1716
+ address5 = FAILURE
1717
+ chunk2, max2 = nil, @offset + 1
1718
+ if max2 <= @input_size
1719
+ chunk2 = @input[@offset...max2]
1720
+ end
1721
+ if chunk2 == "."
1722
+ address5 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
1723
+ @offset = @offset + 1
1724
+ else
1725
+ address5 = FAILURE
1726
+ if @offset > @failure
1727
+ @failure = @offset
1728
+ @expected = []
1729
+ end
1730
+ if @offset == @failure
1731
+ @expected << "\".\""
1732
+ end
1733
+ end
1734
+ unless address5 == FAILURE
1735
+ elements0 << address5
1736
+ address6 = FAILURE
1737
+ remaining1, index4, elements2, address7 = 1, @offset, [], true
1738
+ until address7 == FAILURE
1739
+ chunk3, max3 = nil, @offset + 1
1740
+ if max3 <= @input_size
1741
+ chunk3 = @input[@offset...max3]
1742
+ end
1743
+ if chunk3 =~ /\A[0-9]/
1744
+ address7 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
1745
+ @offset = @offset + 1
1746
+ else
1747
+ address7 = FAILURE
1748
+ if @offset > @failure
1749
+ @failure = @offset
1750
+ @expected = []
1751
+ end
1752
+ if @offset == @failure
1753
+ @expected << "[0-9]"
1754
+ end
1755
+ end
1756
+ unless address7 == FAILURE
1757
+ elements2 << address7
1758
+ remaining1 -= 1
1759
+ end
1760
+ end
1761
+ if remaining1 <= 0
1762
+ address6 = TreeNode.new(@input[index4...@offset], index4, elements2)
1763
+ @offset = @offset
1764
+ else
1765
+ address6 = FAILURE
1766
+ end
1767
+ unless address6 == FAILURE
1768
+ elements0 << address6
1769
+ address8 = FAILURE
1770
+ address8 = _read___
1771
+ unless address8 == FAILURE
1772
+ elements0 << address8
1773
+ else
1774
+ elements0 = nil
1775
+ @offset = index1
1776
+ end
1777
+ else
1778
+ elements0 = nil
1779
+ @offset = index1
1780
+ end
1781
+ else
1782
+ elements0 = nil
1783
+ @offset = index1
1784
+ end
1785
+ else
1786
+ elements0 = nil
1787
+ @offset = index1
1788
+ end
1789
+ else
1790
+ elements0 = nil
1791
+ @offset = index1
1792
+ end
1793
+ else
1794
+ elements0 = nil
1795
+ @offset = index1
1796
+ end
1797
+ if elements0.nil?
1798
+ address0 = FAILURE
1799
+ else
1800
+ address0 = @actions.make_float(@input, index1, @offset, elements0)
1801
+ @offset = @offset
1802
+ end
1803
+ @cache[:float_][index0] = [address0, @offset]
1804
+ return address0
1805
+ end
1806
+
1807
+ def _read_boolean_
1808
+ address0, index0 = FAILURE, @offset
1809
+ cached = @cache[:boolean_][index0]
1810
+ if cached
1811
+ @offset = cached[1]
1812
+ return cached[0]
1813
+ end
1814
+ index1, elements0 = @offset, []
1815
+ address1 = FAILURE
1816
+ address1 = _read___
1817
+ unless address1 == FAILURE
1818
+ elements0 << address1
1819
+ address2 = FAILURE
1820
+ index2 = @offset
1821
+ chunk0, max0 = nil, @offset + 4
1822
+ if max0 <= @input_size
1823
+ chunk0 = @input[@offset...max0]
1824
+ end
1825
+ if chunk0 == "True"
1826
+ address2 = TreeNode.new(@input[@offset...@offset + 4], @offset, [])
1827
+ @offset = @offset + 4
1828
+ else
1829
+ address2 = FAILURE
1830
+ if @offset > @failure
1831
+ @failure = @offset
1832
+ @expected = []
1833
+ end
1834
+ if @offset == @failure
1835
+ @expected << "\"True\""
1836
+ end
1837
+ end
1838
+ if address2 == FAILURE
1839
+ @offset = index2
1840
+ chunk1, max1 = nil, @offset + 4
1841
+ if max1 <= @input_size
1842
+ chunk1 = @input[@offset...max1]
1843
+ end
1844
+ if chunk1 == "true"
1845
+ address2 = TreeNode.new(@input[@offset...@offset + 4], @offset, [])
1846
+ @offset = @offset + 4
1847
+ else
1848
+ address2 = FAILURE
1849
+ if @offset > @failure
1850
+ @failure = @offset
1851
+ @expected = []
1852
+ end
1853
+ if @offset == @failure
1854
+ @expected << "\"true\""
1855
+ end
1856
+ end
1857
+ if address2 == FAILURE
1858
+ @offset = index2
1859
+ chunk2, max2 = nil, @offset + 5
1860
+ if max2 <= @input_size
1861
+ chunk2 = @input[@offset...max2]
1862
+ end
1863
+ if chunk2 == "False"
1864
+ address2 = TreeNode.new(@input[@offset...@offset + 5], @offset, [])
1865
+ @offset = @offset + 5
1866
+ else
1867
+ address2 = FAILURE
1868
+ if @offset > @failure
1869
+ @failure = @offset
1870
+ @expected = []
1871
+ end
1872
+ if @offset == @failure
1873
+ @expected << "\"False\""
1874
+ end
1875
+ end
1876
+ if address2 == FAILURE
1877
+ @offset = index2
1878
+ chunk3, max3 = nil, @offset + 5
1879
+ if max3 <= @input_size
1880
+ chunk3 = @input[@offset...max3]
1881
+ end
1882
+ if chunk3 == "false"
1883
+ address2 = TreeNode.new(@input[@offset...@offset + 5], @offset, [])
1884
+ @offset = @offset + 5
1885
+ else
1886
+ address2 = FAILURE
1887
+ if @offset > @failure
1888
+ @failure = @offset
1889
+ @expected = []
1890
+ end
1891
+ if @offset == @failure
1892
+ @expected << "\"false\""
1893
+ end
1894
+ end
1895
+ if address2 == FAILURE
1896
+ @offset = index2
1897
+ end
1898
+ end
1899
+ end
1900
+ end
1901
+ unless address2 == FAILURE
1902
+ elements0 << address2
1903
+ address3 = FAILURE
1904
+ address3 = _read___
1905
+ unless address3 == FAILURE
1906
+ elements0 << address3
1907
+ else
1908
+ elements0 = nil
1909
+ @offset = index1
1910
+ end
1911
+ else
1912
+ elements0 = nil
1913
+ @offset = index1
1914
+ end
1915
+ else
1916
+ elements0 = nil
1917
+ @offset = index1
1918
+ end
1919
+ if elements0.nil?
1920
+ address0 = FAILURE
1921
+ else
1922
+ address0 = @actions.make_bool(@input, index1, @offset, elements0)
1923
+ @offset = @offset
1924
+ end
1925
+ @cache[:boolean_][index0] = [address0, @offset]
1926
+ return address0
1927
+ end
1928
+
1929
+ def _read_null_
1930
+ address0, index0 = FAILURE, @offset
1931
+ cached = @cache[:null_][index0]
1932
+ if cached
1933
+ @offset = cached[1]
1934
+ return cached[0]
1935
+ end
1936
+ index1, elements0 = @offset, []
1937
+ address1 = FAILURE
1938
+ address1 = _read___
1939
+ unless address1 == FAILURE
1940
+ elements0 << address1
1941
+ address2 = FAILURE
1942
+ index2 = @offset
1943
+ chunk0, max0 = nil, @offset + 4
1944
+ if max0 <= @input_size
1945
+ chunk0 = @input[@offset...max0]
1946
+ end
1947
+ if chunk0 == "None"
1948
+ address2 = TreeNode.new(@input[@offset...@offset + 4], @offset, [])
1949
+ @offset = @offset + 4
1950
+ else
1951
+ address2 = FAILURE
1952
+ if @offset > @failure
1953
+ @failure = @offset
1954
+ @expected = []
1955
+ end
1956
+ if @offset == @failure
1957
+ @expected << "\"None\""
1958
+ end
1959
+ end
1960
+ if address2 == FAILURE
1961
+ @offset = index2
1962
+ chunk1, max1 = nil, @offset + 3
1963
+ if max1 <= @input_size
1964
+ chunk1 = @input[@offset...max1]
1965
+ end
1966
+ if chunk1 == "nil"
1967
+ address2 = TreeNode.new(@input[@offset...@offset + 3], @offset, [])
1968
+ @offset = @offset + 3
1969
+ else
1970
+ address2 = FAILURE
1971
+ if @offset > @failure
1972
+ @failure = @offset
1973
+ @expected = []
1974
+ end
1975
+ if @offset == @failure
1976
+ @expected << "\"nil\""
1977
+ end
1978
+ end
1979
+ if address2 == FAILURE
1980
+ @offset = index2
1981
+ chunk2, max2 = nil, @offset + 4
1982
+ if max2 <= @input_size
1983
+ chunk2 = @input[@offset...max2]
1984
+ end
1985
+ if chunk2 == "null"
1986
+ address2 = TreeNode.new(@input[@offset...@offset + 4], @offset, [])
1987
+ @offset = @offset + 4
1988
+ else
1989
+ address2 = FAILURE
1990
+ if @offset > @failure
1991
+ @failure = @offset
1992
+ @expected = []
1993
+ end
1994
+ if @offset == @failure
1995
+ @expected << "\"null\""
1996
+ end
1997
+ end
1998
+ if address2 == FAILURE
1999
+ @offset = index2
2000
+ end
2001
+ end
2002
+ end
2003
+ unless address2 == FAILURE
2004
+ elements0 << address2
2005
+ address3 = FAILURE
2006
+ address3 = _read___
2007
+ unless address3 == FAILURE
2008
+ elements0 << address3
2009
+ else
2010
+ elements0 = nil
2011
+ @offset = index1
2012
+ end
2013
+ else
2014
+ elements0 = nil
2015
+ @offset = index1
2016
+ end
2017
+ else
2018
+ elements0 = nil
2019
+ @offset = index1
2020
+ end
2021
+ if elements0.nil?
2022
+ address0 = FAILURE
2023
+ else
2024
+ address0 = @actions.make_null(@input, index1, @offset, elements0)
2025
+ @offset = @offset
2026
+ end
2027
+ @cache[:null_][index0] = [address0, @offset]
2028
+ return address0
2029
+ end
2030
+
2031
+ def _read_undefined_
2032
+ address0, index0 = FAILURE, @offset
2033
+ cached = @cache[:undefined_][index0]
2034
+ if cached
2035
+ @offset = cached[1]
2036
+ return cached[0]
2037
+ end
2038
+ index1, elements0 = @offset, []
2039
+ address1 = FAILURE
2040
+ address1 = _read___
2041
+ unless address1 == FAILURE
2042
+ elements0 << address1
2043
+ address2 = FAILURE
2044
+ chunk0, max0 = nil, @offset + 9
2045
+ if max0 <= @input_size
2046
+ chunk0 = @input[@offset...max0]
2047
+ end
2048
+ if chunk0 == "undefined"
2049
+ address2 = TreeNode.new(@input[@offset...@offset + 9], @offset, [])
2050
+ @offset = @offset + 9
2051
+ else
2052
+ address2 = FAILURE
2053
+ if @offset > @failure
2054
+ @failure = @offset
2055
+ @expected = []
2056
+ end
2057
+ if @offset == @failure
2058
+ @expected << "\"undefined\""
2059
+ end
2060
+ end
2061
+ unless address2 == FAILURE
2062
+ elements0 << address2
2063
+ address3 = FAILURE
2064
+ address3 = _read___
2065
+ unless address3 == FAILURE
2066
+ elements0 << address3
2067
+ else
2068
+ elements0 = nil
2069
+ @offset = index1
2070
+ end
2071
+ else
2072
+ elements0 = nil
2073
+ @offset = index1
2074
+ end
2075
+ else
2076
+ elements0 = nil
2077
+ @offset = index1
2078
+ end
2079
+ if elements0.nil?
2080
+ address0 = FAILURE
2081
+ else
2082
+ address0 = @actions.make_undefined(@input, index1, @offset, elements0)
2083
+ @offset = @offset
2084
+ end
2085
+ @cache[:undefined_][index0] = [address0, @offset]
2086
+ return address0
2087
+ end
2088
+
2089
+ def _read_opt_
2090
+ address0, index0 = FAILURE, @offset
2091
+ cached = @cache[:opt_][index0]
2092
+ if cached
2093
+ @offset = cached[1]
2094
+ return cached[0]
2095
+ end
2096
+ index1, elements0 = @offset, []
2097
+ address1 = FAILURE
2098
+ address1 = _read___
2099
+ unless address1 == FAILURE
2100
+ elements0 << address1
2101
+ address2 = FAILURE
2102
+ index2 = @offset
2103
+ chunk0, max0 = nil, @offset + 1
2104
+ if max0 <= @input_size
2105
+ chunk0 = @input[@offset...max0]
2106
+ end
2107
+ if chunk0 == "+"
2108
+ address2 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
2109
+ @offset = @offset + 1
2110
+ else
2111
+ address2 = FAILURE
2112
+ if @offset > @failure
2113
+ @failure = @offset
2114
+ @expected = []
2115
+ end
2116
+ if @offset == @failure
2117
+ @expected << "\"+\""
2118
+ end
2119
+ end
2120
+ if address2 == FAILURE
2121
+ @offset = index2
2122
+ chunk1, max1 = nil, @offset + 1
2123
+ if max1 <= @input_size
2124
+ chunk1 = @input[@offset...max1]
2125
+ end
2126
+ if chunk1 == "-"
2127
+ address2 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
2128
+ @offset = @offset + 1
2129
+ else
2130
+ address2 = FAILURE
2131
+ if @offset > @failure
2132
+ @failure = @offset
2133
+ @expected = []
2134
+ end
2135
+ if @offset == @failure
2136
+ @expected << "\"-\""
2137
+ end
2138
+ end
2139
+ if address2 == FAILURE
2140
+ @offset = index2
2141
+ chunk2, max2 = nil, @offset + 1
2142
+ if max2 <= @input_size
2143
+ chunk2 = @input[@offset...max2]
2144
+ end
2145
+ if chunk2 == "*"
2146
+ address2 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
2147
+ @offset = @offset + 1
2148
+ else
2149
+ address2 = FAILURE
2150
+ if @offset > @failure
2151
+ @failure = @offset
2152
+ @expected = []
2153
+ end
2154
+ if @offset == @failure
2155
+ @expected << "\"*\""
2156
+ end
2157
+ end
2158
+ if address2 == FAILURE
2159
+ @offset = index2
2160
+ chunk3, max3 = nil, @offset + 1
2161
+ if max3 <= @input_size
2162
+ chunk3 = @input[@offset...max3]
2163
+ end
2164
+ if chunk3 == "/"
2165
+ address2 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
2166
+ @offset = @offset + 1
2167
+ else
2168
+ address2 = FAILURE
2169
+ if @offset > @failure
2170
+ @failure = @offset
2171
+ @expected = []
2172
+ end
2173
+ if @offset == @failure
2174
+ @expected << "\"/\""
2175
+ end
2176
+ end
2177
+ if address2 == FAILURE
2178
+ @offset = index2
2179
+ chunk4, max4 = nil, @offset + 2
2180
+ if max4 <= @input_size
2181
+ chunk4 = @input[@offset...max4]
2182
+ end
2183
+ if chunk4 == "<="
2184
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2185
+ @offset = @offset + 2
2186
+ else
2187
+ address2 = FAILURE
2188
+ if @offset > @failure
2189
+ @failure = @offset
2190
+ @expected = []
2191
+ end
2192
+ if @offset == @failure
2193
+ @expected << "\"<=\""
2194
+ end
2195
+ end
2196
+ if address2 == FAILURE
2197
+ @offset = index2
2198
+ chunk5, max5 = nil, @offset + 2
2199
+ if max5 <= @input_size
2200
+ chunk5 = @input[@offset...max5]
2201
+ end
2202
+ if chunk5 == ">="
2203
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2204
+ @offset = @offset + 2
2205
+ else
2206
+ address2 = FAILURE
2207
+ if @offset > @failure
2208
+ @failure = @offset
2209
+ @expected = []
2210
+ end
2211
+ if @offset == @failure
2212
+ @expected << "\">=\""
2213
+ end
2214
+ end
2215
+ if address2 == FAILURE
2216
+ @offset = index2
2217
+ chunk6, max6 = nil, @offset + 2
2218
+ if max6 <= @input_size
2219
+ chunk6 = @input[@offset...max6]
2220
+ end
2221
+ if chunk6 == "!="
2222
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2223
+ @offset = @offset + 2
2224
+ else
2225
+ address2 = FAILURE
2226
+ if @offset > @failure
2227
+ @failure = @offset
2228
+ @expected = []
2229
+ end
2230
+ if @offset == @failure
2231
+ @expected << "\"!=\""
2232
+ end
2233
+ end
2234
+ if address2 == FAILURE
2235
+ @offset = index2
2236
+ chunk7, max7 = nil, @offset + 2
2237
+ if max7 <= @input_size
2238
+ chunk7 = @input[@offset...max7]
2239
+ end
2240
+ if chunk7 == "=="
2241
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2242
+ @offset = @offset + 2
2243
+ else
2244
+ address2 = FAILURE
2245
+ if @offset > @failure
2246
+ @failure = @offset
2247
+ @expected = []
2248
+ end
2249
+ if @offset == @failure
2250
+ @expected << "\"==\""
2251
+ end
2252
+ end
2253
+ if address2 == FAILURE
2254
+ @offset = index2
2255
+ chunk8, max8 = nil, @offset + 1
2256
+ if max8 <= @input_size
2257
+ chunk8 = @input[@offset...max8]
2258
+ end
2259
+ if chunk8 == "="
2260
+ address2 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
2261
+ @offset = @offset + 1
2262
+ else
2263
+ address2 = FAILURE
2264
+ if @offset > @failure
2265
+ @failure = @offset
2266
+ @expected = []
2267
+ end
2268
+ if @offset == @failure
2269
+ @expected << "\"=\""
2270
+ end
2271
+ end
2272
+ if address2 == FAILURE
2273
+ @offset = index2
2274
+ chunk9, max9 = nil, @offset + 1
2275
+ if max9 <= @input_size
2276
+ chunk9 = @input[@offset...max9]
2277
+ end
2278
+ if chunk9 == ">"
2279
+ address2 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
2280
+ @offset = @offset + 1
2281
+ else
2282
+ address2 = FAILURE
2283
+ if @offset > @failure
2284
+ @failure = @offset
2285
+ @expected = []
2286
+ end
2287
+ if @offset == @failure
2288
+ @expected << "\">\""
2289
+ end
2290
+ end
2291
+ if address2 == FAILURE
2292
+ @offset = index2
2293
+ chunk10, max10 = nil, @offset + 1
2294
+ if max10 <= @input_size
2295
+ chunk10 = @input[@offset...max10]
2296
+ end
2297
+ if chunk10 == "<"
2298
+ address2 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
2299
+ @offset = @offset + 1
2300
+ else
2301
+ address2 = FAILURE
2302
+ if @offset > @failure
2303
+ @failure = @offset
2304
+ @expected = []
2305
+ end
2306
+ if @offset == @failure
2307
+ @expected << "\"<\""
2308
+ end
2309
+ end
2310
+ if address2 == FAILURE
2311
+ @offset = index2
2312
+ chunk11, max11 = nil, @offset + 2
2313
+ if max11 <= @input_size
2314
+ chunk11 = @input[@offset...max11]
2315
+ end
2316
+ if chunk11 == "LT"
2317
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2318
+ @offset = @offset + 2
2319
+ else
2320
+ address2 = FAILURE
2321
+ if @offset > @failure
2322
+ @failure = @offset
2323
+ @expected = []
2324
+ end
2325
+ if @offset == @failure
2326
+ @expected << "\"LT\""
2327
+ end
2328
+ end
2329
+ if address2 == FAILURE
2330
+ @offset = index2
2331
+ chunk12, max12 = nil, @offset + 2
2332
+ if max12 <= @input_size
2333
+ chunk12 = @input[@offset...max12]
2334
+ end
2335
+ if chunk12 == "GT"
2336
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2337
+ @offset = @offset + 2
2338
+ else
2339
+ address2 = FAILURE
2340
+ if @offset > @failure
2341
+ @failure = @offset
2342
+ @expected = []
2343
+ end
2344
+ if @offset == @failure
2345
+ @expected << "\"GT\""
2346
+ end
2347
+ end
2348
+ if address2 == FAILURE
2349
+ @offset = index2
2350
+ chunk13, max13 = nil, @offset + 2
2351
+ if max13 <= @input_size
2352
+ chunk13 = @input[@offset...max13]
2353
+ end
2354
+ if chunk13 == "LE"
2355
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2356
+ @offset = @offset + 2
2357
+ else
2358
+ address2 = FAILURE
2359
+ if @offset > @failure
2360
+ @failure = @offset
2361
+ @expected = []
2362
+ end
2363
+ if @offset == @failure
2364
+ @expected << "\"LE\""
2365
+ end
2366
+ end
2367
+ if address2 == FAILURE
2368
+ @offset = index2
2369
+ chunk14, max14 = nil, @offset + 2
2370
+ if max14 <= @input_size
2371
+ chunk14 = @input[@offset...max14]
2372
+ end
2373
+ if chunk14 == "GE"
2374
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2375
+ @offset = @offset + 2
2376
+ else
2377
+ address2 = FAILURE
2378
+ if @offset > @failure
2379
+ @failure = @offset
2380
+ @expected = []
2381
+ end
2382
+ if @offset == @failure
2383
+ @expected << "\"GE\""
2384
+ end
2385
+ end
2386
+ if address2 == FAILURE
2387
+ @offset = index2
2388
+ chunk15, max15 = nil, @offset + 2
2389
+ if max15 <= @input_size
2390
+ chunk15 = @input[@offset...max15]
2391
+ end
2392
+ if chunk15 == "EQ"
2393
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2394
+ @offset = @offset + 2
2395
+ else
2396
+ address2 = FAILURE
2397
+ if @offset > @failure
2398
+ @failure = @offset
2399
+ @expected = []
2400
+ end
2401
+ if @offset == @failure
2402
+ @expected << "\"EQ\""
2403
+ end
2404
+ end
2405
+ if address2 == FAILURE
2406
+ @offset = index2
2407
+ chunk16, max16 = nil, @offset + 2
2408
+ if max16 <= @input_size
2409
+ chunk16 = @input[@offset...max16]
2410
+ end
2411
+ if chunk16 == "NE"
2412
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2413
+ @offset = @offset + 2
2414
+ else
2415
+ address2 = FAILURE
2416
+ if @offset > @failure
2417
+ @failure = @offset
2418
+ @expected = []
2419
+ end
2420
+ if @offset == @failure
2421
+ @expected << "\"NE\""
2422
+ end
2423
+ end
2424
+ if address2 == FAILURE
2425
+ @offset = index2
2426
+ chunk17, max17 = nil, @offset + 2
2427
+ if max17 <= @input_size
2428
+ chunk17 = @input[@offset...max17]
2429
+ end
2430
+ if chunk17 == "lt"
2431
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2432
+ @offset = @offset + 2
2433
+ else
2434
+ address2 = FAILURE
2435
+ if @offset > @failure
2436
+ @failure = @offset
2437
+ @expected = []
2438
+ end
2439
+ if @offset == @failure
2440
+ @expected << "\"lt\""
2441
+ end
2442
+ end
2443
+ if address2 == FAILURE
2444
+ @offset = index2
2445
+ chunk18, max18 = nil, @offset + 2
2446
+ if max18 <= @input_size
2447
+ chunk18 = @input[@offset...max18]
2448
+ end
2449
+ if chunk18 == "gt"
2450
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2451
+ @offset = @offset + 2
2452
+ else
2453
+ address2 = FAILURE
2454
+ if @offset > @failure
2455
+ @failure = @offset
2456
+ @expected = []
2457
+ end
2458
+ if @offset == @failure
2459
+ @expected << "\"gt\""
2460
+ end
2461
+ end
2462
+ if address2 == FAILURE
2463
+ @offset = index2
2464
+ chunk19, max19 = nil, @offset + 2
2465
+ if max19 <= @input_size
2466
+ chunk19 = @input[@offset...max19]
2467
+ end
2468
+ if chunk19 == "le"
2469
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2470
+ @offset = @offset + 2
2471
+ else
2472
+ address2 = FAILURE
2473
+ if @offset > @failure
2474
+ @failure = @offset
2475
+ @expected = []
2476
+ end
2477
+ if @offset == @failure
2478
+ @expected << "\"le\""
2479
+ end
2480
+ end
2481
+ if address2 == FAILURE
2482
+ @offset = index2
2483
+ chunk20, max20 = nil, @offset + 2
2484
+ if max20 <= @input_size
2485
+ chunk20 = @input[@offset...max20]
2486
+ end
2487
+ if chunk20 == "ge"
2488
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2489
+ @offset = @offset + 2
2490
+ else
2491
+ address2 = FAILURE
2492
+ if @offset > @failure
2493
+ @failure = @offset
2494
+ @expected = []
2495
+ end
2496
+ if @offset == @failure
2497
+ @expected << "\"ge\""
2498
+ end
2499
+ end
2500
+ if address2 == FAILURE
2501
+ @offset = index2
2502
+ chunk21, max21 = nil, @offset + 2
2503
+ if max21 <= @input_size
2504
+ chunk21 = @input[@offset...max21]
2505
+ end
2506
+ if chunk21 == "eq"
2507
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2508
+ @offset = @offset + 2
2509
+ else
2510
+ address2 = FAILURE
2511
+ if @offset > @failure
2512
+ @failure = @offset
2513
+ @expected = []
2514
+ end
2515
+ if @offset == @failure
2516
+ @expected << "\"eq\""
2517
+ end
2518
+ end
2519
+ if address2 == FAILURE
2520
+ @offset = index2
2521
+ chunk22, max22 = nil, @offset + 2
2522
+ if max22 <= @input_size
2523
+ chunk22 = @input[@offset...max22]
2524
+ end
2525
+ if chunk22 == "ne"
2526
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2527
+ @offset = @offset + 2
2528
+ else
2529
+ address2 = FAILURE
2530
+ if @offset > @failure
2531
+ @failure = @offset
2532
+ @expected = []
2533
+ end
2534
+ if @offset == @failure
2535
+ @expected << "\"ne\""
2536
+ end
2537
+ end
2538
+ if address2 == FAILURE
2539
+ @offset = index2
2540
+ chunk23, max23 = nil, @offset + 2
2541
+ if max23 <= @input_size
2542
+ chunk23 = @input[@offset...max23]
2543
+ end
2544
+ if chunk23 == "in"
2545
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2546
+ @offset = @offset + 2
2547
+ else
2548
+ address2 = FAILURE
2549
+ if @offset > @failure
2550
+ @failure = @offset
2551
+ @expected = []
2552
+ end
2553
+ if @offset == @failure
2554
+ @expected << "\"in\""
2555
+ end
2556
+ end
2557
+ if address2 == FAILURE
2558
+ @offset = index2
2559
+ chunk24, max24 = nil, @offset + 2
2560
+ if max24 <= @input_size
2561
+ chunk24 = @input[@offset...max24]
2562
+ end
2563
+ if chunk24 == "IN"
2564
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2565
+ @offset = @offset + 2
2566
+ else
2567
+ address2 = FAILURE
2568
+ if @offset > @failure
2569
+ @failure = @offset
2570
+ @expected = []
2571
+ end
2572
+ if @offset == @failure
2573
+ @expected << "\"IN\""
2574
+ end
2575
+ end
2576
+ if address2 == FAILURE
2577
+ @offset = index2
2578
+ chunk25, max25 = nil, @offset + 2
2579
+ if max25 <= @input_size
2580
+ chunk25 = @input[@offset...max25]
2581
+ end
2582
+ if chunk25 == "or"
2583
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2584
+ @offset = @offset + 2
2585
+ else
2586
+ address2 = FAILURE
2587
+ if @offset > @failure
2588
+ @failure = @offset
2589
+ @expected = []
2590
+ end
2591
+ if @offset == @failure
2592
+ @expected << "\"or\""
2593
+ end
2594
+ end
2595
+ if address2 == FAILURE
2596
+ @offset = index2
2597
+ chunk26, max26 = nil, @offset + 2
2598
+ if max26 <= @input_size
2599
+ chunk26 = @input[@offset...max26]
2600
+ end
2601
+ if chunk26 == "OR"
2602
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2603
+ @offset = @offset + 2
2604
+ else
2605
+ address2 = FAILURE
2606
+ if @offset > @failure
2607
+ @failure = @offset
2608
+ @expected = []
2609
+ end
2610
+ if @offset == @failure
2611
+ @expected << "\"OR\""
2612
+ end
2613
+ end
2614
+ if address2 == FAILURE
2615
+ @offset = index2
2616
+ chunk27, max27 = nil, @offset + 2
2617
+ if max27 <= @input_size
2618
+ chunk27 = @input[@offset...max27]
2619
+ end
2620
+ if chunk27 == "||"
2621
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2622
+ @offset = @offset + 2
2623
+ else
2624
+ address2 = FAILURE
2625
+ if @offset > @failure
2626
+ @failure = @offset
2627
+ @expected = []
2628
+ end
2629
+ if @offset == @failure
2630
+ @expected << "\"||\""
2631
+ end
2632
+ end
2633
+ if address2 == FAILURE
2634
+ @offset = index2
2635
+ chunk28, max28 = nil, @offset + 3
2636
+ if max28 <= @input_size
2637
+ chunk28 = @input[@offset...max28]
2638
+ end
2639
+ if chunk28 == "and"
2640
+ address2 = TreeNode.new(@input[@offset...@offset + 3], @offset, [])
2641
+ @offset = @offset + 3
2642
+ else
2643
+ address2 = FAILURE
2644
+ if @offset > @failure
2645
+ @failure = @offset
2646
+ @expected = []
2647
+ end
2648
+ if @offset == @failure
2649
+ @expected << "\"and\""
2650
+ end
2651
+ end
2652
+ if address2 == FAILURE
2653
+ @offset = index2
2654
+ chunk29, max29 = nil, @offset + 3
2655
+ if max29 <= @input_size
2656
+ chunk29 = @input[@offset...max29]
2657
+ end
2658
+ if chunk29 == "AND"
2659
+ address2 = TreeNode.new(@input[@offset...@offset + 3], @offset, [])
2660
+ @offset = @offset + 3
2661
+ else
2662
+ address2 = FAILURE
2663
+ if @offset > @failure
2664
+ @failure = @offset
2665
+ @expected = []
2666
+ end
2667
+ if @offset == @failure
2668
+ @expected << "\"AND\""
2669
+ end
2670
+ end
2671
+ if address2 == FAILURE
2672
+ @offset = index2
2673
+ chunk30, max30 = nil, @offset + 2
2674
+ if max30 <= @input_size
2675
+ chunk30 = @input[@offset...max30]
2676
+ end
2677
+ if chunk30 == "&&"
2678
+ address2 = TreeNode.new(@input[@offset...@offset + 2], @offset, [])
2679
+ @offset = @offset + 2
2680
+ else
2681
+ address2 = FAILURE
2682
+ if @offset > @failure
2683
+ @failure = @offset
2684
+ @expected = []
2685
+ end
2686
+ if @offset == @failure
2687
+ @expected << "\"&&\""
2688
+ end
2689
+ end
2690
+ if address2 == FAILURE
2691
+ @offset = index2
2692
+ end
2693
+ end
2694
+ end
2695
+ end
2696
+ end
2697
+ end
2698
+ end
2699
+ end
2700
+ end
2701
+ end
2702
+ end
2703
+ end
2704
+ end
2705
+ end
2706
+ end
2707
+ end
2708
+ end
2709
+ end
2710
+ end
2711
+ end
2712
+ end
2713
+ end
2714
+ end
2715
+ end
2716
+ end
2717
+ end
2718
+ end
2719
+ end
2720
+ end
2721
+ end
2722
+ end
2723
+ unless address2 == FAILURE
2724
+ elements0 << address2
2725
+ address3 = FAILURE
2726
+ address3 = _read___
2727
+ unless address3 == FAILURE
2728
+ elements0 << address3
2729
+ else
2730
+ elements0 = nil
2731
+ @offset = index1
2732
+ end
2733
+ else
2734
+ elements0 = nil
2735
+ @offset = index1
2736
+ end
2737
+ else
2738
+ elements0 = nil
2739
+ @offset = index1
2740
+ end
2741
+ if elements0.nil?
2742
+ address0 = FAILURE
2743
+ else
2744
+ address0 = @actions.make_opt(@input, index1, @offset, elements0)
2745
+ @offset = @offset
2746
+ end
2747
+ @cache[:opt_][index0] = [address0, @offset]
2748
+ return address0
2749
+ end
2750
+
2751
+ def _read___
2752
+ address0, index0 = FAILURE, @offset
2753
+ cached = @cache[:__][index0]
2754
+ if cached
2755
+ @offset = cached[1]
2756
+ return cached[0]
2757
+ end
2758
+ remaining0, index1, elements0, address1 = 0, @offset, [], true
2759
+ until address1 == FAILURE
2760
+ chunk0, max0 = nil, @offset + 1
2761
+ if max0 <= @input_size
2762
+ chunk0 = @input[@offset...max0]
2763
+ end
2764
+ if chunk0 =~ /\A[\s]/
2765
+ address1 = TreeNode.new(@input[@offset...@offset + 1], @offset, [])
2766
+ @offset = @offset + 1
2767
+ else
2768
+ address1 = FAILURE
2769
+ if @offset > @failure
2770
+ @failure = @offset
2771
+ @expected = []
2772
+ end
2773
+ if @offset == @failure
2774
+ @expected << "[\\s]"
2775
+ end
2776
+ end
2777
+ unless address1 == FAILURE
2778
+ elements0 << address1
2779
+ remaining0 -= 1
2780
+ end
2781
+ end
2782
+ if remaining0 <= 0
2783
+ address0 = TreeNode.new(@input[index1...@offset], index1, elements0)
2784
+ @offset = @offset
2785
+ else
2786
+ address0 = FAILURE
2787
+ end
2788
+ @cache[:__][index0] = [address0, @offset]
2789
+ return address0
2790
+ end
2791
+ end
2792
+
2793
+ class Parser
2794
+ include Grammar
2795
+
2796
+ def initialize(input, actions, types)
2797
+ @input = input
2798
+ @input_size = input.size
2799
+ @actions = actions
2800
+ @types = types
2801
+ @offset = 0
2802
+ @cache = Hash.new { |h,k| h[k] = {} }
2803
+ @failure = 0
2804
+ @expected = []
2805
+ end
2806
+
2807
+ def parse
2808
+ tree = _read_comp_expression
2809
+ if tree != FAILURE and @offset == @input_size
2810
+ return tree
2811
+ end
2812
+ if @expected.empty?
2813
+ @failure = @offset
2814
+ @expected << "<EOF>"
2815
+ end
2816
+ raise ParseError, Parser.format_error(@input, @failure, @expected)
2817
+ end
2818
+
2819
+ def self.format_error(input, offset, expected)
2820
+ lines, line_no, position = input.split(/\n/), 0, 0
2821
+ while position <= offset
2822
+ position += lines[line_no].size + 1
2823
+ line_no += 1
2824
+ end
2825
+ message, line = "Line #{line_no}: expected #{expected * ", "}\n", lines[line_no - 1]
2826
+ message += "#{line}\n"
2827
+ position -= line.size + 1
2828
+ message += " " * (offset - position)
2829
+ return message + "^"
2830
+ end
2831
+ end
2832
+
2833
+ def self.parse(input, options = {})
2834
+ parser = Parser.new(input, options[:actions], options[:types])
2835
+ parser.parse
2836
+ end
2837
+ end