| /* |
| * [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); |
| } |
| |
| } |