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.junit.Test; 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic class TestSyntacticPredicateEvaluation extends BaseTest { 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testTwoPredsWithNakedAlt() throws Exception { 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : (a ';')+ ;\n" + 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a\n" + 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {\n" + 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " k=1;\n" + 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "}\n" + 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " : (b '.')=> b '.' {System.out.println(\"alt 1\");}\n" + 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | (b)=> b {System.out.println(\"alt 2\");}\n" + 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | c {System.out.println(\"alt 3\");}\n" + 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" + 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b\n" + 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "@init {System.out.println(\"enter b\");}\n" + 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " : '(' 'x' ')' ;\n" + 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "c\n" + 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "@init {System.out.println(\"enter c\");}\n" + 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " : '(' c ')' | 'x' ;\n" + 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n')+ {$channel=HIDDEN;}\n" + 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" ; 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "(x) ;", false); 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String expecting = 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter b\n" + 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter b\n" + 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter b\n" + 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "alt 2\n"; 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals(expecting, found); 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = execParser("T.g", grammar, "TParser", "TLexer", 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "(x). ;", false); 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver expecting = 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter b\n" + 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter b\n" + 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "alt 1\n"; 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals(expecting, found); 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = execParser("T.g", grammar, "TParser", "TLexer", 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "((x)) ;", false); 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver expecting = 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter b\n" + 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter b\n" + 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter c\n" + 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter c\n" + 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter c\n" + 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "alt 3\n"; 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals(expecting, found); 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testTwoPredsWithNakedAltNotLast() throws Exception { 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : (a ';')+ ;\n" + 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a\n" + 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {\n" + 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " k=1;\n" + 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "}\n" + 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " : (b '.')=> b '.' {System.out.println(\"alt 1\");}\n" + 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | c {System.out.println(\"alt 2\");}\n" + 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | (b)=> b {System.out.println(\"alt 3\");}\n" + 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" + 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b\n" + 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "@init {System.out.println(\"enter b\");}\n" + 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " : '(' 'x' ')' ;\n" + 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "c\n" + 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "@init {System.out.println(\"enter c\");}\n" + 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " : '(' c ')' | 'x' ;\n" + 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n')+ {$channel=HIDDEN;}\n" + 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" ; 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "(x) ;", false); 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String expecting = 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter b\n" + 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter c\n" + 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter c\n" + 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "alt 2\n"; 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals(expecting, found); 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = execParser("T.g", grammar, "TParser", "TLexer", 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "(x). ;", false); 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver expecting = 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter b\n" + 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter b\n" + 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "alt 1\n"; 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals(expecting, found); 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = execParser("T.g", grammar, "TParser", "TLexer", 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "((x)) ;", false); 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver expecting = 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter b\n" + 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter c\n" + 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter c\n" + 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter c\n" + 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "alt 2\n"; 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals(expecting, found); 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testLexerPred() throws Exception { 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : A ;\n" + 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "A options {k=1;}\n" + // force backtracking 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " : (B '.')=>B '.' {System.out.println(\"alt1\");}\n" + 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | B {System.out.println(\"alt2\");}" + 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" + 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "fragment\n" + 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "B : 'x'+ ;\n" ; 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s", "xxx", false); 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("alt2\n", found); 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = execParser("T.g", grammar, "TParser", "TLexer", 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s", "xxx.", false); 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("alt1\n", found); 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testLexerWithPredLongerThanAlt() throws Exception { 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : A ;\n" + 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "A options {k=1;}\n" + // force backtracking 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " : (B '.')=>B {System.out.println(\"alt1\");}\n" + 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | B {System.out.println(\"alt2\");}" + 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" + 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "D : '.' {System.out.println(\"D\");} ;\n" + 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "fragment\n" + 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "B : 'x'+ ;\n" ; 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s", "xxx", false); 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("alt2\n", found); 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = execParser("T.g", grammar, "TParser", "TLexer", 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s", "xxx.", false); 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("alt1\nD\n", found); 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testLexerPredCyclicPrediction() throws Exception { 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : A ;\n" + 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "A : (B)=>(B|'y'+) {System.out.println(\"alt1\");}\n" + 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | B {System.out.println(\"alt2\");}\n" + 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | 'y'+ ';'" + 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" + 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "fragment\n" + 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "B : 'x'+ ;\n" ; 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s", "xxx", false); 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("alt1\n", found); 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testLexerPredCyclicPrediction2() throws Exception { 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : A ;\n" + 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "A : (B '.')=>(B|'y'+) {System.out.println(\"alt1\");}\n" + 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | B {System.out.println(\"alt2\");}\n" + 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | 'y'+ ';'" + 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" + 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "fragment\n" + 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "B : 'x'+ ;\n" ; 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s", "xxx", false); 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("alt2\n", found); 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testSimpleNestedPred() throws Exception { 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : (expr ';')+ ;\n" + 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "expr\n" + 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {\n" + 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " k=1;\n" + 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "}\n" + 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "@init {System.out.println(\"enter expr \"+input.LT(1).getText());}\n" + 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " : (atom 'x') => atom 'x'\n" + 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | atom\n" + 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ";\n" + 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "atom\n" + 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "@init {System.out.println(\"enter atom \"+input.LT(1).getText());}\n" + 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " : '(' expr ')'\n" + 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | INT\n" + 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" + 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT: '0'..'9'+ ;\n" + 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n')+ {$channel=HIDDEN;}\n" + 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" ; 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s", "(34)x;", false); 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String expecting = 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter expr (\n" + 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom (\n" + 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter expr 34\n" + 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom 34\n" + 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom 34\n" + 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom (\n" + 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter expr 34\n" + 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom 34\n" + 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom 34\n"; 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals(expecting, found); 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testTripleNestedPredInLexer() throws Exception { 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s : (.)+ {System.out.println(\"done\");} ;\n" + 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "EXPR\n" + 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {\n" + 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " k=1;\n" + 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "}\n" + 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "@init {System.out.println(\"enter expr \"+(char)input.LT(1));}\n" + 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " : (ATOM 'x') => ATOM 'x' {System.out.println(\"ATOM x\");}\n" + 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | ATOM {System.out.println(\"ATOM \"+$ATOM.text);}\n" + 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ";\n" + 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "fragment ATOM\n" + 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "@init {System.out.println(\"enter atom \"+(char)input.LT(1));}\n" + 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " : '(' EXPR ')'\n" + 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | INT\n" + 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" + 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "fragment INT: '0'..'9'+ ;\n" + 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "fragment WS : (' '|'\\n')+ \n" + 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" ; 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "s", "((34)x)x", false); 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String expecting = // has no memoization 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter expr (\n" + 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom (\n" + 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter expr (\n" + 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom (\n" + 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter expr 3\n" + 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom 3\n" + 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom 3\n" + 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom (\n" + 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter expr 3\n" + 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom 3\n" + 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom 3\n" + 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom (\n" + 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter expr (\n" + 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom (\n" + 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter expr 3\n" + 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom 3\n" + 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom 3\n" + 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom (\n" + 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter expr 3\n" + 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom 3\n" + 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "enter atom 3\n" + 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ATOM 34\n" + 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ATOM x\n" + 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ATOM x\n" + 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "done\n"; 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals(expecting, found); 288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testTreeParserWithSynPred() throws Exception { 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT+ (PERIOD|SEMI);\n" + 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "SEMI : ';' ;\n"+ 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "PERIOD : '.' ;\n"+ 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n" + 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {k=1; backtrack=true; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT+ PERIOD {System.out.print(\"alt 1\");}"+ 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | ID INT+ SEMI {System.out.print(\"alt 2\");}\n" + 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n"; 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "a 1 2 3;"); 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("alt 2\n", found); 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testTreeParserWithNestedSynPred() throws Exception { 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID INT+ (PERIOD|SEMI);\n" + 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "ID : 'a'..'z'+ ;\n" + 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "INT : '0'..'9'+;\n" + 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "SEMI : ';' ;\n"+ 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "PERIOD : '.' ;\n"+ 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;\n"; 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // backtracks in a and b due to k=1 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String treeGrammar = 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tree grammar TP;\n" + 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {k=1; backtrack=true; ASTLabelType=CommonTree; tokenVocab=T;}\n" + 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ID b {System.out.print(\" a:alt 1\");}"+ 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | ID INT+ SEMI {System.out.print(\" a:alt 2\");}\n" + 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" + 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : INT PERIOD {System.out.print(\"b:alt 1\");}" + // choose this alt for just one INT 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | INT+ PERIOD {System.out.print(\"b:alt 2\");}" + 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;"; 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execTreeParser("T.g", grammar, "TParser", "TP.g", 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver treeGrammar, "TP", "TLexer", "a", "a", "a 1 2 3."); 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("b:alt 2 a:alt 1\n", found); 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testSynPredWithOutputTemplate() throws Exception { 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // really just seeing if it will compile 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=template;}\n" + 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a\n" + 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {\n" + 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " k=1;\n" + 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "}\n" + 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " : ('x'+ 'y')=> 'x'+ 'y' -> template(a={$text}) <<1:<a>;>>\n" + 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | 'x'+ 'z' -> template(a={$text}) <<2:<a>;>>\n"+ 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" + 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n')+ {$channel=HIDDEN;}\n" + 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" ; 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "xxxy", false); 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("1:xxxy;\n", found); 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testSynPredWithOutputAST() throws Exception { 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // really just seeing if it will compile 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {output=AST;}\n" + 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a\n" + 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "options {\n" + 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " k=1;\n" + 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "}\n" + 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " : ('x'+ 'y')=> 'x'+ 'y'\n" + 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " | 'x'+ 'z'\n"+ 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" + 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n')+ {$channel=HIDDEN;}\n" + 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " ;\n" ; 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "xxxy", false); 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("x x x y\n", found); 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testOptionalBlockWithSynPred() throws Exception { 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "\n" + 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : ( (b)=> b {System.out.println(\"b\");})? b ;\n" + 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : 'x' ;\n" ; 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "xx", false); 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("b\n", found); 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver found = execParser("T.g", grammar, "TParser", "TLexer", 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "x", false); 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("", found); 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testSynPredK2() throws Exception { 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // all manually specified syn predicates are gated (i.e., forced 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // to execute). 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "\n" + 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : (b)=> b {System.out.println(\"alt1\");} | 'a' 'c' ;\n" + 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : 'a' 'b' ;\n" ; 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "ab", false); 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("alt1\n", found); 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testSynPredKStar() throws Exception { 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "\n" + 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : (b)=> b {System.out.println(\"alt1\");} | 'a'+ 'c' ;\n" + 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "b : 'a'+ 'b' ;\n" ; 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "aaab", false); 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("alt1\n", found); 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 421