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.grammar.v3.ANTLRParser;
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.grammar.v3.ActionTranslator;
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.runtime.CommonToken;
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.stringtemplate.v4.ST;
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.stringtemplate.v4.STGroup;
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.tool.*;
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.junit.Test;
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.io.StringReader;
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.util.ArrayList;
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.util.List;
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Check the $x, $x.y attributes.  For checking the actual
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  translation, assume the Java target.  This is still a great test
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver *  for the semantics of the $x.y stuff regardless of the target.
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic class TestAttributes extends BaseTest {
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/** Public default constructor used by TestRig */
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public TestAttributes() {
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testEscapedLessThanInAction() throws Exception {
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar();
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "i<3; '<xmltag>'";
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),0);
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = action;
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rawTranslation =
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			translator.translate();
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		STGroup templates =
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new STGroup();
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST actionST = new ST(templates, "<action>");
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		actionST.add("action", rawTranslation);
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = actionST.render();
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testEscaped$InAction() throws Exception {
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "int \\$n; \"\\$in string\\$\"";
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "int $n; \"$in string$\"";
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"@members {"+action+"}\n"+
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a[User u, int i]\n" +
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        : {"+action+"}\n" +
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        ;");
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator =
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ActionTranslator(generator,
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a",
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),0);
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();		assertEquals(expecting, found);
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testArguments() throws Exception {
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$i; $i.x; $u; $u.x";
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "i; i.x; u; u.x";
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a[User u, int i]\n" +
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        : {"+action+"}\n" +
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        ;");
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();		assertEquals(expecting, found);
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testComplicatedArgParsing() throws Exception {
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "x, (*a).foo(21,33), 3.2+1, '\\n', "+
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"\"a,oo\\nick\", {bl, \"fdkj\"eck}";
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "x, (*a).foo(21,33), 3.2+1, '\\n', \"a,oo\\nick\", {bl, \"fdkj\"eck}";
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// now check in actual grammar.
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a[User u, int i]\n" +
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        : A a["+action+"] B\n" +
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        ;");
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rawTranslation =	translator.translate();
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, rawTranslation);
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testBracketArgParsing() throws Exception {
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// now check in actual grammar.
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a[String[\\] ick, int i]\n" +
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        : A \n"+
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        ;");
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Rule r = g.getRule("a");
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		AttributeScope parameters = r.parameterScope;
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		List<Attribute> attrs = parameters.getAttributes();
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("attribute mismatch","String[] ick",attrs.get(0).decl.toString());
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("parameter name mismatch","ick",attrs.get(0).name);
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("declarator mismatch", "String[]", attrs.get(0).type);
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("attribute mismatch","int i",attrs.get(1).decl.toString());
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("parameter name mismatch","i",attrs.get(1).name);
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("declarator mismatch", "int", attrs.get(1).type);
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testStringArgParsing() throws Exception {
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "34, '{', \"it's<\", '\"', \"\\\"\", 19";
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "34, '{', \"it's<\", '\"', \"\\\"\", 19";
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// now check in actual grammar.
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a[User u, int i]\n" +
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        : A a["+action+"] B\n" +
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        ;");
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rawTranslation =	translator.translate();
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, rawTranslation);
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		List<String> expectArgs = new ArrayList<String>() {
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{add("34");}
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{add("'{'");}
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{add("\"it's<\"");}
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{add("'\"'");}
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{add("\"\\\"\"");} // that's "\""
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			{add("19");}
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		};
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		List<String> actualArgs = CodeGenerator.getListOfArgumentsFromAction(action, ',');
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("args mismatch", expectArgs, actualArgs);
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testComplicatedSingleArgParsing() throws Exception {
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "(*a).foo(21,33,\",\")";
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "(*a).foo(21,33,\",\")";
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// now check in actual grammar.
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a[User u, int i]\n" +
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        : A a["+action+"] B\n" +
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        ;");
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rawTranslation =	translator.translate();
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, rawTranslation);
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testArgWithLT() throws Exception {
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "34<50";
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "34<50";
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// now check in actual grammar.
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a[boolean b]\n" +
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        : A a["+action+"] B\n" +
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        ;");
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rawTranslation =
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			translator.translate();
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, rawTranslation);
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testGenericsAsArgumentDefinition() throws Exception {
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$foo.get(\"ick\");";
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "foo.get(\"ick\");";
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar T;\n"+
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a[HashMap<String,String> foo]\n" +
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        : {"+action+"}\n" +
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        ;";
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(grammar);
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Rule ra = g.getRule("a");
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		List<Attribute> attrs = ra.parameterScope.getAttributes();
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("attribute mismatch","HashMap<String,String> foo",attrs.get(0).decl.toString());
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("parameter name mismatch","foo",attrs.get(0).name);
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("declarator mismatch", "HashMap<String,String>", attrs.get(0).type);
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();		assertEquals(expecting, found);
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testGenericsAsArgumentDefinition2() throws Exception {
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$foo.get(\"ick\"); x=3;";
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "foo.get(\"ick\"); x=3;";
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar T;\n"+
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a[HashMap<String,String> foo, int x, List<String> duh]\n" +
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        : {"+action+"}\n" +
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        ;";
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(grammar);
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Rule ra = g.getRule("a");
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		List<Attribute> attrs = ra.parameterScope.getAttributes();
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("attribute mismatch","HashMap<String,String> foo",attrs.get(0).decl.toString().trim());
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("parameter name mismatch","foo",attrs.get(0).name);
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("declarator mismatch", "HashMap<String,String>", attrs.get(0).type);
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("attribute mismatch","int x",attrs.get(1).decl.toString().trim());
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("parameter name mismatch","x",attrs.get(1).name);
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("declarator mismatch", "int", attrs.get(1).type);
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("attribute mismatch","List<String> duh",attrs.get(2).decl.toString().trim());
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("parameter name mismatch","duh",attrs.get(2).name);
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("declarator mismatch", "List<String>", attrs.get(2).type);
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();		assertEquals(expecting, found);
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testGenericsAsReturnValue() throws Exception {
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar T;\n"+
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a returns [HashMap<String,String> foo] : ;\n";
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(grammar);
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Rule ra = g.getRule("a");
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		List<Attribute> attrs = ra.returnScope.getAttributes();
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("attribute mismatch","HashMap<String,String> foo",attrs.get(0).decl.toString());
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("parameter name mismatch","foo",attrs.get(0).name);
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("declarator mismatch", "HashMap<String,String>", attrs.get(0).type);
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testComplicatedArgParsingWithTranslation() throws Exception {
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "x, $A.text+\"3242\", (*$A).foo(21,33), 3.2+1, '\\n', "+
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"\"a,oo\\nick\", {bl, \"fdkj\"eck}";
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "x, (A1!=null?A1.getText():null)+\"3242\", (*A1).foo(21,33), 3.2+1, '\\n', \"a,oo\\nick\", {bl, \"fdkj\"eck}";
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// now check in actual grammar.
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a[User u, int i]\n" +
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        : A a["+action+"] B\n" +
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        ;");
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();		assertEquals(expecting, found);
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/** $x.start refs are checked during translation not before so ANTLR misses
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 the fact that rule r has refs to predefined attributes if the ref is after
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 the def of the method or self-referential.  Actually would be ok if I didn't
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 convert actions to strings; keep as templates.
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 June 9, 2006: made action translation leave templates not strings
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	 */
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRefToReturnValueBeforeRefToPredefinedAttr() throws Exception {
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$x.foo";
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "(x!=null?x.foo:0)";
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : x=b {"+action+"} ;\n" +
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b returns [int foo] : B {$b.start} ;\n");
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRuleLabelBeforeRefToPredefinedAttr() throws Exception {
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// As of Mar 2007, I'm removing unused labels.  Unfortunately,
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// the action is not seen until code gen.  Can't see $x.text
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// before stripping unused labels.  We really need to translate
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// actions first so code gen logic can use info.
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$x.text";
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "(x!=null?input.toString(x.start,x.stop):null)";
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : x=b {###"+action+"!!!} ;\n" +
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : B ;\n");
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // codegen phase sets some vars we need
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST codeST = generator.getRecognizerST();
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String code = codeST.render();
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = code.substring(code.indexOf("###")+3,code.indexOf("!!!"));
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testInvalidArguments() throws Exception {
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$x";
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = action;
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a[User u, int i]\n" +
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        : {"+action+"}\n" +
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        ;");
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a",
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_UNKNOWN_SIMPLE_ATTRIBUTE;
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "x";
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testReturnValue() throws Exception {
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$x.i";
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "x";
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a returns [int i]\n" +
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        : 'a'\n" +
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        ;\n" +
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : x=a {"+action+"} ;\n");
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator =
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ActionTranslator(generator,
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b",
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),1);
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found =	translator.translate();
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testActionNotMovedToSynPred() throws Exception {
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$b = true;";
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "retval.b = true;";
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {output=AST;}\n" + // push b into retval struct
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a returns [boolean b]\n" +
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options {backtrack=true;}\n" +
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"   : 'a' {"+action+"}\n" +
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"   | 'a'\n" +
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"   ;\n");
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator =
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ActionTranslator(generator,
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a",
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),1);
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found =	translator.translate();
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testReturnValueWithNumber() throws Exception {
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$x.i1";
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "x";
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a returns [int i1]\n" +
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        : 'a'\n" +
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        ;\n" +
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : x=a {"+action+"} ;\n");
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator =
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ActionTranslator(generator,
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b",
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),1);
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testReturnValues() throws Exception {
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$i; $i.x; $u; $u.x";
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "retval.i; retval.i.x; retval.u; retval.u.x";
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a returns [User u, int i]\n" +
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        : {"+action+"}\n" +
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        ;");
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/* regression test for ANTLR-46 */
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testReturnWithMultipleRuleRefs() throws Exception {
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action1 = "$obj = $rule2.obj;";
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action2 = "$obj = $rule3.obj;";
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting1 = "obj = rule21;";
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting2 = "obj = rule32;";
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n" +
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"rule1 returns [ Object obj ]\n" +
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				":	rule2 { "+action1+" }\n" +
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"|	rule3 { "+action2+" }\n" +
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				";\n"+
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"rule2 returns [ Object obj ]\n"+
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				":	foo='foo' { $obj = $foo.text; }\n"+
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				";\n"+
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"rule3 returns [ Object obj ]\n"+
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				":	bar='bar' { $obj = $bar.text; }\n"+
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				";");
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int i = 0;
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = action1;
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = expecting1;
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		do {
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ActionTranslator translator = new ActionTranslator(generator,"rule1",
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),i+1);
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			String found = translator.translate();
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(expecting, found);
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			action = action2;
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			expecting = expecting2;
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		} while (i++ < 1);
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testInvalidReturnValues() throws Exception {
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$x";
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = action;
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a returns [User u, int i]\n" +
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        : {"+action+"}\n" +
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"        ;");
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_UNKNOWN_SIMPLE_ATTRIBUTE;
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "x";
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testTokenLabels() throws Exception {
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$id; $f; $id.text; $id.getText(); $id.dork " +
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"$id.type; $id.line; $id.pos; " +
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"$id.channel; $id.index;";
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "id; f; (id!=null?id.getText():null); id.getText(); id.dork (id!=null?id.getType():0); (id!=null?id.getLine():0); (id!=null?id.getCharPositionInLine():0); (id!=null?id.getChannel():0); (id!=null?id.getTokenIndex():0);";
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : id=ID f=FLOAT {"+action+"}\n" +
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;");
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRuleLabels() throws Exception {
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$r.x; $r.start;\n $r.stop;\n $r.tree; $a.x; $a.stop;";
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "(r!=null?r.x:0); (r!=null?((Token)r.start):null);" + newline +
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"             (r!=null?((Token)r.stop):null);" + newline +
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"             (r!=null?((Object)r.tree):null); (r!=null?r.x:0); (r!=null?((Token)r.stop):null);";
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a returns [int x]\n" +
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  :\n" +
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n"+
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : r=a {###"+action+"!!!}\n" +
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;");
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // codegen phase sets some vars we need
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST codeST = generator.getRecognizerST();
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String code = codeST.render();
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = code.substring(code.indexOf("###")+3,code.indexOf("!!!"));
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testAmbiguRuleRef() throws Exception {
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : A a {$a.text} | B ;");
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// error(132): <string>:2:9: reference $a is ambiguous; rule a is enclosing rule and referenced in the production
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 1, equeue.errors.size());
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRuleLabelsWithSpecialToken() throws Exception {
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$r.x; $r.start; $r.stop; $r.tree; $a.x; $a.stop;";
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "(r!=null?r.x:0); (r!=null?((MYTOKEN)r.start):null); (r!=null?((MYTOKEN)r.stop):null); (r!=null?((Object)r.tree):null); (r!=null?r.x:0); (r!=null?((MYTOKEN)r.stop):null);";
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"options {TokenLabelType=MYTOKEN;}\n"+
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a returns [int x]\n" +
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  :\n" +
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n"+
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : r=a {###"+action+"!!!}\n" +
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;");
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // codegen phase sets some vars we need
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST codeST = generator.getRecognizerST();
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String code = codeST.render();
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = code.substring(code.indexOf("###")+3,code.indexOf("!!!"));
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testForwardRefRuleLabels() throws Exception {
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$r.x; $r.start; $r.stop; $r.tree; $a.x; $a.tree;";
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "(r!=null?r.x:0); (r!=null?((Token)r.start):null); (r!=null?((Token)r.stop):null); (r!=null?((Object)r.tree):null); (r!=null?r.x:0); (r!=null?((Object)r.tree):null);";
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : r=a {###"+action+"!!!}\n" +
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n" +
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a returns [int x]\n" +
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  : ;\n");
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // codegen phase sets some vars we need
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST codeST = generator.getRecognizerST();
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String code = codeST.render();
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = code.substring(code.indexOf("###")+3,code.indexOf("!!!"));
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testInvalidRuleLabelAccessesParameter() throws Exception {
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$r.z";
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = action;
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a[int z] returns [int x]\n" +
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  :\n" +
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n"+
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : r=a[3] {"+action+"}\n" +
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;");
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator, "b",
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();		assertEquals(expecting, found);
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_INVALID_RULE_PARAMETER_REF;
752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "a";
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = "z";
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testInvalidRuleLabelAccessesScopeAttribute() throws Exception {
760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$r.n";
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = action;
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a\n" +
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope { int n; }\n" +
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  :\n" +
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n"+
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : r=a[3] {"+action+"}\n" +
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;");
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator, "b",
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_INVALID_RULE_SCOPE_ATTRIBUTE_REF;
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "a";
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = "n";
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testInvalidRuleAttribute() throws Exception {
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$r.blort";
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = action;
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a[int z] returns [int x]\n" +
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  :\n" +
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n"+
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : r=a[3] {"+action+"}\n" +
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;");
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator, "b",
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_UNKNOWN_RULE_ATTRIBUTE;
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "a";
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = "blort";
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testMissingRuleAttribute() throws Exception {
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$r";
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = action;
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a[int z] returns [int x]\n" +
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  :\n" +
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n"+
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : r=a[3] {"+action+"}\n" +
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;");
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator, "b",
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rawTranslation =
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			translator.translate();
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_ISOLATED_RULE_SCOPE;
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "r";
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = null;
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testMissingUnlabeledRuleAttribute() throws Exception {
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$a";
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = action;
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a returns [int x]:\n" +
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n"+
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : a {"+action+"}\n" +
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;");
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator, "b",
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rawTranslation =
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			translator.translate();
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_ISOLATED_RULE_SCOPE;
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "a";
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testNonDynamicAttributeOutsideRule() throws Exception {
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "public void foo() { $x; }";
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = action;
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"@members {'+action+'}\n" +
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : ;\n");
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			null,
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),0);
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();		assertEquals(expecting, found);
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_ATTRIBUTE_REF_NOT_IN_RULE;
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "x";
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testNonDynamicAttributeOutsideRule2() throws Exception {
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "public void foo() { $x.y; }";
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = action;
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"@members {'+action+'}\n" +
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : ;\n");
904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			null,
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),0);
909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_ATTRIBUTE_REF_NOT_IN_RULE;
913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "x";
914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = "y";
915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// D Y N A M I C A L L Y  S C O P E D  A T T R I B U T E S
921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testBasicGlobalScope() throws Exception {
923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$Symbols::names.add($id.text);";
924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "((Symbols_scope)Symbols_stack.peek()).names.add((id!=null?id.getText():null));";
925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope Symbols {\n" +
931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  int n;\n" +
932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  List names;\n" +
933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"}\n" +
934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a scope Symbols; : (id=ID ';' {"+action+"} )+\n" +
935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n" +
936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testUnknownGlobalScope() throws Exception {
950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$Symbols::names.add($id.text);";
951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a scope Symbols; : (id=ID ';' {"+action+"} )+\n" +
957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n" +
958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 2, equeue.errors.size());
967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_UNKNOWN_DYNAMIC_SCOPE;
969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "Symbols";
970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testIndexedGlobalScope() throws Exception {
976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$Symbols[-1]::names.add($id.text);";
977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting =
978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"((Symbols_scope)Symbols_stack.elementAt(Symbols_stack.size()-1-1)).names.add((id!=null?id.getText():null));";
979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope Symbols {\n" +
985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  int n;\n" +
986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  List names;\n" +
987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"}\n" +
988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a scope Symbols; : (id=ID ';' {"+action+"} )+\n" +
989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n" +
990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void test0IndexedGlobalScope() throws Exception {
1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$Symbols[0]::names.add($id.text);";
1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting =
1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"((Symbols_scope)Symbols_stack.elementAt(0)).names.add((id!=null?id.getText():null));";
1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope Symbols {\n" +
1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  int n;\n" +
1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  List names;\n" +
1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"}\n" +
1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a scope Symbols; : (id=ID ';' {"+action+"} )+\n" +
1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n" +
1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testAbsoluteIndexedGlobalScope() throws Exception {
1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$Symbols[3]::names.add($id.text);";
1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting =
1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"((Symbols_scope)Symbols_stack.elementAt(3)).names.add((id!=null?id.getText():null));";
1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope Symbols {\n" +
1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  int n;\n" +
1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  List names;\n" +
1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"}\n" +
1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a scope Symbols; : (id=ID ';' {"+action+"} )+\n" +
1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n" +
1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testScopeAndAttributeWithUnderscore() throws Exception {
1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$foo_bar::a_b;";
1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "((foo_bar_scope)foo_bar_stack.peek()).a_b;";
1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope foo_bar {\n" +
1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  int a_b;\n" +
1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"}\n" +
1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a scope foo_bar; : (ID {"+action+"} )+\n" +
1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n" +
1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testSharedGlobalScope() throws Exception {
1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$Symbols::x;";
1087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "((Symbols_scope)Symbols_stack.peek()).x;";
1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope Symbols {\n" +
1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  String x;\n" +
1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"}\n" +
1096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a\n"+
1097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope { int y; }\n"+
1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope Symbols;\n" +
1099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				" : b {"+action+"}\n" +
1100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				" ;\n" +
1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : ID {$Symbols::x=$ID.text} ;\n" +
1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
1103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
1108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
1109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testGlobalScopeOutsideRule() throws Exception {
1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "public void foo() {$Symbols::names.add('foo');}";
1117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "public void foo() {((Symbols_scope)Symbols_stack.peek()).names.add('foo');}";
1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope Symbols {\n" +
1124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  int n;\n" +
1125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  List names;\n" +
1126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"}\n" +
1127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"@members {'+action+'}\n" +
1128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : \n" +
1129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
1135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
1136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
1137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRuleScopeOutsideRule() throws Exception {
1143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "public void foo() {$a::name;}";
1144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "public void foo() {((a_scope)a_stack.peek()).name;}";
1145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"@members {"+action+"}\n" +
1151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a\n" +
1152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope { String name; }\n" +
1153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  : {foo();}\n" +
1154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,
1160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			null,
1161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),0);
1162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();		assertEquals(expecting, found);
1163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testBasicRuleScope() throws Exception {
1168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$a::n;";
1169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "((a_scope)a_stack.peek()).n;";
1170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a\n" +
1176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope {\n" +
1177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  int n;\n" +
1178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"} : {"+action+"}\n" +
1179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
1185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
1186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
1187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testUnqualifiedRuleScopeAccessInsideRule() throws Exception {
1193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$n;";
1194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = action;
1195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a\n" +
1201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope {\n" +
1202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  int n;\n" +
1203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"} : {"+action+"}\n" +
1204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_ISOLATED_RULE_ATTRIBUTE;
1211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "n";
1212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = null;
1213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
1214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg,
1215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				expectedArg2);
1216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
1217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testIsolatedDynamicRuleScopeRef() throws Exception {
1220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$a;"; // refers to stack not top of stack
1221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "a_stack;";
1222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a\n" +
1228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope {\n" +
1229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  int n;\n" +
1230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"} : b ;\n" +
1231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : {"+action+"}\n" +
1232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator, "b",
1238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
1239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
1240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testDynamicRuleScopeRefInSubrule() throws Exception {
1246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$a::n;";
1247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "((a_scope)a_stack.peek()).n;";
1248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a\n" +
1254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope {\n" +
1255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  float n;\n" +
1256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"} : b ;\n" +
1257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : {"+action+"}\n" +
1258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator, "b",
1264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
1265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
1266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testIsolatedGlobalScopeRef() throws Exception {
1272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$Symbols;";
1273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "Symbols_stack;";
1274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope Symbols {\n" +
1280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  String x;\n" +
1281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"}\n" +
1282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a\n"+
1283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope { int y; }\n"+
1284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope Symbols;\n" +
1285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				" : b {"+action+"}\n" +
1286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				" ;\n" +
1287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : ID {$Symbols::x=$ID.text} ;\n" +
1288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
1289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
1294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
1295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
1296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRuleScopeFromAnotherRule() throws Exception {
1302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$a::n;"; // must be qualified
1303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "((a_scope)a_stack.peek()).n;";
1304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a\n" +
1310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope {\n" +
1311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  boolean n;\n" +
1312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"} : b\n" +
1313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n" +
1314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : {"+action+"}\n" +
1315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator, "b",
1321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
1322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
1323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testFullyQualifiedRefToCurrentRuleParameter() throws Exception {
1329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$a.i;";
1330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "i;";
1331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a[int i]: {"+action+"}\n" +
1337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
1343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
1344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();		assertEquals(expecting, found);
1345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testFullyQualifiedRefToCurrentRuleRetVal() throws Exception {
1350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$a.i;";
1351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "retval.i;";
1352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a returns [int i, int j]: {"+action+"}\n" +
1358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
1364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
1365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
1366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testSetFullyQualifiedRefToCurrentRuleRetVal() throws Exception {
1372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$a.i = 1;";
1373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "retval.i = 1;";
1374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a returns [int i, int j]: {"+action+"}\n" +
1380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
1386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
1387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
1388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testIsolatedRefToCurrentRule() throws Exception {
1394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$a;";
1395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "";
1396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : 'a' {"+action+"}\n" +
1402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_ISOLATED_RULE_SCOPE;
1409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "a";
1410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = null;
1411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
1412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg,
1413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				expectedArg2);
1414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
1415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testIsolatedRefToRule() throws Exception {
1418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$x;";
1419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : x=b {"+action+"}\n" +
1425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n" +
1426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : 'b' ;\n");
1427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_ISOLATED_RULE_SCOPE;
1433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "x";
1434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
1435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
1436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
1437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/*  I think these have to be errors $a.x makes no sense.
1440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testFullyQualifiedRefToLabelInCurrentRule() throws Exception {
1441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			String action = "$a.x;";
1442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			String expecting = "x;";
1443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ErrorQueue equeue = new ErrorQueue();
1445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ErrorManager.setErrorListener(equeue);
1446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Grammar g = new Grammar(
1447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"grammar t;\n"+
1448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					"a : x='a' {"+action+"}\n" +
1449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					"  ;\n");
1450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Tool antlr = newTool();
1451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			g.setCodeGenerator(generator);
1453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			generator.genRecognizer(); // forces load of templates
1454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ActionTranslator translator = new ActionTranslator(generator,"a",
1455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver															   new CommonToken(ANTLRParser.ACTION,action),1);
1456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			String rawTranslation =
1457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				translator.translate();
1458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			STGroup templates =
1459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new STGroup();
1460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ST actionST = new ST(templates, rawTranslation);
1461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			String found = actionST.render();
1462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(expecting, found);
1463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
1466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testFullyQualifiedRefToListLabelInCurrentRule() throws Exception {
1468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$a.x;"; // must be qualified
1469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "list_x;";
1470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : x+='a' {"+action+"}\n" +
1476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
1482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver														   new CommonToken(ANTLRParser.ACTION,action),1);
1483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();		assertEquals(expecting, found);
1484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver*/
1488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testFullyQualifiedRefToTemplateAttributeInCurrentRule() throws Exception {
1489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$a.st;"; // can be qualified
1490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "retval.st;";
1491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n" +
1496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"options {output=template;}\n"+
1497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : (A->{$A.text}) {"+action+"}\n" +
1498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
1504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
1505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
1506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRuleRefWhenRuleHasScope() throws Exception {
1512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$b.start;";
1513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "(b1!=null?((Token)b1.start):null);";
1514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n" +
1519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : b {###"+action+"!!!} ;\n" +
1520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b\n" +
1521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope {\n" +
1522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  int n;\n" +
1523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"} : 'b' \n" +
1524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST codeST = generator.getRecognizerST();
1531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String code = codeST.render();
1532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = code.substring(code.indexOf("###")+3,code.indexOf("!!!"));
1533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testDynamicScopeRefOkEvenThoughRuleRefExists() throws Exception {
1539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$b::n;";
1540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "((b_scope)b_stack.peek()).n;";
1541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n" +
1546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"s : b ;\n"+
1547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b\n" +
1548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope {\n" +
1549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  int n;\n" +
1550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"} : '(' b ')' {"+action+"}\n" + // refers to current invocation's n
1551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator, "b",
1557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
1558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();		assertEquals(expecting, found);
1559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRefToTemplateAttributeForCurrentRule() throws Exception {
1564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$st=null;";
1565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "retval.st =null;";
1566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n" +
1571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"options {output=template;}\n"+
1572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : {"+action+"}\n" +
1573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
1579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
1580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();		assertEquals(expecting, found);
1581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRefToTextAttributeForCurrentRule() throws Exception {
1586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$text";
1587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "input.toString(retval.start,input.LT(-1))";
1588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n" +
1593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"options {output=template;}\n"+
1594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : {###"+action+"!!!}\n" +
1595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // codegen phase sets some vars we need
1600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST codeST = generator.getRecognizerST();
1601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String code = codeST.render();
1602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = code.substring(code.indexOf("###")+3,code.indexOf("!!!"));
1603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRefToStartAttributeForCurrentRule() throws Exception {
1609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$start;";
1610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "((Token)retval.start);";
1611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n" +
1616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : {###"+action+"!!!}\n" +
1617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
1623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
1624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST codeST = generator.getRecognizerST();
1625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String code = codeST.render();
1626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = code.substring(code.indexOf("###")+3,code.indexOf("!!!"));
1627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testTokenLabelFromMultipleAlts() throws Exception {
1633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$ID.text;"; // must be qualified
1634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action2 = "$INT.text;"; // must be qualified
1635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "(ID1!=null?ID1.getText():null);";
1636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting2 = "(INT2!=null?INT2.getText():null);";
1637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : ID {"+action+"}\n" +
1643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  | INT {"+action2+"}\n" +
1644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n" +
1645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n" +
1646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"INT : '0';\n");
1647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
1652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
1653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();		assertEquals(expecting, found);
1654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		translator = new ActionTranslator(generator,
1657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a",
1658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action2),2);
1659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		found = translator.translate();
1660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting2, found);
1661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRuleLabelFromMultipleAlts() throws Exception {
1666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$b.text;"; // must be qualified
1667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action2 = "$c.text;"; // must be qualified
1668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "(b1!=null?input.toString(b1.start,b1.stop):null);";
1669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting2 = "(c2!=null?input.toString(c2.start,c2.stop):null);";
1670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : b {###"+action+"!!!}\n" +
1676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  | c {^^^"+action2+"&&&}\n" +
1677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n" +
1678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : 'a';\n" +
1679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"c : '0';\n");
1680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // codegen phase sets some vars we need
1684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST codeST = generator.getRecognizerST();
1685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String code = codeST.render();
1686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = code.substring(code.indexOf("###")+3,code.indexOf("!!!"));
1687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		found = code.substring(code.indexOf("^^^")+3,code.indexOf("&&&"));
1689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting2, found);
1690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testUnknownDynamicAttribute() throws Exception {
1695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$a::x";
1696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = action;
1697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a\n" +
1703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope {\n" +
1704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  int n;\n" +
1705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"} : {"+action+"}\n" +
1706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator =
1712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ActionTranslator(generator,
1713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a",
1714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),1);
1715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();		assertEquals(expecting, found);
1716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_UNKNOWN_DYNAMIC_SCOPE_ATTRIBUTE;
1718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "a";
1719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = "x";
1720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
1721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
1722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
1723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testUnknownGlobalDynamicAttribute() throws Exception {
1726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$Symbols::x";
1727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = action;
1728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope Symbols {\n" +
1734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  int n;\n" +
1735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"}\n" +
1736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : {'+action+'}\n" +
1737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator =
1743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ActionTranslator(generator,
1744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a",
1745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),1);
1746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();		assertEquals(expecting, found);
1747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_UNKNOWN_DYNAMIC_SCOPE_ATTRIBUTE;
1749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "Symbols";
1750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = "x";
1751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
1752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
1753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
1754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testUnqualifiedRuleScopeAttribute() throws Exception {
1757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$n;"; // must be qualified
1758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "$n;";
1759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a\n" +
1765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope {\n" +
1766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  int n;\n" +
1767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"} : b\n" +
1768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n" +
1769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : {'+action+'}\n" +
1770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
1771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator =
1774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ActionTranslator(generator,
1775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b",
1776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),1);
1777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();		assertEquals(expecting, found);
1778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_UNKNOWN_SIMPLE_ATTRIBUTE;
1780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "n";
1781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = null;
1782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
1783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
1784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
1785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRuleAndTokenLabelTypeMismatch() throws Exception {
1788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : id='foo' id=b\n" +
1793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n" +
1794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : ;\n");
1795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_LABEL_TYPE_CONFLICT;
1796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "id";
1797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = "rule!=token";
1798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
1799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
1800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
1801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testListAndTokenLabelTypeMismatch() throws Exception {
1804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : ids+='a' ids='b'\n" +
1809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n" +
1810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : ;\n");
1811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_LABEL_TYPE_CONFLICT;
1812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "ids";
1813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = "token!=token-list";
1814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
1815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
1816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
1817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testListAndRuleLabelTypeMismatch() throws Exception {
1820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n" +
1824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"options {output=AST;}\n"+
1825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : bs+=b bs=b\n" +
1826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n" +
1827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : 'b';\n");
1828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_LABEL_TYPE_CONFLICT;
1829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "bs";
1830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = "rule!=rule-list";
1831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
1832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
1833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
1834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testArgReturnValueMismatch() throws Exception {
1837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a[int i] returns [int x, int i]\n" +
1842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  : \n" +
1843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n" +
1844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : ;\n");
1845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_ARG_RETVAL_CONFLICT;
1846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "i";
1847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = "a";
1848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
1849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
1850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
1851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testSimplePlusEqualLabel() throws Exception {
1854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$ids.size();"; // must be qualified
1855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "list_ids.size();";
1856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
1861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : ids+=ID ( COMMA ids+=ID {"+action+"})* ;\n");
1862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator =
1867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ActionTranslator(generator,
1868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a",
1869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),1);
1870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
1871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testPlusEqualStringLabel() throws Exception {
1877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$ids.size();"; // must be qualified
1878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "list_ids.size();";
1879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : ids+='if' ( ',' ids+=ID {"+action+"})* ;" +
1885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
1886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator =
1891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ActionTranslator(generator,
1892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a",
1893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),1);
1894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
1895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testPlusEqualSetLabel() throws Exception {
1901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$ids.size();"; // must be qualified
1902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "list_ids.size();";
1903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : ids+=('a'|'b') ( ',' ids+=ID {"+action+"})* ;" +
1909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
1910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator =
1915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ActionTranslator(generator,
1916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a",
1917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),1);
1918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
1919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testPlusEqualWildcardLabel() throws Exception {
1925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$ids.size();"; // must be qualified
1926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "list_ids.size();";
1927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : ids+=. ( ',' ids+=ID {"+action+"})* ;" +
1933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
1934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator =
1937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ActionTranslator(generator,
1938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a",
1939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),1);
1940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
1943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testImplicitTokenLabel() throws Exception {
1949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$ID; $ID.text; $ID.getText()";
1950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "ID1; (ID1!=null?ID1.getText():null); ID1.getText()";
1951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : ID {"+action+"} ;" +
1957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
1958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
1960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator =
1963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ActionTranslator(generator,
1964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a",
1965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),1);
1966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
1968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
1969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testImplicitRuleLabel() throws Exception {
1975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$r.start;";
1976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "(r1!=null?((Token)r1.start):null);";
1977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
1979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
1980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
1981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
1982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : r {###"+action+"!!!} ;" +
1983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"r : 'a';\n");
1984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
1985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
1986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
1987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
1988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
1989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST codeST = generator.getRecognizerST();
1991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String code = codeST.render();
1992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = code.substring(code.indexOf("###")+3,code.indexOf("!!!"));
1993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
1994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
1996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
1997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
1998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testReuseExistingLabelWithImplicitRuleLabel() throws Exception {
1999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$r.start;";
2000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "(x!=null?((Token)x.start):null);";
2001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
2006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : x=r {###"+action+"!!!} ;" +
2007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"r : 'a';\n");
2008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
2010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
2013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST codeST = generator.getRecognizerST();
2015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String code = codeST.render();
2016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = code.substring(code.indexOf("###")+3,code.indexOf("!!!"));
2017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testReuseExistingListLabelWithImplicitRuleLabel() throws Exception {
2023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$r.start;";
2024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "(x!=null?((Token)x.start):null);";
2025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
2030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"options {output=AST;}\n" +
2031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : x+=r {###"+action+"!!!} ;" +
2032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"r : 'a';\n");
2033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
2035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
2038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST codeST = generator.getRecognizerST();
2040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String code = codeST.render();
2041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = code.substring(code.indexOf("###")+3,code.indexOf("!!!"));
2042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testReuseExistingLabelWithImplicitTokenLabel() throws Exception {
2048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$ID.text;";
2049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "(x!=null?x.getText():null);";
2050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
2055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : x=ID {"+action+"} ;" +
2056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
2057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
2059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
2062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
2064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
2065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
2066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testReuseExistingListLabelWithImplicitTokenLabel() throws Exception {
2072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$ID.text;";
2073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "(x!=null?x.getText():null);";
2074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
2079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : x+=ID {"+action+"} ;" +
2080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
2081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
2083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
2086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
2088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
2089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
2090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRuleLabelWithoutOutputOption() throws Exception {
2096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n"+
2100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"s : x+=a ;" +
2101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : 'a';\n"+
2102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : 'b';\n"+
2103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"WS : ' '|'\n';\n");
2104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
2106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
2109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_LIST_LABEL_INVALID_UNLESS_RETVAL_STRUCT;
2111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "x";
2112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = null;
2113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
2114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
2115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
2116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRuleLabelOnTwoDifferentRulesAST() throws Exception {
2119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
2120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n"+
2121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"options {output=AST;}\n"+
2122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"s : x+=a x+=b {System.out.println($x);} ;" +
2123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : 'a';\n"+
2124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : 'b';\n"+
2125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"WS : (' '|'\\n') {skip();};\n";
2126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "[a, b]\na b\n";
2127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execParser("T.g", grammar, "TParser", "TLexer",
2128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"s", "a b", false);
2129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRuleLabelOnTwoDifferentRulesTemplate() throws Exception {
2133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
2134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar T;\n"+
2135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"options {output=template;}\n"+
2136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"s : x+=a x+=b {System.out.println($x);} ;" +
2137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : 'a' -> {%{\"hi\"}} ;\n"+
2138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : 'b' -> {%{\"mom\"}} ;\n"+
2139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"WS : (' '|'\\n') {skip();};\n";
2140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "[hi, mom]\n";
2141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execParser("T.g", grammar, "TParser", "TLexer",
2142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"s", "a b", false);
2143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testMissingArgs() throws Exception {
2147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
2151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : r ;" +
2152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"r[int i] : 'a';\n");
2153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
2155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
2158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_MISSING_RULE_ARGS;
2160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "r";
2161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = null;
2162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
2163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
2164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
2165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testArgsWhenNoneDefined() throws Exception {
2168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
2172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : r[32,34] ;" +
2173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"r : 'a';\n");
2174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
2176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
2179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_RULE_HAS_NO_ARGS;
2181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "r";
2182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = null;
2183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
2184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
2185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
2186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testReturnInitValue() throws Exception {
2189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
2193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : r ;\n" +
2194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"r returns [int x=0] : 'a' {$x = 4;} ;\n");
2195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Rule r = g.getRule("r");
2198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		AttributeScope retScope = r.returnScope;
2199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		List parameters = retScope.getAttributes();
2200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertNotNull("missing return action", parameters);
2201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(1, parameters.size());
2202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = parameters.get(0).toString();
2203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "int x=0";
2204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testMultipleReturnInitValue() throws Exception {
2208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
2212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : r ;\n" +
2213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"r returns [int x=0, int y, String s=new String(\"foo\")] : 'a' {$x = 4;} ;\n");
2214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Rule r = g.getRule("r");
2217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		AttributeScope retScope = r.returnScope;
2218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		List parameters = retScope.getAttributes();
2219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertNotNull("missing return action", parameters);
2220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(3, parameters.size());
2221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("int x=0", parameters.get(0).toString());
2222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("int y", parameters.get(1).toString());
2223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("String s=new String(\"foo\")", parameters.get(2).toString());
2224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testCStyleReturnInitValue() throws Exception {
2227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
2231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : r ;\n" +
2232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"r returns [int (*x)()=NULL] : 'a' ;\n");
2233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Rule r = g.getRule("r");
2236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		AttributeScope retScope = r.returnScope;
2237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		List parameters = retScope.getAttributes();
2238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertNotNull("missing return action", parameters);
2239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(1, parameters.size());
2240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = parameters.get(0).toString();
2241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "int (*)() x=NULL";
2242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testArgsWithInitValues() throws Exception {
2246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
2250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : r[32,34] ;" +
2251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"r[int x, int y=3] : 'a';\n");
2252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
2254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
2257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_ARG_INIT_VALUES_ILLEGAL;
2259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "y";
2260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = null;
2261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
2262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
2263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
2264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testArgsOnToken() throws Exception {
2267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
2271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : ID[32,34] ;" +
2272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
2273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
2275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
2278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_ARGS_ON_TOKEN_REF;
2280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "ID";
2281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = null;
2282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
2283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
2284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
2285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testArgsOnTokenInLexer() throws Exception {
2288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"lexer grammar t;\n"+
2292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R : 'z' ID[32,34] ;" +
2293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
2294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
2296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
2299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_RULE_HAS_NO_ARGS;
2301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "ID";
2302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = null;
2303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
2304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
2305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
2306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testLabelOnRuleRefInLexer() throws Exception {
2309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$i.text";
2310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "(i!=null?i.getText():null)";
2311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"lexer grammar t;\n"+
2315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R : 'z' i=ID {"+action+"};" +
2316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"fragment ID : 'a';\n");
2317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
2321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator =
2322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ActionTranslator(generator,
2323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R",
2324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),1);
2325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
2326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRefToRuleRefInLexer() throws Exception {
2332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$ID.text";
2333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "(ID1!=null?ID1.getText():null)";
2334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"lexer grammar t;\n"+
2338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R : 'z' ID {"+action+"};" +
2339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
2340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
2344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator =
2345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ActionTranslator(generator,
2346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R",
2347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),1);
2348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
2349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRefToRuleRefInLexerNoAttribute() throws Exception {
2355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$ID";
2356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "ID1";
2357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"lexer grammar t;\n"+
2361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R : 'z' ID {"+action+"};" +
2362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
2363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
2367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator =
2368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ActionTranslator(generator,
2369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R",
2370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),1);
2371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
2372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testCharLabelInLexer() throws Exception {
2378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"lexer grammar t;\n"+
2382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R : x='z' ;\n");
2383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
2388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testCharListLabelInLexer() throws Exception {
2393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"lexer grammar t;\n"+
2397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R : x+='z' ;\n");
2398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
2403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testWildcardCharLabelInLexer() throws Exception {
2407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"lexer grammar t;\n"+
2411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R : x=. ;\n");
2412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
2417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testWildcardCharListLabelInLexer() throws Exception {
2421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"lexer grammar t;\n"+
2425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R : x+=. ;\n");
2426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
2431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testMissingArgsInLexer() throws Exception {
2435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"lexer grammar t;\n"+
2439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"A : R ;" +
2440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R[int i] : 'a';\n");
2441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
2443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
2446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_MISSING_RULE_ARGS;
2448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "R";
2449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = null;
2450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// getting a second error @1:12, probably from nextToken
2451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
2452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
2453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
2454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testLexerRulePropertyRefs() throws Exception {
2457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$text $type $line $pos $channel $index $start $stop";
2458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "getText() _type state.tokenStartLine state.tokenStartCharPositionInLine _channel -1 state.tokenStartCharIndex (getCharIndex()-1)";
2459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"lexer grammar t;\n"+
2463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R : 'r' {"+action+"};\n");
2464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
2468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator =
2469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ActionTranslator(generator,
2470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R",
2471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),1);
2472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
2473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testLexerLabelRefs() throws Exception {
2479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$a $b.text $c $d.text";
2480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "a (b!=null?b.getText():null) c (d!=null?d.getText():null)";
2481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"lexer grammar t;\n"+
2485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R : a='c' b='hi' c=. d=DUH {"+action+"};\n" +
2486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"DUH : 'd' ;\n");
2487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
2491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator =
2492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ActionTranslator(generator,
2493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R",
2494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),1);
2495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
2496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testSettingLexerRulePropertyRefs() throws Exception {
2502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$text $type=1 $line=1 $pos=1 $channel=1 $index";
2503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "getText() _type=1 state.tokenStartLine=1 state.tokenStartCharPositionInLine=1 _channel=1 -1";
2504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"lexer grammar t;\n"+
2508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R : 'r' {"+action+"};\n");
2509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
2513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator =
2514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ActionTranslator(generator,
2515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R",
2516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),1);
2517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
2518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testArgsOnTokenInLexerRuleOfCombined() throws Exception {
2524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
2528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : R;\n" +
2529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R : 'z' ID[32] ;\n" +
2530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
2531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String lexerGrammarStr = g.getLexerGrammar();
2533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		StringReader sr = new StringReader(lexerGrammarStr);
2534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar lexerGrammar = new Grammar();
2535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		lexerGrammar.setFileName("<internally-generated-lexer>");
2536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		lexerGrammar.importTokenVocabulary(g);
2537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		lexerGrammar.parseAndBuildAST(sr);
2538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		lexerGrammar.defineGrammarSymbols();
2539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		lexerGrammar.checkNameSpaceAndActions();
2540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		sr.close();
2541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
2544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, lexerGrammar, "Java");
2545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		lexerGrammar.setCodeGenerator(generator);
2546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
2547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_RULE_HAS_NO_ARGS;
2549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "ID";
2550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = null;
2551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
2552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, lexerGrammar, null, expectedArg, expectedArg2);
2553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
2554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testMissingArgsOnTokenInLexerRuleOfCombined() throws Exception {
2557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
2561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : R;\n" +
2562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"R : 'z' ID ;\n" +
2563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID[int i] : 'a';\n");
2564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String lexerGrammarStr = g.getLexerGrammar();
2566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		StringReader sr = new StringReader(lexerGrammarStr);
2567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar lexerGrammar = new Grammar();
2568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		lexerGrammar.setFileName("<internally-generated-lexer>");
2569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		lexerGrammar.importTokenVocabulary(g);
2570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		lexerGrammar.parseAndBuildAST(sr);
2571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		lexerGrammar.defineGrammarSymbols();
2572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		lexerGrammar.checkNameSpaceAndActions();
2573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		sr.close();
2574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
2577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, lexerGrammar, "Java");
2578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		lexerGrammar.setCodeGenerator(generator);
2579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
2580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_MISSING_RULE_ARGS;
2582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "ID";
2583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = null;
2584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
2585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, lexerGrammar, null, expectedArg, expectedArg2);
2586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
2587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// T R E E S
2590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testTokenLabelTreeProperty() throws Exception {
2592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$id.tree;";
2593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "id_tree;";
2594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
2599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : id=ID {"+action+"} ;\n" +
2600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
2601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
2604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator =
2606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new ActionTranslator(generator,
2607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a",
2608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				new CommonToken(ANTLRParser.ACTION,action),1);
2609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
2611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
2612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testTokenRefTreeProperty() throws Exception {
2618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$ID.tree;";
2619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "ID1_tree;";
2620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
2625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : ID {"+action+"} ;" +
2626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
2627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
2629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
2632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,"a",
2634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
2635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
2636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testAmbiguousTokenRef() throws Exception {
2640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$ID;";
2641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "";
2642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
2647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : ID ID {"+action+"};" +
2648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
2649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
2651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
2654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_NONUNIQUE_REF;
2656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "ID";
2657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
2658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
2659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
2660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testAmbiguousTokenRefWithProp() throws Exception {
2663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$ID.text;";
2664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "";
2665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
2670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : ID ID {"+action+"};" +
2671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
2672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
2674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
2677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_NONUNIQUE_REF;
2679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "ID";
2680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
2681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
2682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
2683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRuleRefWithDynamicScope() throws Exception {
2686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$field::x = $field.st;";
2687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "((field_scope)field_stack.peek()).x = retval.st;";
2688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar a;\n" +
2693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"field\n" +
2694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope { ST x; }\n" +
2695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    :   'y' {"+action+"}\n" +
2696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    ;\n");
2697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
2701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,
2702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"field",
2703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
2704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
2705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testAssignToOwnRulenameAttr() throws Exception {
2711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$rule.tree = null;";
2712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "retval.tree = null;";
2713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar a;\n" +
2717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"rule\n" +
2718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    : 'y' {" + action +"}\n" +
2719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    ;");
2720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
2724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,
2725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"rule",
2726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
2727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
2728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testAssignToOwnParamAttr() throws Exception {
2734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$rule.i = 42; $i = 23;";
2735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "i = 42; i = 23;";
2736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar a;\n" +
2740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"rule[int i]\n" +
2741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    : 'y' {" + action +"}\n" +
2742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    ;");
2743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
2747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,
2748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"rule",
2749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
2750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
2751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testIllegalAssignToOwnRulenameAttr() throws Exception {
2757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$rule.stop = 0;";
2758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar a;\n" +
2762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"rule\n" +
2763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    : 'y' {" + action +"}\n" +
2764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    ;");
2765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
2769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,
2770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"rule",
2771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
2772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rawTranslation =
2773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			translator.translate();
2774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_WRITE_TO_READONLY_ATTR;
2776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "rule";
2777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = "stop";
2778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
2779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
2780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
2781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testIllegalAssignToLocalAttr() throws Exception {
2784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$tree = null; $st = null; $start = 0; $stop = 0; $text = 0;";
2785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "retval.tree = null; retval.st = null;   ";
2786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar a;\n" +
2790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"rule\n" +
2791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    : 'y' {" + action +"}\n" +
2792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    ;");
2793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
2797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,
2798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"rule",
2799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
2800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rawTranslation =
2801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			translator.translate();
2802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_WRITE_TO_READONLY_ATTR;
2804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ArrayList expectedErrors = new ArrayList(3);
2805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
2806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, "start", "");
2807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		expectedErrors.add(expectedMessage);
2808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage2 =
2809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, "stop", "");
2810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		expectedErrors.add(expectedMessage2);
2811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage3 =
2812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, "text", "");
2813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		expectedErrors.add(expectedMessage3);
2814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkErrors(equeue, expectedErrors);
2815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		STGroup templates =
2817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new STGroup();
2818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST actionST = new ST(templates, rawTranslation);
2819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = actionST.render();
2820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testIllegalAssignRuleRefAttr() throws Exception {
2824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$other.tree = null;";
2825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar a;\n" +
2829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"options { output = AST;}" +
2830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"otherrule\n" +
2831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    : 'y' ;" +
2832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"rule\n" +
2833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    : other=otherrule {" + action +"}\n" +
2834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    ;");
2835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
2839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,
2840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"rule",
2841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
2842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rawTranslation =
2843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			translator.translate();
2844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_WRITE_TO_READONLY_ATTR;
2846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "other";
2847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = "tree";
2848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
2849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
2850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
2851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testIllegalAssignTokenRefAttr() throws Exception {
2854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$ID.text = \"test\";";
2855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar a;\n" +
2859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID\n" +
2860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    : 'y' ;" +
2861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"rule\n" +
2862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    : ID {" + action +"}\n" +
2863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    ;");
2864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
2868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,
2869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"rule",
2870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
2871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rawTranslation =
2872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			translator.translate();
2873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_WRITE_TO_READONLY_ATTR;
2875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "ID";
2876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = "text";
2877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
2878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
2879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
2880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testAssignToTreeNodeAttribute() throws Exception {
2883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$tree.scope = localScope;";
2884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "((Object)retval.tree).scope = localScope;";
2885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar a;\n" +
2889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"options { output=AST; }" +
2890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"rule\n" +
2891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"@init {\n" +
2892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"   Scope localScope=null;\n" +
2893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"}\n" +
2894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"@after {\n" +
2895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"   ###$tree.scope = localScope;!!!\n" +
2896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"}\n" +
2897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"   : 'a' -> ^('a')\n" +
2898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				";");
2899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // codegen phase sets some vars we need
2904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST codeST = generator.getRecognizerST();
2905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String code = codeST.render();
2906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = code.substring(code.indexOf("###")+3,code.indexOf("!!!"));
2907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testDoNotTranslateAttributeCompare() throws Exception {
2912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$a.line == $b.line";
2913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "(a!=null?a.getLine():0) == (b!=null?b.getLine():0)";
2914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"lexer grammar a;\n" +
2918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"RULE:\n" +
2919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"     a=ID b=ID {" + action + "}" +
2920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    ;\n" +
2921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'id';"
2922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		);
2923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
2927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,
2928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"RULE",
2929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
2930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
2931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testDoNotTranslateScopeAttributeCompare() throws Exception {
2936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "if ($rule::foo == \"foo\" || 1) { System.out.println(\"ouch\"); }";
2937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "if (((rule_scope)rule_stack.peek()).foo == \"foo\" || 1) { System.out.println(\"ouch\"); }";
2938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar a;\n" +
2942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"rule\n" +
2943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope {\n" +
2944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"   String foo;" +
2945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"} :\n" +
2946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"     twoIDs" +
2947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    ;\n" +
2948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"twoIDs:\n" +
2949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    ID ID {" + action + "}\n" +
2950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    ;\n" +
2951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'id';"
2952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		);
2953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
2956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer();
2957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator,
2958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"twoIDs",
2959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
2960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rawTranslation =
2961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			translator.translate();
2962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// check that we didn't use scopeSetAttributeRef int translation!
2963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		boolean foundScopeSetAttributeRef = false;
2964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		for (int i = 0; i < translator.chunks.size(); i++) {
2965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Object chunk = translator.chunks.get(i);
2966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if (chunk instanceof ST) {
2967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				if (((ST)chunk).getName().equals("/scopeSetAttributeRef")) {
2968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					foundScopeSetAttributeRef = true;
2969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				}
2970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
2971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
2972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertFalse("action translator used scopeSetAttributeRef template in comparison!", foundScopeSetAttributeRef);
2973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		STGroup templates =
2974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new STGroup();
2975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST actionST = new ST(templates, rawTranslation);
2976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = actionST.render();
2977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
2978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
2979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
2980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testTreeRuleStopAttributeIsInvalid() throws Exception {
2982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$r.x; $r.start; $r.stop";
2983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "(r!=null?r.x:0); (r!=null?((CommonTree)r.start):null); $r.stop";
2984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
2985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
2986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
2987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
2988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar t;\n" +
2989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"options {ASTLabelType=CommonTree;}\n"+
2990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a returns [int x]\n" +
2991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  :\n" +
2992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n"+
2993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : r=a {###"+action+"!!!}\n" +
2994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;");
2995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		System.out.println(g.toString());
2996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
2997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
2998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
2999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
3000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // codegen phase sets some vars we need
3001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST codeST = generator.getRecognizerST();
3002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String code = codeST.render();
3003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = code.substring(code.indexOf("###")+3,code.indexOf("!!!"));
3004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
3005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_UNKNOWN_RULE_ATTRIBUTE;
3007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "a";
3008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = "stop";
3009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
3010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
3011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		System.out.println("equeue:"+equeue);
3012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkError(equeue, expectedMessage);
3013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
3014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRefToTextAttributeForCurrentTreeRule() throws Exception {
3016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "$text";
3017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "input.getTokenStream().toString(" +
3018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"input.getTreeAdaptor().getTokenStartIndex(retval.start)," +
3019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"input.getTreeAdaptor().getTokenStopIndex(retval.start))";
3020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
3022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
3023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
3024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tree grammar t;\n" +
3025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"options {ASTLabelType=CommonTree;}\n" +
3026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : {###"+action+"!!!}\n" +
3027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
3028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
3030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		antlr.setOutputDirectory(null); // write to /dev/null
3031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
3032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
3033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // codegen phase sets some vars we need
3034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST codeST = generator.getRecognizerST();
3035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String code = codeST.render();
3036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = code.substring(code.indexOf("###")+3,code.indexOf("!!!"));
3037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
3038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
3040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
3041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testTypeOfGuardedAttributeRefIsCorrect() throws Exception {
3043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String action = "int x = $b::n;";
3044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expecting = "int x = ((b_scope)b_stack.peek()).n;";
3045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
3047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
3048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
3049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n" +
3050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"s : b ;\n"+
3051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b\n" +
3052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"scope {\n" +
3053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  int n;\n" +
3054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"} : '(' b ')' {"+action+"}\n" + // refers to current invocation's n
3055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
3056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
3057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
3058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
3059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		generator.genRecognizer(); // forces load of templates
3060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ActionTranslator translator = new ActionTranslator(generator, "b",
3061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new CommonToken(ANTLRParser.ACTION,action),1);
3062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = translator.translate();
3063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expecting, found);
3064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
3066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
3067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// S U P P O R T
3069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected void checkError(ErrorQueue equeue,
3071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							  GrammarSemanticsMessage expectedMessage)
3072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		throws Exception
3073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
3074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		/*
3075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		System.out.println(equeue.infos);
3076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		System.out.println(equeue.warnings);
3077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		System.out.println(equeue.errors);
3078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		*/
3079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Message foundMsg = null;
3080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		for (int i = 0; i < equeue.errors.size(); i++) {
3081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Message m = (Message)equeue.errors.get(i);
3082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if (m.msgID==expectedMessage.msgID ) {
3083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				foundMsg = m;
3084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
3085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
3086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertTrue("no error; "+expectedMessage.msgID+" expected", equeue.errors.size() > 0);
3087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertNotNull("couldn't find expected error: "+expectedMessage.msgID+" in "+equeue, foundMsg);
3088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertTrue("error is not a GrammarSemanticsMessage",
3089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			foundMsg instanceof GrammarSemanticsMessage);
3090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expectedMessage.arg, foundMsg.arg);
3091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expectedMessage.arg2, foundMsg.arg2);
3092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
3093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/** Allow checking for multiple errors in one test */
3095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected void checkErrors(ErrorQueue equeue,
3096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver							   ArrayList expectedMessages)
3097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		throws Exception
3098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
3099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ArrayList messageExpected = new ArrayList(equeue.errors.size());
3100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		for (int i = 0; i < equeue.errors.size(); i++) {
3101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			Message m = (Message)equeue.errors.get(i);
3102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			boolean foundMsg = false;
3103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			for (int j = 0; j < expectedMessages.size(); j++) {
3104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				Message em = (Message)expectedMessages.get(j);
3105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				if (m.msgID==em.msgID && m.arg.equals(em.arg) && m.arg2.equals(em.arg2)) {
3106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					foundMsg = true;
3107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				}
3108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
3109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if (foundMsg) {
3110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				messageExpected.add(i, Boolean.TRUE);
3111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			} else
3112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				messageExpected.add(i, Boolean.FALSE);
3113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
3114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		for (int i = 0; i < equeue.errors.size(); i++) {
3115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertTrue("unexpected error:" + equeue.errors.get(i), ((Boolean)messageExpected.get(i)).booleanValue());
3116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
3117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
3118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
3119