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.tool.*; 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.junit.Test; 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic class TestRewriteTemplates extends BaseTest { 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected boolean debug = false; 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testDelete() throws Exception { 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=template;}\n" + 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ;\n" + 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "abc 34", debug); 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("", found); 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testAction() throws Exception { 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=template;}\n" + 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> {new StringTemplate($ID.text)} ;\n" + 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "abc 34", debug); 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("abc\n", found); 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testEmbeddedLiteralConstructor() throws Exception { 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=template;}\n" + 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> {%{$ID.text}} ;\n" + 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "abc 34", debug); 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("abc\n", found); 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testInlineTemplate() throws Exception { 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=template;}\n" + 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> template(x={$ID},y={$INT}) <<x:<x.text>, y:<y.text>;>> ;\n" + 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "abc 34", debug); 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("x:abc, y:34;\n", found); 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testNamedTemplate() throws Exception { 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // the support code adds template group in it's output Test.java 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // that defines template foo. 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=template;}\n" + 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> foo(x={$ID.text},y={$INT.text}) ;\n" + 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "abc 34", debug); 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("abc 34\n", found); 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testIndirectTemplate() throws Exception { 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // the support code adds template group in it's output Test.java 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // that defines template foo. 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=template;}\n" + 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ({\"foo\"})(x={$ID.text},y={$INT.text}) ;\n" + 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "abc 34", debug); 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("abc 34\n", found); 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testInlineTemplateInvokingLib() throws Exception { 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=template;}\n" + 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> template(x={$ID.text},y={$INT.text}) \"<foo(...)>\" ;\n" + 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "abc 34", debug); 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("abc 34\n", found); 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testPredicatedAlts() throws Exception { 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // the support code adds template group in it's output Test.java 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // that defines template foo. 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=template;}\n" + 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> {false}? foo(x={$ID.text},y={$INT.text})\n" + 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " -> foo(x={\"hi\"}, y={$ID.text})\n" + 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" + 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "abc 34", debug); 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("hi abc\n", found); 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testTemplateReturn() throws Exception { 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=template;}\n" + 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : b {System.out.println($b.st);} ;\n" + 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : ID INT -> foo(x={$ID.text},y={$INT.text}) ;\n" + 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "abc 34", debug); 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("abc 34\n", found); 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testReturnValueWithTemplate() throws Exception { 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=template;}\n" + 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : b {System.out.println($b.i);} ;\n" + 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b returns [int i] : ID INT {$i=8;} ;\n" + 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "abc 34", debug); 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("8\n", found); 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testTemplateRefToDynamicAttributes() throws Exception { 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=template;}\n" + 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a scope {String id;} : ID {$a::id=$ID.text;} b\n" + 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " {System.out.println($b.st.toString());}\n" + 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" + 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : INT -> foo(x={$a::id}) ;\n" + 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "abc 34", debug); 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("abc \n", found); 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // tests for rewriting templates in tree parsers 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testSingleNode() throws Exception { 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID ;\n" + 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {ASTLabelType=CommonTree; output=template;}\n" + 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : a {System.out.println($a.st);} ;\n" + 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID -> template(x={$ID.text}) <<|<x>|>> ;\n"; 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "abc"); 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("|abc|\n", found); 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testSingleNodeRewriteMode() throws Exception { 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID ;\n" + 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {ASTLabelType=CommonTree; output=template; rewrite=true;}\n" + 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : a {System.out.println(input.getTokenStream().toString(0,0));} ;\n" + 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID -> template(x={$ID.text}) <<|<x>|>> ;\n"; 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "abc"); 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("|abc|\n", found); 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteRuleAndRewriteModeOnSimpleElements() throws Exception { 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorQueue equeue = new ErrorQueue(); 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.setErrorListener(equeue); 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar g = new Grammar( 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {ASTLabelType=CommonTree; output=template; rewrite=true;}\n" + 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a: ^(A B) -> {ick}\n" + 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | y+=INT -> {ick}\n" + 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | x=ID -> {ick}\n" + 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | BLORT -> {ick}\n" + 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ); 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Tool antlr = newTool(); 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver antlr.setOutputDirectory(null); // write to /dev/null 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator generator = new CodeGenerator(antlr, g, "Java"); 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver g.setCodeGenerator(generator); 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver generator.genRecognizer(); 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("unexpected errors: "+equeue, 0, equeue.warnings.size()); 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteRuleAndRewriteModeIgnoreActionsPredicates() throws Exception { 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorQueue equeue = new ErrorQueue(); 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.setErrorListener(equeue); 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar g = new Grammar( 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {ASTLabelType=CommonTree; output=template; rewrite=true;}\n" + 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a: {action} {action2} x=A -> {ick}\n" + 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | {pred1}? y+=B -> {ick}\n" + 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | C {action} -> {ick}\n" + 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | {pred2}?=> z+=D -> {ick}\n" + 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | (E)=> ^(F G) -> {ick}\n" + 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ); 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Tool antlr = newTool(); 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver antlr.setOutputDirectory(null); // write to /dev/null 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator generator = new CodeGenerator(antlr, g, "Java"); 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver g.setCodeGenerator(generator); 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver generator.genRecognizer(); 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("unexpected errors: "+equeue, 0, equeue.warnings.size()); 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteRuleAndRewriteModeNotSimple() throws Exception { 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorQueue equeue = new ErrorQueue(); 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.setErrorListener(equeue); 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar g = new Grammar( 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {ASTLabelType=CommonTree; output=template; rewrite=true;}\n" + 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID+ -> {ick}\n" + 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | INT INT -> {ick}\n" + 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ); 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Tool antlr = newTool(); 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver antlr.setOutputDirectory(null); // write to /dev/null 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator generator = new CodeGenerator(antlr, g, "Java"); 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver g.setCodeGenerator(generator); 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver generator.genRecognizer(); 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("unexpected errors: "+equeue, 0, equeue.warnings.size()); 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteRuleAndRewriteModeRefRule() throws Exception { 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorQueue equeue = new ErrorQueue(); 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.setErrorListener(equeue); 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar g = new Grammar( 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {ASTLabelType=CommonTree; output=template; rewrite=true;}\n" + 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : b+ -> {ick}\n" + 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | b b A -> {ick}\n" + 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" + 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : B ;\n" 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ); 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Tool antlr = newTool(); 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver antlr.setOutputDirectory(null); // write to /dev/null 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator generator = new CodeGenerator(antlr, g, "Java"); 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver g.setCodeGenerator(generator); 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver generator.genRecognizer(); 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("unexpected errors: "+equeue, 0, equeue.warnings.size()); 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 319