blob: f0de1ce47a9890319f10baa8185e78b75fd1cf86 [file] [log] [blame]
/*
* [The "BSD license"]
* Copyright (c) 2010 Terence Parr
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.antlr.test;
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CharStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.Token;
import org.antlr.tool.Grammar;
import org.antlr.tool.Interpreter;
import org.junit.Test;
public class TestInterpretedLexing extends BaseTest {
/*
static class Tracer implements ANTLRDebugInterface {
Grammar g;
public DebugActions(Grammar g) {
this.g = g;
}
public void enterRule(String ruleName) {
System.out.println("enterRule("+ruleName+")");
}
public void exitRule(String ruleName) {
System.out.println("exitRule("+ruleName+")");
}
public void matchElement(int type) {
System.out.println("matchElement("+g.getTokenName(type)+")");
}
public void mismatchedElement(MismatchedTokenException e) {
System.out.println(e);
e.printStackTrace(System.out);
}
public void mismatchedSet(MismatchedSetException e) {
System.out.println(e);
e.printStackTrace(System.out);
}
public void noViableAlt(NoViableAltException e) {
System.out.println(e);
e.printStackTrace(System.out);
}
}
*/
/** Public default constructor used by TestRig */
public TestInterpretedLexing() {
}
@Test public void testSimpleAltCharTest() throws Exception {
Grammar g = new Grammar(
"lexer grammar t;\n"+
"A : 'a' | 'b' | 'c';");
final int Atype = g.getTokenType("A");
Interpreter engine = new Interpreter(g, new ANTLRStringStream("a"));
engine = new Interpreter(g, new ANTLRStringStream("b"));
Token result = engine.scan("A");
assertEquals(result.getType(), Atype);
engine = new Interpreter(g, new ANTLRStringStream("c"));
result = engine.scan("A");
assertEquals(result.getType(), Atype);
}
@Test public void testSingleRuleRef() throws Exception {
Grammar g = new Grammar(
"lexer grammar t;\n"+
"A : 'a' B 'c' ;\n" +
"B : 'b' ;\n");
final int Atype = g.getTokenType("A");
Interpreter engine = new Interpreter(g, new ANTLRStringStream("abc")); // should ignore the x
Token result = engine.scan("A");
assertEquals(result.getType(), Atype);
}
@Test public void testSimpleLoop() throws Exception {
Grammar g = new Grammar(
"lexer grammar t;\n"+
"INT : (DIGIT)+ ;\n"+
"fragment DIGIT : '0'..'9';\n");
final int INTtype = g.getTokenType("INT");
Interpreter engine = new Interpreter(g, new ANTLRStringStream("12x")); // should ignore the x
Token result = engine.scan("INT");
assertEquals(result.getType(), INTtype);
engine = new Interpreter(g, new ANTLRStringStream("1234"));
result = engine.scan("INT");
assertEquals(result.getType(), INTtype);
}
@Test public void testMultAltLoop() throws Exception {
Grammar g = new Grammar(
"lexer grammar t;\n"+
"A : ('0'..'9'|'a'|'b')+ ;\n");
final int Atype = g.getTokenType("A");
Interpreter engine = new Interpreter(g, new ANTLRStringStream("a"));
Token result = engine.scan("A");
engine = new Interpreter(g, new ANTLRStringStream("a"));
result = engine.scan("A");
assertEquals(result.getType(), Atype);
engine = new Interpreter(g, new ANTLRStringStream("1234"));
result = engine.scan("A");
assertEquals(result.getType(), Atype);
engine = new Interpreter(g, new ANTLRStringStream("aaa"));
result = engine.scan("A");
assertEquals(result.getType(), Atype);
engine = new Interpreter(g, new ANTLRStringStream("aaaa9"));
result = engine.scan("A");
assertEquals(result.getType(), Atype);
engine = new Interpreter(g, new ANTLRStringStream("b"));
result = engine.scan("A");
assertEquals(result.getType(), Atype);
engine = new Interpreter(g, new ANTLRStringStream("baa"));
result = engine.scan("A");
assertEquals(result.getType(), Atype);
}
@Test public void testSimpleLoops() throws Exception {
Grammar g = new Grammar(
"lexer grammar t;\n"+
"A : ('0'..'9')+ '.' ('0'..'9')* | ('0'..'9')+ ;\n");
final int Atype = g.getTokenType("A");
CharStream input = new ANTLRStringStream("1234.5");
Interpreter engine = new Interpreter(g, input);
Token result = engine.scan("A");
assertEquals(Atype, result.getType());
}
@Test public void testTokensRules() throws Exception {
Grammar pg = new Grammar(
"parser grammar p;\n"+
"a : (INT|FLOAT|WS)+;\n");
Grammar g = new Grammar();
g.importTokenVocabulary(pg);
g.setFileName("<string>");
g.setGrammarContent(
"lexer grammar t;\n"+
"INT : (DIGIT)+ ;\n"+
"FLOAT : (DIGIT)+ '.' (DIGIT)* ;\n"+
"fragment DIGIT : '0'..'9';\n" +
"WS : (' ')+ {channel=99;};\n");
CharStream input = new ANTLRStringStream("123 139.52");
Interpreter lexEngine = new Interpreter(g, input);
CommonTokenStream tokens = new CommonTokenStream(lexEngine);
tokens.LT(5); // make sure it grabs all tokens
String result = tokens.toString();
//System.out.println(result);
String expecting = "123 139.52";
assertEquals(expecting, result);
}
}