1*16467b97STreehugger Robotimport unittest 2*16467b97STreehugger Robotimport textwrap 3*16467b97STreehugger Robotimport antlr3 4*16467b97STreehugger Robotimport antlr3.tree 5*16467b97STreehugger Robotimport testbase 6*16467b97STreehugger Robot 7*16467b97STreehugger Robotclass T(testbase.ANTLRTest): 8*16467b97STreehugger Robot def walkerClass(self, base): 9*16467b97STreehugger Robot class TWalker(base): 10*16467b97STreehugger Robot def __init__(self, *args, **kwargs): 11*16467b97STreehugger Robot base.__init__(self, *args, **kwargs) 12*16467b97STreehugger Robot self.buf = "" 13*16467b97STreehugger Robot 14*16467b97STreehugger Robot def traceIn(self, ruleName, ruleIndex): 15*16467b97STreehugger Robot self.traces.append('>'+ruleName) 16*16467b97STreehugger Robot 17*16467b97STreehugger Robot 18*16467b97STreehugger Robot def traceOut(self, ruleName, ruleIndex): 19*16467b97STreehugger Robot self.traces.append('<'+ruleName) 20*16467b97STreehugger Robot 21*16467b97STreehugger Robot 22*16467b97STreehugger Robot def recover(self, input, re): 23*16467b97STreehugger Robot # no error recovery yet, just crash! 24*16467b97STreehugger Robot raise 25*16467b97STreehugger Robot 26*16467b97STreehugger Robot return TWalker 27*16467b97STreehugger Robot 28*16467b97STreehugger Robot 29*16467b97STreehugger Robot def execTreeParser(self, grammar, grammarEntry, treeGrammar, treeEntry, input): 30*16467b97STreehugger Robot lexerCls, parserCls = self.compileInlineGrammar(grammar) 31*16467b97STreehugger Robot walkerCls = self.compileInlineGrammar(treeGrammar) 32*16467b97STreehugger Robot 33*16467b97STreehugger Robot cStream = antlr3.StringStream(input) 34*16467b97STreehugger Robot lexer = lexerCls(cStream) 35*16467b97STreehugger Robot tStream = antlr3.CommonTokenStream(lexer) 36*16467b97STreehugger Robot parser = parserCls(tStream) 37*16467b97STreehugger Robot r = getattr(parser, grammarEntry)() 38*16467b97STreehugger Robot nodes = antlr3.tree.CommonTreeNodeStream(r.tree) 39*16467b97STreehugger Robot nodes.setTokenStream(tStream) 40*16467b97STreehugger Robot walker = walkerCls(nodes) 41*16467b97STreehugger Robot r = getattr(walker, treeEntry)() 42*16467b97STreehugger Robot 43*16467b97STreehugger Robot if r.tree is not None: 44*16467b97STreehugger Robot return r.tree.toStringTree() 45*16467b97STreehugger Robot 46*16467b97STreehugger Robot return "" 47*16467b97STreehugger Robot 48*16467b97STreehugger Robot 49*16467b97STreehugger Robot def testFlatList(self): 50*16467b97STreehugger Robot grammar = textwrap.dedent( 51*16467b97STreehugger Robot r''' 52*16467b97STreehugger Robot grammar T1; 53*16467b97STreehugger Robot options { 54*16467b97STreehugger Robot language=Python; 55*16467b97STreehugger Robot output=AST; 56*16467b97STreehugger Robot } 57*16467b97STreehugger Robot a : ID INT; 58*16467b97STreehugger Robot ID : 'a'..'z'+ ; 59*16467b97STreehugger Robot INT : '0'..'9'+; 60*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 61*16467b97STreehugger Robot ''') 62*16467b97STreehugger Robot 63*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 64*16467b97STreehugger Robot r''' 65*16467b97STreehugger Robot tree grammar TP1; 66*16467b97STreehugger Robot options { 67*16467b97STreehugger Robot language=Python; 68*16467b97STreehugger Robot output=AST; 69*16467b97STreehugger Robot ASTLabelType=CommonTree; 70*16467b97STreehugger Robot tokenVocab=T1; 71*16467b97STreehugger Robot } 72*16467b97STreehugger Robot 73*16467b97STreehugger Robot a : ID INT -> INT ID; 74*16467b97STreehugger Robot ''') 75*16467b97STreehugger Robot 76*16467b97STreehugger Robot found = self.execTreeParser( 77*16467b97STreehugger Robot grammar, 'a', 78*16467b97STreehugger Robot treeGrammar, 'a', 79*16467b97STreehugger Robot "abc 34" 80*16467b97STreehugger Robot ) 81*16467b97STreehugger Robot 82*16467b97STreehugger Robot self.failUnlessEqual("34 abc", found) 83*16467b97STreehugger Robot 84*16467b97STreehugger Robot 85*16467b97STreehugger Robot def testSimpleTree(self): 86*16467b97STreehugger Robot grammar = textwrap.dedent( 87*16467b97STreehugger Robot r''' 88*16467b97STreehugger Robot grammar T2; 89*16467b97STreehugger Robot options { 90*16467b97STreehugger Robot language=Python; 91*16467b97STreehugger Robot output=AST; 92*16467b97STreehugger Robot } 93*16467b97STreehugger Robot a : ID INT -> ^(ID INT); 94*16467b97STreehugger Robot ID : 'a'..'z'+ ; 95*16467b97STreehugger Robot INT : '0'..'9'+; 96*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 97*16467b97STreehugger Robot ''') 98*16467b97STreehugger Robot 99*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 100*16467b97STreehugger Robot r''' 101*16467b97STreehugger Robot tree grammar TP2; 102*16467b97STreehugger Robot options { 103*16467b97STreehugger Robot language=Python; 104*16467b97STreehugger Robot output=AST; 105*16467b97STreehugger Robot ASTLabelType=CommonTree; 106*16467b97STreehugger Robot tokenVocab=T2; 107*16467b97STreehugger Robot } 108*16467b97STreehugger Robot a : ^(ID INT) -> ^(INT ID); 109*16467b97STreehugger Robot ''') 110*16467b97STreehugger Robot 111*16467b97STreehugger Robot found = self.execTreeParser( 112*16467b97STreehugger Robot grammar, 'a', 113*16467b97STreehugger Robot treeGrammar, 'a', 114*16467b97STreehugger Robot "abc 34" 115*16467b97STreehugger Robot ) 116*16467b97STreehugger Robot 117*16467b97STreehugger Robot self.failUnlessEqual("(34 abc)", found) 118*16467b97STreehugger Robot 119*16467b97STreehugger Robot 120*16467b97STreehugger Robot def testCombinedRewriteAndAuto(self): 121*16467b97STreehugger Robot grammar = textwrap.dedent( 122*16467b97STreehugger Robot r''' 123*16467b97STreehugger Robot grammar T3; 124*16467b97STreehugger Robot options { 125*16467b97STreehugger Robot language=Python; 126*16467b97STreehugger Robot output=AST; 127*16467b97STreehugger Robot } 128*16467b97STreehugger Robot a : ID INT -> ^(ID INT) | INT ; 129*16467b97STreehugger Robot ID : 'a'..'z'+ ; 130*16467b97STreehugger Robot INT : '0'..'9'+; 131*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 132*16467b97STreehugger Robot ''') 133*16467b97STreehugger Robot 134*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 135*16467b97STreehugger Robot r''' 136*16467b97STreehugger Robot tree grammar TP3; 137*16467b97STreehugger Robot options { 138*16467b97STreehugger Robot language=Python; 139*16467b97STreehugger Robot output=AST; 140*16467b97STreehugger Robot ASTLabelType=CommonTree; 141*16467b97STreehugger Robot tokenVocab=T3; 142*16467b97STreehugger Robot } 143*16467b97STreehugger Robot a : ^(ID INT) -> ^(INT ID) | INT; 144*16467b97STreehugger Robot ''') 145*16467b97STreehugger Robot 146*16467b97STreehugger Robot found = self.execTreeParser( 147*16467b97STreehugger Robot grammar, 'a', 148*16467b97STreehugger Robot treeGrammar, 'a', 149*16467b97STreehugger Robot "abc 34" 150*16467b97STreehugger Robot ) 151*16467b97STreehugger Robot 152*16467b97STreehugger Robot self.failUnlessEqual("(34 abc)", found) 153*16467b97STreehugger Robot 154*16467b97STreehugger Robot 155*16467b97STreehugger Robot found = self.execTreeParser( 156*16467b97STreehugger Robot grammar, 'a', 157*16467b97STreehugger Robot treeGrammar, 'a', 158*16467b97STreehugger Robot "34" 159*16467b97STreehugger Robot ) 160*16467b97STreehugger Robot 161*16467b97STreehugger Robot self.failUnlessEqual("34", found) 162*16467b97STreehugger Robot 163*16467b97STreehugger Robot 164*16467b97STreehugger Robot def testAvoidDup(self): 165*16467b97STreehugger Robot grammar = textwrap.dedent( 166*16467b97STreehugger Robot r''' 167*16467b97STreehugger Robot grammar T4; 168*16467b97STreehugger Robot options { 169*16467b97STreehugger Robot language=Python; 170*16467b97STreehugger Robot output=AST; 171*16467b97STreehugger Robot } 172*16467b97STreehugger Robot a : ID ; 173*16467b97STreehugger Robot ID : 'a'..'z'+ ; 174*16467b97STreehugger Robot INT : '0'..'9'+; 175*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 176*16467b97STreehugger Robot ''') 177*16467b97STreehugger Robot 178*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 179*16467b97STreehugger Robot r''' 180*16467b97STreehugger Robot tree grammar TP4; 181*16467b97STreehugger Robot options { 182*16467b97STreehugger Robot language=Python; 183*16467b97STreehugger Robot output=AST; 184*16467b97STreehugger Robot ASTLabelType=CommonTree; 185*16467b97STreehugger Robot tokenVocab=T4; 186*16467b97STreehugger Robot } 187*16467b97STreehugger Robot a : ID -> ^(ID ID); 188*16467b97STreehugger Robot ''') 189*16467b97STreehugger Robot 190*16467b97STreehugger Robot found = self.execTreeParser( 191*16467b97STreehugger Robot grammar, 'a', 192*16467b97STreehugger Robot treeGrammar, 'a', 193*16467b97STreehugger Robot "abc" 194*16467b97STreehugger Robot ) 195*16467b97STreehugger Robot 196*16467b97STreehugger Robot self.failUnlessEqual("(abc abc)", found) 197*16467b97STreehugger Robot 198*16467b97STreehugger Robot 199*16467b97STreehugger Robot def testLoop(self): 200*16467b97STreehugger Robot grammar = textwrap.dedent( 201*16467b97STreehugger Robot r''' 202*16467b97STreehugger Robot grammar T5; 203*16467b97STreehugger Robot options { 204*16467b97STreehugger Robot language=Python; 205*16467b97STreehugger Robot output=AST; 206*16467b97STreehugger Robot } 207*16467b97STreehugger Robot a : ID+ INT+ -> (^(ID INT))+ ; 208*16467b97STreehugger Robot ID : 'a'..'z'+ ; 209*16467b97STreehugger Robot INT : '0'..'9'+; 210*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 211*16467b97STreehugger Robot ''') 212*16467b97STreehugger Robot 213*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 214*16467b97STreehugger Robot r''' 215*16467b97STreehugger Robot tree grammar TP5; 216*16467b97STreehugger Robot options { 217*16467b97STreehugger Robot language=Python; 218*16467b97STreehugger Robot output=AST; 219*16467b97STreehugger Robot ASTLabelType=CommonTree; 220*16467b97STreehugger Robot tokenVocab=T5; 221*16467b97STreehugger Robot } 222*16467b97STreehugger Robot a : (^(ID INT))+ -> INT+ ID+; 223*16467b97STreehugger Robot ''') 224*16467b97STreehugger Robot 225*16467b97STreehugger Robot found = self.execTreeParser( 226*16467b97STreehugger Robot grammar, 'a', 227*16467b97STreehugger Robot treeGrammar, 'a', 228*16467b97STreehugger Robot "a b c 3 4 5" 229*16467b97STreehugger Robot ) 230*16467b97STreehugger Robot 231*16467b97STreehugger Robot self.failUnlessEqual("3 4 5 a b c", found) 232*16467b97STreehugger Robot 233*16467b97STreehugger Robot 234*16467b97STreehugger Robot def testAutoDup(self): 235*16467b97STreehugger Robot grammar = textwrap.dedent( 236*16467b97STreehugger Robot r''' 237*16467b97STreehugger Robot grammar T6; 238*16467b97STreehugger Robot options { 239*16467b97STreehugger Robot language=Python; 240*16467b97STreehugger Robot output=AST; 241*16467b97STreehugger Robot } 242*16467b97STreehugger Robot a : ID ; 243*16467b97STreehugger Robot ID : 'a'..'z'+ ; 244*16467b97STreehugger Robot INT : '0'..'9'+; 245*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 246*16467b97STreehugger Robot ''') 247*16467b97STreehugger Robot 248*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 249*16467b97STreehugger Robot r''' 250*16467b97STreehugger Robot tree grammar TP6; 251*16467b97STreehugger Robot options { 252*16467b97STreehugger Robot language=Python; 253*16467b97STreehugger Robot output=AST; 254*16467b97STreehugger Robot ASTLabelType=CommonTree; 255*16467b97STreehugger Robot tokenVocab=T6; 256*16467b97STreehugger Robot } 257*16467b97STreehugger Robot a : ID; 258*16467b97STreehugger Robot ''') 259*16467b97STreehugger Robot 260*16467b97STreehugger Robot found = self.execTreeParser( 261*16467b97STreehugger Robot grammar, 'a', 262*16467b97STreehugger Robot treeGrammar, 'a', 263*16467b97STreehugger Robot "abc" 264*16467b97STreehugger Robot ) 265*16467b97STreehugger Robot 266*16467b97STreehugger Robot self.failUnlessEqual("abc", found) 267*16467b97STreehugger Robot 268*16467b97STreehugger Robot 269*16467b97STreehugger Robot def testAutoDupRule(self): 270*16467b97STreehugger Robot grammar = textwrap.dedent( 271*16467b97STreehugger Robot r''' 272*16467b97STreehugger Robot grammar T7; 273*16467b97STreehugger Robot options { 274*16467b97STreehugger Robot language=Python; 275*16467b97STreehugger Robot output=AST; 276*16467b97STreehugger Robot } 277*16467b97STreehugger Robot a : ID INT ; 278*16467b97STreehugger Robot ID : 'a'..'z'+ ; 279*16467b97STreehugger Robot INT : '0'..'9'+; 280*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 281*16467b97STreehugger Robot ''') 282*16467b97STreehugger Robot 283*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 284*16467b97STreehugger Robot r''' 285*16467b97STreehugger Robot tree grammar TP7; 286*16467b97STreehugger Robot options { 287*16467b97STreehugger Robot language=Python; 288*16467b97STreehugger Robot output=AST; 289*16467b97STreehugger Robot ASTLabelType=CommonTree; 290*16467b97STreehugger Robot tokenVocab=T7; 291*16467b97STreehugger Robot } 292*16467b97STreehugger Robot a : b c ; 293*16467b97STreehugger Robot b : ID ; 294*16467b97STreehugger Robot c : INT ; 295*16467b97STreehugger Robot ''') 296*16467b97STreehugger Robot 297*16467b97STreehugger Robot found = self.execTreeParser( 298*16467b97STreehugger Robot grammar, 'a', 299*16467b97STreehugger Robot treeGrammar, 'a', 300*16467b97STreehugger Robot "a 1" 301*16467b97STreehugger Robot ) 302*16467b97STreehugger Robot 303*16467b97STreehugger Robot self.failUnlessEqual("a 1", found) 304*16467b97STreehugger Robot 305*16467b97STreehugger Robot 306*16467b97STreehugger Robot def testAutoWildcard(self): 307*16467b97STreehugger Robot grammar = textwrap.dedent( 308*16467b97STreehugger Robot r''' 309*16467b97STreehugger Robot grammar T; 310*16467b97STreehugger Robot options {language=Python;output=AST;} 311*16467b97STreehugger Robot a : ID INT ; 312*16467b97STreehugger Robot ID : 'a'..'z'+ ; 313*16467b97STreehugger Robot INT : '0'..'9'+; 314*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 315*16467b97STreehugger Robot ''') 316*16467b97STreehugger Robot 317*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 318*16467b97STreehugger Robot r''' 319*16467b97STreehugger Robot tree grammar TP; 320*16467b97STreehugger Robot options {language=Python;output=AST; ASTLabelType=CommonTree; tokenVocab=T;} 321*16467b97STreehugger Robot a : ID . 322*16467b97STreehugger Robot ; 323*16467b97STreehugger Robot ''') 324*16467b97STreehugger Robot 325*16467b97STreehugger Robot found = self.execTreeParser( 326*16467b97STreehugger Robot grammar, 'a', 327*16467b97STreehugger Robot treeGrammar, 'a', 328*16467b97STreehugger Robot "abc 34") 329*16467b97STreehugger Robot self.assertEquals("abc 34", found) 330*16467b97STreehugger Robot 331*16467b97STreehugger Robot 332*16467b97STreehugger Robot# def testNoWildcardAsRootError(self): 333*16467b97STreehugger Robot# ErrorQueue equeue = new ErrorQueue(); 334*16467b97STreehugger Robot# ErrorManager.setErrorListener(equeue); 335*16467b97STreehugger Robot# > 336*16467b97STreehugger Robot# String treeGrammar = 337*16467b97STreehugger Robot# "tree grammar TP;\n"+ 338*16467b97STreehugger Robot# "options {language=Python;output=AST;} 339*16467b97STreehugger Robot# "a : ^(. INT) 340*16467b97STreehugger Robot# " ;\n"; 341*16467b97STreehugger Robot# > 342*16467b97STreehugger Robot# Grammar g = new Grammar(treeGrammar); 343*16467b97STreehugger Robot# Tool antlr = newTool(); 344*16467b97STreehugger Robot# antlr.setOutputDirectory(null); // write to /dev/null 345*16467b97STreehugger Robot# CodeGenerator generator = new CodeGenerator(antlr, g, "Java"); 346*16467b97STreehugger Robot# g.setCodeGenerator(generator); 347*16467b97STreehugger Robot# generator.genRecognizer(); 348*16467b97STreehugger Robot# > 349*16467b97STreehugger Robot# assertEquals("unexpected errors: "+equeue, 1, equeue.errors.size()); 350*16467b97STreehugger Robot# > 351*16467b97STreehugger Robot# int expectedMsgID = ErrorManager.MSG_WILDCARD_AS_ROOT; 352*16467b97STreehugger Robot# Object expectedArg = null; 353*16467b97STreehugger Robot# antlr.RecognitionException expectedExc = null; 354*16467b97STreehugger Robot# GrammarSyntaxMessage expectedMessage = 355*16467b97STreehugger Robot# new GrammarSyntaxMessage(expectedMsgID, g, null, expectedArg, expectedExc); 356*16467b97STreehugger Robot# > 357*16467b97STreehugger Robot# checkError(equeue, expectedMessage); 358*16467b97STreehugger Robot# } 359*16467b97STreehugger Robot 360*16467b97STreehugger Robot def testAutoWildcard2(self): 361*16467b97STreehugger Robot grammar = textwrap.dedent( 362*16467b97STreehugger Robot r''' 363*16467b97STreehugger Robot grammar T; 364*16467b97STreehugger Robot options {language=Python;output=AST;} 365*16467b97STreehugger Robot a : ID INT -> ^(ID INT); 366*16467b97STreehugger Robot ID : 'a'..'z'+ ; 367*16467b97STreehugger Robot INT : '0'..'9'+; 368*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 369*16467b97STreehugger Robot ''') 370*16467b97STreehugger Robot 371*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 372*16467b97STreehugger Robot r''' 373*16467b97STreehugger Robot tree grammar TP; 374*16467b97STreehugger Robot options {language=Python;output=AST; ASTLabelType=CommonTree; tokenVocab=T;} 375*16467b97STreehugger Robot a : ^(ID .) 376*16467b97STreehugger Robot ; 377*16467b97STreehugger Robot ''') 378*16467b97STreehugger Robot 379*16467b97STreehugger Robot found = self.execTreeParser( 380*16467b97STreehugger Robot grammar, 'a', 381*16467b97STreehugger Robot treeGrammar, 'a', 382*16467b97STreehugger Robot "abc 34") 383*16467b97STreehugger Robot self.assertEquals("(abc 34)", found) 384*16467b97STreehugger Robot 385*16467b97STreehugger Robot 386*16467b97STreehugger Robot def testAutoWildcardWithLabel(self): 387*16467b97STreehugger Robot grammar = textwrap.dedent( 388*16467b97STreehugger Robot r''' 389*16467b97STreehugger Robot grammar T; 390*16467b97STreehugger Robot options {language=Python;output=AST;} 391*16467b97STreehugger Robot a : ID INT ; 392*16467b97STreehugger Robot ID : 'a'..'z'+ ; 393*16467b97STreehugger Robot INT : '0'..'9'+; 394*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 395*16467b97STreehugger Robot ''') 396*16467b97STreehugger Robot 397*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 398*16467b97STreehugger Robot r''' 399*16467b97STreehugger Robot tree grammar TP; 400*16467b97STreehugger Robot options {language=Python;output=AST; ASTLabelType=CommonTree; tokenVocab=T;} 401*16467b97STreehugger Robot a : ID c=. 402*16467b97STreehugger Robot ; 403*16467b97STreehugger Robot ''') 404*16467b97STreehugger Robot 405*16467b97STreehugger Robot found = self.execTreeParser( 406*16467b97STreehugger Robot grammar, 'a', 407*16467b97STreehugger Robot treeGrammar, 'a', 408*16467b97STreehugger Robot "abc 34") 409*16467b97STreehugger Robot self.assertEquals("abc 34", found) 410*16467b97STreehugger Robot 411*16467b97STreehugger Robot 412*16467b97STreehugger Robot def testAutoWildcardWithListLabel(self): 413*16467b97STreehugger Robot grammar = textwrap.dedent( 414*16467b97STreehugger Robot r''' 415*16467b97STreehugger Robot grammar T; 416*16467b97STreehugger Robot options {language=Python;output=AST;} 417*16467b97STreehugger Robot a : ID INT ; 418*16467b97STreehugger Robot ID : 'a'..'z'+ ; 419*16467b97STreehugger Robot INT : '0'..'9'+; 420*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 421*16467b97STreehugger Robot ''') 422*16467b97STreehugger Robot 423*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 424*16467b97STreehugger Robot r''' 425*16467b97STreehugger Robot tree grammar TP; 426*16467b97STreehugger Robot options {language=Python;output=AST; ASTLabelType=CommonTree; tokenVocab=T;} 427*16467b97STreehugger Robot a : ID c+=. 428*16467b97STreehugger Robot ; 429*16467b97STreehugger Robot ''') 430*16467b97STreehugger Robot 431*16467b97STreehugger Robot found = self.execTreeParser( 432*16467b97STreehugger Robot grammar, 'a', 433*16467b97STreehugger Robot treeGrammar, 'a', 434*16467b97STreehugger Robot "abc 34") 435*16467b97STreehugger Robot self.assertEquals("abc 34", found) 436*16467b97STreehugger Robot 437*16467b97STreehugger Robot 438*16467b97STreehugger Robot def testAutoDupMultiple(self): 439*16467b97STreehugger Robot grammar = textwrap.dedent( 440*16467b97STreehugger Robot r''' 441*16467b97STreehugger Robot grammar T8; 442*16467b97STreehugger Robot options { 443*16467b97STreehugger Robot language=Python; 444*16467b97STreehugger Robot output=AST; 445*16467b97STreehugger Robot } 446*16467b97STreehugger Robot a : ID ID INT; 447*16467b97STreehugger Robot ID : 'a'..'z'+ ; 448*16467b97STreehugger Robot INT : '0'..'9'+; 449*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 450*16467b97STreehugger Robot ''') 451*16467b97STreehugger Robot 452*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 453*16467b97STreehugger Robot r''' 454*16467b97STreehugger Robot tree grammar TP8; 455*16467b97STreehugger Robot options { 456*16467b97STreehugger Robot language=Python; 457*16467b97STreehugger Robot output=AST; 458*16467b97STreehugger Robot ASTLabelType=CommonTree; 459*16467b97STreehugger Robot tokenVocab=T8; 460*16467b97STreehugger Robot } 461*16467b97STreehugger Robot a : ID ID INT 462*16467b97STreehugger Robot ; 463*16467b97STreehugger Robot ''') 464*16467b97STreehugger Robot 465*16467b97STreehugger Robot found = self.execTreeParser( 466*16467b97STreehugger Robot grammar, 'a', 467*16467b97STreehugger Robot treeGrammar, 'a', 468*16467b97STreehugger Robot "a b 3" 469*16467b97STreehugger Robot ) 470*16467b97STreehugger Robot 471*16467b97STreehugger Robot self.failUnlessEqual("a b 3", found) 472*16467b97STreehugger Robot 473*16467b97STreehugger Robot 474*16467b97STreehugger Robot def testAutoDupTree(self): 475*16467b97STreehugger Robot grammar = textwrap.dedent( 476*16467b97STreehugger Robot r''' 477*16467b97STreehugger Robot grammar T9; 478*16467b97STreehugger Robot options { 479*16467b97STreehugger Robot language=Python; 480*16467b97STreehugger Robot output=AST; 481*16467b97STreehugger Robot } 482*16467b97STreehugger Robot a : ID INT -> ^(ID INT); 483*16467b97STreehugger Robot ID : 'a'..'z'+ ; 484*16467b97STreehugger Robot INT : '0'..'9'+; 485*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 486*16467b97STreehugger Robot ''') 487*16467b97STreehugger Robot 488*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 489*16467b97STreehugger Robot r''' 490*16467b97STreehugger Robot tree grammar TP9; 491*16467b97STreehugger Robot options { 492*16467b97STreehugger Robot language=Python; 493*16467b97STreehugger Robot output=AST; 494*16467b97STreehugger Robot ASTLabelType=CommonTree; 495*16467b97STreehugger Robot tokenVocab=T9; 496*16467b97STreehugger Robot } 497*16467b97STreehugger Robot a : ^(ID INT) 498*16467b97STreehugger Robot ; 499*16467b97STreehugger Robot ''') 500*16467b97STreehugger Robot 501*16467b97STreehugger Robot found = self.execTreeParser( 502*16467b97STreehugger Robot grammar, 'a', 503*16467b97STreehugger Robot treeGrammar, 'a', 504*16467b97STreehugger Robot "a 3" 505*16467b97STreehugger Robot ) 506*16467b97STreehugger Robot 507*16467b97STreehugger Robot self.failUnlessEqual("(a 3)", found) 508*16467b97STreehugger Robot 509*16467b97STreehugger Robot 510*16467b97STreehugger Robot def testAutoDupTreeWithLabels(self): 511*16467b97STreehugger Robot grammar = textwrap.dedent( 512*16467b97STreehugger Robot r''' 513*16467b97STreehugger Robot grammar T10; 514*16467b97STreehugger Robot options { 515*16467b97STreehugger Robot language=Python; 516*16467b97STreehugger Robot output=AST; 517*16467b97STreehugger Robot } 518*16467b97STreehugger Robot a : ID INT -> ^(ID INT); 519*16467b97STreehugger Robot ID : 'a'..'z'+ ; 520*16467b97STreehugger Robot INT : '0'..'9'+; 521*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 522*16467b97STreehugger Robot ''') 523*16467b97STreehugger Robot 524*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 525*16467b97STreehugger Robot r''' 526*16467b97STreehugger Robot tree grammar TP10; 527*16467b97STreehugger Robot options { 528*16467b97STreehugger Robot language=Python; 529*16467b97STreehugger Robot output=AST; 530*16467b97STreehugger Robot ASTLabelType=CommonTree; 531*16467b97STreehugger Robot tokenVocab=T10; 532*16467b97STreehugger Robot } 533*16467b97STreehugger Robot a : ^(x=ID y=INT) 534*16467b97STreehugger Robot ; 535*16467b97STreehugger Robot ''') 536*16467b97STreehugger Robot 537*16467b97STreehugger Robot found = self.execTreeParser( 538*16467b97STreehugger Robot grammar, 'a', 539*16467b97STreehugger Robot treeGrammar, 'a', 540*16467b97STreehugger Robot "a 3" 541*16467b97STreehugger Robot ) 542*16467b97STreehugger Robot 543*16467b97STreehugger Robot self.failUnlessEqual("(a 3)", found) 544*16467b97STreehugger Robot 545*16467b97STreehugger Robot 546*16467b97STreehugger Robot def testAutoDupTreeWithListLabels(self): 547*16467b97STreehugger Robot grammar = textwrap.dedent( 548*16467b97STreehugger Robot r''' 549*16467b97STreehugger Robot grammar T11; 550*16467b97STreehugger Robot options { 551*16467b97STreehugger Robot language=Python; 552*16467b97STreehugger Robot output=AST; 553*16467b97STreehugger Robot } 554*16467b97STreehugger Robot a : ID INT -> ^(ID INT); 555*16467b97STreehugger Robot ID : 'a'..'z'+ ; 556*16467b97STreehugger Robot INT : '0'..'9'+; 557*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 558*16467b97STreehugger Robot ''') 559*16467b97STreehugger Robot 560*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 561*16467b97STreehugger Robot r''' 562*16467b97STreehugger Robot tree grammar TP11; 563*16467b97STreehugger Robot options { 564*16467b97STreehugger Robot language=Python; 565*16467b97STreehugger Robot output=AST; 566*16467b97STreehugger Robot ASTLabelType=CommonTree; 567*16467b97STreehugger Robot tokenVocab=T11; 568*16467b97STreehugger Robot } 569*16467b97STreehugger Robot a : ^(x+=ID y+=INT) 570*16467b97STreehugger Robot ; 571*16467b97STreehugger Robot ''') 572*16467b97STreehugger Robot 573*16467b97STreehugger Robot found = self.execTreeParser( 574*16467b97STreehugger Robot grammar, 'a', 575*16467b97STreehugger Robot treeGrammar, 'a', 576*16467b97STreehugger Robot "a 3" 577*16467b97STreehugger Robot ) 578*16467b97STreehugger Robot 579*16467b97STreehugger Robot self.failUnlessEqual("(a 3)", found) 580*16467b97STreehugger Robot 581*16467b97STreehugger Robot 582*16467b97STreehugger Robot def testAutoDupTreeWithRuleRoot(self): 583*16467b97STreehugger Robot grammar = textwrap.dedent( 584*16467b97STreehugger Robot r''' 585*16467b97STreehugger Robot grammar T12; 586*16467b97STreehugger Robot options { 587*16467b97STreehugger Robot language=Python; 588*16467b97STreehugger Robot output=AST; 589*16467b97STreehugger Robot } 590*16467b97STreehugger Robot a : ID INT -> ^(ID INT); 591*16467b97STreehugger Robot ID : 'a'..'z'+ ; 592*16467b97STreehugger Robot INT : '0'..'9'+; 593*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 594*16467b97STreehugger Robot ''') 595*16467b97STreehugger Robot 596*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 597*16467b97STreehugger Robot r''' 598*16467b97STreehugger Robot tree grammar TP12; 599*16467b97STreehugger Robot options { 600*16467b97STreehugger Robot language=Python; 601*16467b97STreehugger Robot output=AST; 602*16467b97STreehugger Robot ASTLabelType=CommonTree; 603*16467b97STreehugger Robot tokenVocab=T12; 604*16467b97STreehugger Robot } 605*16467b97STreehugger Robot a : ^(b INT) ; 606*16467b97STreehugger Robot b : ID ; 607*16467b97STreehugger Robot ''') 608*16467b97STreehugger Robot 609*16467b97STreehugger Robot found = self.execTreeParser( 610*16467b97STreehugger Robot grammar, 'a', 611*16467b97STreehugger Robot treeGrammar, 'a', 612*16467b97STreehugger Robot "a 3" 613*16467b97STreehugger Robot ) 614*16467b97STreehugger Robot 615*16467b97STreehugger Robot self.failUnlessEqual("(a 3)", found) 616*16467b97STreehugger Robot 617*16467b97STreehugger Robot 618*16467b97STreehugger Robot def testAutoDupTreeWithRuleRootAndLabels(self): 619*16467b97STreehugger Robot grammar = textwrap.dedent( 620*16467b97STreehugger Robot r''' 621*16467b97STreehugger Robot grammar T13; 622*16467b97STreehugger Robot options { 623*16467b97STreehugger Robot language=Python; 624*16467b97STreehugger Robot output=AST; 625*16467b97STreehugger Robot } 626*16467b97STreehugger Robot a : ID INT -> ^(ID INT); 627*16467b97STreehugger Robot ID : 'a'..'z'+ ; 628*16467b97STreehugger Robot INT : '0'..'9'+; 629*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 630*16467b97STreehugger Robot ''') 631*16467b97STreehugger Robot 632*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 633*16467b97STreehugger Robot r''' 634*16467b97STreehugger Robot tree grammar TP13; 635*16467b97STreehugger Robot options { 636*16467b97STreehugger Robot language=Python; 637*16467b97STreehugger Robot output=AST; 638*16467b97STreehugger Robot ASTLabelType=CommonTree; 639*16467b97STreehugger Robot tokenVocab=T13; 640*16467b97STreehugger Robot } 641*16467b97STreehugger Robot a : ^(x=b INT) ; 642*16467b97STreehugger Robot b : ID ; 643*16467b97STreehugger Robot ''') 644*16467b97STreehugger Robot 645*16467b97STreehugger Robot found = self.execTreeParser( 646*16467b97STreehugger Robot grammar, 'a', 647*16467b97STreehugger Robot treeGrammar, 'a', 648*16467b97STreehugger Robot "a 3" 649*16467b97STreehugger Robot ) 650*16467b97STreehugger Robot 651*16467b97STreehugger Robot self.failUnlessEqual("(a 3)", found) 652*16467b97STreehugger Robot 653*16467b97STreehugger Robot 654*16467b97STreehugger Robot def testAutoDupTreeWithRuleRootAndListLabels(self): 655*16467b97STreehugger Robot grammar = textwrap.dedent( 656*16467b97STreehugger Robot r''' 657*16467b97STreehugger Robot grammar T14; 658*16467b97STreehugger Robot options { 659*16467b97STreehugger Robot language=Python; 660*16467b97STreehugger Robot output=AST; 661*16467b97STreehugger Robot } 662*16467b97STreehugger Robot a : ID INT -> ^(ID INT); 663*16467b97STreehugger Robot ID : 'a'..'z'+ ; 664*16467b97STreehugger Robot INT : '0'..'9'+; 665*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 666*16467b97STreehugger Robot ''') 667*16467b97STreehugger Robot 668*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 669*16467b97STreehugger Robot r''' 670*16467b97STreehugger Robot tree grammar TP14; 671*16467b97STreehugger Robot options { 672*16467b97STreehugger Robot language=Python; 673*16467b97STreehugger Robot output=AST; 674*16467b97STreehugger Robot ASTLabelType=CommonTree; 675*16467b97STreehugger Robot tokenVocab=T14; 676*16467b97STreehugger Robot } 677*16467b97STreehugger Robot a : ^(x+=b y+=c) ; 678*16467b97STreehugger Robot b : ID ; 679*16467b97STreehugger Robot c : INT ; 680*16467b97STreehugger Robot ''') 681*16467b97STreehugger Robot 682*16467b97STreehugger Robot found = self.execTreeParser( 683*16467b97STreehugger Robot grammar, 'a', 684*16467b97STreehugger Robot treeGrammar, 'a', 685*16467b97STreehugger Robot "a 3" 686*16467b97STreehugger Robot ) 687*16467b97STreehugger Robot 688*16467b97STreehugger Robot self.failUnlessEqual("(a 3)", found) 689*16467b97STreehugger Robot 690*16467b97STreehugger Robot 691*16467b97STreehugger Robot def testAutoDupNestedTree(self): 692*16467b97STreehugger Robot grammar = textwrap.dedent( 693*16467b97STreehugger Robot r''' 694*16467b97STreehugger Robot grammar T15; 695*16467b97STreehugger Robot options { 696*16467b97STreehugger Robot language=Python; 697*16467b97STreehugger Robot output=AST; 698*16467b97STreehugger Robot } 699*16467b97STreehugger Robot a : x=ID y=ID INT -> ^($x ^($y INT)); 700*16467b97STreehugger Robot ID : 'a'..'z'+ ; 701*16467b97STreehugger Robot INT : '0'..'9'+; 702*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 703*16467b97STreehugger Robot ''') 704*16467b97STreehugger Robot 705*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 706*16467b97STreehugger Robot r''' 707*16467b97STreehugger Robot tree grammar TP15; 708*16467b97STreehugger Robot options { 709*16467b97STreehugger Robot language=Python; 710*16467b97STreehugger Robot output=AST; 711*16467b97STreehugger Robot ASTLabelType=CommonTree; 712*16467b97STreehugger Robot tokenVocab=T15; 713*16467b97STreehugger Robot } 714*16467b97STreehugger Robot a : ^(ID ^(ID INT)) 715*16467b97STreehugger Robot ; 716*16467b97STreehugger Robot ''') 717*16467b97STreehugger Robot 718*16467b97STreehugger Robot found = self.execTreeParser( 719*16467b97STreehugger Robot grammar, 'a', 720*16467b97STreehugger Robot treeGrammar, 'a', 721*16467b97STreehugger Robot "a b 3" 722*16467b97STreehugger Robot ) 723*16467b97STreehugger Robot 724*16467b97STreehugger Robot self.failUnlessEqual("(a (b 3))", found) 725*16467b97STreehugger Robot 726*16467b97STreehugger Robot 727*16467b97STreehugger Robot def testDelete(self): 728*16467b97STreehugger Robot grammar = textwrap.dedent( 729*16467b97STreehugger Robot r''' 730*16467b97STreehugger Robot grammar T16; 731*16467b97STreehugger Robot options { 732*16467b97STreehugger Robot language=Python; 733*16467b97STreehugger Robot output=AST; 734*16467b97STreehugger Robot } 735*16467b97STreehugger Robot a : ID ; 736*16467b97STreehugger Robot ID : 'a'..'z'+ ; 737*16467b97STreehugger Robot INT : '0'..'9'+; 738*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 739*16467b97STreehugger Robot ''') 740*16467b97STreehugger Robot 741*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 742*16467b97STreehugger Robot r''' 743*16467b97STreehugger Robot tree grammar TP16; 744*16467b97STreehugger Robot options { 745*16467b97STreehugger Robot language=Python; 746*16467b97STreehugger Robot output=AST; 747*16467b97STreehugger Robot ASTLabelType=CommonTree; 748*16467b97STreehugger Robot tokenVocab=T16; 749*16467b97STreehugger Robot } 750*16467b97STreehugger Robot a : ID -> 751*16467b97STreehugger Robot ; 752*16467b97STreehugger Robot ''') 753*16467b97STreehugger Robot 754*16467b97STreehugger Robot found = self.execTreeParser( 755*16467b97STreehugger Robot grammar, 'a', 756*16467b97STreehugger Robot treeGrammar, 'a', 757*16467b97STreehugger Robot "abc" 758*16467b97STreehugger Robot ) 759*16467b97STreehugger Robot 760*16467b97STreehugger Robot self.failUnlessEqual("", found) 761*16467b97STreehugger Robot 762*16467b97STreehugger Robot def testSetMatchNoRewrite(self): 763*16467b97STreehugger Robot grammar = textwrap.dedent( 764*16467b97STreehugger Robot r''' 765*16467b97STreehugger Robot grammar T; 766*16467b97STreehugger Robot options { 767*16467b97STreehugger Robot language=Python; 768*16467b97STreehugger Robot output=AST; 769*16467b97STreehugger Robot } 770*16467b97STreehugger Robot a : ID INT ; 771*16467b97STreehugger Robot ID : 'a'..'z'+ ; 772*16467b97STreehugger Robot INT : '0'..'9'+; 773*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 774*16467b97STreehugger Robot ''') 775*16467b97STreehugger Robot 776*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 777*16467b97STreehugger Robot r''' 778*16467b97STreehugger Robot tree grammar TP; 779*16467b97STreehugger Robot options { 780*16467b97STreehugger Robot language=Python; 781*16467b97STreehugger Robot output=AST; 782*16467b97STreehugger Robot ASTLabelType=CommonTree; 783*16467b97STreehugger Robot tokenVocab=T; 784*16467b97STreehugger Robot } 785*16467b97STreehugger Robot a : b INT; 786*16467b97STreehugger Robot b : ID | INT; 787*16467b97STreehugger Robot ''') 788*16467b97STreehugger Robot 789*16467b97STreehugger Robot found = self.execTreeParser( 790*16467b97STreehugger Robot grammar, 'a', 791*16467b97STreehugger Robot treeGrammar, 'a', 792*16467b97STreehugger Robot "abc 34" 793*16467b97STreehugger Robot ) 794*16467b97STreehugger Robot 795*16467b97STreehugger Robot self.failUnlessEqual("abc 34", found) 796*16467b97STreehugger Robot 797*16467b97STreehugger Robot 798*16467b97STreehugger Robot def testSetOptionalMatchNoRewrite(self): 799*16467b97STreehugger Robot grammar = textwrap.dedent( 800*16467b97STreehugger Robot r''' 801*16467b97STreehugger Robot grammar T; 802*16467b97STreehugger Robot options { 803*16467b97STreehugger Robot language=Python; 804*16467b97STreehugger Robot output=AST; 805*16467b97STreehugger Robot } 806*16467b97STreehugger Robot a : ID INT ; 807*16467b97STreehugger Robot ID : 'a'..'z'+ ; 808*16467b97STreehugger Robot INT : '0'..'9'+; 809*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 810*16467b97STreehugger Robot ''') 811*16467b97STreehugger Robot 812*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 813*16467b97STreehugger Robot r''' 814*16467b97STreehugger Robot tree grammar TP; 815*16467b97STreehugger Robot options { 816*16467b97STreehugger Robot language=Python; 817*16467b97STreehugger Robot output=AST; 818*16467b97STreehugger Robot ASTLabelType=CommonTree; 819*16467b97STreehugger Robot tokenVocab=T; 820*16467b97STreehugger Robot } 821*16467b97STreehugger Robot a : (ID|INT)? INT ; 822*16467b97STreehugger Robot ''') 823*16467b97STreehugger Robot 824*16467b97STreehugger Robot found = self.execTreeParser( 825*16467b97STreehugger Robot grammar, 'a', 826*16467b97STreehugger Robot treeGrammar, 'a', 827*16467b97STreehugger Robot "abc 34") 828*16467b97STreehugger Robot 829*16467b97STreehugger Robot self.failUnlessEqual("abc 34", found) 830*16467b97STreehugger Robot 831*16467b97STreehugger Robot 832*16467b97STreehugger Robot def testSetMatchNoRewriteLevel2(self): 833*16467b97STreehugger Robot grammar = textwrap.dedent( 834*16467b97STreehugger Robot r''' 835*16467b97STreehugger Robot grammar T; 836*16467b97STreehugger Robot options { 837*16467b97STreehugger Robot language=Python; 838*16467b97STreehugger Robot output=AST; 839*16467b97STreehugger Robot } 840*16467b97STreehugger Robot a : x=ID INT -> ^($x INT); 841*16467b97STreehugger Robot ID : 'a'..'z'+ ; 842*16467b97STreehugger Robot INT : '0'..'9'+; 843*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 844*16467b97STreehugger Robot ''') 845*16467b97STreehugger Robot 846*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 847*16467b97STreehugger Robot r''' 848*16467b97STreehugger Robot tree grammar TP; 849*16467b97STreehugger Robot options { 850*16467b97STreehugger Robot language=Python; 851*16467b97STreehugger Robot output=AST; 852*16467b97STreehugger Robot ASTLabelType=CommonTree; 853*16467b97STreehugger Robot tokenVocab=T; 854*16467b97STreehugger Robot } 855*16467b97STreehugger Robot a : ^(ID (ID | INT) ) ; 856*16467b97STreehugger Robot ''') 857*16467b97STreehugger Robot 858*16467b97STreehugger Robot found = self.execTreeParser( 859*16467b97STreehugger Robot grammar, 'a', 860*16467b97STreehugger Robot treeGrammar, 'a', 861*16467b97STreehugger Robot "abc 34" 862*16467b97STreehugger Robot ) 863*16467b97STreehugger Robot 864*16467b97STreehugger Robot self.failUnlessEqual("(abc 34)", found) 865*16467b97STreehugger Robot 866*16467b97STreehugger Robot 867*16467b97STreehugger Robot def testSetMatchNoRewriteLevel2Root(self): 868*16467b97STreehugger Robot grammar = textwrap.dedent( 869*16467b97STreehugger Robot r''' 870*16467b97STreehugger Robot grammar T; 871*16467b97STreehugger Robot options { 872*16467b97STreehugger Robot language=Python; 873*16467b97STreehugger Robot output=AST; 874*16467b97STreehugger Robot } 875*16467b97STreehugger Robot a : x=ID INT -> ^($x INT); 876*16467b97STreehugger Robot ID : 'a'..'z'+ ; 877*16467b97STreehugger Robot INT : '0'..'9'+; 878*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 879*16467b97STreehugger Robot ''') 880*16467b97STreehugger Robot 881*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 882*16467b97STreehugger Robot r''' 883*16467b97STreehugger Robot tree grammar TP; 884*16467b97STreehugger Robot options { 885*16467b97STreehugger Robot language=Python; 886*16467b97STreehugger Robot output=AST; 887*16467b97STreehugger Robot ASTLabelType=CommonTree; 888*16467b97STreehugger Robot tokenVocab=T; 889*16467b97STreehugger Robot } 890*16467b97STreehugger Robot a : ^((ID | INT) INT) ; 891*16467b97STreehugger Robot ''') 892*16467b97STreehugger Robot 893*16467b97STreehugger Robot found = self.execTreeParser( 894*16467b97STreehugger Robot grammar, 'a', 895*16467b97STreehugger Robot treeGrammar, 'a', 896*16467b97STreehugger Robot "abc 34" 897*16467b97STreehugger Robot ) 898*16467b97STreehugger Robot 899*16467b97STreehugger Robot self.failUnlessEqual("(abc 34)", found) 900*16467b97STreehugger Robot 901*16467b97STreehugger Robot 902*16467b97STreehugger Robot ## REWRITE MODE 903*16467b97STreehugger Robot 904*16467b97STreehugger Robot def testRewriteModeCombinedRewriteAndAuto(self): 905*16467b97STreehugger Robot grammar = textwrap.dedent( 906*16467b97STreehugger Robot r''' 907*16467b97STreehugger Robot grammar T17; 908*16467b97STreehugger Robot options { 909*16467b97STreehugger Robot language=Python; 910*16467b97STreehugger Robot output=AST; 911*16467b97STreehugger Robot } 912*16467b97STreehugger Robot a : ID INT -> ^(ID INT) | INT ; 913*16467b97STreehugger Robot ID : 'a'..'z'+ ; 914*16467b97STreehugger Robot INT : '0'..'9'+; 915*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 916*16467b97STreehugger Robot ''') 917*16467b97STreehugger Robot 918*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 919*16467b97STreehugger Robot r''' 920*16467b97STreehugger Robot tree grammar TP17; 921*16467b97STreehugger Robot options { 922*16467b97STreehugger Robot language=Python; 923*16467b97STreehugger Robot output=AST; 924*16467b97STreehugger Robot ASTLabelType=CommonTree; 925*16467b97STreehugger Robot tokenVocab=T17; 926*16467b97STreehugger Robot rewrite=true; 927*16467b97STreehugger Robot } 928*16467b97STreehugger Robot a : ^(ID INT) -> ^(ID["ick"] INT) 929*16467b97STreehugger Robot | INT // leaves it alone, returning $a.start 930*16467b97STreehugger Robot ; 931*16467b97STreehugger Robot ''') 932*16467b97STreehugger Robot 933*16467b97STreehugger Robot found = self.execTreeParser( 934*16467b97STreehugger Robot grammar, 'a', 935*16467b97STreehugger Robot treeGrammar, 'a', 936*16467b97STreehugger Robot "abc 34" 937*16467b97STreehugger Robot ) 938*16467b97STreehugger Robot 939*16467b97STreehugger Robot self.failUnlessEqual("(ick 34)", found) 940*16467b97STreehugger Robot 941*16467b97STreehugger Robot 942*16467b97STreehugger Robot found = self.execTreeParser( 943*16467b97STreehugger Robot grammar, 'a', 944*16467b97STreehugger Robot treeGrammar, 'a', 945*16467b97STreehugger Robot "34" 946*16467b97STreehugger Robot ) 947*16467b97STreehugger Robot 948*16467b97STreehugger Robot self.failUnlessEqual("34", found) 949*16467b97STreehugger Robot 950*16467b97STreehugger Robot 951*16467b97STreehugger Robot def testRewriteModeFlatTree(self): 952*16467b97STreehugger Robot grammar = textwrap.dedent( 953*16467b97STreehugger Robot r''' 954*16467b97STreehugger Robot grammar T18; 955*16467b97STreehugger Robot options { 956*16467b97STreehugger Robot language=Python; 957*16467b97STreehugger Robot output=AST; 958*16467b97STreehugger Robot } 959*16467b97STreehugger Robot a : ID INT -> ID INT | INT ; 960*16467b97STreehugger Robot ID : 'a'..'z'+ ; 961*16467b97STreehugger Robot INT : '0'..'9'+; 962*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 963*16467b97STreehugger Robot ''') 964*16467b97STreehugger Robot 965*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 966*16467b97STreehugger Robot r''' 967*16467b97STreehugger Robot tree grammar TP18; 968*16467b97STreehugger Robot options { 969*16467b97STreehugger Robot language=Python; 970*16467b97STreehugger Robot output=AST; 971*16467b97STreehugger Robot ASTLabelType=CommonTree; 972*16467b97STreehugger Robot tokenVocab=T18; 973*16467b97STreehugger Robot rewrite=true; 974*16467b97STreehugger Robot } 975*16467b97STreehugger Robot s : ID a ; 976*16467b97STreehugger Robot a : INT -> INT["1"] 977*16467b97STreehugger Robot ; 978*16467b97STreehugger Robot ''') 979*16467b97STreehugger Robot 980*16467b97STreehugger Robot found = self.execTreeParser( 981*16467b97STreehugger Robot grammar, 'a', 982*16467b97STreehugger Robot treeGrammar, 's', 983*16467b97STreehugger Robot "abc 34" 984*16467b97STreehugger Robot ) 985*16467b97STreehugger Robot self.assertEquals("abc 1", found) 986*16467b97STreehugger Robot 987*16467b97STreehugger Robot 988*16467b97STreehugger Robot def testRewriteModeChainRuleFlatTree(self): 989*16467b97STreehugger Robot grammar = textwrap.dedent( 990*16467b97STreehugger Robot r''' 991*16467b97STreehugger Robot grammar T; 992*16467b97STreehugger Robot options {language=Python; output=AST;} 993*16467b97STreehugger Robot a : ID INT -> ID INT | INT ; 994*16467b97STreehugger Robot ID : 'a'..'z'+ ; 995*16467b97STreehugger Robot INT : '0'..'9'+; 996*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 997*16467b97STreehugger Robot ''') 998*16467b97STreehugger Robot 999*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1000*16467b97STreehugger Robot r''' 1001*16467b97STreehugger Robot tree grammar TP; 1002*16467b97STreehugger Robot options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1003*16467b97STreehugger Robot s : a ; 1004*16467b97STreehugger Robot a : b ; 1005*16467b97STreehugger Robot b : ID INT -> INT ID 1006*16467b97STreehugger Robot ; 1007*16467b97STreehugger Robot ''') 1008*16467b97STreehugger Robot 1009*16467b97STreehugger Robot found = self.execTreeParser( 1010*16467b97STreehugger Robot grammar, 'a', 1011*16467b97STreehugger Robot treeGrammar, 's', 1012*16467b97STreehugger Robot "abc 34") 1013*16467b97STreehugger Robot self.assertEquals("34 abc", found) 1014*16467b97STreehugger Robot 1015*16467b97STreehugger Robot 1016*16467b97STreehugger Robot def testRewriteModeChainRuleTree(self): 1017*16467b97STreehugger Robot grammar = textwrap.dedent( 1018*16467b97STreehugger Robot r''' 1019*16467b97STreehugger Robot grammar T; 1020*16467b97STreehugger Robot options {language=Python; output=AST;} 1021*16467b97STreehugger Robot a : ID INT -> ^(ID INT) ; 1022*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1023*16467b97STreehugger Robot INT : '0'..'9'+; 1024*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1025*16467b97STreehugger Robot ''') 1026*16467b97STreehugger Robot 1027*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1028*16467b97STreehugger Robot r''' 1029*16467b97STreehugger Robot tree grammar TP; 1030*16467b97STreehugger Robot options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1031*16467b97STreehugger Robot s : a ; 1032*16467b97STreehugger Robot a : b ; // a.tree must become b.tree 1033*16467b97STreehugger Robot b : ^(ID INT) -> INT 1034*16467b97STreehugger Robot ; 1035*16467b97STreehugger Robot ''') 1036*16467b97STreehugger Robot 1037*16467b97STreehugger Robot found = self.execTreeParser( 1038*16467b97STreehugger Robot grammar, 'a', 1039*16467b97STreehugger Robot treeGrammar, 's', 1040*16467b97STreehugger Robot "abc 34") 1041*16467b97STreehugger Robot self.assertEquals("34", found) 1042*16467b97STreehugger Robot 1043*16467b97STreehugger Robot 1044*16467b97STreehugger Robot def testRewriteModeChainRuleTree2(self): 1045*16467b97STreehugger Robot grammar = textwrap.dedent( 1046*16467b97STreehugger Robot r''' 1047*16467b97STreehugger Robot grammar T; 1048*16467b97STreehugger Robot options {language=Python; output=AST;} 1049*16467b97STreehugger Robot a : ID INT -> ^(ID INT) ; 1050*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1051*16467b97STreehugger Robot INT : '0'..'9'+; 1052*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1053*16467b97STreehugger Robot ''') 1054*16467b97STreehugger Robot 1055*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1056*16467b97STreehugger Robot r""" 1057*16467b97STreehugger Robot tree grammar TP; 1058*16467b97STreehugger Robot options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1059*16467b97STreehugger Robot tokens { X; } 1060*16467b97STreehugger Robot s : a* b ; // only b contributes to tree, but it's after a*; s.tree = b.tree 1061*16467b97STreehugger Robot a : X ; 1062*16467b97STreehugger Robot b : ^(ID INT) -> INT 1063*16467b97STreehugger Robot ; 1064*16467b97STreehugger Robot """) 1065*16467b97STreehugger Robot 1066*16467b97STreehugger Robot found = self.execTreeParser( 1067*16467b97STreehugger Robot grammar, 'a', 1068*16467b97STreehugger Robot treeGrammar, 's', 1069*16467b97STreehugger Robot "abc 34") 1070*16467b97STreehugger Robot self.assertEquals("34", found) 1071*16467b97STreehugger Robot 1072*16467b97STreehugger Robot 1073*16467b97STreehugger Robot def testRewriteModeChainRuleTree3(self): 1074*16467b97STreehugger Robot grammar = textwrap.dedent( 1075*16467b97STreehugger Robot r''' 1076*16467b97STreehugger Robot grammar T; 1077*16467b97STreehugger Robot options {language=Python; output=AST;} 1078*16467b97STreehugger Robot a : 'boo' ID INT -> 'boo' ^(ID INT) ; 1079*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1080*16467b97STreehugger Robot INT : '0'..'9'+; 1081*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1082*16467b97STreehugger Robot ''') 1083*16467b97STreehugger Robot 1084*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1085*16467b97STreehugger Robot r""" 1086*16467b97STreehugger Robot tree grammar TP; 1087*16467b97STreehugger Robot options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1088*16467b97STreehugger Robot tokens { X; } 1089*16467b97STreehugger Robot s : 'boo' a* b ; // don't reset s.tree to b.tree due to 'boo' 1090*16467b97STreehugger Robot a : X ; 1091*16467b97STreehugger Robot b : ^(ID INT) -> INT 1092*16467b97STreehugger Robot ; 1093*16467b97STreehugger Robot """) 1094*16467b97STreehugger Robot 1095*16467b97STreehugger Robot found = self.execTreeParser( 1096*16467b97STreehugger Robot grammar, 'a', 1097*16467b97STreehugger Robot treeGrammar, 's', 1098*16467b97STreehugger Robot "boo abc 34") 1099*16467b97STreehugger Robot self.assertEquals("boo 34", found) 1100*16467b97STreehugger Robot 1101*16467b97STreehugger Robot 1102*16467b97STreehugger Robot def testRewriteModeChainRuleTree4(self): 1103*16467b97STreehugger Robot grammar = textwrap.dedent( 1104*16467b97STreehugger Robot r""" 1105*16467b97STreehugger Robot grammar T; 1106*16467b97STreehugger Robot options {language=Python; output=AST;} 1107*16467b97STreehugger Robot a : 'boo' ID INT -> ^('boo' ^(ID INT)) ; 1108*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1109*16467b97STreehugger Robot INT : '0'..'9'+; 1110*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1111*16467b97STreehugger Robot """) 1112*16467b97STreehugger Robot 1113*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1114*16467b97STreehugger Robot r""" 1115*16467b97STreehugger Robot tree grammar TP; 1116*16467b97STreehugger Robot options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1117*16467b97STreehugger Robot tokens { X; } 1118*16467b97STreehugger Robot s : ^('boo' a* b) ; // don't reset s.tree to b.tree due to 'boo' 1119*16467b97STreehugger Robot a : X ; 1120*16467b97STreehugger Robot b : ^(ID INT) -> INT 1121*16467b97STreehugger Robot ; 1122*16467b97STreehugger Robot """) 1123*16467b97STreehugger Robot 1124*16467b97STreehugger Robot found = self.execTreeParser( 1125*16467b97STreehugger Robot grammar, 'a', 1126*16467b97STreehugger Robot treeGrammar, 's', 1127*16467b97STreehugger Robot "boo abc 34") 1128*16467b97STreehugger Robot self.assertEquals("(boo 34)", found) 1129*16467b97STreehugger Robot 1130*16467b97STreehugger Robot 1131*16467b97STreehugger Robot def testRewriteModeChainRuleTree5(self): 1132*16467b97STreehugger Robot grammar = textwrap.dedent( 1133*16467b97STreehugger Robot r""" 1134*16467b97STreehugger Robot grammar T; 1135*16467b97STreehugger Robot options {language=Python; output=AST;} 1136*16467b97STreehugger Robot a : 'boo' ID INT -> ^('boo' ^(ID INT)) ; 1137*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1138*16467b97STreehugger Robot INT : '0'..'9'+; 1139*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1140*16467b97STreehugger Robot """) 1141*16467b97STreehugger Robot 1142*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1143*16467b97STreehugger Robot r""" 1144*16467b97STreehugger Robot tree grammar TP; 1145*16467b97STreehugger Robot options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1146*16467b97STreehugger Robot tokens { X; } 1147*16467b97STreehugger Robot s : ^(a b) ; // s.tree is a.tree 1148*16467b97STreehugger Robot a : 'boo' ; 1149*16467b97STreehugger Robot b : ^(ID INT) -> INT 1150*16467b97STreehugger Robot ; 1151*16467b97STreehugger Robot """) 1152*16467b97STreehugger Robot 1153*16467b97STreehugger Robot found = self.execTreeParser( 1154*16467b97STreehugger Robot grammar, 'a', 1155*16467b97STreehugger Robot treeGrammar, 's', 1156*16467b97STreehugger Robot "boo abc 34") 1157*16467b97STreehugger Robot self.assertEquals("(boo 34)", found) 1158*16467b97STreehugger Robot 1159*16467b97STreehugger Robot 1160*16467b97STreehugger Robot def testRewriteOfRuleRef(self): 1161*16467b97STreehugger Robot grammar = textwrap.dedent( 1162*16467b97STreehugger Robot r""" 1163*16467b97STreehugger Robot grammar T; 1164*16467b97STreehugger Robot options {language=Python; output=AST;} 1165*16467b97STreehugger Robot a : ID INT -> ID INT | INT ; 1166*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1167*16467b97STreehugger Robot INT : '0'..'9'+; 1168*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1169*16467b97STreehugger Robot """) 1170*16467b97STreehugger Robot 1171*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1172*16467b97STreehugger Robot r""" 1173*16467b97STreehugger Robot tree grammar TP; 1174*16467b97STreehugger Robot options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1175*16467b97STreehugger Robot s : a -> a ; 1176*16467b97STreehugger Robot a : ID INT -> ID INT ; 1177*16467b97STreehugger Robot """) 1178*16467b97STreehugger Robot 1179*16467b97STreehugger Robot found = self.execTreeParser( 1180*16467b97STreehugger Robot grammar, 'a', 1181*16467b97STreehugger Robot treeGrammar, 's', 1182*16467b97STreehugger Robot "abc 34") 1183*16467b97STreehugger Robot self.failUnlessEqual("abc 34", found) 1184*16467b97STreehugger Robot 1185*16467b97STreehugger Robot 1186*16467b97STreehugger Robot def testRewriteOfRuleRefRoot(self): 1187*16467b97STreehugger Robot grammar = textwrap.dedent( 1188*16467b97STreehugger Robot r""" 1189*16467b97STreehugger Robot grammar T; 1190*16467b97STreehugger Robot options {language=Python; output=AST;} 1191*16467b97STreehugger Robot a : ID INT INT -> ^(INT ^(ID INT)); 1192*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1193*16467b97STreehugger Robot INT : '0'..'9'+; 1194*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1195*16467b97STreehugger Robot """) 1196*16467b97STreehugger Robot 1197*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1198*16467b97STreehugger Robot r""" 1199*16467b97STreehugger Robot tree grammar TP; 1200*16467b97STreehugger Robot options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1201*16467b97STreehugger Robot s : ^(a ^(ID INT)) -> a ; 1202*16467b97STreehugger Robot a : INT ; 1203*16467b97STreehugger Robot """) 1204*16467b97STreehugger Robot 1205*16467b97STreehugger Robot found = self.execTreeParser( 1206*16467b97STreehugger Robot grammar, 'a', 1207*16467b97STreehugger Robot treeGrammar, 's', 1208*16467b97STreehugger Robot "abc 12 34") 1209*16467b97STreehugger Robot # emits whole tree when you ref the root since I can't know whether 1210*16467b97STreehugger Robot # you want the children or not. You might be returning a whole new 1211*16467b97STreehugger Robot # tree. Hmm...still seems weird. oh well. 1212*16467b97STreehugger Robot self.failUnlessEqual("(12 (abc 34))", found) 1213*16467b97STreehugger Robot 1214*16467b97STreehugger Robot 1215*16467b97STreehugger Robot def testRewriteOfRuleRefRootLabeled(self): 1216*16467b97STreehugger Robot grammar = textwrap.dedent( 1217*16467b97STreehugger Robot r""" 1218*16467b97STreehugger Robot grammar T; 1219*16467b97STreehugger Robot options {language=Python; output=AST;} 1220*16467b97STreehugger Robot a : ID INT INT -> ^(INT ^(ID INT)); 1221*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1222*16467b97STreehugger Robot INT : '0'..'9'+; 1223*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1224*16467b97STreehugger Robot """) 1225*16467b97STreehugger Robot 1226*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1227*16467b97STreehugger Robot r""" 1228*16467b97STreehugger Robot tree grammar TP; 1229*16467b97STreehugger Robot options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1230*16467b97STreehugger Robot s : ^(label=a ^(ID INT)) -> a ; 1231*16467b97STreehugger Robot a : INT ; 1232*16467b97STreehugger Robot """) 1233*16467b97STreehugger Robot 1234*16467b97STreehugger Robot found = self.execTreeParser( 1235*16467b97STreehugger Robot grammar, 'a', 1236*16467b97STreehugger Robot treeGrammar, 's', 1237*16467b97STreehugger Robot "abc 12 34") 1238*16467b97STreehugger Robot # emits whole tree when you ref the root since I can't know whether 1239*16467b97STreehugger Robot # you want the children or not. You might be returning a whole new 1240*16467b97STreehugger Robot # tree. Hmm...still seems weird. oh well. 1241*16467b97STreehugger Robot self.failUnlessEqual("(12 (abc 34))", found) 1242*16467b97STreehugger Robot 1243*16467b97STreehugger Robot 1244*16467b97STreehugger Robot def testRewriteOfRuleRefRootListLabeled(self): 1245*16467b97STreehugger Robot grammar = textwrap.dedent( 1246*16467b97STreehugger Robot r""" 1247*16467b97STreehugger Robot grammar T; 1248*16467b97STreehugger Robot options {language=Python; output=AST;} 1249*16467b97STreehugger Robot a : ID INT INT -> ^(INT ^(ID INT)); 1250*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1251*16467b97STreehugger Robot INT : '0'..'9'+; 1252*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1253*16467b97STreehugger Robot """) 1254*16467b97STreehugger Robot 1255*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1256*16467b97STreehugger Robot r""" 1257*16467b97STreehugger Robot tree grammar TP; 1258*16467b97STreehugger Robot options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1259*16467b97STreehugger Robot s : ^(label+=a ^(ID INT)) -> a ; 1260*16467b97STreehugger Robot a : INT ; 1261*16467b97STreehugger Robot """) 1262*16467b97STreehugger Robot 1263*16467b97STreehugger Robot found = self.execTreeParser( 1264*16467b97STreehugger Robot grammar, 'a', 1265*16467b97STreehugger Robot treeGrammar, 's', 1266*16467b97STreehugger Robot "abc 12 34") 1267*16467b97STreehugger Robot # emits whole tree when you ref the root since I can't know whether 1268*16467b97STreehugger Robot # you want the children or not. You might be returning a whole new 1269*16467b97STreehugger Robot # tree. Hmm...still seems weird. oh well. 1270*16467b97STreehugger Robot self.failUnlessEqual("(12 (abc 34))", found) 1271*16467b97STreehugger Robot 1272*16467b97STreehugger Robot 1273*16467b97STreehugger Robot def testRewriteOfRuleRefChild(self): 1274*16467b97STreehugger Robot grammar = textwrap.dedent( 1275*16467b97STreehugger Robot r""" 1276*16467b97STreehugger Robot grammar T; 1277*16467b97STreehugger Robot options {language=Python; output=AST;} 1278*16467b97STreehugger Robot a : ID INT -> ^(ID ^(INT INT)); 1279*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1280*16467b97STreehugger Robot INT : '0'..'9'+; 1281*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1282*16467b97STreehugger Robot """) 1283*16467b97STreehugger Robot 1284*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1285*16467b97STreehugger Robot r""" 1286*16467b97STreehugger Robot tree grammar TP; 1287*16467b97STreehugger Robot options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1288*16467b97STreehugger Robot s : ^(ID a) -> a ; 1289*16467b97STreehugger Robot a : ^(INT INT) ; 1290*16467b97STreehugger Robot """) 1291*16467b97STreehugger Robot 1292*16467b97STreehugger Robot found = self.execTreeParser( 1293*16467b97STreehugger Robot grammar, 'a', 1294*16467b97STreehugger Robot treeGrammar, 's', 1295*16467b97STreehugger Robot "abc 34") 1296*16467b97STreehugger Robot self.failUnlessEqual("(34 34)", found) 1297*16467b97STreehugger Robot 1298*16467b97STreehugger Robot 1299*16467b97STreehugger Robot def testRewriteOfRuleRefLabel(self): 1300*16467b97STreehugger Robot grammar = textwrap.dedent( 1301*16467b97STreehugger Robot r""" 1302*16467b97STreehugger Robot grammar T; 1303*16467b97STreehugger Robot options {language=Python; output=AST;} 1304*16467b97STreehugger Robot a : ID INT -> ^(ID ^(INT INT)); 1305*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1306*16467b97STreehugger Robot INT : '0'..'9'+; 1307*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1308*16467b97STreehugger Robot """) 1309*16467b97STreehugger Robot 1310*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1311*16467b97STreehugger Robot r""" 1312*16467b97STreehugger Robot tree grammar TP; 1313*16467b97STreehugger Robot options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1314*16467b97STreehugger Robot s : ^(ID label=a) -> a ; 1315*16467b97STreehugger Robot a : ^(INT INT) ; 1316*16467b97STreehugger Robot """) 1317*16467b97STreehugger Robot 1318*16467b97STreehugger Robot found = self.execTreeParser( 1319*16467b97STreehugger Robot grammar, 'a', 1320*16467b97STreehugger Robot treeGrammar, 's', 1321*16467b97STreehugger Robot "abc 34") 1322*16467b97STreehugger Robot self.failUnlessEqual("(34 34)", found) 1323*16467b97STreehugger Robot 1324*16467b97STreehugger Robot 1325*16467b97STreehugger Robot def testRewriteOfRuleRefListLabel(self): 1326*16467b97STreehugger Robot grammar = textwrap.dedent( 1327*16467b97STreehugger Robot r""" 1328*16467b97STreehugger Robot grammar T; 1329*16467b97STreehugger Robot options {language=Python; output=AST;} 1330*16467b97STreehugger Robot a : ID INT -> ^(ID ^(INT INT)); 1331*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1332*16467b97STreehugger Robot INT : '0'..'9'+; 1333*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1334*16467b97STreehugger Robot """) 1335*16467b97STreehugger Robot 1336*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1337*16467b97STreehugger Robot r""" 1338*16467b97STreehugger Robot tree grammar TP; 1339*16467b97STreehugger Robot options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1340*16467b97STreehugger Robot s : ^(ID label+=a) -> a ; 1341*16467b97STreehugger Robot a : ^(INT INT) ; 1342*16467b97STreehugger Robot """) 1343*16467b97STreehugger Robot 1344*16467b97STreehugger Robot found = self.execTreeParser( 1345*16467b97STreehugger Robot grammar, 'a', 1346*16467b97STreehugger Robot treeGrammar, 's', 1347*16467b97STreehugger Robot "abc 34") 1348*16467b97STreehugger Robot self.failUnlessEqual("(34 34)", found) 1349*16467b97STreehugger Robot 1350*16467b97STreehugger Robot 1351*16467b97STreehugger Robot 1352*16467b97STreehugger Robot def testRewriteModeWithPredicatedRewrites(self): 1353*16467b97STreehugger Robot grammar = textwrap.dedent( 1354*16467b97STreehugger Robot r''' 1355*16467b97STreehugger Robot grammar T19; 1356*16467b97STreehugger Robot options { 1357*16467b97STreehugger Robot language=Python; 1358*16467b97STreehugger Robot output=AST; 1359*16467b97STreehugger Robot } 1360*16467b97STreehugger Robot a : ID INT -> ^(ID["root"] ^(ID INT)) | INT -> ^(ID["root"] INT) ; 1361*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1362*16467b97STreehugger Robot INT : '0'..'9'+; 1363*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1364*16467b97STreehugger Robot ''') 1365*16467b97STreehugger Robot 1366*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1367*16467b97STreehugger Robot r''' 1368*16467b97STreehugger Robot tree grammar TP19; 1369*16467b97STreehugger Robot options { 1370*16467b97STreehugger Robot language=Python; 1371*16467b97STreehugger Robot output=AST; 1372*16467b97STreehugger Robot ASTLabelType=CommonTree; 1373*16467b97STreehugger Robot tokenVocab=T19; 1374*16467b97STreehugger Robot rewrite=true; 1375*16467b97STreehugger Robot } 1376*16467b97STreehugger Robot s : ^(ID a) { self.buf += $s.start.toStringTree() }; 1377*16467b97STreehugger Robot a : ^(ID INT) -> {True}? ^(ID["ick"] INT) 1378*16467b97STreehugger Robot -> INT 1379*16467b97STreehugger Robot ; 1380*16467b97STreehugger Robot ''') 1381*16467b97STreehugger Robot 1382*16467b97STreehugger Robot found = self.execTreeParser( 1383*16467b97STreehugger Robot grammar, 'a', 1384*16467b97STreehugger Robot treeGrammar, 's', 1385*16467b97STreehugger Robot "abc 34" 1386*16467b97STreehugger Robot ) 1387*16467b97STreehugger Robot 1388*16467b97STreehugger Robot self.failUnlessEqual("(root (ick 34))", found) 1389*16467b97STreehugger Robot 1390*16467b97STreehugger Robot 1391*16467b97STreehugger Robot def testWildcardSingleNode(self): 1392*16467b97STreehugger Robot grammar = textwrap.dedent( 1393*16467b97STreehugger Robot r''' 1394*16467b97STreehugger Robot grammar T; 1395*16467b97STreehugger Robot options { 1396*16467b97STreehugger Robot language=Python; 1397*16467b97STreehugger Robot output=AST; 1398*16467b97STreehugger Robot } 1399*16467b97STreehugger Robot a : ID INT -> ^(ID["root"] INT); 1400*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1401*16467b97STreehugger Robot INT : '0'..'9'+; 1402*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1403*16467b97STreehugger Robot ''') 1404*16467b97STreehugger Robot 1405*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1406*16467b97STreehugger Robot r''' 1407*16467b97STreehugger Robot tree grammar TP; 1408*16467b97STreehugger Robot options { 1409*16467b97STreehugger Robot language=Python; 1410*16467b97STreehugger Robot output=AST; 1411*16467b97STreehugger Robot ASTLabelType=CommonTree; 1412*16467b97STreehugger Robot tokenVocab=T; 1413*16467b97STreehugger Robot } 1414*16467b97STreehugger Robot s : ^(ID c=.) -> $c 1415*16467b97STreehugger Robot ; 1416*16467b97STreehugger Robot ''') 1417*16467b97STreehugger Robot 1418*16467b97STreehugger Robot found = self.execTreeParser( 1419*16467b97STreehugger Robot grammar, 'a', 1420*16467b97STreehugger Robot treeGrammar, 's', 1421*16467b97STreehugger Robot "abc 34" 1422*16467b97STreehugger Robot ) 1423*16467b97STreehugger Robot 1424*16467b97STreehugger Robot self.failUnlessEqual("34", found) 1425*16467b97STreehugger Robot 1426*16467b97STreehugger Robot def testWildcardUnlabeledSingleNode(self): 1427*16467b97STreehugger Robot grammar = textwrap.dedent( 1428*16467b97STreehugger Robot r''' 1429*16467b97STreehugger Robot grammar T; 1430*16467b97STreehugger Robot options {language=Python; output=AST;} 1431*16467b97STreehugger Robot a : ID INT -> ^(ID INT); 1432*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1433*16467b97STreehugger Robot INT : '0'..'9'+; 1434*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1435*16467b97STreehugger Robot ''') 1436*16467b97STreehugger Robot 1437*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1438*16467b97STreehugger Robot r''' 1439*16467b97STreehugger Robot tree grammar TP; 1440*16467b97STreehugger Robot options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T;} 1441*16467b97STreehugger Robot s : ^(ID .) -> ID 1442*16467b97STreehugger Robot ; 1443*16467b97STreehugger Robot ''') 1444*16467b97STreehugger Robot 1445*16467b97STreehugger Robot found = self.execTreeParser( 1446*16467b97STreehugger Robot grammar, 'a', 1447*16467b97STreehugger Robot treeGrammar, 's', 1448*16467b97STreehugger Robot "abc 34") 1449*16467b97STreehugger Robot self.assertEquals("abc", found) 1450*16467b97STreehugger Robot 1451*16467b97STreehugger Robot 1452*16467b97STreehugger Robot def testWildcardGrabsSubtree(self): 1453*16467b97STreehugger Robot grammar = textwrap.dedent( 1454*16467b97STreehugger Robot r''' 1455*16467b97STreehugger Robot grammar T; 1456*16467b97STreehugger Robot options {language=Python; output=AST;} 1457*16467b97STreehugger Robot a : ID x=INT y=INT z=INT -> ^(ID[\"root\"] ^($x $y $z)); 1458*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1459*16467b97STreehugger Robot INT : '0'..'9'+; 1460*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1461*16467b97STreehugger Robot ''') 1462*16467b97STreehugger Robot 1463*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1464*16467b97STreehugger Robot r''' 1465*16467b97STreehugger Robot tree grammar TP; 1466*16467b97STreehugger Robot options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T;} 1467*16467b97STreehugger Robot s : ^(ID c=.) -> $c 1468*16467b97STreehugger Robot ; 1469*16467b97STreehugger Robot ''') 1470*16467b97STreehugger Robot 1471*16467b97STreehugger Robot found = self.execTreeParser( 1472*16467b97STreehugger Robot grammar, 'a', 1473*16467b97STreehugger Robot treeGrammar, 's', 1474*16467b97STreehugger Robot "abc 1 2 3") 1475*16467b97STreehugger Robot self.assertEquals("(1 2 3)", found) 1476*16467b97STreehugger Robot 1477*16467b97STreehugger Robot 1478*16467b97STreehugger Robot def testWildcardGrabsSubtree2(self): 1479*16467b97STreehugger Robot grammar = textwrap.dedent( 1480*16467b97STreehugger Robot r''' 1481*16467b97STreehugger Robot grammar T; 1482*16467b97STreehugger Robot options {language=Python; output=AST;} 1483*16467b97STreehugger Robot a : ID x=INT y=INT z=INT -> ID ^($x $y $z); 1484*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1485*16467b97STreehugger Robot INT : '0'..'9'+; 1486*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1487*16467b97STreehugger Robot ''') 1488*16467b97STreehugger Robot 1489*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1490*16467b97STreehugger Robot r''' 1491*16467b97STreehugger Robot tree grammar TP; 1492*16467b97STreehugger Robot options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T;} 1493*16467b97STreehugger Robot s : ID c=. -> $c 1494*16467b97STreehugger Robot ; 1495*16467b97STreehugger Robot ''') 1496*16467b97STreehugger Robot 1497*16467b97STreehugger Robot found = self.execTreeParser( 1498*16467b97STreehugger Robot grammar, 'a', 1499*16467b97STreehugger Robot treeGrammar, 's', 1500*16467b97STreehugger Robot "abc 1 2 3") 1501*16467b97STreehugger Robot self.assertEquals("(1 2 3)", found) 1502*16467b97STreehugger Robot 1503*16467b97STreehugger Robot 1504*16467b97STreehugger Robot def testWildcardListLabel(self): 1505*16467b97STreehugger Robot grammar = textwrap.dedent( 1506*16467b97STreehugger Robot r''' 1507*16467b97STreehugger Robot grammar T; 1508*16467b97STreehugger Robot options {language=Python; output=AST;} 1509*16467b97STreehugger Robot a : INT INT INT ; 1510*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1511*16467b97STreehugger Robot INT : '0'..'9'+; 1512*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1513*16467b97STreehugger Robot ''') 1514*16467b97STreehugger Robot 1515*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1516*16467b97STreehugger Robot r''' 1517*16467b97STreehugger Robot tree grammar TP; 1518*16467b97STreehugger Robot options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T;} 1519*16467b97STreehugger Robot s : (c+=.)+ -> $c+ 1520*16467b97STreehugger Robot ; 1521*16467b97STreehugger Robot ''') 1522*16467b97STreehugger Robot 1523*16467b97STreehugger Robot found = self.execTreeParser( 1524*16467b97STreehugger Robot grammar, 'a', 1525*16467b97STreehugger Robot treeGrammar, 's', 1526*16467b97STreehugger Robot "1 2 3") 1527*16467b97STreehugger Robot self.assertEquals("1 2 3", found) 1528*16467b97STreehugger Robot 1529*16467b97STreehugger Robot 1530*16467b97STreehugger Robot def testWildcardListLabel2(self): 1531*16467b97STreehugger Robot grammar = textwrap.dedent( 1532*16467b97STreehugger Robot r''' 1533*16467b97STreehugger Robot grammar T; 1534*16467b97STreehugger Robot options {language=Python; output=AST; ASTLabelType=CommonTree;} 1535*16467b97STreehugger Robot a : x=INT y=INT z=INT -> ^($x ^($y $z) ^($y $z)); 1536*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1537*16467b97STreehugger Robot INT : '0'..'9'+; 1538*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1539*16467b97STreehugger Robot ''') 1540*16467b97STreehugger Robot 1541*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1542*16467b97STreehugger Robot r''' 1543*16467b97STreehugger Robot tree grammar TP; 1544*16467b97STreehugger Robot options {language=Python; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1545*16467b97STreehugger Robot s : ^(INT (c+=.)+) -> $c+ 1546*16467b97STreehugger Robot ; 1547*16467b97STreehugger Robot ''') 1548*16467b97STreehugger Robot 1549*16467b97STreehugger Robot found = self.execTreeParser( 1550*16467b97STreehugger Robot grammar, 'a', 1551*16467b97STreehugger Robot treeGrammar, 's', 1552*16467b97STreehugger Robot "1 2 3") 1553*16467b97STreehugger Robot self.assertEquals("(2 3) (2 3)", found) 1554*16467b97STreehugger Robot 1555*16467b97STreehugger Robot 1556*16467b97STreehugger Robot def testRuleResultAsRoot(self): 1557*16467b97STreehugger Robot grammar = textwrap.dedent( 1558*16467b97STreehugger Robot r''' 1559*16467b97STreehugger Robot grammar T; 1560*16467b97STreehugger Robot options { 1561*16467b97STreehugger Robot language=Python; 1562*16467b97STreehugger Robot output=AST; 1563*16467b97STreehugger Robot } 1564*16467b97STreehugger Robot a : ID '=' INT -> ^('=' ID INT); 1565*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1566*16467b97STreehugger Robot INT : '0'..'9'+; 1567*16467b97STreehugger Robot COLON : ':' ; 1568*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1569*16467b97STreehugger Robot ''') 1570*16467b97STreehugger Robot 1571*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1572*16467b97STreehugger Robot r''' 1573*16467b97STreehugger Robot tree grammar TP; 1574*16467b97STreehugger Robot options { 1575*16467b97STreehugger Robot language=Python; 1576*16467b97STreehugger Robot output=AST; 1577*16467b97STreehugger Robot rewrite=true; 1578*16467b97STreehugger Robot ASTLabelType=CommonTree; 1579*16467b97STreehugger Robot tokenVocab=T; 1580*16467b97STreehugger Robot } 1581*16467b97STreehugger Robot a : ^(eq e1=ID e2=.) -> ^(eq $e2 $e1) ; 1582*16467b97STreehugger Robot eq : '=' | ':' {pass} ; // bug in set match, doesn't add to tree!! booh. force nonset. 1583*16467b97STreehugger Robot ''') 1584*16467b97STreehugger Robot 1585*16467b97STreehugger Robot found = self.execTreeParser( 1586*16467b97STreehugger Robot grammar, 'a', 1587*16467b97STreehugger Robot treeGrammar, 'a', 1588*16467b97STreehugger Robot "abc = 34") 1589*16467b97STreehugger Robot self.assertEquals("(= 34 abc)", found) 1590*16467b97STreehugger Robot 1591*16467b97STreehugger Robot 1592*16467b97STreehugger Robotif __name__ == '__main__': 1593*16467b97STreehugger Robot unittest.main() 1594