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  */
28 package org.antlr.test;
29 
30 import org.antlr.runtime.ANTLRStringStream;
31 import org.antlr.runtime.CharStream;
32 import org.antlr.runtime.tree.ParseTree;
33 import org.antlr.tool.Grammar;
34 import org.antlr.tool.Interpreter;
35 import org.junit.Test;
36 
37 public class TestInterpretedParsing extends BaseTest {
38     /** Public default constructor used by TestRig */
TestInterpretedParsing()39     public TestInterpretedParsing() {
40     }
41 
testSimpleParse()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 
testMismatchedTokenError()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 
testMismatchedSetError()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 
testNoViableAltError()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