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.tool.Grammar;
31 import org.junit.Test;
32 
33 public class TestASTConstruction extends BaseTest {
34 
35     /** Public default constructor used by TestRig */
TestASTConstruction()36     public TestASTConstruction() {
37     }
38 
testA()39 	@Test public void testA() throws Exception {
40 		Grammar g = new Grammar(
41 				"parser grammar P;\n"+
42 				"a : A;");
43 		String expecting =
44 			"(rule a ARG RET scope (BLOCK (ALT A <end-of-alt>) <end-of-block>) <end-of-rule>)";
45 		String found = g.getRule("a").tree.toStringTree();
46 		assertEquals(expecting, found);
47 	}
48 
testEmptyAlt()49 	@Test public void testEmptyAlt() throws Exception {
50 		Grammar g = new Grammar(
51 				"parser grammar P;\n"+
52 				"a : ;");
53 		String expecting =
54 			"(rule a ARG RET scope (BLOCK (ALT epsilon <end-of-alt>) <end-of-block>) <end-of-rule>)";
55 		String found = g.getRule("a").tree.toStringTree();
56 		assertEquals(expecting, found);
57 	}
58 
testNakeRulePlusInLexer()59 	@Test public void testNakeRulePlusInLexer() throws Exception {
60 		Grammar g = new Grammar(
61 				"lexer grammar P;\n"+
62 				"A : B+;\n" +
63 				"B : 'a';");
64 		String expecting =
65 			"(rule A ARG RET scope (BLOCK (ALT (+ (BLOCK (ALT B <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
66 		String found = g.getRule("A").tree.toStringTree();
67 		assertEquals(expecting, found);
68 	}
69 
testRulePlus()70 	@Test public void testRulePlus() throws Exception {
71 		Grammar g = new Grammar(
72 				"parser grammar P;\n"+
73 				"a : (b)+;\n" +
74 				"b : B;");
75 		String expecting =
76 			"(rule a ARG RET scope (BLOCK (ALT (+ (BLOCK (ALT b <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
77 		String found = g.getRule("a").tree.toStringTree();
78 		assertEquals(expecting, found);
79 	}
80 
testNakedRulePlus()81 	@Test public void testNakedRulePlus() throws Exception {
82 		Grammar g = new Grammar(
83 				"parser grammar P;\n"+
84 				"a : b+;\n" +
85 				"b : B;");
86 		String expecting =
87 			"(rule a ARG RET scope (BLOCK (ALT (+ (BLOCK (ALT b <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
88 		String found = g.getRule("a").tree.toStringTree();
89 		assertEquals(expecting, found);
90 	}
91 
testRuleOptional()92 	@Test public void testRuleOptional() throws Exception {
93 		Grammar g = new Grammar(
94 				"parser grammar P;\n"+
95 				"a : (b)?;\n" +
96 				"b : B;");
97 		String expecting =
98 			"(rule a ARG RET scope (BLOCK (ALT (? (BLOCK (ALT b <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
99 		String found = g.getRule("a").tree.toStringTree();
100 		assertEquals(expecting, found);
101 	}
102 
testNakedRuleOptional()103 	@Test public void testNakedRuleOptional() throws Exception {
104 		Grammar g = new Grammar(
105 				"parser grammar P;\n"+
106 				"a : b?;\n" +
107 				"b : B;");
108 		String expecting =
109 			"(rule a ARG RET scope (BLOCK (ALT (? (BLOCK (ALT b <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
110 		String found = g.getRule("a").tree.toStringTree();
111 		assertEquals(expecting, found);
112 	}
113 
testRuleStar()114 	@Test public void testRuleStar() throws Exception {
115 		Grammar g = new Grammar(
116 				"parser grammar P;\n"+
117 				"a : (b)*;\n" +
118 				"b : B;");
119 		String expecting =
120 			"(rule a ARG RET scope (BLOCK (ALT (* (BLOCK (ALT b <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
121 		String found = g.getRule("a").tree.toStringTree();
122 		assertEquals(expecting, found);
123 	}
124 
testNakedRuleStar()125 	@Test public void testNakedRuleStar() throws Exception {
126 		Grammar g = new Grammar(
127 				"parser grammar P;\n"+
128 				"a : b*;\n" +
129 				"b : B;");
130 		String expecting =
131 			"(rule a ARG RET scope (BLOCK (ALT (* (BLOCK (ALT b <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
132 		String found = g.getRule("a").tree.toStringTree();
133 		assertEquals(expecting, found);
134 	}
135 
testCharStar()136 	@Test public void testCharStar() throws Exception {
137 		Grammar g = new Grammar(
138 				"grammar P;\n"+
139 				"a : 'a'*;");
140 		String expecting =
141 			"(rule a ARG RET scope (BLOCK (ALT (* (BLOCK (ALT 'a' <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
142 		String found = g.getRule("a").tree.toStringTree();
143 		assertEquals(expecting, found);
144 	}
145 
testCharStarInLexer()146 	@Test public void testCharStarInLexer() throws Exception {
147 		Grammar g = new Grammar(
148 				"lexer grammar P;\n"+
149 				"B : 'b'*;");
150 		String expecting =
151 			"(rule B ARG RET scope (BLOCK (ALT (* (BLOCK (ALT 'b' <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
152 		String found = g.getRule("B").tree.toStringTree();
153 		assertEquals(expecting, found);
154 	}
155 
testStringStar()156 	@Test public void testStringStar() throws Exception {
157 		Grammar g = new Grammar(
158 				"grammar P;\n"+
159 				"a : 'while'*;");
160 		String expecting =
161 			"(rule a ARG RET scope (BLOCK (ALT (* (BLOCK (ALT 'while' <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
162 		String found = g.getRule("a").tree.toStringTree();
163 		assertEquals(expecting, found);
164 	}
165 
testStringStarInLexer()166 	@Test public void testStringStarInLexer() throws Exception {
167 		Grammar g = new Grammar(
168 				"lexer grammar P;\n"+
169 				"B : 'while'*;");
170 		String expecting =
171 			"(rule B ARG RET scope (BLOCK (ALT (* (BLOCK (ALT 'while' <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
172 		String found = g.getRule("B").tree.toStringTree();
173 		assertEquals(expecting, found);
174 	}
175 
testCharPlus()176 	@Test public void testCharPlus() throws Exception {
177 		Grammar g = new Grammar(
178 				"grammar P;\n"+
179 				"a : 'a'+;");
180 		String expecting =
181 			"(rule a ARG RET scope (BLOCK (ALT (+ (BLOCK (ALT 'a' <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
182 		String found = g.getRule("a").tree.toStringTree();
183 		assertEquals(expecting, found);
184 	}
185 
testCharPlusInLexer()186 	@Test public void testCharPlusInLexer() throws Exception {
187 		Grammar g = new Grammar(
188 				"lexer grammar P;\n"+
189 				"B : 'b'+;");
190 		String expecting =
191 			"(rule B ARG RET scope (BLOCK (ALT (+ (BLOCK (ALT 'b' <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
192 		String found = g.getRule("B").tree.toStringTree();
193 		assertEquals(expecting, found);
194 	}
195 
testCharOptional()196 	@Test public void testCharOptional() throws Exception {
197 		Grammar g = new Grammar(
198 				"grammar P;\n"+
199 				"a : 'a'?;");
200 		String expecting =
201 			"(rule a ARG RET scope (BLOCK (ALT (? (BLOCK (ALT 'a' <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
202 		String found = g.getRule("a").tree.toStringTree();
203 		assertEquals(expecting, found);
204 	}
205 
testCharOptionalInLexer()206 	@Test public void testCharOptionalInLexer() throws Exception {
207 		Grammar g = new Grammar(
208 				"lexer grammar P;\n"+
209 				"B : 'b'?;");
210 		String expecting =
211 			"(rule B ARG RET scope (BLOCK (ALT (? (BLOCK (ALT 'b' <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
212 		String found = g.getRule("B").tree.toStringTree();
213 		assertEquals(expecting, found);
214 	}
215 
testCharRangePlus()216 	@Test public void testCharRangePlus() throws Exception {
217 		Grammar g = new Grammar(
218 				"lexer grammar P;\n"+
219 				"ID : 'a'..'z'+;");
220 		String expecting =
221 			"(rule ID ARG RET scope (BLOCK (ALT (+ (BLOCK (ALT (.. 'a' 'z') <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
222 		String found = g.getRule("ID").tree.toStringTree();
223 		assertEquals(expecting, found);
224 	}
225 
testLabel()226 	@Test public void testLabel() throws Exception {
227 		Grammar g = new Grammar(
228 				"grammar P;\n"+
229 				"a : x=ID;");
230 		String expecting =
231 			"(rule a ARG RET scope (BLOCK (ALT (= x ID) <end-of-alt>) <end-of-block>) <end-of-rule>)";
232 		String found = g.getRule("a").tree.toStringTree();
233 		assertEquals(expecting, found);
234 	}
235 
testLabelOfOptional()236 	@Test public void testLabelOfOptional() throws Exception {
237 		Grammar g = new Grammar(
238 				"grammar P;\n"+
239 				"a : x=ID?;");
240 		String expecting =
241 			"(rule a ARG RET scope (BLOCK (ALT (? (BLOCK (ALT (= x ID) <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
242 		String found = g.getRule("a").tree.toStringTree();
243 		assertEquals(expecting, found);
244 	}
245 
testLabelOfClosure()246 	@Test public void testLabelOfClosure() throws Exception {
247 		Grammar g = new Grammar(
248 				"grammar P;\n"+
249 				"a : x=ID*;");
250 		String expecting =
251 			"(rule a ARG RET scope (BLOCK (ALT (* (BLOCK (ALT (= x ID) <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
252 		String found = g.getRule("a").tree.toStringTree();
253 		assertEquals(expecting, found);
254 	}
255 
testRuleLabel()256 	@Test public void testRuleLabel() throws Exception {
257 		Grammar g = new Grammar(
258 				"grammar P;\n"+
259 				"a : x=b;\n" +
260 				"b : ID;\n");
261 		String expecting =
262 			"(rule a ARG RET scope (BLOCK (ALT (= x b) <end-of-alt>) <end-of-block>) <end-of-rule>)";
263 		String found = g.getRule("a").tree.toStringTree();
264 		assertEquals(expecting, found);
265 	}
266 
testSetLabel()267 	@Test public void testSetLabel() throws Exception {
268 		Grammar g = new Grammar(
269 				"grammar P;\n"+
270 				"a : x=(A|B);\n");
271 		String expecting =
272 			"(rule a ARG RET scope (BLOCK (ALT (= x (BLOCK (ALT A <end-of-alt>) (ALT B <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
273 		String found = g.getRule("a").tree.toStringTree();
274 		assertEquals(expecting, found);
275 	}
276 
testNotSetLabel()277 	@Test public void testNotSetLabel() throws Exception {
278 		Grammar g = new Grammar(
279 				"grammar P;\n"+
280 				"a : x=~(A|B);\n");
281 		String expecting =
282 			"(rule a ARG RET scope (BLOCK (ALT (= x (~ (BLOCK (ALT A <end-of-alt>) (ALT B <end-of-alt>) <end-of-block>))) <end-of-alt>) <end-of-block>) <end-of-rule>)";
283 		String found = g.getRule("a").tree.toStringTree();
284 		assertEquals(expecting, found);
285 	}
286 
testNotSetListLabel()287 	@Test public void testNotSetListLabel() throws Exception {
288 		Grammar g = new Grammar(
289 				"grammar P;\n"+
290 				"a : x+=~(A|B);\n");
291 		String expecting =
292 			"(rule a ARG RET scope (BLOCK (ALT (+= x (~ (BLOCK (ALT A <end-of-alt>) (ALT B <end-of-alt>) <end-of-block>))) <end-of-alt>) <end-of-block>) <end-of-rule>)";
293 		String found = g.getRule("a").tree.toStringTree();
294 		assertEquals(expecting, found);
295 	}
296 
testNotSetListLabelInLoop()297 	@Test public void testNotSetListLabelInLoop() throws Exception {
298 		Grammar g = new Grammar(
299 				"grammar P;\n"+
300 				"a : x+=~(A|B)+;\n");
301 		String expecting =
302 			"(rule a ARG RET scope (BLOCK (ALT (+ (BLOCK (ALT (+= x (~ (BLOCK (ALT A <end-of-alt>) (ALT B <end-of-alt>) <end-of-block>))) <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
303 		String found = g.getRule("a").tree.toStringTree();
304 		assertEquals(expecting, found);
305 	}
306 
testRuleLabelOfPositiveClosure()307 	@Test public void testRuleLabelOfPositiveClosure() throws Exception {
308 		Grammar g = new Grammar(
309 				"grammar P;\n"+
310 				"a : x=b+;\n" +
311 				"b : ID;\n");
312 		String expecting =
313 			"(rule a ARG RET scope (BLOCK (ALT (+ (BLOCK (ALT (= x b) <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
314 		String found = g.getRule("a").tree.toStringTree();
315 		assertEquals(expecting, found);
316 	}
317 
testListLabelOfClosure()318 	@Test public void testListLabelOfClosure() throws Exception {
319 		Grammar g = new Grammar(
320 				"grammar P;\n"+
321 				"a : x+=ID*;");
322 		String expecting =
323 			"(rule a ARG RET scope (BLOCK (ALT (* (BLOCK (ALT (+= x ID) <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
324 		String found = g.getRule("a").tree.toStringTree();
325 		assertEquals(expecting, found);
326 	}
327 
testListLabelOfClosure2()328 	@Test public void testListLabelOfClosure2() throws Exception {
329 		Grammar g = new Grammar(
330 				"grammar P;\n"+
331 				"a : x+='int'*;");
332 		String expecting =
333 			"(rule a ARG RET scope (BLOCK (ALT (* (BLOCK (ALT (+= x 'int') <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
334 		String found = g.getRule("a").tree.toStringTree();
335 		assertEquals(expecting, found);
336 	}
337 
testRuleListLabelOfPositiveClosure()338 	@Test public void testRuleListLabelOfPositiveClosure() throws Exception {
339 		Grammar g = new Grammar(
340 				"grammar P;\n" +
341 				"options {output=AST;}\n"+
342 				"a : x+=b+;\n" +
343 				"b : ID;\n");
344 		String expecting =
345 			"(rule a ARG RET scope (BLOCK (ALT (+ (BLOCK (ALT (+= x b) <end-of-alt>) <end-of-block>)) <end-of-alt>) <end-of-block>) <end-of-rule>)";
346 		String found = g.getRule("a").tree.toStringTree();
347 		assertEquals(expecting, found);
348 	}
349 
testRootTokenInStarLoop()350 	@Test public void testRootTokenInStarLoop() throws Exception {
351 		Grammar g = new Grammar(
352 				"grammar Expr;\n" +
353 				"options { output=AST; backtrack=true; }\n" +
354 				"a : ('*'^)* ;\n");  // bug: the synpred had nothing in it
355 		String expecting =
356 			"(rule synpred1_Expr ARG RET scope (BLOCK (ALT '*' <end-of-alt>) <end-of-block>) <end-of-rule>)";
357 		String found = g.getRule("synpred1_Expr").tree.toStringTree();
358 		assertEquals(expecting, found);
359 	}
360 
testActionInStarLoop()361 	@Test public void testActionInStarLoop() throws Exception {
362 		Grammar g = new Grammar(
363 				"grammar Expr;\n" +
364 				"options { backtrack=true; }\n" +
365 				"a : ({blort} 'x')* ;\n");  // bug: the synpred had nothing in it
366 		String expecting =
367 			"(rule synpred1_Expr ARG RET scope (BLOCK (ALT blort 'x' <end-of-alt>) <end-of-block>) <end-of-rule>)";
368 		String found = g.getRule("synpred1_Expr").tree.toStringTree();
369 		assertEquals(expecting, found);
370 	}
371 
372 }
373