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>t058rewriteAST</title> 6 7 <!-- ANTLR includes --> 8 <script type="text/javascript" src="../../lib/antlr3-all.js"></script> 9 10 <script type="text/javascript" src="t058rewriteAST1Lexer.js"></script> 11 <script type="text/javascript" src="t058rewriteAST1Parser.js"></script> 12 <script type="text/javascript" src="t058rewriteAST2Lexer.js"></script> 13 <script type="text/javascript" src="t058rewriteAST2Parser.js"></script> 14 <script type="text/javascript" src="t058rewriteAST3Lexer.js"></script> 15 <script type="text/javascript" src="t058rewriteAST3Parser.js"></script> 16 <script type="text/javascript" src="t058rewriteAST4Lexer.js"></script> 17 <script type="text/javascript" src="t058rewriteAST4Parser.js"></script> 18 <script type="text/javascript" src="t058rewriteAST5Lexer.js"></script> 19 <script type="text/javascript" src="t058rewriteAST5Parser.js"></script> 20 <script type="text/javascript" src="t058rewriteAST6Lexer.js"></script> 21 <script type="text/javascript" src="t058rewriteAST6Parser.js"></script> 22 <script type="text/javascript" src="t058rewriteAST7Lexer.js"></script> 23 <script type="text/javascript" src="t058rewriteAST7Parser.js"></script> 24 <script type="text/javascript" src="t058rewriteAST8Lexer.js"></script> 25 <script type="text/javascript" src="t058rewriteAST8Parser.js"></script> 26 <script type="text/javascript" src="t058rewriteAST9Lexer.js"></script> 27 <script type="text/javascript" src="t058rewriteAST9Parser.js"></script> 28 <script type="text/javascript" src="t058rewriteAST10Lexer.js"></script> 29 <script type="text/javascript" src="t058rewriteAST10Parser.js"></script> 30 <script type="text/javascript" src="t058rewriteAST11Lexer.js"></script> 31 <script type="text/javascript" src="t058rewriteAST11Parser.js"></script> 32 <script type="text/javascript" src="t058rewriteAST12Lexer.js"></script> 33 <script type="text/javascript" src="t058rewriteAST12Parser.js"></script> 34 <script type="text/javascript" src="t058rewriteAST13Lexer.js"></script> 35 <script type="text/javascript" src="t058rewriteAST13Parser.js"></script> 36 <script type="text/javascript" src="t058rewriteAST14Lexer.js"></script> 37 <script type="text/javascript" src="t058rewriteAST14Parser.js"></script> 38 <script type="text/javascript" src="t058rewriteAST15Lexer.js"></script> 39 <script type="text/javascript" src="t058rewriteAST15Parser.js"></script> 40 <script type="text/javascript" src="t058rewriteAST16Lexer.js"></script> 41 <script type="text/javascript" src="t058rewriteAST16Parser.js"></script> 42 <script type="text/javascript" src="t058rewriteAST17Lexer.js"></script> 43 <script type="text/javascript" src="t058rewriteAST17Parser.js"></script> 44 <script type="text/javascript" src="t058rewriteAST18Lexer.js"></script> 45 <script type="text/javascript" src="t058rewriteAST18Parser.js"></script> 46 <script type="text/javascript" src="t058rewriteAST19Lexer.js"></script> 47 <script type="text/javascript" src="t058rewriteAST19Parser.js"></script> 48 <script type="text/javascript" src="t058rewriteAST20Lexer.js"></script> 49 <script type="text/javascript" src="t058rewriteAST20Parser.js"></script> 50 <script type="text/javascript" src="t058rewriteAST21Lexer.js"></script> 51 <script type="text/javascript" src="t058rewriteAST21Parser.js"></script> 52 <script type="text/javascript" src="t058rewriteAST22Lexer.js"></script> 53 <script type="text/javascript" src="t058rewriteAST22Parser.js"></script> 54 <script type="text/javascript" src="t058rewriteAST23Lexer.js"></script> 55 <script type="text/javascript" src="t058rewriteAST23Parser.js"></script> 56 <script type="text/javascript" src="t058rewriteAST24Lexer.js"></script> 57 <script type="text/javascript" src="t058rewriteAST24Parser.js"></script> 58 <script type="text/javascript" src="t058rewriteAST25Lexer.js"></script> 59 <script type="text/javascript" src="t058rewriteAST25Parser.js"></script> 60 <script type="text/javascript" src="t058rewriteAST26Lexer.js"></script> 61 <script type="text/javascript" src="t058rewriteAST26Parser.js"></script> 62 <script type="text/javascript" src="t058rewriteAST27Lexer.js"></script> 63 <script type="text/javascript" src="t058rewriteAST27Parser.js"></script> 64 <script type="text/javascript" src="t058rewriteAST28Lexer.js"></script> 65 <script type="text/javascript" src="t058rewriteAST28Parser.js"></script> 66 <script type="text/javascript" src="t058rewriteAST29Lexer.js"></script> 67 <script type="text/javascript" src="t058rewriteAST29Parser.js"></script> 68 <script type="text/javascript" src="t058rewriteAST30Lexer.js"></script> 69 <script type="text/javascript" src="t058rewriteAST30Parser.js"></script> 70 <script type="text/javascript" src="t058rewriteAST31Lexer.js"></script> 71 <script type="text/javascript" src="t058rewriteAST31Parser.js"></script> 72 <script type="text/javascript" src="t058rewriteAST32Lexer.js"></script> 73 <script type="text/javascript" src="t058rewriteAST32Parser.js"></script> 74 <script type="text/javascript" src="t058rewriteAST33Lexer.js"></script> 75 <script type="text/javascript" src="t058rewriteAST33Parser.js"></script> 76 <script type="text/javascript" src="t058rewriteAST34Lexer.js"></script> 77 <script type="text/javascript" src="t058rewriteAST34Parser.js"></script> 78 <script type="text/javascript" src="t058rewriteAST35Lexer.js"></script> 79 <script type="text/javascript" src="t058rewriteAST35Parser.js"></script> 80 <script type="text/javascript" src="t058rewriteAST36Lexer.js"></script> 81 <script type="text/javascript" src="t058rewriteAST36Parser.js"></script> 82 <script type="text/javascript" src="t058rewriteAST37Lexer.js"></script> 83 <script type="text/javascript" src="t058rewriteAST37Parser.js"></script> 84 <script type="text/javascript" src="t058rewriteAST38Lexer.js"></script> 85 <script type="text/javascript" src="t058rewriteAST38Parser.js"></script> 86 <script type="text/javascript" src="t058rewriteAST39Lexer.js"></script> 87 <script type="text/javascript" src="t058rewriteAST39Parser.js"></script> 88 <script type="text/javascript" src="t058rewriteAST40Lexer.js"></script> 89 <script type="text/javascript" src="t058rewriteAST40Parser.js"></script> 90 <script type="text/javascript" src="t058rewriteAST41Lexer.js"></script> 91 <script type="text/javascript" src="t058rewriteAST41Parser.js"></script> 92 <script type="text/javascript" src="t058rewriteAST42Lexer.js"></script> 93 <script type="text/javascript" src="t058rewriteAST42Parser.js"></script> 94 <script type="text/javascript" src="t058rewriteAST43Lexer.js"></script> 95 <script type="text/javascript" src="t058rewriteAST43Parser.js"></script> 96 <script type="text/javascript" src="t058rewriteAST44Lexer.js"></script> 97 <script type="text/javascript" src="t058rewriteAST44Parser.js"></script> 98 <script type="text/javascript" src="t058rewriteAST45Lexer.js"></script> 99 <script type="text/javascript" src="t058rewriteAST45Parser.js"></script> 100 <script type="text/javascript" src="t058rewriteAST46Lexer.js"></script> 101 <script type="text/javascript" src="t058rewriteAST46Parser.js"></script> 102 <script type="text/javascript" src="t058rewriteAST47Lexer.js"></script> 103 <script type="text/javascript" src="t058rewriteAST47Parser.js"></script> 104 <script type="text/javascript" src="t058rewriteAST48Lexer.js"></script> 105 <script type="text/javascript" src="t058rewriteAST48Parser.js"></script> 106 <script type="text/javascript" src="t058rewriteAST49Lexer.js"></script> 107 <script type="text/javascript" src="t058rewriteAST49Parser.js"></script> 108 <script type="text/javascript" src="t058rewriteAST50Lexer.js"></script> 109 <script type="text/javascript" src="t058rewriteAST50Parser.js"></script> 110 <script type="text/javascript" src="t058rewriteAST51Lexer.js"></script> 111 <script type="text/javascript" src="t058rewriteAST51Parser.js"></script> 112 <script type="text/javascript" src="t058rewriteAST52Lexer.js"></script> 113 <script type="text/javascript" src="t058rewriteAST52Parser.js"></script> 114 <script type="text/javascript" src="t058rewriteAST53Lexer.js"></script> 115 <script type="text/javascript" src="t058rewriteAST53Parser.js"></script> 116 <script type="text/javascript" src="t058rewriteAST54Lexer.js"></script> 117 <script type="text/javascript" src="t058rewriteAST54Parser.js"></script> 118 <script type="text/javascript" src="t058rewriteAST55Lexer.js"></script> 119 <script type="text/javascript" src="t058rewriteAST55Parser.js"></script> 120 <script type="text/javascript" src="t058rewriteAST56Lexer.js"></script> 121 <script type="text/javascript" src="t058rewriteAST56Parser.js"></script> 122 <script type="text/javascript" src="t058rewriteAST57Lexer.js"></script> 123 <script type="text/javascript" src="t058rewriteAST57Parser.js"></script> 124 <script type="text/javascript" src="t058rewriteAST58Lexer.js"></script> 125 <script type="text/javascript" src="t058rewriteAST58Parser.js"></script> 126 <script type="text/javascript" src="t058rewriteAST59Lexer.js"></script> 127 <script type="text/javascript" src="t058rewriteAST59Parser.js"></script> 128 <script type="text/javascript" src="t058rewriteAST60Lexer.js"></script> 129 <script type="text/javascript" src="t058rewriteAST60Parser.js"></script> 130 <script type="text/javascript" src="t058rewriteAST61Lexer.js"></script> 131 <script type="text/javascript" src="t058rewriteAST61Parser.js"></script> 132 <script type="text/javascript" src="t058rewriteAST62Lexer.js"></script> 133 <script type="text/javascript" src="t058rewriteAST62Parser.js"></script> 134 <script type="text/javascript" src="t058rewriteAST63Lexer.js"></script> 135 <script type="text/javascript" src="t058rewriteAST63Parser.js"></script> 136 <script type="text/javascript" src="t058rewriteAST64Lexer.js"></script> 137 <script type="text/javascript" src="t058rewriteAST64Parser.js"></script> 138 <script type="text/javascript" src="t058rewriteAST65Lexer.js"></script> 139 <script type="text/javascript" src="t058rewriteAST65Parser.js"></script> 140 <script type="text/javascript" src="t058rewriteAST66Lexer.js"></script> 141 <script type="text/javascript" src="t058rewriteAST66Parser.js"></script> 142 <script type="text/javascript" src="t058rewriteAST67Lexer.js"></script> 143 <script type="text/javascript" src="t058rewriteAST67Parser.js"></script> 144 <script type="text/javascript" src="t058rewriteAST68Lexer.js"></script> 145 <script type="text/javascript" src="t058rewriteAST68Parser.js"></script> 146 <script type="text/javascript" src="t058rewriteAST69Lexer.js"></script> 147 <script type="text/javascript" src="t058rewriteAST69Parser.js"></script> 148 <script type="text/javascript" src="t058rewriteAST70Lexer.js"></script> 149 <script type="text/javascript" src="t058rewriteAST70Parser.js"></script> 150 <script type="text/javascript" src="t058rewriteAST71Lexer.js"></script> 151 <script type="text/javascript" src="t058rewriteAST71Parser.js"></script> 152 <script type="text/javascript" src="t058rewriteAST72Lexer.js"></script> 153 <script type="text/javascript" src="t058rewriteAST72Parser.js"></script> 154 <script type="text/javascript" src="t058rewriteAST73Lexer.js"></script> 155 <script type="text/javascript" src="t058rewriteAST73Parser.js"></script> 156 <script type="text/javascript" src="t058rewriteAST74Lexer.js"></script> 157 <script type="text/javascript" src="t058rewriteAST74Parser.js"></script> 158 <script type="text/javascript" src="t058rewriteAST75Lexer.js"></script> 159 <script type="text/javascript" src="t058rewriteAST75Parser.js"></script> 160 <script type="text/javascript" src="t058rewriteAST76Lexer.js"></script> 161 <script type="text/javascript" src="t058rewriteAST76Parser.js"></script> 162 <script type="text/javascript" src="t058rewriteAST77Lexer.js"></script> 163 <script type="text/javascript" src="t058rewriteAST77Parser.js"></script> 164 <script type="text/javascript" src="t058rewriteAST78Lexer.js"></script> 165 <script type="text/javascript" src="t058rewriteAST78Parser.js"></script> 166 <script type="text/javascript" src="t058rewriteAST79Lexer.js"></script> 167 <script type="text/javascript" src="t058rewriteAST79Parser.js"></script> 168 <script type="text/javascript" src="t058rewriteAST80Lexer.js"></script> 169 <script type="text/javascript" src="t058rewriteAST80Parser.js"></script> 170 <script type="text/javascript" src="t058rewriteAST81Lexer.js"></script> 171 <script type="text/javascript" src="t058rewriteAST81Parser.js"></script> 172 <script type="text/javascript" src="t058rewriteAST82Lexer.js"></script> 173 <script type="text/javascript" src="t058rewriteAST82Parser.js"></script> 174 <script type="text/javascript" src="t058rewriteAST83Lexer.js"></script> 175 <script type="text/javascript" src="t058rewriteAST83Parser.js"></script> 176 177 <!-- JsUnit include --> 178 <script type="text/javascript" src="../jsunit/app/jsUnitCore.js"></script> 179 180 <!-- Test Code --> 181 <script type="text/javascript"> 182 // Parser Tests 183 184 function execParser(lexerCls, parserCls, grammarEntry, xinput, expectErrors) { 185 var cstream = new org.antlr.runtime.ANTLRStringStream(xinput), 186 lexer = new (EnhancedParser(lexerCls))(cstream), 187 tstream = new org.antlr.runtime.CommonTokenStream(lexer), 188 parser = new (EnhancedParser(parserCls))(tstream); 189 var r = parser[grammarEntry](); 190 191 if (!expectErrors) { 192 throw parser._errors[0]; 193 assertEquals(parser._errors.length, 0); 194 } 195 196 var result = ""; 197 if (r) { 198 if (r.result) { 199 result += r.result 200 } 201 if (r.getTree()) { 202 result += r.getTree().toStringTree(); 203 } 204 } 205 206 if (!expectErrors) { 207 return result; 208 } else { 209 return [result, parser._errors]; 210 } 211 } 212 213 function EnhancedParser(base) { 214 var T = function() { 215 T.superclass.constructor.apply(this, arguments); 216 this.traces = []; 217 this.buf = ""; 218 this._errors = []; 219 }; 220 221 org.antlr.lang.extend(T, base, { 222 capture: function(t) { 223 this.buf += t; 224 }, 225 traceIn: function(ruleName, ruleIndex) { 226 this.traces.push(">"+ruleName); 227 }, 228 traceOut: function(ruleName, ruleIndex) { 229 this.traces.push("<"+ruleName); 230 }, 231 emitErrorMessage: function(msg) { 232 this._errors.push(msg); 233 } 234 }); 235 236 return T; 237 } 238 239 function testDelete() { 240 var found = execParser(t058rewriteAST1Lexer, t058rewriteAST1Parser, "a", "abc 34"); 241 assertEquals("", found); 242 } 243 244 function testSingleToken() { 245 var found = execParser(t058rewriteAST2Lexer, t058rewriteAST2Parser, "a", "abc"); 246 assertEquals("abc", found); 247 } 248 249 function testSingleTokenToNewNode() { 250 var found = execParser(t058rewriteAST3Lexer, t058rewriteAST3Parser, "a", "abc"); 251 assertEquals("x", found); 252 } 253 254 function testSingleTokenToNewNodeRoot() { 255 var found = execParser(t058rewriteAST4Lexer, t058rewriteAST4Parser, "a", "abc"); 256 assertEquals("(x INT)", found); 257 } 258 259 function testSingleTokenToNewNode2() { 260 // Allow creation of new nodes w/o args. 261 var found = execParser(t058rewriteAST5Lexer, t058rewriteAST5Parser, "a", "abc"); 262 assertEquals("ID", found); 263 } 264 265 function testSingleCharLiteral() { 266 var found = execParser(t058rewriteAST6Lexer, t058rewriteAST6Parser, "a", "c"); 267 assertEquals("c", found); 268 } 269 270 function testSingleStringLiteral() { 271 var found = execParser(t058rewriteAST7Lexer, t058rewriteAST7Parser, "a", "ick"); 272 assertEquals("ick", found); 273 } 274 275 function testSingleRule() { 276 var found = execParser(t058rewriteAST8Lexer, t058rewriteAST8Parser, "a", "abc"); 277 assertEquals("abc", found); 278 } 279 280 function testReorderTokens() { 281 var found = execParser(t058rewriteAST9Lexer, t058rewriteAST9Parser, "a", "abc 34"); 282 assertEquals("34 abc", found); 283 } 284 285 function testReorderTokenAndRule() { 286 var found = execParser(t058rewriteAST10Lexer, t058rewriteAST10Parser, "a", "abc 34"); 287 assertEquals("34 abc", found); 288 } 289 290 function testTokenTree() { 291 var found = execParser(t058rewriteAST11Lexer, t058rewriteAST11Parser, "a", "abc 34"); 292 assertEquals("(34 abc)", found); 293 } 294 295 function testTokenTreeAfterOtherStuff() { 296 var found = execParser(t058rewriteAST12Lexer, t058rewriteAST12Parser, "a", "void abc 34"); 297 assertEquals("void (34 abc)", found); 298 } 299 300 function testNestedTokenTreeWithOuterLoop() { 301 // verify that ID and INT both iterate over outer index variable 302 var found = execParser(t058rewriteAST13Lexer, t058rewriteAST13Parser, "a", "a 1 b 2"); 303 assertEquals("(DUH a (DUH 1)) (DUH b (DUH 2))", found); 304 } 305 306 function testOptionalSingleToken() { 307 var found = execParser(t058rewriteAST14Lexer, t058rewriteAST14Parser, "a", "abc"); 308 assertEquals("abc", found); 309 } 310 311 function testClosureSingleToken() { 312 var found = execParser(t058rewriteAST15Lexer, t058rewriteAST15Parser, "a", "a b"); 313 assertEquals("a b", found); 314 } 315 316 function testPositiveClosureSingleToken() { 317 var found = execParser(t058rewriteAST16Lexer, t058rewriteAST16Parser, "a", "a b"); 318 assertEquals("a b", found); 319 } 320 321 function testOptionalSingleRule() { 322 var found = execParser(t058rewriteAST17Lexer, t058rewriteAST17Parser, "a", "abc"); 323 assertEquals("abc", found); 324 } 325 326 function testClosureSingleRule() { 327 var found = execParser(t058rewriteAST18Lexer, t058rewriteAST18Parser, "a", "a b"); 328 assertEquals("a b", found); 329 } 330 331 function testClosureOfLabel() { 332 var found = execParser(t058rewriteAST19Lexer, t058rewriteAST19Parser, "a", "a b"); 333 assertEquals("a b", found); 334 } 335 336 function testOptionalLabelNoListLabel() { 337 var found = execParser(t058rewriteAST20Lexer, t058rewriteAST20Parser, "a", "a"); 338 assertEquals("a", found); 339 } 340 341 function testPositiveClosureSingleRule() { 342 var found = execParser(t058rewriteAST21Lexer, t058rewriteAST21Parser, "a", "a b"); 343 assertEquals("a b", found); 344 } 345 346 function testSinglePredicateT() { 347 var found = execParser(t058rewriteAST22Lexer, t058rewriteAST22Parser, "a", "abc"); 348 assertEquals("abc", found); 349 } 350 351 function testSinglePredicateF() { 352 var found = execParser(t058rewriteAST23Lexer, t058rewriteAST23Parser, "a", "abc"); 353 assertEquals("", found); 354 } 355 356 function testMultiplePredicate() { 357 var found = execParser(t058rewriteAST24Lexer, t058rewriteAST24Parser, "a", "a 2"); 358 assertEquals("2", found); 359 } 360 361 function testMultiplePredicateTrees() { 362 var found = execParser(t058rewriteAST25Lexer, t058rewriteAST25Parser, "a", "a 2"); 363 assertEquals("(2 a)", found); 364 } 365 366 function testSimpleTree() { 367 var found = execParser(t058rewriteAST26Lexer, t058rewriteAST26Parser, "a", "-34"); 368 assertEquals("(- 34)", found); 369 } 370 371 function testSimpleTree2() { 372 var found = execParser(t058rewriteAST27Lexer, t058rewriteAST27Parser, "a", "+ 34"); 373 assertEquals("(34 +)", found); 374 } 375 376 function testNestedTrees() { 377 var found = execParser(t058rewriteAST28Lexer, t058rewriteAST28Parser, "a", "var a:int; b:float;"); 378 assertEquals("(var (: a int) (: b float))", found); 379 } 380 381 function testImaginaryTokenCopy() { 382 var found = execParser(t058rewriteAST29Lexer, t058rewriteAST29Parser, "a", "a,b,c"); 383 assertEquals("(VAR a) (VAR b) (VAR c)", found); 384 } 385 386 function testTokenUnreferencedOnLeftButDefined() { 387 var found = execParser(t058rewriteAST30Lexer, t058rewriteAST30Parser, "a", "a"); 388 assertEquals("ID", found); 389 } 390 391 function testImaginaryTokenCopySetText() { 392 var found = execParser(t058rewriteAST31Lexer, t058rewriteAST31Parser, "a", "a,b,c"); 393 assertEquals("(var a) (var b) (var c)", found); 394 } 395 396 function testImaginaryTokenNoCopyFromToken() { 397 var found = execParser(t058rewriteAST32Lexer, t058rewriteAST32Parser, "a", "{a b c}"); 398 assertEquals("({ a b c)", found); 399 } 400 401 function testImaginaryTokenNoCopyFromTokenSetText() { 402 var found = execParser(t058rewriteAST33Lexer, t058rewriteAST33Parser, "a", "{a b c}"); 403 assertEquals("(block a b c)", found); 404 } 405 406 function testMixedRewriteAndAutoAST() { 407 var found = execParser(t058rewriteAST34Lexer, t058rewriteAST34Parser, "a", "a 1 2"); 408 assertEquals("(2 1 a)", found); 409 } 410 411 function testSubruleWithRewrite() { 412 var found = execParser(t058rewriteAST35Lexer, t058rewriteAST35Parser, "a", "a 1 2 3"); 413 assertEquals("1 a 2 3", found); 414 } 415 416 function testSubruleWithRewrite2() { 417 var found = execParser(t058rewriteAST36Lexer, t058rewriteAST36Parser, "a", "int a; int b=3;"); 418 assertEquals("(TYPE int a) (TYPE int b 3)", found); 419 } 420 421 function testNestedRewriteShutsOffAutoAST() { 422 var found = execParser(t058rewriteAST37Lexer, t058rewriteAST37Parser, "a", "a b c d; 42"); 423 assertEquals("d 42", found); 424 } 425 426 function testRewriteActions() { 427 var found = execParser(t058rewriteAST38Lexer, t058rewriteAST38Parser, "a", "3"); 428 assertEquals("(9 3)", found); 429 } 430 431 function testRewriteActions2() { 432 var found = execParser(t058rewriteAST39Lexer, t058rewriteAST39Parser, "a", "3"); 433 assertEquals("9 3", found); 434 } 435 436 function testRefToOldValue() { 437 var found = execParser(t058rewriteAST40Lexer, t058rewriteAST40Parser, "a", "3+4+5"); 438 assertEquals("(+ (+ 3 4) 5)", found); 439 } 440 441 function testCopySemanticsForRules() { 442 var found = execParser(t058rewriteAST41Lexer, t058rewriteAST41Parser, "a", "3"); 443 assertEquals("(3 3)", found); 444 } 445 446 function testCopySemanticsForRules2() { 447 // copy type as a root for each invocation of (...)+ in rewrite 448 var found = execParser(t058rewriteAST42Lexer, t058rewriteAST42Parser, "a", "int a,b,c;"); 449 assertEquals("(int a) (int b) (int c)", found); 450 } 451 452 function testCopySemanticsForRules3() { 453 // copy type *and* modifier even though it's optional 454 // for each invocation of (...)+ in rewrite 455 var found = execParser(t058rewriteAST43Lexer, t058rewriteAST43Parser, "a", "public int a,b,c;"); 456 assertEquals("(int public a) (int public b) (int public c)", found); 457 } 458 459 function testCopySemanticsForRules3Double() { 460 // copy type *and* modifier even though it's optional 461 // for each invocation of (...)+ in rewrite 462 var found = execParser(t058rewriteAST44Lexer, t058rewriteAST44Parser, "a", "public int a,b,c;"); 463 assertEquals("(int public a) (int public b) (int public c) (int public a) (int public b) (int public c)", found); 464 } 465 466 function testCopySemanticsForRules4() { 467 // copy type *and* modifier even though it's optional 468 // for each invocation of (...)+ in rewrite 469 var found = execParser(t058rewriteAST45Lexer, t058rewriteAST45Parser, "a", "public int a,b,c;"); 470 assertEquals("(int (MOD public) a) (int (MOD public) b) (int (MOD public) c)", found); 471 } 472 473 function testCopySemanticsLists() { 474 var found = execParser(t058rewriteAST46Lexer, t058rewriteAST46Parser, "a", "a,b,c;"); 475 assertEquals("a b c a b c", found); 476 } 477 478 function testCopyRuleLabel() { 479 var found = execParser(t058rewriteAST47Lexer, t058rewriteAST47Parser, "a", "a"); 480 assertEquals("a a", found); 481 } 482 483 function testCopyRuleLabel2() { 484 var found = execParser(t058rewriteAST48Lexer, t058rewriteAST48Parser, "a", "a"); 485 assertEquals("(a a)", found); 486 } 487 488 function testQueueingOfTokens() { 489 var found = execParser(t058rewriteAST49Lexer, t058rewriteAST49Parser, "a", "int a,b,c;"); 490 assertEquals("(int a b c)", found); 491 } 492 493 function testCopyOfTokens() { 494 var found = execParser(t058rewriteAST50Lexer, t058rewriteAST50Parser, "a", "int a;"); 495 assertEquals("int a int a", found); 496 } 497 498 function testTokenCopyInLoop() { 499 var found = execParser(t058rewriteAST51Lexer, t058rewriteAST51Parser, "a", "int a,b,c;"); 500 assertEquals("(int a) (int b) (int c)", found); 501 } 502 503 function testTokenCopyInLoopAgainstTwoOthers() { 504 // must smear 'int' copies across as root of multiple trees 505 var found = execParser(t058rewriteAST52Lexer, t058rewriteAST52Parser, "a", "int a:1,b:2,c:3;"); 506 assertEquals("(int a 1) (int b 2) (int c 3)", found); 507 } 508 509 function testListRefdOneAtATime() { 510 var found = execParser(t058rewriteAST53Lexer, t058rewriteAST53Parser, "a", "a b c"); 511 assertEquals("a b c", found); 512 } 513 514 function testSplitListWithLabels() { 515 var found = execParser(t058rewriteAST54Lexer, t058rewriteAST54Parser, "a", "a b c"); 516 assertEquals("a VAR b c", found); 517 } 518 519 function testComplicatedMelange() { 520 var found = execParser(t058rewriteAST55Lexer, t058rewriteAST55Parser, "a", "a a b b b c c c d"); 521 assertEquals("a a b b b c c c d", found); 522 } 523 524 function testRuleLabel() { 525 var found = execParser(t058rewriteAST56Lexer, t058rewriteAST56Parser, "a", "a"); 526 assertEquals("a", found); 527 } 528 529 function testAmbiguousRule() { 530 var found = execParser(t058rewriteAST57Lexer, t058rewriteAST57Parser, 531 "a", "abc 34"); 532 assertEquals("34", found); 533 } 534 535 function testRuleListLabel() { 536 var found = execParser(t058rewriteAST58Lexer, t058rewriteAST58Parser, "a", "a b"); 537 assertEquals("a b", found); 538 } 539 540 function testRuleListLabel2() { 541 var found = execParser(t058rewriteAST59Lexer, t058rewriteAST59Parser, "a", "a b"); 542 assertEquals("a b", found); 543 } 544 545 function testOptional() { 546 var found = execParser(t058rewriteAST60Lexer, t058rewriteAST60Parser, "a", "a"); 547 assertEquals("a", found); 548 } 549 550 function testOptional2() { 551 var found = execParser(t058rewriteAST61Lexer, t058rewriteAST61Parser, "a", "a b"); 552 assertEquals("a b", found); 553 } 554 555 function testOptional3() { 556 var found = execParser(t058rewriteAST62Lexer, t058rewriteAST62Parser, "a", "a b"); 557 assertEquals("a b", found); 558 } 559 560 function testOptional4() { 561 var found = execParser(t058rewriteAST63Lexer, t058rewriteAST63Parser, "a", "a b"); 562 assertEquals("a b", found); 563 } 564 565 function testOptional5() { 566 var found = execParser(t058rewriteAST64Lexer, t058rewriteAST64Parser, "a", "a"); 567 assertEquals("a", found); 568 } 569 570 function testArbitraryExprType() { 571 var found = execParser(t058rewriteAST65Lexer, t058rewriteAST65Parser, "a", "a b"); 572 assertEquals("", found); 573 } 574 575 function testSet() { 576 var found = execParser(t058rewriteAST66Lexer, t058rewriteAST66Parser, "a", "2 a 34 de"); 577 assertEquals("2 34 a de", found); 578 } 579 580 function testSet2() { 581 var found = execParser(t058rewriteAST67Lexer, t058rewriteAST67Parser, "a", "2"); 582 assertEquals("2", found); 583 } 584 585 /* 586 * @fails - the grammar shouldn't be valid, but is 587 * 588 function testSetWithLabel() { 589 var found = execParser(t058rewriteAST68Lexer, t058rewriteAST68Parser, "a", "2"); 590 assertEquals("2", found); 591 } 592 */ 593 594 function testRewriteAction() { 595 var found = execParser(t058rewriteAST69Lexer, t058rewriteAST69Parser, "r", "25"); 596 assertEquals("25.0", found); 597 } 598 599 function testOptionalSubruleWithoutRealElements() { 600 // copy type *and* modifier even though it's optional 601 // for each invocation of (...)+ in rewrite 602 var found = execParser(t058rewriteAST70Lexer, t058rewriteAST70Parser, "modulo", "modulo abc (x y)"); 603 assertEquals("(modulo abc (PARMS x y))", found); 604 } 605 606 //// C A R D I N A L I T Y I S S U E S 607 608 function testCardinality() { 609 try { 610 execParser(t058rewriteAST71Lexer, t058rewriteAST71Parser, "a", "a b 3 4 5"); 611 fail(); 612 } catch(e) { 613 assertEquals(e.getMessage(), "token ID"); 614 } 615 } 616 617 618 function testCardinality2() { 619 try { 620 execParser(t058rewriteAST72Lexer, t058rewriteAST72Parser, "a", "a b"); 621 fail(); 622 } catch(e) { 623 assertEquals(e.getMessage(), "token ID"); 624 } 625 } 626 627 function testCardinality3() { 628 try { 629 execParser(t058rewriteAST73Lexer, t058rewriteAST73Parser, "a", "3"); 630 fail(); 631 } catch(e) { 632 assertEquals(e.getMessage(), "token ID"); 633 } 634 } 635 636 function testLoopCardinality() { 637 try { 638 execParser(t058rewriteAST74Lexer, t058rewriteAST74Parser, "a", "3"); 639 fail(); 640 } catch(e) { 641 assert(e instanceof org.antlr.runtime.tree.RewriteEarlyExitException); 642 } 643 } 644 645 function testWildcard() { 646 var found = execParser(t058rewriteAST75Lexer, t058rewriteAST75Parser, "a", "abc 34"); 647 assertEquals("34\n", found); 648 } 649 650 // E R R O R S 651 652 function testExtraTokenInSimpleDecl() { 653 var retval = execParser(t058rewriteAST76Lexer, t058rewriteAST76Parser, "decl", "int 34 x=1;", 654 true); 655 var found = retval[0], errors = retval[1]; 656 assertArrayEquals(["line 1:4 extraneous input '34' expecting ID"], 657 errors); 658 assertEquals("(EXPR int x 1)", found) // tree gets correct x and 1 tokens 659 } 660 661 662 function testMissingIDInSimpleDecl() { 663 var retval = execParser(t058rewriteAST77Lexer, t058rewriteAST77Parser, "decl", "int =1;", 664 true); 665 var found = retval[0], errors = retval[1]; 666 assertArrayEquals(["line 1:4 missing ID at '='"], errors); 667 assertEquals("(EXPR int <missing ID> 1)", found) // tree gets invented ID token 668 } 669 670 function testMissingSetInSimpleDecl() { 671 var retval = execParser(t058rewriteAST78Lexer, t058rewriteAST78Parser, "decl", "x=1;", 672 true); 673 var found = retval[0], errors = retval[1]; 674 assertArrayEquals(["line 1:0 mismatched input 'x' expecting set null"], 675 errors); 676 assertEquals("(EXPR <error: x> x 1)", found) // tree gets invented ID token 677 } 678 679 function testMissingTokenGivesErrorNode() { 680 var retval = execParser(t058rewriteAST79Lexer, t058rewriteAST79Parser, "a", "abc", 681 true); 682 var found = retval[0], errors = retval[1]; 683 assertArrayEquals(["line 0:-1 missing INT at '<EOF>'"], errors); 684 // doesn't do in-line recovery for sets (yet?); 685 assertEquals("abc <missing INT>", found); 686 } 687 688 function testExtraTokenGivesErrorNode() { 689 var retval = execParser(t058rewriteAST80Lexer, t058rewriteAST80Parser, "a", "abc ick 34", 690 true); 691 var found = retval[0], errors = retval[1]; 692 assertArrayEquals(["line 1:4 extraneous input 'ick' expecting INT"], 693 errors); 694 assertEquals("abc 34", found); 695 } 696 697 function testMissingFirstTokenGivesErrorNode() { 698 var retval = execParser(t058rewriteAST81Lexer, t058rewriteAST81Parser, "a", "34", true); 699 var found = retval[0], errors = retval[1]; 700 assertArrayEquals(["line 1:0 missing ID at '34'"], errors); 701 assertEquals("<missing ID> 34", found); 702 } 703 704 function testMissingFirstTokenGivesErrorNode2() { 705 var retval = execParser(t058rewriteAST82Lexer, t058rewriteAST82Parser, "a", "34", true); 706 var found = retval[0], errors = retval[1]; 707 // finds an error at the first token, 34, and re-syncs. 708 // re-synchronizing does not consume a token because 34 follows 709 // ref to rule b (start of c). It then matches 34 in c. 710 assertArrayEquals(["line 1:0 mismatched input '34' expecting ID"], errors); 711 assertEquals("<mismatched token: [@0,0:1='34',<5>,1:0], resync=34> 34", found); 712 } 713 714 function testNoViableAltGivesErrorNode() { 715 var retval = execParser(t058rewriteAST83Lexer, t058rewriteAST83Parser, "a", "*", true); 716 var found = retval[0], errors = retval[1]; 717 // finds an error at the first token, 34, and re-syncs. 718 // re-synchronizing does not consume a token because 34 follows 719 // ref to rule b (start of c). It then matches 34 in c. 720 assertArrayEquals(["line 1:0 no viable alternative at input '*'"], 721 errors); 722 assertEquals("<unexpected: [@0,0:0='*',<6>,1:0], resync=*>", 723 found); 724 } 725 </script> 726 727 </head> 728 <body> 729 <h1>t058rewriteAST</h1> 730 </body> 731 </html> 732 733