1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverrequire 'antlr3/test/functional'
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass TestHeterogeneousNodeTypes < ANTLR3::Test::Functional
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar VToken;
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.text + "<V>"
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID<V> ;
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar TokenWithQualifiedType;
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.text + "<V>"
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID<TokenWithQualifiedType.Parser.V> ;
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar TokenWithLabel;
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    class V < ANTLR3::CommonTree
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      def to_s
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return @token.text + "<V>"
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    end
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : x=ID<V> ;
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar TokenWithListLabel;
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.text + "<V>"
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : x+=ID<V> ;
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar TokenRoot;
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.text + "<V>"
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID<V>^ ;
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar TokenRootWithListLabel;
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.text + "<V>"
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : x+=ID<V>^ ;
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar FromString;
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.text + "<V>"
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : 'begin'<V> ;
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar StringRoot;
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.text + "<V>"
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : 'begin'<V>^ ;
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar RewriteToken;
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.text + "<V>"
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID -> ID<V> ;
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar RewriteTokenWithArgs;
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def initialize(*args)
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          case args.length
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          when 4
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ttype, @x, @y, @z = args
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            token = ANTLR3::CommonToken.new(ttype, nil, '')
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          when 3
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ttype, token, @x = args
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            @y = @z = 0
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          else raise ArgumentError, "invalid number of arguments: #{args.length} for 3-4"
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          end
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          super(token)
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          (@token.text.to_s rescue '') << "<V>;\%d\%d\%d" \% [@x, @y, @z]
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID -> ID<V>[42,19,30] ID<V>[$ID,99];
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar RewriteTokenRoot;
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.text + "<V>"
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID INT -> ^(ID<V> INT) ;
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    INT : '0'..'9'+ ;
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar RewriteString;
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.text + "<V>"
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : 'begin' -> 'begin'<V> ;
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar RewriteStringRoot;
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.text + "<V>"
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : 'begin' INT -> ^('begin'<V> INT) ;
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    INT : '0'..'9'+ ;
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar RewriteRuleResults;
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens {LIST;}
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.text + "<V>"
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class W < ANTLR3::CommonTree
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def initialize(tok, text)
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          tok.text = text
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          super(tok)
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.text + "<W>"
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : id (',' id)* -> ^(LIST<W>["LIST"] id+);
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    id : ID -> ID<V>;
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar CopySemanticsWithHetero;
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def dup_node
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return V.new(self)
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.text + "<V>"
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : type ID (',' ID)* ';' -> ^(type ID)+;
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    type : 'int'<V> ;
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    INT : '0'..'9'+;
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\\n') {$channel=HIDDEN;} ;
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar TreeParserRewriteFlatList;
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID INT;
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    INT : '0'..'9'+;
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree grammar TreeParserRewriteFlatListWalker;
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ASTLabelType=CommonTree;
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokenVocab=TreeParserRewriteFlatList;
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.text + "<V>"
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class W < ANTLR3::CommonTree
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.text + "<W>"
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID INT -> INT<V> ID<W>
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ;
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar TreeParserRewriteTree;
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID INT;
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    INT : '0'..'9'+;
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree grammar TreeParserRewriteTreeWalker;
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ASTLabelType=CommonTree;
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokenVocab=TreeParserRewriteTree;
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.text + "<V>"
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class W < ANTLR3::CommonTree
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.text + "<W>"
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end      
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID INT -> ^(INT<V> ID<W>)
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ;
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar TreeParserRewriteImaginary;
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID ;
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    INT : '0'..'9'+;
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree grammar TreeParserRewriteImaginaryWalker;
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ASTLabelType=CommonTree;
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokenVocab=TreeParserRewriteImaginary;
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens { ROOT; }
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.name + "<V>"
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID -> ROOT<V> ID
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ;
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar TreeParserRewriteImaginaryWithArgs;
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID ;
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    INT : '0'..'9'+;
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree grammar TreeParserRewriteImaginaryWithArgsWalker;
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ASTLabelType=CommonTree;
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokenVocab=TreeParserRewriteImaginaryWithArgs;
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens { ROOT; }
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def initialize(token_type, x)
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          super(token_type)
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          @x = x
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.name + "<V>;#@x"
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID -> ROOT<V>[42] ID
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ;
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar TreeParserRewriteImaginaryRoot;
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID ;
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    INT : '0'..'9'+;
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree grammar TreeParserRewriteImaginaryRootWalker;
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ASTLabelType=CommonTree;
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokenVocab=TreeParserRewriteImaginaryRoot;
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens { ROOT; }
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.name + "<V>"
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID -> ^(ROOT<V> ID)
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ;
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar TreeParserRewriteImaginaryFromReal;
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID ;
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    INT : '0'..'9'+;
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree grammar TreeParserRewriteImaginaryFromRealWalker;
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ASTLabelType=CommonTree;
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokenVocab=TreeParserRewriteImaginaryFromReal;
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens { ROOT; }
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def initialize(token, tree = nil)
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          if tree.nil? then super(token)
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          else
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            super(tree)
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            @token = TokenData::Token.from_token(@token)
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            @token.type = token.type
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          end
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.name + "<V>@" + @token.line.to_s
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID -> ROOT<V>[$ID]
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      ;
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar TreeParserAutoHeteroAST;
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID ';' ;
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ID : 'a'..'z'+ ;
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    INT : '0'..'9'+;
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    WS : (' '|'\n') {$channel=HIDDEN;} ;
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  inline_grammar( <<-'END' )
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree grammar TreeParserAutoHeteroASTWalker;
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    options {
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        language=Ruby;
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        output=AST;
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ASTLabelType=CommonTree;
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        tokenVocab=TreeParserAutoHeteroAST;
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens { ROOT; }
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @members {
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      class V < ANTLR3::CommonTree
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        def to_s
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver          return @token.text + "<V>"
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        end
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver      end
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    a : ID<V> ';'<V>;
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  END
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def parse( grammar_name, grammar_rule, input )
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar_module = self.class.const_get( grammar_name.to_s )
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer  = grammar_module::Lexer.new( input )
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = ANTLR3::CommonTokenStream.new( lexer )
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = grammar_module::Parser.new( tokens )
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r = parser.send( grammar_rule )
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return( r.tree.inspect rescue '' )
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  def tree_parse( grammar_name, grammar_rule, tree_grammar_rule, input )
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    grammar_module = self.class.const_get( grammar_name.to_s )
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree_grammar_module = self.class.const_get( grammar_name.to_s + 'Walker' )
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    lexer  = grammar_module::Lexer.new( input )
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tokens = ANTLR3::CommonTokenStream.new( lexer )
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    parser = grammar_module::Parser.new( tokens )
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r = parser.send( grammar_rule )
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes = ANTLR3::CommonTreeNodeStream.new( r.tree )
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    nodes.token_stream = tokens
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    tree_parser = tree_grammar_module::TreeParser.new( nodes )
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    r = tree_parser.send( tree_grammar_rule )
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return( r.tree.inspect rescue '' )
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "v token" do
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( :VToken, :a, 'a' )
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a<V>'
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "token with qualified type" do
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( :TokenWithQualifiedType, :a, 'a' )
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a<V>'
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "token with label" do
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( :TokenWithLabel, :a, 'a' )
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a<V>'
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "token with list label" do
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( :TokenWithListLabel, :a, 'a' )
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a<V>'
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "token root" do
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( :TokenRoot, :a, 'a' )
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a<V>'
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "token root with list label" do
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( :TokenRootWithListLabel, :a, 'a' )
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a<V>'
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "string" do
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( :FromString, :a, 'begin' )
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'begin<V>'
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "string root" do
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( :StringRoot, :a, 'begin' )
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'begin<V>'
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "rewrite token" do
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( :RewriteToken, :a, 'a' )
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'a<V>'
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "rewrite token with args" do
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( :RewriteTokenWithArgs, :a, 'a' )
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '<V>;421930 a<V>;9900'
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "rewrite token root" do
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( :RewriteTokenRoot, :a, 'a 2' )
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(a<V> 2)'
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "rewrite string" do
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( :RewriteString, :a, 'begin' )
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'begin<V>'
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "rewrite string root" do
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( :RewriteStringRoot, :a, 'begin 2' )
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(begin<V> 2)'
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "rewrite rule results" do
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( :RewriteRuleResults, :a, 'a,b,c' )
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(LIST<W> a<V> b<V> c<V>)'
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "copy semantics with hetero" do
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = parse( :CopySemanticsWithHetero, :a, 'int a, b, c;' )
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(int<V> a) (int<V> b) (int<V> c)'
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "tree parser rewrite flat list" do
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = tree_parse( :TreeParserRewriteFlatList, :a, :a, 'abc 34' )
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '34<V> abc<W>'
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "tree parser rewrite tree" do
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = tree_parse( :TreeParserRewriteTree, :a, :a, 'abc 34' )
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(34<V> abc<W>)'
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "tree parser rewrite imaginary" do
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = tree_parse( :TreeParserRewriteImaginary, :a, :a, 'abc' )
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'ROOT<V> abc'
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "tree parser rewrite imaginary with args" do
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = tree_parse( :TreeParserRewriteImaginaryWithArgs, :a, :a, 'abc' )
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'ROOT<V>;42 abc'
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "tree parser rewrite imaginary root" do
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = tree_parse( :TreeParserRewriteImaginaryRoot, :a, :a, 'abc' )
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == '(ROOT<V> abc)'
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "tree parser rewrite imaginary from real" do
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = tree_parse( :TreeParserRewriteImaginaryFromReal, :a, :a, 'abc' )
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'ROOT<V>@1'
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  example "tree parser auto hetero ast" do
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result = tree_parse( :TreeParserAutoHeteroAST, :a, :a, 'abc;' )
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    result.should == 'abc<V> ;<V>'
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver  end
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend
752