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