1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3/test/functional'
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestTreeParser1 < ANTLR3::Test::Functional
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "flat list" do
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar FlatList;
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          output=AST;
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID INT;
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tree grammar FlatListWalker;
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ASTLabelType=CommonTree;
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID INT
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          {self.capture("\%s, \%s" \% [$ID, $INT])}
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer  = FlatList::Lexer.new( "abc 34" )
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = ANTLR3::CommonTokenStream.new( lexer )
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = FlatList::Parser.new( tokens )
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parser.a
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree )
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes.token_stream = tokens
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker = FlatListWalker::TreeParser.new( nodes )
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.a
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.output.should == "abc, 34"
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "simple tree" do
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar SimpleTree;
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          output=AST;
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID INT -> ^(ID INT);
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\\n') {$channel=HIDDEN;} ;
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tree grammar SimpleTreeWalker;
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ASTLabelType=CommonTree;
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ^(ID INT)
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          {capture('\%s, \%s' \% [$ID, $INT])}
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer  = SimpleTree::Lexer.new( "abc 34" )
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = ANTLR3::CommonTokenStream.new( lexer )
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = SimpleTree::Parser.new( tokens )
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parser.a
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree )
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes.token_stream = tokens
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker = SimpleTreeWalker::TreeParser.new( nodes )
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.a
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.output.should == "abc, 34"
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "flat vs tree decision" do
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar FlatVsTreeDecision;
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          output=AST;
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b c ;
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID INT -> ^(ID INT);
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      c : ID INT;
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\\n') {$channel=HIDDEN;} ;
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tree grammar FlatVsTreeDecisionWalker;
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ASTLabelType=CommonTree;
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b b ;
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID INT    {capture("\%s \%s\n" \% [$ID, $INT])}
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | ^(ID INT) {capture("^(\%s \%s)" \% [$ID, $INT])}
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer  = FlatVsTreeDecision::Lexer.new( "a 1 b 2" )
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = ANTLR3::CommonTokenStream.new( lexer )
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = FlatVsTreeDecision::Parser.new( tokens )
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parser.a
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree )
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes.token_stream = tokens
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker = FlatVsTreeDecisionWalker::TreeParser.new( nodes )
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.a
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.output.should == "^(a 1)b 2\n"
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "flat vs tree decision2" do
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar FlatVsTreeDecision2;
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          output=AST;
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b c ;
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID INT+ -> ^(ID INT+);
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      c : ID INT+;
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tree grammar FlatVsTreeDecision2Walker;
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ASTLabelType=CommonTree;
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : b b ;
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID INT+    {say("#{$ID} #{$INT}")}
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | ^(x=ID (y=INT)+) {capture("^(#{$x} #{$y})")}
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer  = FlatVsTreeDecision2::Lexer.new( "a 1 2 3 b 4 5" )
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = ANTLR3::CommonTokenStream.new( lexer )
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = FlatVsTreeDecision2::Parser.new( tokens )
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parser.a
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree )
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes.token_stream = tokens
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker = FlatVsTreeDecision2Walker::TreeParser.new( nodes )
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.a
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.output.should == "^(a 3)b 5\n"
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "cyclic dfa lookahead" do
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar CyclicDFALookahead;
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          output=AST;
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID INT+ PERIOD;
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      SEMI : ';' ;
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      PERIOD : '.' ;
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tree grammar CyclicDFALookaheadWalker;
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ASTLabelType=CommonTree;
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID INT+ PERIOD {capture("alt 1")}
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | ID INT+ SEMI   {capture("alt 2")}
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer  = CyclicDFALookahead::Lexer.new( "a 1 2 3." )
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = ANTLR3::CommonTokenStream.new( lexer )
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = CyclicDFALookahead::Parser.new( tokens )
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parser.a
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree )
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes.token_stream = tokens
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker = CyclicDFALookaheadWalker::TreeParser.new( nodes )
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.a
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.output.should == "alt 1"
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "nullable child list" do
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar NullableChildList;
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          output=AST;
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID INT? -> ^(ID INT?);
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\\n') {$channel=HIDDEN;} ;
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tree grammar NullableChildListWalker;
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ASTLabelType=CommonTree;
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ^(ID INT?)
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          {capture($ID.to_s)}
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer  = NullableChildList::Lexer.new( "abc" )
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = ANTLR3::CommonTokenStream.new( lexer )
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = NullableChildList::Parser.new( tokens )
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parser.a
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree )
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes.token_stream = tokens
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker = NullableChildListWalker::TreeParser.new( nodes )
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.a
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.output.should == "abc"
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "nullable child list2" do
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar NullableChildList2;
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          output=AST;
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID INT? SEMI -> ^(ID INT?) SEMI ;
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      SEMI : ';' ;
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tree grammar NullableChildList2Walker;
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ASTLabelType=CommonTree;
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ^(ID INT?) SEMI
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          {capture($ID.to_s)}
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer  = NullableChildList2::Lexer.new( "abc;" )
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = ANTLR3::CommonTokenStream.new( lexer )
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = NullableChildList2::Parser.new( tokens )
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parser.a
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree )
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes.token_stream = tokens
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker = NullableChildList2Walker::TreeParser.new( nodes )
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.a
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.output.should == "abc"
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "nullable child list3" do
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar NullableChildList3;
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          output=AST;
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : x=ID INT? (y=ID)? SEMI -> ^($x INT? $y?) SEMI ;
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      SEMI : ';' ;
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\\n') {$channel=HIDDEN;} ;
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tree grammar NullableChildList3Walker;
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ASTLabelType=CommonTree;
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ^(ID INT? b) SEMI
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          {self.capture($ID.to_s + ", " + $b.text.to_s)}
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      b : ID? ;
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer  = NullableChildList3::Lexer.new( "abc def;" )
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = ANTLR3::CommonTokenStream.new( lexer )
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = NullableChildList3::Parser.new( tokens )
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parser.a
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree )
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes.token_stream = tokens
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker = NullableChildList3Walker::TreeParser.new( nodes )
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.a
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.output.should == "abc, def"
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "actions after root" do
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar ActionsAfterRoot;
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          output=AST;
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : x=ID INT? SEMI -> ^($x INT?) ;
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      SEMI : ';' ;
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tree grammar ActionsAfterRootWalker;
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          language=Ruby;
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          ASTLabelType=CommonTree;
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a @init {x=0} : ^(ID {x=1} {x=2} INT?)
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          {say( $ID.to_s + ", " + x.to_s )}
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer  = ActionsAfterRoot::Lexer.new( "abc;" )
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = ANTLR3::CommonTokenStream.new( lexer )
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = ActionsAfterRoot::Parser.new( tokens )
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parser.a
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree )
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes.token_stream = tokens
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker = ActionsAfterRootWalker::TreeParser.new( nodes )
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.a
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.output.should == "abc, 2\n"
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "wildcard lookahead" do
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar WildcardLookahead;
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby; output=AST;}
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID '+'^ INT;
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      SEMI : ';' ;
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      PERIOD : '.' ;
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tree grammar WildcardLookaheadWalker;
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby; tokenVocab=WildcardLookahead; ASTLabelType=CommonTree;}
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ^('+' . INT) { capture("alt 1") }
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer  = WildcardLookahead::Lexer.new( "a + 2" )
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = ANTLR3::CommonTokenStream.new( lexer )
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = WildcardLookahead::Parser.new( tokens )
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parser.a
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree )
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes.token_stream = tokens
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker = WildcardLookaheadWalker::TreeParser.new( nodes )
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.a
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.output.should == "alt 1"
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "wildcard lookahead2" do
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar WildcardLookahead2;
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby; output=AST;}
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID '+'^ INT;
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      SEMI : ';' ;
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      PERIOD : '.' ;
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tree grammar WildcardLookahead2Walker;
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby; tokenVocab=WildcardLookahead2; ASTLabelType=CommonTree;}
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ^('+' . INT) { capture("alt 1") }
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | ^('+' . .)   { capture("alt 2") }
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer  = WildcardLookahead2::Lexer.new( "a + 2" )
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = ANTLR3::CommonTokenStream.new( lexer )
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = WildcardLookahead2::Parser.new( tokens )
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parser.a
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree )
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes.token_stream = tokens
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker = WildcardLookahead2Walker::TreeParser.new( nodes )
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.a
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.output.should == "alt 1"
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "wildcard lookahead3" do
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar WildcardLookahead3;
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby; output=AST;}
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID '+'^ INT;
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      SEMI : ';' ;
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      PERIOD : '.' ;
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tree grammar WildcardLookahead3Walker;
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby; tokenVocab=WildcardLookahead3; ASTLabelType=CommonTree;}
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ^('+' ID INT) { capture("alt 1") }
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | ^('+' . .)   { capture("alt 2") }
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer  = WildcardLookahead3::Lexer.new( "a + 2" )
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = ANTLR3::CommonTokenStream.new( lexer )
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = WildcardLookahead3::Parser.new( tokens )
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parser.a
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree )
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes.token_stream = tokens
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker = WildcardLookahead3Walker::TreeParser.new( nodes )
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.a
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.output.should == "alt 1"
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "wildcard plus lookahead" do
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      grammar WildcardPlusLookahead;
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby; output=AST;}
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ID '+'^ INT;
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ID : 'a'..'z'+ ;
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      INT : '0'..'9'+;
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      SEMI : ';' ;
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      PERIOD : '.' ;
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      WS : (' '|'\n') {$channel=HIDDEN;} ;
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    compile_and_load inline_grammar( <<-'END' )
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      tree grammar WildcardPlusLookaheadWalker;
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      options {language=Ruby; tokenVocab=WildcardPlusLookahead; ASTLabelType=CommonTree;}
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      @members { include ANTLR3::Test::CaptureOutput }
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      a : ^('+' INT INT ) { capture("alt 1") }
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | ^('+' .+)   { capture("alt 2") }
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer  = WildcardPlusLookahead::Lexer.new( "a + 2" )
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = ANTLR3::CommonTokenStream.new( lexer )
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = WildcardPlusLookahead::Parser.new( tokens )
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parser.a
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree )
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes.token_stream = tokens
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker = WildcardPlusLookaheadWalker::TreeParser.new( nodes )
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.a
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    walker.output.should == "alt 2"
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestTreeParser2 < ANTLR3::Test::Functional
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar GenericLanguage;
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language = Ruby;
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens {
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        VAR_DEF;
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ARG_DEF;
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FUNC_HDR;
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FUNC_DECL;
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        FUNC_DEF;
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        BLOCK;
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    program
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   declaration+
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    declaration
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   variable
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        |   functionHeader ';' -> ^(FUNC_DECL functionHeader)
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        |   functionHeader block -> ^(FUNC_DEF functionHeader block)
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    variable
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   type declarator ';' -> ^(VAR_DEF type declarator)
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    declarator
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   ID 
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    functionHeader
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   type ID '(' ( formalParameter ( ',' formalParameter )* )? ')'
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            -> ^(FUNC_HDR type ID formalParameter+)
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    formalParameter
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   type declarator -> ^(ARG_DEF type declarator)
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   'int'   
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        |   'char'  
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        |   'void'
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        |   ID        
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    block
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   lc='{'
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                variable*
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                stat*
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            '}'
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            -> ^(BLOCK[$lc,"BLOCK"] variable* stat*)
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    stat: forStat
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | expr ';'!
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | block
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | assignStat ';'!
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | ';'!
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    forStat
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   'for' '(' start=assignStat ';' expr ';' next=assignStat ')' block
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            -> ^('for' $start expr $next block)
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    assignStat
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   ID EQ expr -> ^(EQ ID expr)
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    expr:   condExpr
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    condExpr
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   aexpr ( ('=='^ | '<'^) aexpr )?
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    aexpr
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   atom ( '+'^ atom )*
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    atom
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : ID      
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | INT      
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | '(' expr ')' -> expr
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ; 
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    FOR : 'for' ;
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    INT_TYPE : 'int' ;
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    CHAR: 'char';
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    VOID: 'void';
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    INT :	('0'..'9')+
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    EQ   : '=' ;
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    EQEQ : '==' ;
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    LT   : '<' ;
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    PLUS : '+' ;
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS  :   (   ' '
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            |   '\t'
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            |   '\r'
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            |   '\n'
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            )+
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            { $channel=HIDDEN }
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree grammar GenericLanguageWalker;
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language = Ruby;
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokenVocab = GenericLanguage;
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ASTLabelType = CommonTree;
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @init { @traces = [] }
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      attr_reader :traces
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def trace_in(rule_name, rule_index)
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @traces << ">#{rule_name}"
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def trace_out(rule_name, rule_index)
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        @traces << "<#{rule_name}"
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    program
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   declaration+
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    declaration
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   variable
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        |   ^(FUNC_DECL functionHeader)
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        |   ^(FUNC_DEF functionHeader block)
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    variable returns [res]
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   ^(VAR_DEF type declarator)
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            { 
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                $res = $declarator.text; 
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    declarator
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   ID 
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    functionHeader
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   ^(FUNC_HDR type ID formalParameter+)
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    formalParameter
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   ^(ARG_DEF type declarator)
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   'int'
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        |   'char'
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        |   'void'
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        |   ID        
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    block
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   ^(BLOCK variable* stat*)
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    stat: forStat
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | expr
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | block
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    forStat
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        :   ^('for' expr expr expr block)
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    expr:   ^(EQEQ expr expr)
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        |   ^(LT expr expr)
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        |   ^(PLUS expr expr)
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        |   ^(EQ ID expr)
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        |   atom
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    atom
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        : ID      
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        | INT      
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ;
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  compile_options :trace => true
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "processing AST output from a parser with a tree parser" do
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    input_source = <<-END.fixed_indent( 0 )
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      char c;
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      int x;
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      void bar(int x);
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      int foo(int y, char d) {
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        int i;
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        for (i=0; i<3; i=i+1) {
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          x=3;
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          y=5;
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      }
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer = GenericLanguage::Lexer.new( input_source )
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = GenericLanguage::Parser.new( lexer )
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    expected_tree = <<-END.strip!.gsub!( /\s+/, ' ' )
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      (VAR_DEF char c)
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      (VAR_DEF int x)
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      (FUNC_DECL (FUNC_HDR void bar (ARG_DEF int x)))
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      (FUNC_DEF
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        (FUNC_HDR int foo (ARG_DEF int y) (ARG_DEF char d))
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        (BLOCK
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          (VAR_DEF int i)
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          (for (= i 0) (< i 3) (= i (+ i 1))
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            (BLOCK (= x 3) (= y 5)))))
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    END
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parser.program
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.tree.inspect.should == expected_tree
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree )
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes.token_stream = parser.input
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree_parser = GenericLanguageWalker::TreeParser.new( nodes )
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree_parser.program
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree_parser.traces.should == %w(
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      >program          >declaration      >variable         >type           
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <type             >declarator       <declarator       <variable       
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <declaration      >declaration      >variable         >type           
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <type             >declarator       <declarator       <variable       
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <declaration      >declaration      >functionHeader   >type           
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <type             >formalParameter  >type             <type           
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      >declarator       <declarator       <formalParameter  <functionHeader 
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <declaration      >declaration      >functionHeader   >type           
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <type             >formalParameter  >type             <type           
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      >declarator       <declarator       <formalParameter  >formalParameter
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      >type             <type             >declarator       <declarator     
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <formalParameter  <functionHeader   >block            >variable       
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      >type             <type             >declarator       <declarator     
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <variable         >stat             >forStat          >expr           
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      >expr             >atom             <atom             <expr           
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <expr             >expr             >expr             >atom           
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <atom             <expr             >expr             >atom           
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <atom             <expr             <expr             >expr           
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      >expr             >expr             >atom             <atom           
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <expr             >expr             >atom             <atom           
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <expr             <expr             <expr             >block          
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      >stat             >expr             >expr             >atom           
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <atom             <expr             <expr             <stat           
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      >stat             >expr             >expr             >atom           
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <atom             <expr             <expr             <stat           
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <block            <forStat          <stat             <block          
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      <declaration      <program        
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    )
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example 'tree parser rule label property references' do
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    input = "char c;\n"
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer  = GenericLanguage::Lexer.new( "char c;\n" )
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = GenericLanguage::Parser.new( lexer )
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parser.variable
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes = ANTLR3::AST::CommonTreeNodeStream.new( result.tree )
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes.token_stream = parser.input
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree_parser = GenericLanguageWalker::TreeParser.new( nodes )
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree_parser.variable.should == 'c'
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
750