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.runtime.RecognitionException; 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.tool.ErrorManager; 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.tool.Grammar; 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.tool.GrammarSyntaxMessage; 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.junit.Ignore; 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.junit.Test; 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Tree rewrites in tree parsers are basically identical to rewrites 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * in a normal grammar except that the atomic element is a node not 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * a Token. Tests here ensure duplication of nodes occurs properly 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * and basic functionality. 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic class TestTreeGrammarRewriteAST extends BaseTest { 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected boolean debug = false; 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testFlatList() throws Exception { 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT;\n" + 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> INT ID\n" + 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "abc 34"); 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("34 abc\n", found); 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testSimpleTree() throws Exception { 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ^(ID INT);\n" + 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(ID INT) -> ^(INT ID)\n" + 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "abc 34"); 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(34 abc)\n", found); 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testNonImaginaryWithCtor() throws Exception { 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : INT ;\n" + 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : INT -> INT[\"99\"]\n" + // make new INT node 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "34"); 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("99\n", found); 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testCombinedRewriteAndAuto() throws Exception { 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ^(ID INT) | INT ;\n" + 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(ID INT) -> ^(INT ID) | INT\n" + 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "abc 34"); 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(34 abc)\n", found); 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = execTreeParser("T.g", grammar, "TParser", "TP.g", 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "34"); 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("34\n", found); 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testAvoidDup() throws Exception { 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID ;\n" + 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID -> ^(ID ID)\n" + 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "abc"); 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(abc abc)\n", found); 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testLoop() throws Exception { 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID+ INT+ -> (^(ID INT))+ ;\n" + 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : (^(ID INT))+ -> INT+ ID+\n" + 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "a b c 3 4 5"); 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("3 4 5 a b c\n", found); 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testAutoDup() throws Exception { 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID ;\n" + 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID \n" + 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "abc"); 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("abc\n", found); 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testAutoDupRule() throws Exception { 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT ;\n" + 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : b c ;\n" + 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : ID ;\n" + 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "c : INT ;\n"; 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "a 1"); 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("a 1\n", found); 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testAutoWildcard() throws Exception { 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT ;\n" + 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID . \n" + 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "abc 34"); 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("abc 34\n", found); 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testNoWildcardAsRootError() throws Exception { 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorQueue equeue = new ErrorQueue(); 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ErrorManager.setErrorListener(equeue); 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(. INT) \n" + 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar g = new Grammar(treeGrammar); 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Tool antlr = newTool(); 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver antlr.setOutputDirectory(null); // write to /dev/null 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CodeGenerator generator = new CodeGenerator(antlr, g, "Java"); 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver g.setCodeGenerator(generator); 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver generator.genRecognizer(); 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("unexpected errors: "+equeue, 1, equeue.errors.size()); 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int expectedMsgID = ErrorManager.MSG_WILDCARD_AS_ROOT; 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Object expectedArg = null; 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver RecognitionException expectedExc = null; 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver GrammarSyntaxMessage expectedMessage = 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver new GrammarSyntaxMessage(expectedMsgID, g, null, expectedArg, expectedExc); 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver checkError(equeue, expectedMessage); 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testAutoWildcard2() throws Exception { 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ^(ID INT);\n" + 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(ID .) \n" + 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "abc 34"); 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(abc 34)\n", found); 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testAutoWildcardWithLabel() throws Exception { 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT ;\n" + 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID c=. \n" + 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "abc 34"); 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("abc 34\n", found); 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testAutoWildcardWithListLabel() throws Exception { 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT ;\n" + 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID c+=. \n" + 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "abc 34"); 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("abc 34\n", found); 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testAutoDupMultiple() throws Exception { 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID ID INT;\n" + 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID ID INT\n" + 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "a b 3"); 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("a b 3\n", found); 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testAutoDupTree() throws Exception { 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ^(ID INT);\n" + 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(ID INT)\n" + 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "a 3"); 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(a 3)\n", found); 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testAutoDupTree2() throws Exception { 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT INT -> ^(ID INT INT);\n" + 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(ID b b)\n" + 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" + 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : INT ;"; 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "a 3 4"); 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(a 3 4)\n", found); 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testAutoDupTreeWithLabels() throws Exception { 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ^(ID INT);\n" + 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(x=ID y=INT)\n" + 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "a 3"); 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(a 3)\n", found); 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testAutoDupTreeWithListLabels() throws Exception { 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ^(ID INT);\n" + 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(x+=ID y+=INT)\n" + 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "a 3"); 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(a 3)\n", found); 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testAutoDupTreeWithRuleRoot() throws Exception { 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ^(ID INT);\n" + 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(b INT) ;\n" + 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : ID ;\n"; 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "a 3"); 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(a 3)\n", found); 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testAutoDupTreeWithRuleRootAndLabels() throws Exception { 441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ^(ID INT);\n" + 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(x=b INT) ;\n" + 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : ID ;\n"; 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "a 3"); 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(a 3)\n", found); 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testAutoDupTreeWithRuleRootAndListLabels() throws Exception { 461324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ^(ID INT);\n" + 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 470324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(x+=b y+=c) ;\n" + 473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : ID ;\n" + 474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "c : INT ;\n"; 475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "a 3"); 478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(a 3)\n", found); 479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testAutoDupNestedTree() throws Exception { 482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : x=ID y=ID INT -> ^($x ^($y INT));\n" + 486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 490324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 491324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 492324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 493324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(ID ^(ID INT))\n" + 494324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 495324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 496324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 497324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "a b 3"); 498324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(a (b 3))\n", found); 499324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 500324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 501324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testAutoDupTreeWithSubruleInside() throws Exception { 502324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 503324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 504324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 505324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tokens {OP;}\n" + 506324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : (x=ID|x=INT) -> ^(OP $x) ;\n" + 507324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 508324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 509324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 510324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 511324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 512324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 513324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 514324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(OP (b|c)) ;\n" + 515324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : ID ;\n" + 516324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "c : INT ;\n"; 517324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 518324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 519324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "a"); 520324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(OP a)\n", found); 521324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 522324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 523324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testDelete() throws Exception { 524324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 525324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 526324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 527324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID ;\n" + 528324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 529324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 530324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 531324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 532324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 533324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 534324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 535324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID -> \n" + 536324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 537324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 538324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 539324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "abc"); 540324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("", found); 541324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 542324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 543324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testSetMatchNoRewrite() throws Exception { 544324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 545324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 546324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 547324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT ;\n" + 548324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 549324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 550324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 551324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 552324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 553324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 554324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 555324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : b INT\n" + 556324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" + 557324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : ID | INT ;\n"; 558324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 559324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 560324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "abc 34"); 561324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("abc 34\n", found); 562324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 563324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 564324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testSetOptionalMatchNoRewrite() throws Exception { 565324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 566324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 567324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 568324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT ;\n" + 569324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 570324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 571324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 572324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 573324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 574324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 575324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 576324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : (ID|INT)? INT ;\n"; 577324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 578324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 579324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "abc 34"); 580324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("abc 34\n", found); 581324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 582324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 583324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 584324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testSetMatchNoRewriteLevel2() throws Exception { 585324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 586324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 587324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 588324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : x=ID INT -> ^($x INT);\n" + 589324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 590324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 591324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 592324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 593324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 594324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 595324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 596324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(ID (ID | INT) ) ;\n"; 597324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 598324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 599324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "abc 34"); 600324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(abc 34)\n", found); 601324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 602324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 603324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testSetMatchNoRewriteLevel2Root() throws Exception { 604324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 605324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 606324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 607324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : x=ID INT -> ^($x INT);\n" + 608324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 609324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 610324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 611324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 612324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 613324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 614324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 615324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^((ID | INT) INT) ;\n"; 616324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 617324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 618324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "abc 34"); 619324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(abc 34)\n", found); 620324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 621324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 622324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 623324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // REWRITE MODE 624324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 625324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteModeCombinedRewriteAndAuto() throws Exception { 626324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 627324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 628324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 629324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ^(ID INT) | INT ;\n" + 630324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 631324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 632324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 633324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 634324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 635324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 636324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" + 637324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(ID INT) -> ^(ID[\"ick\"] INT)\n" + 638324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | INT\n" + // leaves it alone, returning $a.start 639324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 640324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 641324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 642324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "abc 34"); 643324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(ick 34)\n", found); 644324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 645324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = execTreeParser("T.g", grammar, "TParser", "TP.g", 646324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "34"); 647324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("34\n", found); 648324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 649324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 650324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteModeFlatTree() throws Exception { 651324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 652324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 653324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 654324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ID INT | INT ;\n" + 655324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 656324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 657324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 658324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 659324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 660324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 661324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" + 662324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : ID a ;\n" + 663324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : INT -> INT[\"1\"]\n"+ 664324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 665324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 666324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 667324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "abc 34"); 668324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("abc 1\n", found); 669324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 670324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 671324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteModeChainRuleFlatTree() throws Exception { 672324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 673324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 674324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 675324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ID INT | INT ;\n" + 676324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 677324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 678324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 679324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 680324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 681324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 682324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" + 683324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : a ;\n" + 684324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : b ;\n" + 685324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : ID INT -> INT ID\n"+ 686324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 687324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 688324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 689324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "abc 34"); 690324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("34 abc\n", found); 691324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 692324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 693324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteModeChainRuleTree() throws Exception { 694324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 695324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 696324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 697324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ^(ID INT) ;\n" + 698324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 699324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 700324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 701324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 702324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 703324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 704324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" + 705324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : a ;\n" + 706324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : b ;\n" + // a.tree must become b.tree 707324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : ^(ID INT) -> INT\n"+ 708324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 709324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 710324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 711324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "abc 34"); 712324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("34\n", found); 713324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 714324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 715324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteModeChainRuleTree2() throws Exception { 716324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 717324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 718324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 719324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ^(ID INT) ;\n" + 720324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 721324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 722324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 723324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 724324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 725324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 726324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" + 727324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tokens { X; }\n" + 728324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : a* b ;\n" + // only b contributes to tree, but it's after a*; s.tree = b.tree 729324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : X ;\n" + 730324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : ^(ID INT) -> INT\n"+ 731324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 732324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 733324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 734324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "abc 34"); 735324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("34\n", found); 736324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 737324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 738324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteModeChainRuleTree3() throws Exception { 739324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 740324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 741324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 742324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : 'boo' ID INT -> 'boo' ^(ID INT) ;\n" + 743324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 744324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 745324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 746324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 747324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 748324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 749324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" + 750324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tokens { X; }\n" + 751324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : 'boo' a* b ;\n" + // don't reset s.tree to b.tree due to 'boo' 752324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : X ;\n" + 753324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : ^(ID INT) -> INT\n"+ 754324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 755324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 756324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 757324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "boo abc 34"); 758324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("boo 34\n", found); 759324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 760324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 761324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteModeChainRuleTree4() throws Exception { 762324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 763324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 764324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 765324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : 'boo' ID INT -> ^('boo' ^(ID INT)) ;\n" + 766324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 767324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 768324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 769324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 770324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 771324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 772324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" + 773324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tokens { X; }\n" + 774324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : ^('boo' a* b) ;\n" + // don't reset s.tree to b.tree due to 'boo' 775324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : X ;\n" + 776324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : ^(ID INT) -> INT\n"+ 777324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 778324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 779324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 780324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "boo abc 34"); 781324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(boo 34)\n", found); 782324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 783324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 784324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteModeChainRuleTree5() throws Exception { 785324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 786324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 787324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 788324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : 'boo' ID INT -> ^('boo' ^(ID INT)) ;\n" + 789324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 790324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 791324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 792324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 793324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 794324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 795324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" + 796324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tokens { X; }\n" + 797324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : ^(a b) ;\n" + // s.tree is a.tree 798324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : 'boo' ;\n" + 799324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : ^(ID INT) -> INT\n"+ 800324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 801324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 802324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 803324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "boo abc 34"); 804324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(boo 34)\n", found); 805324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 806324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 807324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteOfRuleRef() throws Exception { 808324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 809324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 810324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 811324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ID INT | INT ;\n" + 812324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 813324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 814324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 815324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 816324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 817324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 818324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" + 819324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : a -> a ;\n" + 820324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ID INT ;\n"; 821324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 822324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 823324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "abc 34"); 824324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("abc 34\n", found); 825324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 826324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 827324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteOfRuleRefRoot() throws Exception { 828324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 829324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 830324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 831324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT INT -> ^(INT ^(ID INT));\n" + 832324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 833324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 834324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 835324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 836324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 837324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 838324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" + 839324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : ^(a ^(ID INT)) -> a ;\n" + 840324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : INT ;\n"; 841324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 842324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 843324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "abc 12 34"); 844324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // emits whole tree when you ref the root since I can't know whether 845324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // you want the children or not. You might be returning a whole new 846324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // tree. Hmm...still seems weird. oh well. 847324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(12 (abc 34))\n", found); 848324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 849324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 850324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteOfRuleRefRootLabeled() throws Exception { 851324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 852324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 853324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 854324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT INT -> ^(INT ^(ID INT));\n" + 855324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 856324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 857324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 858324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 859324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 860324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 861324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" + 862324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : ^(label=a ^(ID INT)) -> a ;\n" + 863324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : INT ;\n"; 864324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 865324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 866324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "abc 12 34"); 867324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // emits whole tree when you ref the root since I can't know whether 868324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // you want the children or not. You might be returning a whole new 869324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // tree. Hmm...still seems weird. oh well. 870324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(12 (abc 34))\n", found); 871324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 872324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 873324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Ignore 874324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteOfRuleRefRootListLabeled() throws Exception { 875324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 876324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 877324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 878324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT INT -> ^(INT ^(ID INT));\n" + 879324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 880324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 881324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 882324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 883324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 884324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 885324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" + 886324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : ^(label+=a ^(ID INT)) -> a ;\n" + 887324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : INT ;\n"; 888324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 889324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 890324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "abc 12 34"); 891324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // emits whole tree when you ref the root since I can't know whether 892324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // you want the children or not. You might be returning a whole new 893324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // tree. Hmm...still seems weird. oh well. 894324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(12 (abc 34))\n", found); 895324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 896324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 897324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteOfRuleRefChild() throws Exception { 898324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 899324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 900324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 901324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ^(ID ^(INT INT));\n" + 902324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 903324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 904324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 905324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 906324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 907324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 908324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" + 909324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : ^(ID a) -> a ;\n" + 910324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(INT INT) ;\n"; 911324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 912324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 913324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "abc 34"); 914324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(34 34)\n", found); 915324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 916324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 917324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteOfRuleRefLabel() throws Exception { 918324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 919324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 920324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 921324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ^(ID ^(INT INT));\n" + 922324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 923324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 924324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 925324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 926324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 927324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 928324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" + 929324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : ^(ID label=a) -> a ;\n" + 930324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(INT INT) ;\n"; 931324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 932324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 933324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "abc 34"); 934324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(34 34)\n", found); 935324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 936324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 937324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteOfRuleRefListLabel() throws Exception { 938324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 939324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 940324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 941324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ^(ID ^(INT INT));\n" + 942324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 943324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 944324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 945324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 946324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 947324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 948324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" + 949324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : ^(ID label+=a) -> a ;\n" + 950324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(INT INT) ;\n"; 951324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 952324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 953324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "abc 34"); 954324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(34 34)\n", found); 955324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 956324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 957324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRewriteModeWithPredicatedRewrites() throws Exception { 958324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 959324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 960324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 961324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ^(ID[\"root\"] ^(ID INT)) | INT -> ^(ID[\"root\"] INT) ;\n" + 962324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 963324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 964324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 965324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 966324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 967324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 968324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" + 969324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : ^(ID a) {System.out.println(\"altered tree=\"+$s.start.toStringTree());};\n" + 970324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(ID INT) -> {true}? ^(ID[\"ick\"] INT)\n" + 971324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " -> INT\n" + 972324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 973324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 974324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 975324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "abc 34"); 976324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("altered tree=(root (ick 34))\n" + 977324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "(root (ick 34))\n", found); 978324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 979324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 980324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testWildcardSingleNode() throws Exception { 981324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 982324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 983324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 984324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ^(ID[\"root\"] INT);\n"+ 985324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 986324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 987324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 988324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 989324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 990324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 991324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 992324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : ^(ID c=.) -> $c\n" + 993324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 994324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 995324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 996324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "abc 34"); 997324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("34\n", found); 998324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 999324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1000324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testWildcardUnlabeledSingleNode() throws Exception { 1001324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 1002324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 1003324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 1004324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT -> ^(ID INT);\n"+ 1005324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 1006324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 1007324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 1008324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1009324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 1010324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 1011324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 1012324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : ^(ID .) -> ID\n" + 1013324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 1014324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1015324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 1016324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "abc 34"); 1017324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("abc\n", found); 1018324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1019324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1020324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testWildcardGrabsSubtree() throws Exception { 1021324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 1022324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 1023324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 1024324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID x=INT y=INT z=INT -> ^(ID[\"root\"] ^($x $y $z));\n"+ 1025324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 1026324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 1027324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 1028324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1029324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 1030324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 1031324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 1032324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : ^(ID c=.) -> $c\n" + 1033324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 1034324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1035324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 1036324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "abc 1 2 3"); 1037324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(1 2 3)\n", found); 1038324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1039324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1040324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testWildcardGrabsSubtree2() throws Exception { 1041324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 1042324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 1043324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 1044324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID x=INT y=INT z=INT -> ID ^($x $y $z);\n"+ 1045324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 1046324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 1047324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 1048324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1049324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 1050324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 1051324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 1052324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : ID c=. -> $c\n" + 1053324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 1054324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1055324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 1056324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "abc 1 2 3"); 1057324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(1 2 3)\n", found); 1058324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1059324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1060324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testWildcardListLabel() throws Exception { 1061324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 1062324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 1063324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 1064324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : INT INT INT ;\n"+ 1065324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 1066324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 1067324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 1068324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1069324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 1070324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 1071324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 1072324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : (c+=.)+ -> $c+\n" + 1073324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 1074324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1075324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 1076324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "1 2 3"); 1077324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("1 2 3\n", found); 1078324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1079324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1080324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testWildcardListLabel2() throws Exception { 1081324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 1082324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 1083324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree;}\n" + 1084324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : x=INT y=INT z=INT -> ^($x ^($y $z) ^($y $z));\n"+ 1085324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 1086324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 1087324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 1088324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1089324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 1090324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 1091324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;}\n" + 1092324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : ^(INT (c+=.)+) -> $c+\n" + 1093324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 1094324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1095324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 1096324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "s", "1 2 3"); 1097324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(2 3) (2 3)\n", found); 1098324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1099324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRuleResultAsRoot() throws Exception { 1101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 1102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 1103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 1104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID '=' INT -> ^('=' ID INT);\n" + 1105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 1106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 1107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "COLON : ':' ;\n" + 1108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 1109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 1111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n"+ 1112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST; rewrite=true; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 1113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ^(eq e1=ID e2=.) -> ^(eq $e2 $e1) ;\n" + 1114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "eq : '=' | ':' {;} ;\n"; // bug in set match, doesn't add to tree!! booh. force nonset. 1115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 1117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "abc = 34"); 1118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("(= 34 abc)\n", found); 1119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 1120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 1121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 1122