public
Description: A Ruby-based parsing DSL based on parsing expression grammars.
Homepage: http://treetop.rubyforge.org
Clone URL: git://github.com/nathansobo/treetop.git
SyntaxNode changes - elements defaults to nil if no sub-nodes, empty? and 
inspect added
* The old error handling API required that an empty node returned itself 
in an array from elements - no more
* empty? predicate method added to detect whether any input was consumed 
(useful for optional nodes)
* extension_modules method added that returns the modules extended into 
this node by the parser
* inspect added that provides a useful nested dump of the syntax tree, 
including:
  - class and extension module names
  - byte offset in the input
  - a synopsis of the consumed text
  - local methods
  - indented dump of sub-nodes
cjheath (author)
Wed Dec 12 22:48:08 -0800 2007
commit  1bbf1f1fd9013989569d0d4797c60315a85ad50a
tree    e4d61fd112c2bd16d177d51b9a172b65ab91b2cb
parent  f8507012a02ebe76375a56e7bdbadfd273768d8b
...
135
136
137
138
139
 
...
135
136
137
 
138
139
0
@@ -135,4 +135,4 @@ module Treetop
0
       end
0
     end
0
   end
0
-end
0
\ No newline at end of file
0
+end
...
65
66
67
68
69
 
...
65
66
67
 
68
69
0
@@ -65,4 +65,4 @@ module Treetop
0
       end
0
     end
0
   end
0
-end
0
\ No newline at end of file
0
+end
...
2
3
4
5
 
6
7
8
9
10
11
 
12
13
14
15
 
16
17
18
19
 
20
21
 
22
23
 
24
25
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
28
29
30
 
...
2
3
4
 
5
6
7
8
9
10
 
11
12
13
14
 
15
16
17
18
 
19
20
 
21
22
 
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
 
72
73
0
@@ -2,28 +2,71 @@ module Treetop
0
   module Runtime
0
     class SyntaxNode
0
       attr_reader :input, :interval
0
-
0
+
0
       def initialize(input, interval, elements = nil)
0
         @input = input
0
         @interval = interval
0
         @elements = elements
0
       end
0
-
0
+
0
       def terminal?
0
         @elements.nil?
0
       end
0
-
0
+
0
       def nonterminal?
0
         !terminal?
0
       end
0
-
0
+
0
       def elements
0
- @elements || [self]
0
+ @elements
0
       end
0
-
0
+
0
       def text_value
0
         input[interval]
0
       end
0
+
0
+ def empty?
0
+ interval.first == interval.last && interval.exclude_end?
0
+ end
0
+
0
+ def extension_modules
0
+ local_extensions =
0
+ class <<self
0
+ included_modules-Object.included_modules
0
+ end
0
+ if local_extensions.size > 0
0
+ local_extensions
0
+ else
0
+ [] # There weren't any; must be a literal node
0
+ end
0
+ end
0
+
0
+ def inspect(indent="")
0
+ em = extension_modules
0
+ interesting_methods = methods-[em.last ? em.last.methods : nil]-self.class.instance_methods
0
+ im = interesting_methods.size > 0 ? " (#{interesting_methods.join(",")})" : ""
0
+ tv = text_value
0
+ tv = "...#{tv[-20..-1]}" if tv.size > 20
0
+
0
+ indent +
0
+ self.class.to_s.sub(/.*:/,'') +
0
+ em.map{|m| "+"+m.to_s.sub(/.*:/,'')}*"" +
0
+ " offset=#{interval.first}" +
0
+ ", #{tv.inspect}" +
0
+ im +
0
+ (elements && elements.size > 0 ?
0
+ ":" +
0
+ (@elements||[]).map{|e|
0
+ begin
0
+ "\n"+e.inspect(indent+" ")
0
+ rescue # Defend against inspect not taking a parameter
0
+ "\n"+indent+" "+e.inspect
0
+ end
0
+ }.join("") :
0
+ ""
0
+ )
0
+
0
+ end
0
     end
0
   end
0
-end
0
\ No newline at end of file
0
+end
...
6
7
8
9
 
 
 
 
 
 
10
11
12
13
 
...
6
7
8
 
9
10
11
12
13
14
15
16
 
17
18
0
@@ -6,7 +6,12 @@ module Treetop
0
         super(input, interval, [])
0
       end
0
 
0
-
0
+ def inspect(indent="")
0
+ indent+
0
+ self.class.to_s.sub(/.*:/,'') +
0
+ " offset=#{interval.first}" +
0
+ " #{text_value.inspect}"
0
+ end
0
     end
0
   end
0
-end
0
\ No newline at end of file
0
+end
...
16
17
18
19
 
20
21
22
...
16
17
18
 
19
20
21
22
0
@@ -16,7 +16,7 @@ module SyntaxNodeSpec
0
     end
0
   
0
     it "has itself as its only element" do
0
- @node.elements.should == [@node]
0
+ @node.elements.should be_nil
0
     end
0
   end
0
 

Comments

    No one has commented yet.