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.junit.Test; 31 32 /** Test the set stuff in lexer and parser */ 33 public class TestSets extends BaseTest { 34 protected boolean debug = false; 35 36 /** Public default constructor used by TestRig */ TestSets()37 public TestSets() { 38 } 39 testSeqDoesNotBecomeSet()40 @Test public void testSeqDoesNotBecomeSet() throws Exception { 41 // this must return A not I to the parser; calling a nonfragment rule 42 // from a nonfragment rule does not set the overall token. 43 String grammar = 44 "grammar P;\n" + 45 "a : C {System.out.println(input);} ;\n" + 46 "fragment A : '1' | '2';\n" + 47 "fragment B : '3' '4';\n" + 48 "C : A | B;\n"; 49 String found = execParser("P.g", grammar, "PParser", "PLexer", 50 "a", "34", debug); 51 assertEquals("34\n", found); 52 } 53 testParserSet()54 @Test public void testParserSet() throws Exception { 55 String grammar = 56 "grammar T;\n" + 57 "a : t=('x'|'y') {System.out.println($t.text);} ;\n"; 58 String found = execParser("T.g", grammar, "TParser", "TLexer", 59 "a", "x", debug); 60 assertEquals("x\n", found); 61 } 62 testParserNotSet()63 @Test public void testParserNotSet() throws Exception { 64 String grammar = 65 "grammar T;\n" + 66 "a : t=~('x'|'y') 'z' {System.out.println($t.text);} ;\n"; 67 String found = execParser("T.g", grammar, "TParser", "TLexer", 68 "a", "zz", debug); 69 assertEquals("z\n", found); 70 } 71 testParserNotToken()72 @Test public void testParserNotToken() throws Exception { 73 String grammar = 74 "grammar T;\n" + 75 "a : ~'x' 'z' {System.out.println(input);} ;\n"; 76 String found = execParser("T.g", grammar, "TParser", "TLexer", 77 "a", "zz", debug); 78 assertEquals("zz\n", found); 79 } 80 testParserNotTokenWithLabel()81 @Test public void testParserNotTokenWithLabel() throws Exception { 82 String grammar = 83 "grammar T;\n" + 84 "a : t=~'x' 'z' {System.out.println($t.text);} ;\n"; 85 String found = execParser("T.g", grammar, "TParser", "TLexer", 86 "a", "zz", debug); 87 assertEquals("z\n", found); 88 } 89 testRuleAsSet()90 @Test public void testRuleAsSet() throws Exception { 91 String grammar = 92 "grammar T;\n" + 93 "a @after {System.out.println(input);} : 'a' | 'b' |'c' ;\n"; 94 String found = execParser("T.g", grammar, "TParser", "TLexer", 95 "a", "b", debug); 96 assertEquals("b\n", found); 97 } 98 testRuleAsSetAST()99 @Test public void testRuleAsSetAST() throws Exception { 100 String grammar = 101 "grammar T;\n" + 102 "options {output=AST;}\n" + 103 "a : 'a' | 'b' |'c' ;\n"; 104 String found = execParser("T.g", grammar, "TParser", "TLexer", 105 "a", "b", debug); 106 assertEquals("b\n", found); 107 } 108 testNotChar()109 @Test public void testNotChar() throws Exception { 110 String grammar = 111 "grammar T;\n" + 112 "a : A {System.out.println($A.text);} ;\n" + 113 "A : ~'b' ;\n"; 114 String found = execParser("T.g", grammar, "TParser", "TLexer", 115 "a", "x", debug); 116 assertEquals("x\n", found); 117 } 118 testOptionalSingleElement()119 @Test public void testOptionalSingleElement() throws Exception { 120 String grammar = 121 "grammar T;\n" + 122 "a : A? 'c' {System.out.println(input);} ;\n" + 123 "A : 'b' ;\n"; 124 String found = execParser("T.g", grammar, "TParser", "TLexer", 125 "a", "bc", debug); 126 assertEquals("bc\n", found); 127 } 128 testOptionalLexerSingleElement()129 @Test public void testOptionalLexerSingleElement() throws Exception { 130 String grammar = 131 "grammar T;\n" + 132 "a : A {System.out.println(input);} ;\n" + 133 "A : 'b'? 'c' ;\n"; 134 String found = execParser("T.g", grammar, "TParser", "TLexer", 135 "a", "bc", debug); 136 assertEquals("bc\n", found); 137 } 138 testStarLexerSingleElement()139 @Test public void testStarLexerSingleElement() throws Exception { 140 String grammar = 141 "grammar T;\n" + 142 "a : A {System.out.println(input);} ;\n" + 143 "A : 'b'* 'c' ;\n"; 144 String found = execParser("T.g", grammar, "TParser", "TLexer", 145 "a", "bbbbc", debug); 146 assertEquals("bbbbc\n", found); 147 found = execParser("T.g", grammar, "TParser", "TLexer", 148 "a", "c", debug); 149 assertEquals("c\n", found); 150 } 151 testPlusLexerSingleElement()152 @Test public void testPlusLexerSingleElement() throws Exception { 153 String grammar = 154 "grammar T;\n" + 155 "a : A {System.out.println(input);} ;\n" + 156 "A : 'b'+ 'c' ;\n"; 157 String found = execParser("T.g", grammar, "TParser", "TLexer", 158 "a", "bbbbc", debug); 159 assertEquals("bbbbc\n", found); 160 } 161 testOptionalSet()162 @Test public void testOptionalSet() throws Exception { 163 String grammar = 164 "grammar T;\n" + 165 "a : ('a'|'b')? 'c' {System.out.println(input);} ;\n"; 166 String found = execParser("T.g", grammar, "TParser", "TLexer", 167 "a", "ac", debug); 168 assertEquals("ac\n", found); 169 } 170 testStarSet()171 @Test public void testStarSet() throws Exception { 172 String grammar = 173 "grammar T;\n" + 174 "a : ('a'|'b')* 'c' {System.out.println(input);} ;\n"; 175 String found = execParser("T.g", grammar, "TParser", "TLexer", 176 "a", "abaac", debug); 177 assertEquals("abaac\n", found); 178 } 179 testPlusSet()180 @Test public void testPlusSet() throws Exception { 181 String grammar = 182 "grammar T;\n" + 183 "a : ('a'|'b')+ 'c' {System.out.println(input);} ;\n"; 184 String found = execParser("T.g", grammar, "TParser", "TLexer", 185 "a", "abaac", debug); 186 assertEquals("abaac\n", found); 187 } 188 testLexerOptionalSet()189 @Test public void testLexerOptionalSet() throws Exception { 190 String grammar = 191 "grammar T;\n" + 192 "a : A {System.out.println(input);} ;\n" + 193 "A : ('a'|'b')? 'c' ;\n"; 194 String found = execParser("T.g", grammar, "TParser", "TLexer", 195 "a", "ac", debug); 196 assertEquals("ac\n", found); 197 } 198 testLexerStarSet()199 @Test public void testLexerStarSet() throws Exception { 200 String grammar = 201 "grammar T;\n" + 202 "a : A {System.out.println(input);} ;\n" + 203 "A : ('a'|'b')* 'c' ;\n"; 204 String found = execParser("T.g", grammar, "TParser", "TLexer", 205 "a", "abaac", debug); 206 assertEquals("abaac\n", found); 207 } 208 testLexerPlusSet()209 @Test public void testLexerPlusSet() throws Exception { 210 String grammar = 211 "grammar T;\n" + 212 "a : A {System.out.println(input);} ;\n" + 213 "A : ('a'|'b')+ 'c' ;\n"; 214 String found = execParser("T.g", grammar, "TParser", "TLexer", 215 "a", "abaac", debug); 216 assertEquals("abaac\n", found); 217 } 218 testNotCharSet()219 @Test public void testNotCharSet() throws Exception { 220 String grammar = 221 "grammar T;\n" + 222 "a : A {System.out.println($A.text);} ;\n" + 223 "A : ~('b'|'c') ;\n"; 224 String found = execParser("T.g", grammar, "TParser", "TLexer", 225 "a", "x", debug); 226 assertEquals("x\n", found); 227 } 228 testNotCharSetWithLabel()229 @Test public void testNotCharSetWithLabel() throws Exception { 230 // This doesn't work in lexer yet. 231 // Generates: h=input.LA(1); but h is defined as a Token 232 String grammar = 233 "grammar T;\n" + 234 "a : A {System.out.println($A.text);} ;\n" + 235 "A : h=~('b'|'c') ;\n"; 236 String found = execParser("T.g", grammar, "TParser", "TLexer", 237 "a", "x", debug); 238 assertEquals("x\n", found); 239 } 240 testNotCharSetWithRuleRef()241 @Test public void testNotCharSetWithRuleRef() throws Exception { 242 String grammar = 243 "grammar T;\n" + 244 "a : A {System.out.println($A.text);} ;\n" + 245 "A : ~('a'|B) ;\n" + 246 "B : 'b' ;\n"; 247 String found = execParser("T.g", grammar, "TParser", "TLexer", 248 "a", "x", debug); 249 assertEquals("x\n", found); 250 } 251 testNotCharSetWithRuleRef2()252 @Test public void testNotCharSetWithRuleRef2() throws Exception { 253 String grammar = 254 "grammar T;\n" + 255 "a : A {System.out.println($A.text);} ;\n" + 256 "A : ~('a'|B) ;\n" + 257 "B : 'b'|'c' ;\n"; 258 String found = execParser("T.g", grammar, "TParser", "TLexer", 259 "a", "x", debug); 260 assertEquals("x\n", found); 261 } 262 testNotCharSetWithRuleRef3()263 @Test public void testNotCharSetWithRuleRef3() throws Exception { 264 String grammar = 265 "grammar T;\n" + 266 "a : A {System.out.println($A.text);} ;\n" + 267 "A : ('a'|B) ;\n" + 268 "fragment\n" + 269 "B : ~('a'|'c') ;\n"; 270 String found = execParser("T.g", grammar, "TParser", "TLexer", 271 "a", "x", debug); 272 assertEquals("x\n", found); 273 } 274 testNotCharSetWithRuleRef4()275 @Test public void testNotCharSetWithRuleRef4() throws Exception { 276 String grammar = 277 "grammar T;\n" + 278 "a : A {System.out.println($A.text);} ;\n" + 279 "A : ('a'|B) ;\n" + 280 "fragment\n" + 281 "B : ~('a'|C) ;\n" + 282 "fragment\n" + 283 "C : 'c'|'d' ;\n "; 284 String found = execParser("T.g", grammar, "TParser", "TLexer", 285 "a", "x", debug); 286 assertEquals("x\n", found); 287 } 288 289 } 290