1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/*
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD license"]
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Copyright (c) 2010 Terence Parr
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  All rights reserved.
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  Redistribution and use in source and binary forms, with or without
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  modification, are permitted provided that the following conditions
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  are met:
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  1. Redistributions of source code must retain the above copyright
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *      notice, this list of conditions and the following disclaimer.
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  2. Redistributions in binary form must reproduce the above copyright
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *      notice, this list of conditions and the following disclaimer in the
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *      documentation and/or other materials provided with the distribution.
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  3. The name of the author may not be used to endorse or promote products
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *      derived from this software without specific prior written permission.
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage org.antlr.test;
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.Tool;
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.codegen.CodeGenerator;
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.runtime.RecognitionException;
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.tool.ErrorManager;
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.tool.Grammar;
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.tool.GrammarSyntaxMessage;
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.junit.Ignore;
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.junit.Test;
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Tree rewrites in tree parsers are basically identical to rewrites
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  in a normal grammar except that the atomic element is a node not
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  a Token.  Tests here ensure duplication of nodes occurs properly
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  and basic functionality.
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic class TestTreeGrammarRewriteAST extends BaseTest {
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected boolean debug = false;
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testFlatList() throws Exception {
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT;\n" +
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT -> INT ID\n" +
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "abc 34");
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("34 abc\n", found);
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testSimpleTree() throws Exception {
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT -> ^(ID INT);\n" +
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ^(ID INT) -> ^(INT ID)\n" +
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "abc 34");
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("(34 abc)\n", found);
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testNonImaginaryWithCtor() throws Exception {
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : INT ;\n" +
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : INT -> INT[\"99\"]\n" + // make new INT node
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				    treeGrammar, "TP", "TLexer", "a", "a", "34");
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("99\n", found);
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testCombinedRewriteAndAuto() throws Exception {
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT -> ^(ID INT) | INT ;\n" +
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ^(ID INT) -> ^(INT ID) | INT\n" +
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "abc 34");
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("(34 abc)\n", found);
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		found = execTreeParser("T.g", grammar, "TParser", "TP.g",
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							   treeGrammar, "TP", "TLexer", "a", "a", "34");
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("34\n", found);
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testAvoidDup() throws Exception {
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID ;\n" +
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID -> ^(ID ID)\n" +
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "abc");
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("(abc abc)\n", found);
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testLoop() throws Exception {
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID+ INT+ -> (^(ID INT))+ ;\n" +
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : (^(ID INT))+ -> INT+ ID+\n" +
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "a b c 3 4 5");
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("3 4 5 a b c\n", found);
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testAutoDup() throws Exception {
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID ;\n" +
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID \n" +
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "abc");
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("abc\n", found);
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testAutoDupRule() throws Exception {
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT ;\n" +
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : b c ;\n" +
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"b : ID ;\n" +
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"c : INT ;\n";
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "a 1");
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("a 1\n", found);
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testAutoWildcard() throws Exception {
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String grammar =
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "grammar T;\n" +
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST;}\n" +
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ID INT ;\n" +
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "ID : 'a'..'z'+ ;\n" +
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "INT : '0'..'9'+;\n" +
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String treeGrammar =
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "tree grammar TP;\n"+
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ID . \n" +
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "  ;\n";
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                      treeGrammar, "TP", "TLexer", "a", "a", "abc 34");
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals("abc 34\n", found);
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testNoWildcardAsRootError() throws Exception {
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ErrorQueue equeue = new ErrorQueue();
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ErrorManager.setErrorListener(equeue);
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String treeGrammar =
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "tree grammar TP;\n"+
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST;}\n" +
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ^(. INT) \n" +
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "  ;\n";
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Grammar g = new Grammar(treeGrammar);
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Tool antlr = newTool();
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        antlr.setOutputDirectory(null); // write to /dev/null
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        g.setCodeGenerator(generator);
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        generator.genRecognizer();
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals("unexpected errors: "+equeue, 1, equeue.errors.size());
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        int expectedMsgID = ErrorManager.MSG_WILDCARD_AS_ROOT;
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        Object expectedArg = null;
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        RecognitionException expectedExc = null;
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        GrammarSyntaxMessage expectedMessage =
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            new GrammarSyntaxMessage(expectedMsgID, g, null, expectedArg, expectedExc);
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        checkError(equeue, expectedMessage);
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testAutoWildcard2() throws Exception {
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String grammar =
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "grammar T;\n" +
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST;}\n" +
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ID INT -> ^(ID INT);\n" +
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "ID : 'a'..'z'+ ;\n" +
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "INT : '0'..'9'+;\n" +
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String treeGrammar =
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "tree grammar TP;\n"+
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ^(ID .) \n" +
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "  ;\n";
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                      treeGrammar, "TP", "TLexer", "a", "a", "abc 34");
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals("(abc 34)\n", found);
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testAutoWildcardWithLabel() throws Exception {
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String grammar =
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "grammar T;\n" +
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST;}\n" +
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ID INT ;\n" +
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "ID : 'a'..'z'+ ;\n" +
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "INT : '0'..'9'+;\n" +
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String treeGrammar =
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "tree grammar TP;\n"+
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ID c=. \n" +
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "  ;\n";
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                      treeGrammar, "TP", "TLexer", "a", "a", "abc 34");
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals("abc 34\n", found);
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testAutoWildcardWithListLabel() throws Exception {
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String grammar =
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "grammar T;\n" +
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST;}\n" +
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ID INT ;\n" +
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "ID : 'a'..'z'+ ;\n" +
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "INT : '0'..'9'+;\n" +
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String treeGrammar =
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "tree grammar TP;\n"+
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ID c+=. \n" +
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "  ;\n";
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                      treeGrammar, "TP", "TLexer", "a", "a", "abc 34");
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals("abc 34\n", found);
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testAutoDupMultiple() throws Exception {
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID ID INT;\n" +
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID ID INT\n" +
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "a b 3");
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("a b 3\n", found);
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testAutoDupTree() throws Exception {
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT -> ^(ID INT);\n" +
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ^(ID INT)\n" +
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "a 3");
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("(a 3)\n", found);
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testAutoDupTree2() throws Exception {
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT INT -> ^(ID INT INT);\n" +
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ^(ID b b)\n" +
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n" +
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"b : INT ;";
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "a 3 4");
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("(a 3 4)\n", found);
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testAutoDupTreeWithLabels() throws Exception {
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT -> ^(ID INT);\n" +
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ^(x=ID y=INT)\n" +
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "a 3");
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("(a 3)\n", found);
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testAutoDupTreeWithListLabels() throws Exception {
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT -> ^(ID INT);\n" +
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ^(x+=ID y+=INT)\n" +
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "a 3");
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("(a 3)\n", found);
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testAutoDupTreeWithRuleRoot() throws Exception {
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT -> ^(ID INT);\n" +
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ^(b INT) ;\n" +
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"b : ID ;\n";
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "a 3");
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("(a 3)\n", found);
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testAutoDupTreeWithRuleRootAndLabels() throws Exception {
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT -> ^(ID INT);\n" +
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ^(x=b INT) ;\n" +
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"b : ID ;\n";
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "a 3");
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("(a 3)\n", found);
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testAutoDupTreeWithRuleRootAndListLabels() throws Exception {
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT -> ^(ID INT);\n" +
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ^(x+=b y+=c) ;\n" +
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"b : ID ;\n" +
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"c : INT ;\n";
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "a 3");
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("(a 3)\n", found);
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testAutoDupNestedTree() throws Exception {
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : x=ID y=ID INT -> ^($x ^($y INT));\n" +
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ^(ID ^(ID INT))\n" +
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "a b 3");
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("(a (b 3))\n", found);
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testAutoDupTreeWithSubruleInside() throws Exception {
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tokens {OP;}\n" +
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : (x=ID|x=INT) -> ^(OP $x) ;\n" +
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ^(OP (b|c)) ;\n" +
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"b : ID ;\n" +
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"c : INT ;\n";
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "a");
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("(OP a)\n", found);
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testDelete() throws Exception {
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID ;\n" +
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID -> \n" +
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "abc");
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("", found);
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testSetMatchNoRewrite() throws Exception {
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT ;\n" +
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : b INT\n" +
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n" +
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"b : ID | INT ;\n";
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "abc 34");
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("abc 34\n", found);
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testSetOptionalMatchNoRewrite() throws Exception {
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT ;\n" +
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : (ID|INT)? INT ;\n";
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "abc 34");
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("abc 34\n", found);
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testSetMatchNoRewriteLevel2() throws Exception {
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : x=ID INT -> ^($x INT);\n" +
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ^(ID (ID | INT) ) ;\n";
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "abc 34");
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("(abc 34)\n", found);
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testSetMatchNoRewriteLevel2Root() throws Exception {
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : x=ID INT -> ^($x INT);\n" +
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ^((ID | INT) INT) ;\n";
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "abc 34");
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("(abc 34)\n", found);
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// REWRITE MODE
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRewriteModeCombinedRewriteAndAuto() throws Exception {
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT -> ^(ID INT) | INT ;\n" +
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" +
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ^(ID INT) -> ^(ID[\"ick\"] INT)\n" +
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  | INT\n" + // leaves it alone, returning $a.start
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "abc 34");
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("(ick 34)\n", found);
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		found = execTreeParser("T.g", grammar, "TParser", "TP.g",
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							   treeGrammar, "TP", "TLexer", "a", "a", "34");
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("34\n", found);
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRewriteModeFlatTree() throws Exception {
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT -> ID INT | INT ;\n" +
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" +
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"s : ID a ;\n" +
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : INT -> INT[\"1\"]\n"+
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "s", "abc 34");
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("abc 1\n", found);
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRewriteModeChainRuleFlatTree() throws Exception {
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT -> ID INT | INT ;\n" +
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" +
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"s : a ;\n" +
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : b ;\n" +
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"b : ID INT -> INT ID\n"+
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "s", "abc 34");
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("34 abc\n", found);
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRewriteModeChainRuleTree() throws Exception {
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT -> ^(ID INT) ;\n" +
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" +
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"s : a ;\n" +
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : b ;\n" + // a.tree must become b.tree
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"b : ^(ID INT) -> INT\n"+
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "s", "abc 34");
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("34\n", found);
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRewriteModeChainRuleTree2() throws Exception {
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT -> ^(ID INT) ;\n" +
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" +
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tokens { X; }\n" +
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"s : a* b ;\n" + // only b contributes to tree, but it's after a*; s.tree = b.tree
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : X ;\n" +
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"b : ^(ID INT) -> INT\n"+
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "s", "abc 34");
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("34\n", found);
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRewriteModeChainRuleTree3() throws Exception {
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : 'boo' ID INT -> 'boo' ^(ID INT) ;\n" +
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" +
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tokens { X; }\n" +
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"s : 'boo' a* b ;\n" + // don't reset s.tree to b.tree due to 'boo'
752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : X ;\n" +
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"b : ^(ID INT) -> INT\n"+
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "s", "boo abc 34");
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("boo 34\n", found);
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRewriteModeChainRuleTree4() throws Exception {
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : 'boo' ID INT -> ^('boo' ^(ID INT)) ;\n" +
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" +
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tokens { X; }\n" +
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"s : ^('boo' a* b) ;\n" + // don't reset s.tree to b.tree due to 'boo'
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : X ;\n" +
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"b : ^(ID INT) -> INT\n"+
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "s", "boo abc 34");
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("(boo 34)\n", found);
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRewriteModeChainRuleTree5() throws Exception {
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : 'boo' ID INT -> ^('boo' ^(ID INT)) ;\n" +
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" +
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tokens { X; }\n" +
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"s : ^(a b) ;\n" + // s.tree is a.tree
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : 'boo' ;\n" +
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"b : ^(ID INT) -> INT\n"+
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "s", "boo abc 34");
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("(boo 34)\n", found);
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testRewriteOfRuleRef() throws Exception {
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String grammar =
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "grammar T;\n" +
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST;}\n" +
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ID INT -> ID INT | INT ;\n" +
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "ID : 'a'..'z'+ ;\n" +
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "INT : '0'..'9'+;\n" +
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String treeGrammar =
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "tree grammar TP;\n"+
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" +
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "s : a -> a ;\n" +
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ID INT -> ID INT ;\n";
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                      treeGrammar, "TP", "TLexer", "a", "s", "abc 34");
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals("abc 34\n", found);
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testRewriteOfRuleRefRoot() throws Exception {
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String grammar =
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "grammar T;\n" +
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST;}\n" +
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ID INT INT -> ^(INT ^(ID INT));\n" +
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "ID : 'a'..'z'+ ;\n" +
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "INT : '0'..'9'+;\n" +
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String treeGrammar =
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "tree grammar TP;\n"+
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" +
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "s : ^(a ^(ID INT)) -> a ;\n" +
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : INT ;\n";
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                      treeGrammar, "TP", "TLexer", "a", "s", "abc 12 34");
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // emits whole tree when you ref the root since I can't know whether
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // you want the children or not.  You might be returning a whole new
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // tree.  Hmm...still seems weird.  oh well.
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals("(12 (abc 34))\n", found);
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testRewriteOfRuleRefRootLabeled() throws Exception {
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String grammar =
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "grammar T;\n" +
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST;}\n" +
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ID INT INT -> ^(INT ^(ID INT));\n" +
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "ID : 'a'..'z'+ ;\n" +
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "INT : '0'..'9'+;\n" +
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String treeGrammar =
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "tree grammar TP;\n"+
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" +
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "s : ^(label=a ^(ID INT)) -> a ;\n" +
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : INT ;\n";
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                      treeGrammar, "TP", "TLexer", "a", "s", "abc 12 34");
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // emits whole tree when you ref the root since I can't know whether
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // you want the children or not.  You might be returning a whole new
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // tree.  Hmm...still seems weird.  oh well.
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals("(12 (abc 34))\n", found);
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Ignore
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testRewriteOfRuleRefRootListLabeled() throws Exception {
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String grammar =
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "grammar T;\n" +
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST;}\n" +
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ID INT INT -> ^(INT ^(ID INT));\n" +
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "ID : 'a'..'z'+ ;\n" +
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "INT : '0'..'9'+;\n" +
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String treeGrammar =
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "tree grammar TP;\n"+
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" +
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "s : ^(label+=a ^(ID INT)) -> a ;\n" +
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : INT ;\n";
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                      treeGrammar, "TP", "TLexer", "a", "s", "abc 12 34");
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // emits whole tree when you ref the root since I can't know whether
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // you want the children or not.  You might be returning a whole new
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        // tree.  Hmm...still seems weird.  oh well.
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals("(12 (abc 34))\n", found);
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testRewriteOfRuleRefChild() throws Exception {
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String grammar =
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "grammar T;\n" +
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST;}\n" +
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ID INT -> ^(ID ^(INT INT));\n" +
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "ID : 'a'..'z'+ ;\n" +
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "INT : '0'..'9'+;\n" +
904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String treeGrammar =
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "tree grammar TP;\n"+
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" +
909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "s : ^(ID a) -> a ;\n" +
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ^(INT INT) ;\n";
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                      treeGrammar, "TP", "TLexer", "a", "s", "abc 34");
914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals("(34 34)\n", found);
915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testRewriteOfRuleRefLabel() throws Exception {
918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String grammar =
919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "grammar T;\n" +
920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST;}\n" +
921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ID INT -> ^(ID ^(INT INT));\n" +
922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "ID : 'a'..'z'+ ;\n" +
923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "INT : '0'..'9'+;\n" +
924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String treeGrammar =
927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "tree grammar TP;\n"+
928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" +
929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "s : ^(ID label=a) -> a ;\n" +
930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ^(INT INT) ;\n";
931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                      treeGrammar, "TP", "TLexer", "a", "s", "abc 34");
934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals("(34 34)\n", found);
935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testRewriteOfRuleRefListLabel() throws Exception {
938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String grammar =
939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "grammar T;\n" +
940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST;}\n" +
941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ID INT -> ^(ID ^(INT INT));\n" +
942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "ID : 'a'..'z'+ ;\n" +
943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "INT : '0'..'9'+;\n" +
944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String treeGrammar =
947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "tree grammar TP;\n"+
948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" +
949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "s : ^(ID label+=a) -> a ;\n" +
950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ^(INT INT) ;\n";
951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                      treeGrammar, "TP", "TLexer", "a", "s", "abc 34");
954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals("(34 34)\n", found);
955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testRewriteModeWithPredicatedRewrites() throws Exception {
958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID INT -> ^(ID[\"root\"] ^(ID INT)) | INT -> ^(ID[\"root\"] INT) ;\n" +
962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" +
969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"s : ^(ID a) {System.out.println(\"altered tree=\"+$s.start.toStringTree());};\n" +
970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ^(ID INT) -> {true}? ^(ID[\"ick\"] INT)\n" +
971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"              -> INT\n" +
972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n";
973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "s", "abc 34");
976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("altered tree=(root (ick 34))\n" +
977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					 "(root (ick 34))\n", found);
978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testWildcardSingleNode() throws Exception {
981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String grammar =
982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "grammar T;\n" +
983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST;}\n" +
984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ID INT -> ^(ID[\"root\"] INT);\n"+
985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "ID : 'a'..'z'+ ;\n" +
986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "INT : '0'..'9'+;\n" +
987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String treeGrammar =
990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "tree grammar TP;\n"+
991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "s : ^(ID c=.) -> $c\n" +
993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "  ;\n";
994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                      treeGrammar, "TP", "TLexer", "a", "s", "abc 34");
997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals("34\n", found);
998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testWildcardUnlabeledSingleNode() throws Exception {
1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String grammar =
1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "grammar T;\n" +
1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST;}\n" +
1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ID INT -> ^(ID INT);\n"+
1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "ID : 'a'..'z'+ ;\n" +
1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "INT : '0'..'9'+;\n" +
1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String treeGrammar =
1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "tree grammar TP;\n"+
1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "s : ^(ID .) -> ID\n" +
1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "  ;\n";
1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                      treeGrammar, "TP", "TLexer", "a", "s", "abc 34");
1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals("abc\n", found);
1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testWildcardGrabsSubtree() throws Exception {
1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String grammar =
1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "grammar T;\n" +
1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST;}\n" +
1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ID x=INT y=INT z=INT -> ^(ID[\"root\"] ^($x $y $z));\n"+
1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "ID : 'a'..'z'+ ;\n" +
1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "INT : '0'..'9'+;\n" +
1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String treeGrammar =
1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "tree grammar TP;\n"+
1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "s : ^(ID c=.) -> $c\n" +
1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "  ;\n";
1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                      treeGrammar, "TP", "TLexer", "a", "s", "abc 1 2 3");
1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals("(1 2 3)\n", found);
1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testWildcardGrabsSubtree2() throws Exception {
1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String grammar =
1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "grammar T;\n" +
1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST;}\n" +
1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : ID x=INT y=INT z=INT -> ID ^($x $y $z);\n"+
1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "ID : 'a'..'z'+ ;\n" +
1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "INT : '0'..'9'+;\n" +
1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
1048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String treeGrammar =
1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "tree grammar TP;\n"+
1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "s : ID c=. -> $c\n" +
1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "  ;\n";
1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                      treeGrammar, "TP", "TLexer", "a", "s", "abc 1 2 3");
1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals("(1 2 3)\n", found);
1058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testWildcardListLabel() throws Exception {
1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String grammar =
1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "grammar T;\n" +
1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST;}\n" +
1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a : INT INT INT ;\n"+
1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "ID : 'a'..'z'+ ;\n" +
1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "INT : '0'..'9'+;\n" +
1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String treeGrammar =
1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "tree grammar TP;\n"+
1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "s : (c+=.)+ -> $c+\n" +
1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "  ;\n";
1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                      treeGrammar, "TP", "TLexer", "a", "s", "1 2 3");
1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals("1 2 3\n", found);
1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    @Test public void testWildcardListLabel2() throws Exception {
1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String grammar =
1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "grammar T;\n" +
1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST; ASTLabelType=CommonTree;}\n" +
1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "a  : x=INT y=INT z=INT -> ^($x ^($y $z) ^($y $z));\n"+
1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "ID : 'a'..'z'+ ;\n" +
1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "INT : '0'..'9'+;\n" +
1087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String treeGrammar =
1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "tree grammar TP;\n"+
1091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" +
1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "s : ^(INT (c+=.)+) -> $c+\n" +
1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            "  ;\n";
1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
1096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                                      treeGrammar, "TP", "TLexer", "a", "s", "1 2 3");
1097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        assertEquals("(2 3) (2 3)\n", found);
1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
1099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRuleResultAsRoot() throws Exception {
1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n" +
1103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" +
1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID '=' INT -> ^('=' ID INT);\n" +
1105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'..'z'+ ;\n" +
1106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"INT : '0'..'9'+;\n" +
1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"COLON : ':' ;\n" +
1108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;\n";
1109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String treeGrammar =
1111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar TP;\n"+
1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST; rewrite=true; ASTLabelType=CommonTree; tokenVocab=T;}\n" +
1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ^(eq e1=ID e2=.) -> ^(eq $e2 $e1) ;\n" +
1114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"eq : '=' | ':' {;} ;\n";  // bug in set match, doesn't add to tree!! booh. force nonset.
1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execTreeParser("T.g", grammar, "TParser", "TP.g",
1117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver									  treeGrammar, "TP", "TLexer", "a", "a", "abc = 34");
1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("(= 34 abc)\n", found);
1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
1122