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.stringtemplate.v4.ST; 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.tool.Grammar; 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.junit.Test; 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpublic class TestLexer extends BaseTest { 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected boolean debug = false; 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Public default constructor used by TestRig */ 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public TestLexer() { 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testSetText() throws Exception { 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // this must return A not I to the parser; calling a nonfragment rule 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // from a nonfragment rule does not set the overall token. 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar P;\n"+ 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : A {System.out.println(input);} ;\n"+ 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "A : '\\\\' 't' {setText(\"\t\");} ;\n" + 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;"; 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("P.g", grammar, "PParser", "PLexer", 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "\\t", debug); 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("\t\n", found); 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRefToRuleDoesNotSetTokenNorEmitAnother() throws Exception { 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // this must return A not I to the parser; calling a nonfragment rule 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // from a nonfragment rule does not set the overall token. 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar P;\n"+ 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : A EOF {System.out.println(input);} ;\n"+ 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "A : '-' I ;\n" + 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "I : '0'..'9'+ ;\n"+ 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;"; 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("P.g", grammar, "PParser", "PLexer", 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "-34", debug); 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("-34\n", found); 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRefToRuleDoesNotSetChannel() throws Exception { 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // this must set channel of A to HIDDEN. $channel is local to rule 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // like $type. 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar P;\n"+ 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : A EOF {System.out.println($A.text+\", channel=\"+$A.channel);} ;\n"+ 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "A : '-' WS I ;\n" + 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "I : '0'..'9'+ ;\n"+ 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;"; 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("P.g", grammar, "PParser", "PLexer", 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "- 34", debug); 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("- 34, channel=0\n", found); 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testWeCanSetType() throws Exception { 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar P;\n"+ 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "tokens {X;}\n" + 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : X EOF {System.out.println(input);} ;\n"+ 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "A : '-' I {$type = X;} ;\n" + 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "I : '0'..'9'+ ;\n"+ 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;"; 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("P.g", grammar, "PParser", "PLexer", 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "-34", debug); 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("-34\n", found); 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRefToFragment() throws Exception { 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // this must return A not I to the parser; calling a nonfragment rule 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // from a nonfragment rule does not set the overall token. 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar P;\n"+ 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : A {System.out.println(input);} ;\n"+ 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "A : '-' I ;\n" + 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "fragment I : '0'..'9'+ ;\n"+ 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;"; 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("P.g", grammar, "PParser", "PLexer", 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "-34", debug); 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("-34\n", found); 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testMultipleRefToFragment() throws Exception { 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // this must return A not I to the parser; calling a nonfragment rule 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // from a nonfragment rule does not set the overall token. 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar P;\n"+ 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : A EOF {System.out.println(input);} ;\n"+ 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "A : I '.' I ;\n" + 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "fragment I : '0'..'9'+ ;\n"+ 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;"; 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("P.g", grammar, "PParser", "PLexer", 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "3.14159", debug); 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("3.14159\n", found); 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testLabelInSubrule() throws Exception { 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // can we see v outside? 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar P;\n"+ 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : A EOF ;\n"+ 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "A : 'hi' WS (v=I)? {$channel=0; System.out.println($v.text);} ;\n" + 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "fragment I : '0'..'9'+ ;\n"+ 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;"; 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("P.g", grammar, "PParser", "PLexer", 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "hi 342", debug); 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("342\n", found); 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRefToTokenInLexer() throws Exception { 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar P;\n"+ 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : A EOF ;\n"+ 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "A : I {System.out.println($I.text);} ;\n" + 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "fragment I : '0'..'9'+ ;\n"+ 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;"; 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("P.g", grammar, "PParser", "PLexer", 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "342", debug); 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("342\n", found); 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testListLabelInLexer() throws Exception { 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar P;\n"+ 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : A ;\n"+ 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "A : i+=I+ {for (Object t : $i) System.out.print(\" \"+((Token)t).getText());} ;\n" + 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "fragment I : '0'..'9'+ ;\n"+ 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;"; 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("P.g", grammar, "PParser", "PLexer", 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "33 297", debug); 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals(" 33 297\n", found); 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testDupListRefInLexer() throws Exception { 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar P;\n"+ 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : A ;\n"+ 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "A : i+=I WS i+=I {$channel=0; for (Object t : $i) System.out.print(\" \"+((Token)t).getText());} ;\n" + 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "fragment I : '0'..'9'+ ;\n"+ 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "WS : (' '|'\\n') {$channel=HIDDEN;} ;"; 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("P.g", grammar, "PParser", "PLexer", 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "33 297", debug); 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals(" 33 297\n", found); 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testCharLabelInLexer() { 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "grammar T;\n" + 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a : B ;\n" + 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "B : x='a' {System.out.println((char)$x);} ;\n" ; 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = execParser("T.g", grammar, "TParser", "TLexer", 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "a", "a", debug); 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals("a\n", found); 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRepeatedLabelInLexer() { 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "lexer grammar T;\n" + 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "B : x='a' x='b' ;\n" ; 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver boolean found = 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rawGenerateAndBuildRecognizer( 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "T.g", grammar, null, "T", false); 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver boolean expecting = true; // should be ok 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals(expecting, found); 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testRepeatedRuleLabelInLexer() { 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "lexer grammar T;\n" + 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "B : x=A x=A ;\n" + 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "fragment A : 'a' ;\n" ; 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver boolean found = 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rawGenerateAndBuildRecognizer( 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "T.g", grammar, null, "T", false); 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver boolean expecting = true; // should be ok 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals(expecting, found); 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testIsolatedEOTEdge() { 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "lexer grammar T;\n" + 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "QUOTED_CONTENT \n" + 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver " : 'q' (~'q')* (('x' 'q') )* 'q' ; \n"; 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver boolean found = 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rawGenerateAndBuildRecognizer( 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "T.g", grammar, null, "T", false); 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver boolean expecting = true; // should be ok 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals(expecting, found); 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testEscapedLiterals() { 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Grammar: 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver A : '\"' ; should match a single double-quote: " 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver B : '\\\"' ; should match input \" 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String grammar = 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "lexer grammar T;\n" + 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "A : '\\\"' ;\n" + 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "B : '\\\\\\\"' ;\n" ; // '\\\"' 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver boolean found = 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rawGenerateAndBuildRecognizer( 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "T.g", grammar, null, "T", false); 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver boolean expecting = true; // should be ok 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals(expecting, found); 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver @Test public void testNewlineLiterals() throws Exception { 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Grammar g = new Grammar( 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "lexer grammar T;\n" + 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "A : '\\n\\n' ;\n" // ANTLR sees '\n\n' 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ); 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String expecting = "match(\"\\n\\n\")"; 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 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(); // codegen phase sets some vars we need 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ST codeST = generator.getRecognizerST(); 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String code = codeST.render(); 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int m = code.indexOf("match(\""); 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String found = code.substring(m,m+expecting.length()); 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver assertEquals(expecting, found); 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 255