treetop 1.6.3 → 1.6.4

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.
@@ -84,6 +84,10 @@ module Treetop
84
84
  super.elements.map {|elt| elt.alternative}
85
85
  end
86
86
 
87
+ def parent_modules
88
+ []
89
+ end
90
+
87
91
  def inline_modules
88
92
  (alternatives.map {|alt| alt.inline_modules }).flatten
89
93
  end
@@ -100,10 +104,14 @@ module Treetop
100
104
  sequence_body.tail
101
105
  end
102
106
 
107
+ def parent_modules
108
+ node_class_declarations.inline_modules
109
+ end
110
+
103
111
  def inline_modules
104
112
  (sequence_elements.map {|elt| elt.inline_modules}).flatten +
105
113
  [sequence_element_accessor_module] +
106
- node_class_declarations.inline_modules
114
+ parent_modules
107
115
  end
108
116
 
109
117
  def inline_module_name
@@ -150,6 +158,10 @@ module Treetop
150
158
  atomic
151
159
  end
152
160
 
161
+ def parent_modules
162
+ []
163
+ end
164
+
153
165
  def inline_modules
154
166
  atomic.inline_modules
155
167
  end
@@ -166,6 +178,9 @@ module Treetop
166
178
  def prefixed_expression
167
179
  atomic
168
180
  end
181
+ def parent_modules
182
+ []
183
+ end
169
184
  def inline_modules
170
185
  []
171
186
  end
@@ -173,6 +188,7 @@ module Treetop
173
188
  /
174
189
  atomic suffix node_class_declarations {
175
190
  def compile(address, builder, parent_expression=nil)
191
+ STDERR.puts "Extraneous module ignored after suffix: #{input[interval].inspect}" if node_class_declarations.inline_modules.size > 0 && atomic.inline_modules.size > 0
176
192
  suffix.compile(address, builder, self)
177
193
  end
178
194
 
@@ -184,8 +200,12 @@ module Treetop
184
200
  node_class_declarations.node_class_name
185
201
  end
186
202
 
203
+ def parent_modules
204
+ node_class_declarations.inline_modules
205
+ end
206
+
187
207
  def inline_modules
188
- atomic.inline_modules + node_class_declarations.inline_modules
208
+ atomic.inline_modules + parent_modules
189
209
  end
190
210
 
191
211
  def inline_module_name
@@ -195,6 +215,7 @@ module Treetop
195
215
  /
196
216
  atomic node_class_declarations {
197
217
  def compile(address, builder, parent_expression=nil)
218
+ STDERR.puts "Extraneous module ignored with nested atomic: #{input[interval].inspect}" if node_class_declarations.inline_modules.size > 0 && atomic.inline_modules.size > 0
198
219
  atomic.compile(address, builder, self)
199
220
  end
200
221
 
@@ -202,8 +223,12 @@ module Treetop
202
223
  node_class_declarations.node_class_name
203
224
  end
204
225
 
226
+ def parent_modules
227
+ node_class_declarations.inline_modules
228
+ end
229
+
205
230
  def inline_modules
206
- atomic.inline_modules + node_class_declarations.inline_modules
231
+ atomic.inline_modules + parent_modules
207
232
  end
208
233
 
209
234
  def inline_module_name
@@ -222,6 +247,10 @@ module Treetop
222
247
  sequence_primary.compile(lexical_address, builder)
223
248
  end
224
249
 
250
+ def parent_modules
251
+ []
252
+ end
253
+
225
254
  def inline_modules
226
255
  sequence_primary.inline_modules
227
256
  end
@@ -238,6 +267,10 @@ module Treetop
238
267
  sequence_primary.compile(lexical_address, builder)
239
268
  end
240
269
 
270
+ def parent_modules
271
+ []
272
+ end
273
+
241
274
  def inline_modules
242
275
  sequence_primary.inline_modules
243
276
  end
@@ -282,6 +315,10 @@ module Treetop
282
315
  elements[1]
283
316
  end
284
317
 
318
+ def parent_modules
319
+ []
320
+ end
321
+
285
322
  def inline_modules
286
323
  atomic.inline_modules
287
324
  end
@@ -298,6 +335,9 @@ module Treetop
298
335
  def prefixed_expression
299
336
  atomic
300
337
  end
338
+ def parent_modules
339
+ []
340
+ end
301
341
  def inline_modules
302
342
  []
303
343
  end
@@ -312,6 +352,10 @@ module Treetop
312
352
  nil
313
353
  end
314
354
 
355
+ def parent_modules
356
+ []
357
+ end
358
+
315
359
  def inline_modules
316
360
  atomic.inline_modules
317
361
  end
@@ -338,6 +382,7 @@ module Treetop
338
382
  node_class_expression.node_class_name
339
383
  end
340
384
 
385
+ # !!!! cjh !!!!!
341
386
  def inline_modules
342
387
  trailing_inline_module.inline_modules
343
388
  end
@@ -374,6 +419,9 @@ module Treetop
374
419
 
375
420
  rule parenthesized_expression
376
421
  '(' space? parsing_expression space? ')' <ParenthesizedExpression> {
422
+ def parent_modules
423
+ []
424
+ end
377
425
  def inline_modules
378
426
  parsing_expression.inline_modules
379
427
  end
@@ -439,6 +487,9 @@ module Treetop
439
487
 
440
488
  rule trailing_inline_module
441
489
  space inline_module {
490
+ def parent_modules
491
+ []
492
+ end
442
493
  def inline_modules
443
494
  [inline_module]
444
495
  end
@@ -449,6 +500,9 @@ module Treetop
449
500
  }
450
501
  /
451
502
  '' {
503
+ def parent_modules
504
+ []
505
+ end
452
506
  def inline_modules
453
507
  []
454
508
  end
@@ -6,7 +6,7 @@ module Treetop
6
6
  builder.if__ "index < input_length" do
7
7
  if address == 0 || decorated?
8
8
  assign_result "instantiate_node(#{node_class_name},input, index...(index + 1))"
9
- extend_result_with_inline_module
9
+ extend_result_with_inline_module parent_expression
10
10
  else
11
11
  assign_lazily_instantiated_node
12
12
  end
@@ -7,7 +7,7 @@ module Treetop
7
7
  builder.if__ "has_terminal?(@regexps[gr = #{grounded_regexp(text_value)}] ||= Regexp.new(gr), :regexp, index)" do
8
8
  if address == 0 || decorated?
9
9
  assign_result "instantiate_node(#{node_class_name},input, index...(index + 1))"
10
- extend_result_with_inline_module
10
+ extend_result_with_inline_module parent_expression
11
11
  else
12
12
  assign_lazily_instantiated_node
13
13
  end
@@ -5,11 +5,11 @@ module Treetop
5
5
  super
6
6
  begin_comment(self)
7
7
  use_vars :result, :start_index
8
- compile_alternatives(alternatives)
8
+ compile_alternatives(alternatives, parent_expression)
9
9
  end_comment(self)
10
10
  end
11
-
12
- def compile_alternatives(alternatives)
11
+
12
+ def compile_alternatives(alternatives, parent_expression)
13
13
  obtain_new_subexpression_address
14
14
  alternatives.first.compile(subexpression_address, builder)
15
15
  builder.if__ subexpression_success? do
@@ -17,14 +17,14 @@ module Treetop
17
17
  builder << "#{subexpression_result_var} = SyntaxNode.new(input, (index-1)...index) if #{subexpression_result_var} == true"
18
18
  assign_result subexpression_result_var
19
19
  extend_result_with_declared_module
20
- extend_result_with_inline_module
20
+ extend_result_with_inline_module parent_expression
21
21
  end
22
22
  builder.else_ do
23
23
  if alternatives.size == 1
24
24
  reset_index
25
25
  assign_failure start_index_var
26
26
  else
27
- compile_alternatives(alternatives[1..-1])
27
+ compile_alternatives(alternatives[1..-1], parent_expression)
28
28
  end
29
29
  end
30
30
  end
@@ -6,8 +6,8 @@ module Treetop
6
6
  use_vars :result
7
7
  assign_result text_value == 'super' ? 'super' : "_nt_#{text_value}"
8
8
  extend_result_with_declared_module
9
- extend_result_with_inline_module
9
+ extend_result_with_inline_module parent_expression
10
10
  end
11
11
  end
12
12
  end
13
- end
13
+ end
@@ -78,8 +78,14 @@ module Treetop
78
78
  extend_result declared_module_name if declared_module_name
79
79
  end
80
80
 
81
- def extend_result_with_inline_module
82
- extend_result inline_module_name if inline_module_name
81
+ def extend_result_with_inline_module parent_expression = nil
82
+ # debugger if parent_expression && !parent_expression.respond_to?(:parent_modules)
83
+ if parent_expression && parent_expression.parent_modules.size > 0
84
+ parent_expression.parent_modules.each do |inline|
85
+ extend_result inline.module_name
86
+ end
87
+ end
88
+ extend_result inline_module_name if inline_module_name
83
89
  end
84
90
 
85
91
  def reset_index
@@ -43,7 +43,7 @@ module Treetop
43
43
 
44
44
  def when_failure
45
45
  if (e = parent.atomic.expected)
46
- builder << "terminal_failures.pop"
46
+ builder << "@terminal_failures.pop"
47
47
  end
48
48
  assign_success
49
49
  end
@@ -28,9 +28,9 @@ module Treetop
28
28
  parent_expression.inline_module_name
29
29
  end
30
30
 
31
- def assign_and_extend_result
31
+ def assign_and_extend_result parent_expression
32
32
  assign_result "instantiate_node(#{node_class_name},input, #{start_index_var}...index, #{accumulator_var})"
33
- extend_result_with_inline_module
33
+ extend_result_with_inline_module parent_expression
34
34
  end
35
35
  end
36
36
 
@@ -38,7 +38,7 @@ module Treetop
38
38
  class ZeroOrMore < Repetition
39
39
  def compile(address, builder, parent_expression)
40
40
  super
41
- assign_and_extend_result
41
+ assign_and_extend_result parent_expression
42
42
  end_comment(parent_expression)
43
43
  end
44
44
 
@@ -55,7 +55,7 @@ module Treetop
55
55
  assign_failure start_index_var
56
56
  end
57
57
  builder.else_ do
58
- assign_and_extend_result
58
+ assign_and_extend_result parent_expression
59
59
  end
60
60
  end_comment(parent_expression)
61
61
  end
@@ -81,11 +81,11 @@ module Treetop
81
81
  end
82
82
  builder.else_ do
83
83
  clean_unsaturated
84
- assign_and_extend_result
84
+ assign_and_extend_result parent_expression
85
85
  end
86
86
  else
87
87
  clean_unsaturated
88
- assign_and_extend_result
88
+ assign_and_extend_result parent_expression
89
89
  end
90
90
 
91
91
  end_comment(parent_expression)
@@ -95,7 +95,7 @@ module Treetop
95
95
  def clean_unsaturated
96
96
  if !max.empty? && max.text_value.to_i > 0
97
97
  builder.if_ "#{accumulator_var}.size < #{max.text_value}" do
98
- builder << 'terminal_failures.pop' # Ignore the last failure.
98
+ builder << '@terminal_failures.pop' # Ignore the last failure.
99
99
  end
100
100
  end
101
101
  end
@@ -9,7 +9,7 @@ module Treetop
9
9
  builder.if__ "#{accumulator_var}.last" do
10
10
  assign_result "instantiate_node(#{node_class_name},input, #{start_index_var}...index, #{accumulator_var})"
11
11
  extend_result sequence_element_accessor_module_name if sequence_element_accessor_module_name
12
- extend_result_with_inline_module
12
+ extend_result_with_inline_module parent_expression
13
13
  end
14
14
  builder.else_ do
15
15
  reset_index
@@ -25,7 +25,13 @@ module Treetop
25
25
  builder.if__ "(match_len = has_terminal?(#{str}, #{mode}, index))" do
26
26
  if address == 0 || decorated? || mode != 'false' || string_length > 1
27
27
  assign_result "instantiate_node(#{node_class_name},input, index...(index + match_len))"
28
- extend_result_with_inline_module
28
+ # debugger if parent_expression and parent_expression.inline_modules.size > 0
29
+ # extend_result_with_inline_module parent_expression
30
+ if parent_expression
31
+ parent_expression.inline_modules.each do |inline|
32
+ extend_result inline.module_name
33
+ end
34
+ end
29
35
  else
30
36
  assign_lazily_instantiated_node
31
37
  end
@@ -60,7 +60,7 @@ module Treetop
60
60
  end
61
61
  end
62
62
 
63
- def inspect(indent="")
63
+ def inspect_self(indent="")
64
64
  em = extension_modules
65
65
  interesting_methods = methods-[em.last ? em.last.methods : nil]-self.class.instance_methods
66
66
  im = interesting_methods.size > 0 ? " (#{interesting_methods.join(",")})" : ""
@@ -72,18 +72,25 @@ module Treetop
72
72
  em.map{|m| "+"+m.to_s.sub(/.*:/,'')}*"" +
73
73
  " offset=#{interval.first}" +
74
74
  ", #{tv.inspect}" +
75
- im +
76
- (elements && elements.size > 0 ?
77
- ":" +
78
- (elements||[]).map{|e|
79
- begin
80
- "\n"+e.inspect(indent+" ")
81
- rescue # Defend against inspect not taking a parameter
82
- "\n"+indent+" "+e.inspect
83
- end
84
- }.join("") :
85
- ""
86
- )
75
+ im
76
+ end
77
+
78
+ def inspect_children(indent="")
79
+ return '' unless elements && elements.size > 0
80
+ ":" +
81
+ elements.map do |e|
82
+ begin
83
+ "\n"+e.inspect(indent+" ")
84
+ rescue # Defend against inspect not taking a parameter
85
+ "\n"+indent+" "+e.inspect
86
+ end
87
+ end.
88
+ join("")
89
+ end
90
+
91
+ def inspect(indent="")
92
+ inspect_self(indent) +
93
+ inspect_children(indent)
87
94
  end
88
95
 
89
96
  @@dot_id_counter = 0
@@ -2,7 +2,7 @@ module Treetop #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 1
4
4
  MINOR = 6
5
- TINY = 3
5
+ TINY = 4
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -2,22 +2,31 @@ require 'spec_helper'
2
2
 
3
3
  module ChoiceSpec
4
4
  describe "A choice between terminal symbols" do
5
- testing_expression '"foo" { def foo_method; end } / "bar" { def bar_method; end } / "baz" { def baz_method; end }'
5
+ testing_expression '("foo" { def foo_method; end } / "bar" { def bar_method; end } / "baz" { def baz_method; end }) {def bat_method; end}'
6
6
 
7
7
  it "successfully parses input matching any of the alternatives, returning a node that responds to methods defined in its respective inline module" do
8
8
  result = parse('foo')
9
9
  result.should_not be_nil
10
10
  result.should respond_to(:foo_method)
11
-
11
+ result.should_not respond_to(:bar_method)
12
+ result.should_not respond_to(:baz_method)
13
+ result.should respond_to(:bat_method)
14
+
12
15
  result = parse('bar')
13
16
  result.should_not be_nil
17
+ result.should_not respond_to(:foo_method)
14
18
  result.should respond_to(:bar_method)
15
-
19
+ result.should_not respond_to(:baz_method)
20
+ result.should respond_to(:bat_method)
21
+
16
22
  result = parse('baz')
17
23
  result.should_not be_nil
24
+ result.should_not respond_to(:foo_method)
25
+ result.should_not respond_to(:bar_method)
18
26
  result.should respond_to(:baz_method)
27
+ result.should respond_to(:bat_method)
19
28
  end
20
-
29
+
21
30
  it "upon parsing a string matching the second alternative, records the failure of the first terminal" do
22
31
  result = parse('bar')
23
32
  terminal_failures = parser.terminal_failures
@@ -26,18 +35,18 @@ module ChoiceSpec
26
35
  failure.expected_string.should == '"foo"'
27
36
  failure.index.should == 0
28
37
  end
29
-
38
+
30
39
  it "upon parsing a string matching the third alternative, records the failure of the first two terminals" do
31
40
  result = parse('baz')
32
-
41
+
33
42
  terminal_failures = parser.terminal_failures
34
-
43
+
35
44
  terminal_failures.size.should == 2
36
45
 
37
46
  failure_1 = terminal_failures[0]
38
47
  failure_1.expected_string == 'foo'
39
48
  failure_1.index.should == 0
40
-
49
+
41
50
  failure_2 = terminal_failures[1]
42
51
  failure_2.expected_string == 'bar'
43
52
  failure_2.index.should == 0
@@ -53,7 +62,7 @@ module ChoiceSpec
53
62
  end
54
63
  end
55
64
 
56
- describe "A choice between terminals followed by a block" do
65
+ describe "A choice between terminals followed by a block" do
57
66
  testing_expression "('a'/ 'bb' / [c]) { def a_method; end }"
58
67
 
59
68
  it "extends a match of any of its subexpressions with a module created from the block" do
@@ -68,7 +77,7 @@ module ChoiceSpec
68
77
  end
69
78
  end
70
79
 
71
- describe "a choice followed by a declared module" do
80
+ describe "a choice followed by a declared module" do
72
81
  testing_expression "('a'/ 'bb' / [c]) <ChoiceSpec::TestModule>"
73
82
 
74
83
  it "extends a match of any of its subexpressions with a module created from the block" do