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.analysis.Label;
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.codegen.CodeGenerator;
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.stringtemplate.v4.ST;
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.tool.*;
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.junit.Test;
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.util.*;
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic class TestSymbolDefinitions extends BaseTest {
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	/** Public default constructor used by TestRig */
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	public TestSymbolDefinitions() {
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testParserSimpleTokens() throws Exception {
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"parser grammar t;\n"+
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : A | B;\n" +
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : C ;");
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rules = "a, b";
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String tokenNames = "A, B, C";
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkSymbols(g, rules, tokenNames);
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testParserTokensSection() throws Exception {
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"parser grammar t;\n" +
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"tokens {\n" +
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  C;\n" +
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  D;" +
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"}\n"+
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : A | B;\n" +
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : C ;");
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rules = "a, b";
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String tokenNames = "A, B, C, D";
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkSymbols(g, rules, tokenNames);
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testLexerTokensSection() throws Exception {
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"lexer grammar t;\n" +
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"tokens {\n" +
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  C;\n" +
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  D;" +
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"}\n"+
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"A : 'a';\n" +
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"C : 'c' ;");
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rules = "A, C, Tokens";
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String tokenNames = "A, C, D";
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkSymbols(g, rules, tokenNames);
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testTokensSectionWithAssignmentSection() throws Exception {
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"grammar t;\n" +
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"tokens {\n" +
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  C='c';\n" +
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  D;" +
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"}\n"+
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : A | B;\n" +
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : C ;");
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rules = "a, b";
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String tokenNames = "A, B, C, D, 'c'";
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkSymbols(g, rules, tokenNames);
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testCombinedGrammarLiterals() throws Exception {
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"grammar t;\n"+
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : 'begin' b 'end';\n" +
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : C ';' ;\n" +
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a' ;\n" +
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"FOO : 'foo' ;\n" +  // "foo" is not a token name
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"C : 'c' ;\n");        // nor is 'c'
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rules = "a, b";
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String tokenNames = "C, FOO, ID, 'begin', 'end', ';'";
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkSymbols(g, rules, tokenNames);
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testLiteralInParserAndLexer() throws Exception {
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// 'x' is token and char in lexer rule
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"grammar t;\n" +
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : 'x' E ; \n" +
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"E: 'x' '0' ;\n");        // nor is 'c'
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String literals = "['x']";
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String foundLiterals = g.getStringLiterals().toString();
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(literals, foundLiterals);
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String implicitLexer =
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"lexer grammar t;" + newline +
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"T__5 : 'x' ;" + newline +
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"" + newline +
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"// $ANTLR src \"<string>\" 3" + newline +
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"E: 'x' '0' ;";
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(implicitLexer, g.getLexerGrammar());
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testCombinedGrammarWithRefToLiteralButNoTokenIDRef() throws Exception {
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"grammar t;\n"+
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : 'a' ;\n" +
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"A : 'a' ;\n");
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rules = "a";
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String tokenNames = "A, 'a'";
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkSymbols(g, rules, tokenNames);
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testSetDoesNotMissTokenAliases() throws Exception {
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"grammar t;\n"+
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : 'a'|'b' ;\n" +
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"A : 'a' ;\n" +
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"B : 'b' ;\n");
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rules = "a";
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String tokenNames = "A, 'a', B, 'b'";
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkSymbols(g, rules, tokenNames);
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testSimplePlusEqualLabel() throws Exception {
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"parser grammar t;\n"+
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : ids+=ID ( COMMA ids+=ID )* ;\n");
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rule = "a";
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String tokenLabels = "ids";
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String ruleLabels = null;
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkPlusEqualsLabels(g, rule, tokenLabels, ruleLabels);
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testMixedPlusEqualLabel() throws Exception {
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"grammar t;\n"+
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"options {output=AST;}\n" +
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : id+=ID ( ',' e+=expr )* ;\n" +
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"expr : 'e';\n" +
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String rule = "a";
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String tokenLabels = "id";
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String ruleLabels = "e";
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkPlusEqualsLabels(g, rule, tokenLabels, ruleLabels);
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// T E S T  L I T E R A L  E S C A P E S
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testParserCharLiteralWithEscape() throws Exception {
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"grammar t;\n"+
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : '\\n';\n");
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Set literals = g.getStringLiterals();
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// must store literals how they appear in the antlr grammar
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("'\\n'", literals.toArray()[0]);
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testTokenInTokensSectionAndTokenRuleDef() throws Exception {
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// this must return A not I to the parser; calling a nonfragment rule
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// from a nonfragment rule does not set the overall token.
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar P;\n" +
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tokens { B='}'; }\n"+
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : A B {System.out.println(input);} ;\n"+
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"A : 'a' ;\n" +
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"B : '}' ;\n"+
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;";
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execParser("P.g", grammar, "PParser", "PLexer",
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								  "a", "a}", false);
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("a}\n", found);
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testTokenInTokensSectionAndTokenRuleDef2() throws Exception {
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// this must return A not I to the parser; calling a nonfragment rule
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// from a nonfragment rule does not set the overall token.
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammar =
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar P;\n" +
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tokens { B='}'; }\n"+
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : A '}' {System.out.println(input);} ;\n"+
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"A : 'a' ;\n" +
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"B : '}' {/* */} ;\n"+
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"WS : (' '|'\\n') {$channel=HIDDEN;} ;";
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String found = execParser("P.g", grammar, "PParser", "PLexer",
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								  "a", "a}", false);
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("a}\n", found);
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRefToRuleWithNoReturnValue() throws Exception {
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String grammarStr =
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar P;\n" +
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : x=b ;\n" +
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"b : B ;\n" +
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"B : 'b' ;\n";
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(grammarStr);
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CodeGenerator generator = new CodeGenerator(antlr, g, "Java");
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.setCodeGenerator(generator);
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ST recogST = generator.genRecognizer();
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String code = recogST.render();
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertTrue("not expecting label", code.indexOf("x=b();")<0);
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	// T E S T  E R R O R S
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testParserStringLiterals() throws Exception {
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"parser grammar t;\n"+
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : 'begin' b ;\n" +
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : C ;");
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "'begin'";
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_LITERAL_NOT_ASSOCIATED_WITH_LEXER_RULE;
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testParserCharLiterals() throws Exception {
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"parser grammar t;\n"+
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : '(' b ;\n" +
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : C ;");
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "'('";
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_LITERAL_NOT_ASSOCIATED_WITH_LEXER_RULE;
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testEmptyNotChar() throws Exception {
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"grammar foo;\n" +
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : (~'x')+ ;\n");
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.buildNFA();
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "'x'";
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_EMPTY_COMPLEMENT;
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testEmptyNotToken() throws Exception {
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"grammar foo;\n" +
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : (~A)+ ;\n");
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.buildNFA();
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "A";
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_EMPTY_COMPLEMENT;
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testEmptyNotSet() throws Exception {
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"grammar foo;\n" +
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : (~(A|B))+ ;\n");
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.buildNFA();
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = null;
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_EMPTY_COMPLEMENT;
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testStringLiteralInParserTokensSection() throws Exception {
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"parser grammar t;\n" +
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"tokens {\n" +
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  B='begin';\n" +
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"}\n"+
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : A B;\n" +
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : C ;");
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "'begin'";
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_LITERAL_NOT_ASSOCIATED_WITH_LEXER_RULE;
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testCharLiteralInParserTokensSection() throws Exception {
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"parser grammar t;\n" +
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"tokens {\n" +
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  B='(';\n" +
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"}\n"+
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : A B;\n" +
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"b : C ;");
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "'('";
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_LITERAL_NOT_ASSOCIATED_WITH_LEXER_RULE;
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testCharLiteralInLexerTokensSection() throws Exception {
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"lexer grammar t;\n" +
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"tokens {\n" +
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  B='(';\n" +
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"}\n"+
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a';\n");
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "'('";
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_CANNOT_ALIAS_TOKENS_IN_LEXER;
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRuleRedefinition() throws Exception {
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"parser grammar t;\n"+
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : A | B;\n" +
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : C ;");
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "a";
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_RULE_REDEFINITION;
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testLexerRuleRedefinition() throws Exception {
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"lexer grammar t;\n"+
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a' ;\n" +
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'd' ;");
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "ID";
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_RULE_REDEFINITION;
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testCombinedRuleRedefinition() throws Exception {
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"grammar t;\n"+
393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"x : ID ;\n" +
394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"ID : 'a' ;\n" +
395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"x : ID ID ;");
396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "x";
398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_RULE_REDEFINITION;
399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testUndefinedToken() throws Exception {
405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"grammar t;\n"+
409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"x : ID ;");
410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "ID";
412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_NO_TOKEN_DEFINITION;
413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsWarning(equeue, expectedMessage);
416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testUndefinedTokenOkInParser() throws Exception {
419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"parser grammar t;\n"+
423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"x : ID ;");
424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("should not be an error", 0, equeue.errors.size());
425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testUndefinedRule() throws Exception {
428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"grammar t;\n"+
432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"x : r ;");
433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "r";
435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_UNDEFINED_RULE_REF;
436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testLexerRuleInParser() throws Exception {
442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"parser grammar t;\n"+
446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"X : ;");
447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "X";
449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_LEXER_RULES_NOT_ALLOWED;
450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testParserRuleInLexer() throws Exception {
456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"lexer grammar t;\n"+
460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : ;");
461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "a";
463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_PARSER_RULES_NOT_ALLOWED;
464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRuleScopeConflict() throws Exception {
470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"scope a {\n" +
475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  int n;\n" +
476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}\n" +
477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : \n" +
478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n");
479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "a";
481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_SYMBOL_CONFLICTS_WITH_GLOBAL_SCOPE;
482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testTokenRuleScopeConflict() throws Exception {
488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"scope ID {\n" +
493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  int n;\n" +
494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}\n" +
495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'\n" +
496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n");
497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "ID";
499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_SYMBOL_CONFLICTS_WITH_GLOBAL_SCOPE;
500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testTokenScopeConflict() throws Exception {
506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar t;\n"+
510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"tokens { ID; }\n"+
511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"scope ID {\n" +
512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  int n;\n" +
513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}\n" +
514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : \n" +
515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n");
516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "ID";
518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_SYMBOL_CONFLICTS_WITH_GLOBAL_SCOPE;
519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testTokenRuleScopeConflictInLexerGrammar() throws Exception {
525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"lexer grammar t;\n"+
529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"scope ID {\n" +
530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  int n;\n" +
531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}\n" +
532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"ID : 'a'\n" +
533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n");
534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "ID";
536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_SYMBOL_CONFLICTS_WITH_GLOBAL_SCOPE;
537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testTokenLabelScopeConflict() throws Exception {
543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"scope s {\n" +
548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  int n;\n" +
549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}\n" +
550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : s=ID \n" +
551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n");
552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "s";
554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_SYMBOL_CONFLICTS_WITH_GLOBAL_SCOPE;
555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRuleLabelScopeConflict() throws Exception {
561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"scope s {\n" +
566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  int n;\n" +
567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}\n" +
568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : s=b \n" +
569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n" +
570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"b : ;\n");
571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "s";
573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_SYMBOL_CONFLICTS_WITH_GLOBAL_SCOPE;
574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testLabelAndRuleNameConflict() throws Exception {
580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : c=b \n" +
585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n" +
586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"b : ;\n" +
587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"c : ;\n");
588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "c";
590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_LABEL_CONFLICTS_WITH_RULE;
591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testLabelAndTokenNameConflict() throws Exception {
597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a : ID=b \n" +
602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n" +
603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"b : ID ;\n" +
604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"c : ;\n");
605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "ID";
607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_LABEL_CONFLICTS_WITH_TOKEN;
608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testLabelAndArgConflict() throws Exception {
614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a[int i] returns [int x]: i=ID \n" +
619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n");
620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "i";
622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_LABEL_CONFLICTS_WITH_RULE_ARG_RETVAL;
623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testLabelAndParameterConflict() throws Exception {
629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a[int i] returns [int x]: x=ID \n" +
634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n");
635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "x";
637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_LABEL_CONFLICTS_WITH_RULE_ARG_RETVAL;
638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testLabelRuleScopeConflict() throws Exception {
644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a\n" +
649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"scope {" +
650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  int n;" +
651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}\n" +
652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  : n=ID\n" +
653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n");
654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "n";
656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = "a";
657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_LABEL_CONFLICTS_WITH_RULE_SCOPE_ATTRIBUTE;
658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRuleScopeArgConflict() throws Exception {
664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a[int n]\n" +
669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"scope {" +
670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  int n;" +
671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}\n" +
672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  : \n" +
673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n");
674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "n";
676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = "a";
677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_ATTRIBUTE_CONFLICTS_WITH_RULE_ARG_RETVAL;
678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRuleScopeReturnValueConflict() throws Exception {
684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a returns [int n]\n" +
689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"scope {" +
690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  int n;" +
691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}\n" +
692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  : \n" +
693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n");
694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "n";
696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = "a";
697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_ATTRIBUTE_CONFLICTS_WITH_RULE_ARG_RETVAL;
698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testRuleScopeRuleNameConflict() throws Exception {
704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"parser grammar t;\n"+
708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"a\n" +
709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"scope {" +
710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  int a;" +
711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"}\n" +
712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  : \n" +
713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"  ;\n");
714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "a";
716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg2 = null;
717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_ATTRIBUTE_CONFLICTS_WITH_RULE;
718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg, expectedArg2);
720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testBadGrammarOption() throws Exception {
724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool();
727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(antlr,
728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								"grammar t;\n"+
729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								"options {foo=3; language=Java;}\n" +
730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								"a : 'a';\n");
731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "foo";
733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_ILLEGAL_OPTION;
734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testBadRuleOption() throws Exception {
740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"grammar t;\n"+
744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a\n"+
745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"options {k=3; tokenVocab=blort;}\n" +
746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  : 'a';\n");
747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "tokenVocab";
749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_ILLEGAL_OPTION;
750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testBadSubRuleOption() throws Exception {
756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue); // unique listener per thread
758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(
759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"grammar t;\n"+
760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"a : ( options {k=3; language=Java;}\n" +
761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    : 'a'\n" +
762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    | 'b'\n" +
763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"    )\n" +
764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				"  ;\n");
765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Object expectedArg = "language";
766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int expectedMsgID = ErrorManager.MSG_ILLEGAL_OPTION;
767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		GrammarSemanticsMessage expectedMessage =
768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			new GrammarSemanticsMessage(expectedMsgID, g, null, expectedArg);
769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		checkGrammarSemanticsError(equeue, expectedMessage);
770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testTokenVocabStringUsedInLexer() throws Exception {
773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String tokens =
776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"';'=4\n";
777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        mkdir(tmpdir);
778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        writeFile(tmpdir, "T.tokens", tokens);
779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String importer =
781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"lexer grammar B; \n" +
782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options\t{tokenVocab=T;} \n" +
783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"SEMI:';' ; \n" ;
784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		writeFile(tmpdir, "B.g", importer);
785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool(new String[] {"-lib", tmpdir});
786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CompositeGrammar composite = new CompositeGrammar();
787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(antlr,tmpdir+"/B.g",composite);
788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.parseAndBuildAST();
789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.composite.assignTokenTypes();
790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expectedTokenIDToTypeMap = "[SEMI=4]";
792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expectedStringLiteralToTypeMap = "{';'=4}";
793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expectedTypeToTokenList = "[SEMI]";
794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expectedTokenIDToTypeMap,
796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					 realElements(g.composite.tokenIDToTypeMap).toString());
797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expectedStringLiteralToTypeMap, g.composite.stringLiteralToTypeMap.toString());
798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expectedTypeToTokenList,
799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					 realElements(g.composite.typeToTokenList).toString());
800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	@Test public void testTokenVocabStringUsedInCombined() throws Exception {
805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorQueue equeue = new ErrorQueue();
806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		ErrorManager.setErrorListener(equeue);
807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String tokens =
808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"';'=4\n";
809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        mkdir(tmpdir);
810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		writeFile(tmpdir, "T.tokens", tokens);
811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String importer =
813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"grammar B; \n" +
814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"options\t{tokenVocab=T;} \n" +
815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			"SEMI:';' ; \n" ;
816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		writeFile(tmpdir, "B.g", importer);
817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Tool antlr = newTool(new String[] {"-lib", tmpdir});
818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		CompositeGrammar composite = new CompositeGrammar();
819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Grammar g = new Grammar(antlr,tmpdir+"/B.g",composite);
820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.parseAndBuildAST();
821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		g.composite.assignTokenTypes();
822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expectedTokenIDToTypeMap = "[SEMI=4]";
824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expectedStringLiteralToTypeMap = "{';'=4}";
825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		String expectedTypeToTokenList = "[SEMI]";
826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expectedTokenIDToTypeMap,
828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					 realElements(g.composite.tokenIDToTypeMap).toString());
829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expectedStringLiteralToTypeMap, g.composite.stringLiteralToTypeMap.toString());
830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals(expectedTypeToTokenList,
831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					 realElements(g.composite.typeToTokenList).toString());
832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("unexpected errors: "+equeue, 0, equeue.errors.size());
834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected void checkPlusEqualsLabels(Grammar g,
837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver										 String ruleName,
838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver										 String tokenLabelsStr,
839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver										 String ruleLabelsStr)
840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		throws Exception
841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// make sure expected += labels are there
843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Rule r = g.getRule(ruleName);
844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		StringTokenizer st = new StringTokenizer(tokenLabelsStr, ", ");
845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Set tokenLabels = null;
846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		while ( st.hasMoreTokens() ) {
847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			if ( tokenLabels==null ) {
848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				tokenLabels = new HashSet();
849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			String labelName = st.nextToken();
851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			tokenLabels.add(labelName);
852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Set ruleLabels = null;
854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if ( ruleLabelsStr!=null ) {
855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			st = new StringTokenizer(ruleLabelsStr, ", ");
856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			ruleLabels = new HashSet();
857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			while ( st.hasMoreTokens() ) {
858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				String labelName = st.nextToken();
859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				ruleLabels.add(labelName);
860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			}
861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertTrue("token += labels mismatch; "+tokenLabels+"!="+r.tokenListLabels,
863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				   (tokenLabels!=null && r.tokenListLabels!=null) ||
864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				   (tokenLabels==null && r.tokenListLabels==null));
865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertTrue("rule += labels mismatch; "+ruleLabels+"!="+r.ruleListLabels,
866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				   (ruleLabels!=null && r.ruleListLabels!=null) ||
867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver				   (ruleLabels==null && r.ruleListLabels==null));
868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if ( tokenLabels!=null ) {
869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(tokenLabels, r.tokenListLabels.keySet());
870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		if ( ruleLabels!=null ) {
872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertEquals(ruleLabels, r.ruleListLabels.keySet());
873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	protected void checkSymbols(Grammar g,
877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								String rulesStr,
878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver								String tokensStr)
879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		throws Exception
880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	{
881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Set tokens = g.getTokenDisplayNames();
882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// make sure expected tokens are there
884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		StringTokenizer st = new StringTokenizer(tokensStr, ", ");
885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		while ( st.hasMoreTokens() ) {
886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			String tokenName = st.nextToken();
887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertTrue("token "+tokenName+" expected",
888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					   g.getTokenType(tokenName)!=Label.INVALID);
889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			tokens.remove(tokenName);
890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// make sure there are not any others (other than <EOF> etc...)
892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		for (Iterator iter = tokens.iterator(); iter.hasNext();) {
893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			String tokenName = (String) iter.next();
894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertTrue("unexpected token name "+tokenName,
895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver					   g.getTokenType(tokenName)<Label.MIN_TOKEN_TYPE);
896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// make sure all expected rules are there
899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		st = new StringTokenizer(rulesStr, ", ");
900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		int n = 0;
901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		while ( st.hasMoreTokens() ) {
902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			String ruleName = st.nextToken();
903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			assertNotNull("rule "+ruleName+" expected", g.getRule(ruleName));
904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver			n++;
905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		}
906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		Collection rules = g.getRules();
907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		//System.out.println("rules="+rules);
908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		// make sure there are no extra rules
909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		assertEquals("number of rules mismatch; expecting "+n+"; found "+rules.size(), n, rules.size());
910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	}
912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
914