1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 3 <head> 4 <meta http-equiv="content-type" content="text/html;charset=utf-8" /> 5 <title>t057autoAST</title> 6 7 <!-- ANTLR includes --> 8 <script type="text/javascript" src="../../lib/antlr3-all.js"></script> 9 10 <script type="text/javascript" src="t057autoAST1Lexer.js"></script> 11 <script type="text/javascript" src="t057autoAST1Parser.js"></script> 12 <script type="text/javascript" src="t057autoAST2Lexer.js"></script> 13 <script type="text/javascript" src="t057autoAST2Parser.js"></script> 14 <script type="text/javascript" src="t057autoAST3Lexer.js"></script> 15 <script type="text/javascript" src="t057autoAST3Parser.js"></script> 16 <script type="text/javascript" src="t057autoAST4Lexer.js"></script> 17 <script type="text/javascript" src="t057autoAST4Parser.js"></script> 18 <script type="text/javascript" src="t057autoAST5Lexer.js"></script> 19 <script type="text/javascript" src="t057autoAST5Parser.js"></script> 20 <script type="text/javascript" src="t057autoAST6Lexer.js"></script> 21 <script type="text/javascript" src="t057autoAST6Parser.js"></script> 22 <script type="text/javascript" src="t057autoAST7Lexer.js"></script> 23 <script type="text/javascript" src="t057autoAST7Parser.js"></script> 24 <script type="text/javascript" src="t057autoAST8Lexer.js"></script> 25 <script type="text/javascript" src="t057autoAST8Parser.js"></script> 26 <script type="text/javascript" src="t057autoAST9Lexer.js"></script> 27 <script type="text/javascript" src="t057autoAST9Parser.js"></script> 28 <script type="text/javascript" src="t057autoAST10Lexer.js"></script> 29 <script type="text/javascript" src="t057autoAST10Parser.js"></script> 30 <script type="text/javascript" src="t057autoAST11Lexer.js"></script> 31 <script type="text/javascript" src="t057autoAST11Parser.js"></script> 32 <script type="text/javascript" src="t057autoAST12Lexer.js"></script> 33 <script type="text/javascript" src="t057autoAST12Parser.js"></script> 34 <script type="text/javascript" src="t057autoAST13Lexer.js"></script> 35 <script type="text/javascript" src="t057autoAST13Parser.js"></script> 36 <script type="text/javascript" src="t057autoAST14Lexer.js"></script> 37 <script type="text/javascript" src="t057autoAST14Parser.js"></script> 38 <script type="text/javascript" src="t057autoAST15Lexer.js"></script> 39 <script type="text/javascript" src="t057autoAST15Parser.js"></script> 40 <script type="text/javascript" src="t057autoAST16Lexer.js"></script> 41 <script type="text/javascript" src="t057autoAST16Parser.js"></script> 42 <script type="text/javascript" src="t057autoAST17Lexer.js"></script> 43 <script type="text/javascript" src="t057autoAST17Parser.js"></script> 44 <script type="text/javascript" src="t057autoAST18Lexer.js"></script> 45 <script type="text/javascript" src="t057autoAST18Parser.js"></script> 46 <script type="text/javascript" src="t057autoAST19Lexer.js"></script> 47 <script type="text/javascript" src="t057autoAST19Parser.js"></script> 48 <script type="text/javascript" src="t057autoAST20Lexer.js"></script> 49 <script type="text/javascript" src="t057autoAST20Parser.js"></script> 50 <script type="text/javascript" src="t057autoAST21Lexer.js"></script> 51 <script type="text/javascript" src="t057autoAST21Parser.js"></script> 52 <script type="text/javascript" src="t057autoAST22Lexer.js"></script> 53 <script type="text/javascript" src="t057autoAST22Parser.js"></script> 54 <script type="text/javascript" src="t057autoAST23Lexer.js"></script> 55 <script type="text/javascript" src="t057autoAST23Parser.js"></script> 56 <script type="text/javascript" src="t057autoAST24Lexer.js"></script> 57 <script type="text/javascript" src="t057autoAST24Parser.js"></script> 58 <script type="text/javascript" src="t057autoAST25Lexer.js"></script> 59 <script type="text/javascript" src="t057autoAST25Parser.js"></script> 60 <script type="text/javascript" src="t057autoAST26Lexer.js"></script> 61 <script type="text/javascript" src="t057autoAST26Parser.js"></script> 62 <script type="text/javascript" src="t057autoAST27Lexer.js"></script> 63 <script type="text/javascript" src="t057autoAST27Parser.js"></script> 64 <script type="text/javascript" src="t057autoAST28Lexer.js"></script> 65 <script type="text/javascript" src="t057autoAST28Parser.js"></script> 66 <script type="text/javascript" src="t057autoAST29Lexer.js"></script> 67 <script type="text/javascript" src="t057autoAST29Parser.js"></script> 68 <script type="text/javascript" src="t057autoAST30Lexer.js"></script> 69 <script type="text/javascript" src="t057autoAST30Parser.js"></script> 70 <script type="text/javascript" src="t057autoAST31Lexer.js"></script> 71 <script type="text/javascript" src="t057autoAST31Parser.js"></script> 72 <script type="text/javascript" src="t057autoAST32Lexer.js"></script> 73 <script type="text/javascript" src="t057autoAST32Parser.js"></script> 74 <script type="text/javascript" src="t057autoAST33Lexer.js"></script> 75 <script type="text/javascript" src="t057autoAST33Parser.js"></script> 76 <script type="text/javascript" src="t057autoAST34Lexer.js"></script> 77 <script type="text/javascript" src="t057autoAST34Parser.js"></script> 78 <script type="text/javascript" src="t057autoAST35Lexer.js"></script> 79 <script type="text/javascript" src="t057autoAST35Parser.js"></script> 80 <script type="text/javascript" src="t057autoAST36Lexer.js"></script> 81 <script type="text/javascript" src="t057autoAST36Parser.js"></script> 82 <script type="text/javascript" src="t057autoAST37Lexer.js"></script> 83 <script type="text/javascript" src="t057autoAST37Parser.js"></script> 84 <script type="text/javascript" src="t057autoAST38Lexer.js"></script> 85 <script type="text/javascript" src="t057autoAST38Parser.js"></script> 86 <script type="text/javascript" src="t057autoAST39Lexer.js"></script> 87 <script type="text/javascript" src="t057autoAST39Parser.js"></script> 88 <script type="text/javascript" src="t057autoAST40Lexer.js"></script> 89 <script type="text/javascript" src="t057autoAST40Parser.js"></script> 90 <script type="text/javascript" src="t057autoAST41Lexer.js"></script> 91 <script type="text/javascript" src="t057autoAST41Parser.js"></script> 92 <script type="text/javascript" src="t057autoAST42Lexer.js"></script> 93 <script type="text/javascript" src="t057autoAST42Parser.js"></script> 94 <script type="text/javascript" src="t057autoAST43Lexer.js"></script> 95 <script type="text/javascript" src="t057autoAST43Parser.js"></script> 96 <script type="text/javascript" src="t057autoAST44Lexer.js"></script> 97 <script type="text/javascript" src="t057autoAST44Parser.js"></script> 98 <script type="text/javascript" src="t057autoAST45Lexer.js"></script> 99 <script type="text/javascript" src="t057autoAST45Parser.js"></script> 100 <script type="text/javascript" src="t057autoAST46Lexer.js"></script> 101 <script type="text/javascript" src="t057autoAST46Parser.js"></script> 102 <script type="text/javascript" src="t057autoAST47Lexer.js"></script> 103 <script type="text/javascript" src="t057autoAST47Parser.js"></script> 104 <script type="text/javascript" src="t057autoAST48Lexer.js"></script> 105 <script type="text/javascript" src="t057autoAST48Parser.js"></script> 106 <script type="text/javascript" src="t057autoAST49Lexer.js"></script> 107 <script type="text/javascript" src="t057autoAST49Parser.js"></script> 108 <script type="text/javascript" src="t057autoAST50Lexer.js"></script> 109 <script type="text/javascript" src="t057autoAST50Parser.js"></script> 110 <script type="text/javascript" src="t057autoAST51Lexer.js"></script> 111 <script type="text/javascript" src="t057autoAST51Parser.js"></script> 112 <script type="text/javascript" src="t057autoAST52Lexer.js"></script> 113 <script type="text/javascript" src="t057autoAST52Parser.js"></script> 114 <script type="text/javascript" src="t057autoAST53Lexer.js"></script> 115 <script type="text/javascript" src="t057autoAST53Parser.js"></script> 116 <script type="text/javascript" src="t057autoAST54Lexer.js"></script> 117 <script type="text/javascript" src="t057autoAST54Parser.js"></script> 118 <script type="text/javascript" src="t057autoAST55Lexer.js"></script> 119 <script type="text/javascript" src="t057autoAST55Parser.js"></script> 120 <script type="text/javascript" src="t057autoAST56Lexer.js"></script> 121 <script type="text/javascript" src="t057autoAST56Parser.js"></script> 122 <script type="text/javascript" src="t057autoAST57Lexer.js"></script> 123 <script type="text/javascript" src="t057autoAST57Parser.js"></script> 124 125 <!-- JsUnit include --> 126 <script type="text/javascript" src="../jsunit/app/jsUnitCore.js"></script> 127 128 <!-- Test Code --> 129 <script type="text/javascript"> 130 // Parser Tests 131 132 function execParser(lexerCls, parserCls, grammarEntry, xinput, expectErrors) { 133 var cstream = new org.antlr.runtime.ANTLRStringStream(xinput), 134 lexer = new (EnhancedParser(lexerCls))(cstream), 135 tstream = new org.antlr.runtime.CommonTokenStream(lexer), 136 parser = new (EnhancedParser(parserCls))(tstream); 137 var r = parser[grammarEntry](); 138 139 if (!expectErrors) { 140 assertEquals(parser._errors.length, 0); 141 } 142 143 var result = ""; 144 if (r) { 145 if (r.result) { 146 result += r.result 147 } 148 if (r.getTree()) { 149 result += r.getTree().toStringTree(); 150 } 151 } 152 153 if (!expectErrors) { 154 return result; 155 } else { 156 return [result, parser._errors]; 157 } 158 } 159 160 function EnhancedParser(base) { 161 var T = function() { 162 T.superclass.constructor.apply(this, arguments); 163 this.traces = []; 164 this.buf = ""; 165 this._errors = []; 166 }; 167 168 org.antlr.lang.extend(T, base, { 169 capture: function(t) { 170 this.buf += t; 171 }, 172 traceIn: function(ruleName, ruleIndex) { 173 this.traces.push(">"+ruleName); 174 }, 175 traceOut: function(ruleName, ruleIndex) { 176 this.traces.push("<"+ruleName); 177 }, 178 emitErrorMessage: function(msg) { 179 this._errors.push(msg); 180 } 181 }); 182 183 return T; 184 } 185 186 function testTokenList() { 187 var found = execParser(t057autoAST1Lexer, t057autoAST1Parser, "a", "abc 34"); 188 assertEquals("abc 34", found); 189 } 190 191 function testTokenListInSingleAltBlock() { 192 var found = execParser(t057autoAST2Lexer, t057autoAST2Parser,"a", "abc 34"); 193 assertEquals("abc 34", found); 194 } 195 196 function testSimpleRootAtOuterLevel() { 197 var found = execParser(t057autoAST3Lexer, t057autoAST3Parser, "a", "abc 34"); 198 assertEquals("(abc 34)", found); 199 } 200 201 function testSimpleRootAtOuterLevelReverse() { 202 var found = execParser(t057autoAST4Lexer, t057autoAST4Parser, "a", "34 abc"); 203 assertEquals("(abc 34)", found); 204 } 205 206 function testBang() { 207 var found = execParser(t057autoAST5Lexer, t057autoAST5Parser, "a", "abc 34 dag 4532"); 208 assertEquals("abc 4532", found); 209 } 210 211 function testOptionalThenRoot() { 212 var found = execParser(t057autoAST6Lexer, t057autoAST6Parser, "a", "a 1 b"); 213 assertEquals("(b a 1)", found); 214 } 215 216 function testLabeledStringRoot() { 217 var found = execParser(t057autoAST7Lexer, t057autoAST7Parser, "a", "void foo;"); 218 assertEquals("(void foo ;)", found); 219 } 220 221 function testWildcard() { 222 var found = execParser(t057autoAST8Lexer, t057autoAST8Parser, "a", "void foo;"); 223 assertEquals("(void foo ;)", found); 224 } 225 226 function testWildcardRoot() { 227 var found = execParser(t057autoAST9Lexer, t057autoAST9Parser, "a", "void foo;"); 228 assertEquals("(foo void ;)", found); 229 } 230 231 function testWildcardRootWithLabel() { 232 var found = execParser(t057autoAST10Lexer, t057autoAST10Parser, "a", "void foo;"); 233 assertEquals("(foo void ;)", found); 234 } 235 236 function testWildcardRootWithListLabel() { 237 var found = execParser(t057autoAST11Lexer, t057autoAST11Parser, "a", "void foo;"); 238 assertEquals("(foo void ;)", found); 239 } 240 241 function testRootRoot() { 242 var found = execParser(t057autoAST12Lexer, t057autoAST12Parser, "a", "a 34 c"); 243 assertEquals("(34 a c)", found); 244 } 245 246 function testRootRoot2() { 247 var found = execParser(t057autoAST13Lexer, t057autoAST13Parser, "a", "a 34 c"); 248 assertEquals("(c (34 a))", found); 249 } 250 251 function testRootThenRootInLoop() { 252 var found = execParser(t057autoAST14Lexer, t057autoAST14Parser, "a", "a 34 * b 9 * c"); 253 assertEquals("(* (* (a 34) b 9) c)", found); 254 } 255 256 function testNestedSubrule() { 257 var found = execParser(t057autoAST15Lexer, t057autoAST15Parser, "a", "void a b;"); 258 assertEquals("void a b ;", found); 259 } 260 261 function testInvokeRule() { 262 var found = execParser(t057autoAST16Lexer, t057autoAST16Parser, "a", "int a"); 263 assertEquals("int a", found); 264 } 265 266 function testInvokeRuleAsRoot() { 267 var found = execParser(t057autoAST17Lexer, t057autoAST17Parser, "a", "int a"); 268 assertEquals("(int a)", found); 269 } 270 271 function testInvokeRuleAsRootWithLabel() { 272 var found = execParser(t057autoAST18Lexer, t057autoAST18Parser, "a", "int a"); 273 assertEquals("(int a)", found); 274 } 275 276 function testInvokeRuleAsRootWithListLabel() { 277 var found = execParser(t057autoAST19Lexer, t057autoAST19Parser, "a", "int a"); 278 assertEquals("(int a)", found); 279 } 280 281 function testRuleRootInLoop() { 282 var found = execParser(t057autoAST20Lexer, t057autoAST20Parser, "a", "a+b+c+d"); 283 assertEquals("(+ (+ (+ a b) c) d)", found); 284 } 285 286 function testRuleInvocationRuleRootInLoop() { 287 var found = execParser(t057autoAST21Lexer, t057autoAST21Parser, "a", "a+b+c-d"); 288 assertEquals("(- (+ (+ a b) c) d)", found); 289 } 290 291 function testTailRecursion() { 292 var found = execParser(t057autoAST22Lexer, t057autoAST22Parser, "s", "3 exp 4 exp 5"); 293 assertEquals("(exp 3 (exp 4 5))", found); 294 } 295 296 function testSet() { 297 var found = execParser(t057autoAST23Lexer, t057autoAST23Parser, "a", "abc"); 298 assertEquals("abc", found); 299 } 300 301 function testSetRoot() { 302 var found = execParser(t057autoAST24Lexer, t057autoAST24Parser, "a", "+abc"); 303 assertEquals("(+ abc)", found); 304 } 305 306 // (a] testbase.broken("FAILS until antlr.g rebuilt in v3", RuntimeError); 307 function testSetRootWithLabel() { 308 var found = execParser(t057autoAST25Lexer, t057autoAST25Parser, "a", "+abc"); 309 assertEquals("(+ abc)", found); 310 } 311 312 function testSetAsRuleRootInLoop() { 313 var found = execParser(t057autoAST26Lexer, t057autoAST26Parser, "a", "a+b-c"); 314 assertEquals("(- (+ a b) c)", found); 315 } 316 317 function testNotSet() { 318 var found = execParser(t057autoAST27Lexer, t057autoAST27Parser, "a", "34+2"); 319 assertEquals("34 + 2", found); 320 } 321 322 function testNotSetWithLabel() { 323 var found = execParser(t057autoAST28Lexer, t057autoAST28Parser, "a", "34+2"); 324 assertEquals("34 + 2", found); 325 } 326 327 function testNotSetWithListLabel() { 328 var found = execParser(t057autoAST29Lexer, t057autoAST29Parser, "a", "34+2"); 329 assertEquals("34 + 2", found); 330 } 331 332 function testNotSetRoot() { 333 var found = execParser(t057autoAST30Lexer, t057autoAST30Parser, "a", "34 55"); 334 assertEquals("(34 55)", found); 335 } 336 337 function testNotSetRootWithLabel() { 338 var found = execParser(t057autoAST31Lexer, t057autoAST31Parser, "a", "34 55"); 339 assertEquals("(34 55)", found); 340 } 341 342 function testNotSetRootWithListLabel() { 343 var found = execParser(t057autoAST32Lexer, t057autoAST32Parser, "a", "34 55"); 344 assertEquals("(34 55)", found); 345 } 346 347 function testNotSetRuleRootInLoop() { 348 var found = execParser(t057autoAST33Lexer, t057autoAST33Parser, "a", "3+4+5"); 349 assertEquals("(+ (+ 3 4) 5)", found); 350 } 351 352 // (a] testbase.broken("FIXME: What happened to the semicolon?", AssertionError); 353 function testTokenLabelReuse() { 354 // check for compilation problem due to multiple defines 355 var found = execParser(t057autoAST34Lexer, t057autoAST34Parser, "a", "a b"); 356 assertEquals("2nd id=b;a b", found); 357 } 358 359 function testTokenLabelReuse2() { 360 // check for compilation problem due to multiple defines 361 var found = execParser(t057autoAST35Lexer, t057autoAST35Parser, "a", "a b"); 362 assertEquals("2nd id=b,(b a)", found); 363 } 364 365 function testTokenListLabelReuse() { 366 // check for compilation problem due to multiple defines 367 // make sure ids has both ID tokens 368 var found = execParser(t057autoAST36Lexer, t057autoAST36Parser, "a", "a b"); 369 expecting = "id list=[a,b],a b" 370 assertEquals(expecting, found); 371 } 372 373 function testTokenListLabelReuse2() { 374 // check for compilation problem due to multiple defines 375 // make sure ids has both ID tokens 376 var found = execParser(t057autoAST37Lexer, t057autoAST37Parser, "a", "a b"); 377 expecting = "id list=[a,b],(a b)" 378 assertEquals(expecting, found); 379 } 380 381 function testTokenListLabelRuleRoot() { 382 var found = execParser(t057autoAST38Lexer, t057autoAST38Parser, "a", "a"); 383 assertEquals("a", found); 384 } 385 386 function testTokenListLabelBang() { 387 var found = execParser(t057autoAST39Lexer, t057autoAST39Parser, "a", "a"); 388 assertEquals("", found); 389 } 390 391 function testRuleListLabel() { 392 var found = execParser(t057autoAST40Lexer, t057autoAST40Parser, "a", "a b"); 393 assertEquals("2nd x=b,a b", found); 394 } 395 396 function testRuleListLabelRuleRoot() { 397 var found = execParser(t057autoAST41Lexer, t057autoAST41Parser, "a", "a b"); 398 assertEquals("x=(b a),(b a)", found); 399 } 400 401 function testRuleListLabelBang() { 402 var found = execParser(t057autoAST42Lexer, t057autoAST42Parser, "a", "a b"); 403 assertEquals("1st x=a,b", found); 404 } 405 406 function testComplicatedMelange() { 407 // check for compilation problem 408 var found = execParser(t057autoAST43Lexer, t057autoAST43Parser, "a", "a b b c c d"); 409 assertEquals("a b b c c d", found); 410 } 411 412 function testReturnValueWithAST() { 413 var found = execParser(t057autoAST44Lexer, t057autoAST44Parser, "a", "abc 34"); 414 assertEquals("34\nabc 34", found); 415 } 416 417 function testSetLoop() { 418 var found = execParser(t057autoAST45Lexer, t057autoAST45Parser, "r", "abc 34 d"); 419 assertEquals("abc 34 d", found); 420 } 421 422 function testExtraTokenInSimpleDecl() { 423 found, errors = execParser(t057autoAST46Lexer, t057autoAST46Parser, "decl", "int 34 x=1;", 424 true); 425 assertEquals(["line 1:4 extraneous input u'34' expecting ID"], 426 errors); 427 assertEquals("(int x 1)", found); // tree gets correct x and 1 tokens 428 } 429 430 function testMissingIDInSimpleDecl() { 431 found, errors = execParser(t057autoAST47Lexer, t057autoAST47Parser, "decl", "int =1;", 432 true); 433 assertEquals(["line 1:4 missing ID at u'='"], errors); 434 assertEquals("(int <missing ID> 1)", found); // tree gets invented ID token 435 } 436 437 function testMissingSetInSimpleDecl() { 438 found, errors = execParser(t057autoAST48Lexer, t057autoAST48Parser, "decl", "x=1;", 439 true); 440 assertEquals(["line 1:0 mismatched input u'x' expecting set None"], errors); 441 assertEquals("(<error: x> x 1)", found); // tree gets invented ID token 442 } 443 444 function testMissingTokenGivesErrorNode() { 445 found, errors = execParser(t057autoAST49Lexer, t057autoAST49Parser, "a", "abc", true); 446 assertEquals(["line 0:-1 missing INT at '<EOF>'"], errors); 447 assertEquals("abc <missing INT>", found); 448 } 449 450 function testMissingTokenGivesErrorNodeInInvokedRule() { 451 found, errors = execParser(t057autoAST50Lexer, t057autoAST50Parser, "a", "abc", true); 452 assertEquals(["line 0:-1 missing INT at '<EOF>'"], errors); 453 assertEquals("abc <missing INT>", found); 454 } 455 456 function testExtraTokenGivesErrorNode() { 457 found, errors = execParser(t057autoAST51Lexer, t057autoAST51Parser, "a", "abc ick 34", 458 true); 459 assertEquals(["line 1:4 extraneous input u'ick' expecting INT"], 460 errors); 461 assertEquals("abc 34", found); 462 } 463 464 function testMissingFirstTokenGivesErrorNode() { 465 found, errors = execParser(t057autoAST52Lexer, t057autoAST52Parser, "a", "34", true); 466 assertEquals(["line 1:0 missing ID at u'34'"], errors); 467 assertEquals("<missing ID> 34", found); 468 } 469 470 function testMissingFirstTokenGivesErrorNode2() { 471 found, errors = execParser(t057autoAST53Lexer, t057autoAST53Parser, "a", "34", true); 472 // finds an error at the first token, 34, and re-syncs. 473 // re-synchronizing does not consume a token because 34 follows 474 // ref to rule b (start of c). It then matches 34 in c. 475 assertEquals(["line 1:0 missing ID at u'34'"], errors); 476 assertEquals("<missing ID> 34", found); 477 } 478 479 function testNoViableAltGivesErrorNode() { 480 found, errors = execParser(t057autoAST54Lexer, t057autoAST54Parser, "a", "*", true); 481 assertEquals(["line 1:0 no viable alternative at input u'*'"], 482 errors); 483 assertEquals("<unexpected: [@0,0:0=u'*',<6>,1:0], resync=*>", 484 found); 485 } 486 487 </script> 488 489 </head> 490 <body> 491 <h1>t057autoAST</h1> 492 </body> 493 </html> 494 495 496