TestInterpretedParsing.java revision 324c4644fee44b9898524c09511bd33c3f12e2df
1/*
2 * [The "BSD license"]
3 *  Copyright (c) 2010 Terence Parr
4 *  All rights reserved.
5 *
6 *  Redistribution and use in source and binary forms, with or without
7 *  modification, are permitted provided that the following conditions
8 *  are met:
9 *  1. Redistributions of source code must retain the above copyright
10 *      notice, this list of conditions and the following disclaimer.
11 *  2. Redistributions in binary form must reproduce the above copyright
12 *      notice, this list of conditions and the following disclaimer in the
13 *      documentation and/or other materials provided with the distribution.
14 *  3. The name of the author may not be used to endorse or promote products
15 *      derived from this software without specific prior written permission.
16 *
17 *  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 *  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 *  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28package org.antlr.test;
29
30import org.antlr.runtime.ANTLRStringStream;
31import org.antlr.runtime.CharStream;
32import org.antlr.runtime.tree.ParseTree;
33import org.antlr.tool.Grammar;
34import org.antlr.tool.Interpreter;
35import org.junit.Test;
36
37public class TestInterpretedParsing extends BaseTest {
38    /** Public default constructor used by TestRig */
39    public TestInterpretedParsing() {
40    }
41
42    @Test public void testSimpleParse() throws Exception {
43        Grammar pg = new Grammar(
44            "parser grammar p;\n"+
45            "prog : WHILE ID LCURLY (assign)* RCURLY EOF;\n" +
46            "assign : ID ASSIGN expr SEMI ;\n" +
47			"expr : INT | FLOAT | ID ;\n");
48		Grammar g = new Grammar();
49		g.importTokenVocabulary(pg);
50		g.setFileName(Grammar.IGNORE_STRING_IN_GRAMMAR_FILE_NAME +"string");
51		g.setGrammarContent(
52			"lexer grammar t;\n"+
53			"WHILE : 'while';\n"+
54			"LCURLY : '{';\n"+
55			"RCURLY : '}';\n"+
56			"ASSIGN : '=';\n"+
57			"SEMI : ';';\n"+
58			"ID : ('a'..'z')+ ;\n"+
59			"INT : (DIGIT)+ ;\n"+
60			"FLOAT : (DIGIT)+ '.' (DIGIT)* ;\n"+
61			"fragment DIGIT : '0'..'9';\n" +
62			"WS : (' ')+ ;\n");
63		CharStream input = new ANTLRStringStream("while x { i=1; y=3.42; z=y; }");
64		Interpreter lexEngine = new Interpreter(g, input);
65
66		FilteringTokenStream tokens = new FilteringTokenStream(lexEngine);
67		tokens.setTokenTypeChannel(g.getTokenType("WS"), 99);
68		//System.out.println("tokens="+tokens.toString());
69		Interpreter parseEngine = new Interpreter(pg, tokens);
70		ParseTree t = parseEngine.parse("prog");
71		String result = t.toStringTree();
72		String expecting =
73			"(<grammar p> (prog while x { (assign i = (expr 1) ;) (assign y = (expr 3.42) ;) (assign z = (expr y) ;) } <EOF>))";
74		assertEquals(expecting, result);
75	}
76
77	@Test public void testMismatchedTokenError() throws Exception {
78		Grammar pg = new Grammar(
79			"parser grammar p;\n"+
80			"prog : WHILE ID LCURLY (assign)* RCURLY;\n" +
81			"assign : ID ASSIGN expr SEMI ;\n" +
82			"expr : INT | FLOAT | ID ;\n");
83		Grammar g = new Grammar();
84		g.setFileName(Grammar.IGNORE_STRING_IN_GRAMMAR_FILE_NAME +"string");
85		g.importTokenVocabulary(pg);
86		g.setGrammarContent(
87			"lexer grammar t;\n"+
88			"WHILE : 'while';\n"+
89			"LCURLY : '{';\n"+
90			"RCURLY : '}';\n"+
91			"ASSIGN : '=';\n"+
92			"SEMI : ';';\n"+
93			"ID : ('a'..'z')+ ;\n"+
94			"INT : (DIGIT)+ ;\n"+
95			"FLOAT : (DIGIT)+ '.' (DIGIT)* ;\n"+
96			"fragment DIGIT : '0'..'9';\n" +
97			"WS : (' ')+ ;\n");
98		CharStream input = new ANTLRStringStream("while x { i=1 y=3.42; z=y; }");
99		Interpreter lexEngine = new Interpreter(g, input);
100
101		FilteringTokenStream tokens = new FilteringTokenStream(lexEngine);
102		tokens.setTokenTypeChannel(g.getTokenType("WS"), 99);
103		//System.out.println("tokens="+tokens.toString());
104		Interpreter parseEngine = new Interpreter(pg, tokens);
105		ParseTree t = parseEngine.parse("prog");
106		String result = t.toStringTree();
107		String expecting =
108			"(<grammar p> (prog while x { (assign i = (expr 1) MismatchedTokenException(6!=10))))";
109		assertEquals(expecting, result);
110	}
111
112	@Test public void testMismatchedSetError() throws Exception {
113		Grammar pg = new Grammar(
114			"parser grammar p;\n"+
115			"prog : WHILE ID LCURLY (assign)* RCURLY;\n" +
116			"assign : ID ASSIGN expr SEMI ;\n" +
117			"expr : INT | FLOAT | ID ;\n");
118		Grammar g = new Grammar();
119		g.importTokenVocabulary(pg);
120		g.setFileName("<string>");
121		g.setGrammarContent(
122			"lexer grammar t;\n"+
123			"WHILE : 'while';\n"+
124			"LCURLY : '{';\n"+
125			"RCURLY : '}';\n"+
126			"ASSIGN : '=';\n"+
127			"SEMI : ';';\n"+
128			"ID : ('a'..'z')+ ;\n"+
129			"INT : (DIGIT)+ ;\n"+
130			"FLOAT : (DIGIT)+ '.' (DIGIT)* ;\n"+
131			"fragment DIGIT : '0'..'9';\n" +
132			"WS : (' ')+ ;\n");
133		CharStream input = new ANTLRStringStream("while x { i=; y=3.42; z=y; }");
134		Interpreter lexEngine = new Interpreter(g, input);
135
136		FilteringTokenStream tokens = new FilteringTokenStream(lexEngine);
137		tokens.setTokenTypeChannel(g.getTokenType("WS"), 99);
138		//System.out.println("tokens="+tokens.toString());
139		Interpreter parseEngine = new Interpreter(pg, tokens);
140		ParseTree t = parseEngine.parse("prog");
141		String result = t.toStringTree();
142		String expecting =
143			"(<grammar p> (prog while x { (assign i = (expr MismatchedSetException(10!={5,6,7})))))";
144		assertEquals(expecting, result);
145	}
146
147	@Test public void testNoViableAltError() throws Exception {
148		Grammar pg = new Grammar(
149			"parser grammar p;\n"+
150			"prog : WHILE ID LCURLY (assign)* RCURLY;\n" +
151			"assign : ID ASSIGN expr SEMI ;\n" +
152			"expr : {;}INT | FLOAT | ID ;\n");
153		Grammar g = new Grammar();
154		g.importTokenVocabulary(pg);
155		g.setFileName("<string>");
156		g.setGrammarContent(
157			"lexer grammar t;\n"+
158			"WHILE : 'while';\n"+
159			"LCURLY : '{';\n"+
160			"RCURLY : '}';\n"+
161			"ASSIGN : '=';\n"+
162			"SEMI : ';';\n"+
163			"ID : ('a'..'z')+ ;\n"+
164			"INT : (DIGIT)+ ;\n"+
165			"FLOAT : (DIGIT)+ '.' (DIGIT)* ;\n"+
166			"fragment DIGIT : '0'..'9';\n" +
167			"WS : (' ')+ ;\n");
168		CharStream input = new ANTLRStringStream("while x { i=; y=3.42; z=y; }");
169		Interpreter lexEngine = new Interpreter(g, input);
170
171		FilteringTokenStream tokens = new FilteringTokenStream(lexEngine);
172		tokens.setTokenTypeChannel(g.getTokenType("WS"), 99);
173		//System.out.println("tokens="+tokens.toString());
174		Interpreter parseEngine = new Interpreter(pg, tokens);
175		ParseTree t = parseEngine.parse("prog");
176		String result = t.toStringTree();
177		String expecting =
178			"(<grammar p> (prog while x { (assign i = (expr NoViableAltException(10@[4:1: expr : ( INT | FLOAT | ID );])))))";
179		assertEquals(expecting, result);
180	}
181
182}
183