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