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