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 super().__init__(*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: 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=Python3; 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=Python3; 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.assertEqual("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=Python3; 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=Python3; 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.assertEqual("(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=Python3; 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=Python3; 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.assertEqual("(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.assertEqual("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=Python3; 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=Python3; 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.assertEqual("(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=Python3; 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=Python3; 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.assertEqual("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=Python3; 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=Python3; 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.assertEqual("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=Python3; 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=Python3; 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.assertEqual("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=Python3;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=Python3;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.assertEqual("abc 34", found) 330*16467b97STreehugger Robot 331*16467b97STreehugger Robot 332*16467b97STreehugger Robot def testAutoWildcard2(self): 333*16467b97STreehugger Robot grammar = textwrap.dedent( 334*16467b97STreehugger Robot r''' 335*16467b97STreehugger Robot grammar T; 336*16467b97STreehugger Robot options {language=Python3;output=AST;} 337*16467b97STreehugger Robot a : ID INT -> ^(ID INT); 338*16467b97STreehugger Robot ID : 'a'..'z'+ ; 339*16467b97STreehugger Robot INT : '0'..'9'+; 340*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 341*16467b97STreehugger Robot ''') 342*16467b97STreehugger Robot 343*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 344*16467b97STreehugger Robot r''' 345*16467b97STreehugger Robot tree grammar TP; 346*16467b97STreehugger Robot options {language=Python3;output=AST; ASTLabelType=CommonTree; tokenVocab=T;} 347*16467b97STreehugger Robot a : ^(ID .) 348*16467b97STreehugger Robot ; 349*16467b97STreehugger Robot ''') 350*16467b97STreehugger Robot 351*16467b97STreehugger Robot found = self.execTreeParser( 352*16467b97STreehugger Robot grammar, 'a', 353*16467b97STreehugger Robot treeGrammar, 'a', 354*16467b97STreehugger Robot "abc 34") 355*16467b97STreehugger Robot self.assertEqual("(abc 34)", found) 356*16467b97STreehugger Robot 357*16467b97STreehugger Robot 358*16467b97STreehugger Robot def testAutoWildcardWithLabel(self): 359*16467b97STreehugger Robot grammar = textwrap.dedent( 360*16467b97STreehugger Robot r''' 361*16467b97STreehugger Robot grammar T; 362*16467b97STreehugger Robot options {language=Python3;output=AST;} 363*16467b97STreehugger Robot a : ID INT ; 364*16467b97STreehugger Robot ID : 'a'..'z'+ ; 365*16467b97STreehugger Robot INT : '0'..'9'+; 366*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 367*16467b97STreehugger Robot ''') 368*16467b97STreehugger Robot 369*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 370*16467b97STreehugger Robot r''' 371*16467b97STreehugger Robot tree grammar TP; 372*16467b97STreehugger Robot options {language=Python3;output=AST; ASTLabelType=CommonTree; tokenVocab=T;} 373*16467b97STreehugger Robot a : ID c=. 374*16467b97STreehugger Robot ; 375*16467b97STreehugger Robot ''') 376*16467b97STreehugger Robot 377*16467b97STreehugger Robot found = self.execTreeParser( 378*16467b97STreehugger Robot grammar, 'a', 379*16467b97STreehugger Robot treeGrammar, 'a', 380*16467b97STreehugger Robot "abc 34") 381*16467b97STreehugger Robot self.assertEqual("abc 34", found) 382*16467b97STreehugger Robot 383*16467b97STreehugger Robot 384*16467b97STreehugger Robot def testAutoWildcardWithListLabel(self): 385*16467b97STreehugger Robot grammar = textwrap.dedent( 386*16467b97STreehugger Robot r''' 387*16467b97STreehugger Robot grammar T; 388*16467b97STreehugger Robot options {language=Python3;output=AST;} 389*16467b97STreehugger Robot a : ID INT ; 390*16467b97STreehugger Robot ID : 'a'..'z'+ ; 391*16467b97STreehugger Robot INT : '0'..'9'+; 392*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 393*16467b97STreehugger Robot ''') 394*16467b97STreehugger Robot 395*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 396*16467b97STreehugger Robot r''' 397*16467b97STreehugger Robot tree grammar TP; 398*16467b97STreehugger Robot options {language=Python3;output=AST; ASTLabelType=CommonTree; tokenVocab=T;} 399*16467b97STreehugger Robot a : ID c+=. 400*16467b97STreehugger Robot ; 401*16467b97STreehugger Robot ''') 402*16467b97STreehugger Robot 403*16467b97STreehugger Robot found = self.execTreeParser( 404*16467b97STreehugger Robot grammar, 'a', 405*16467b97STreehugger Robot treeGrammar, 'a', 406*16467b97STreehugger Robot "abc 34") 407*16467b97STreehugger Robot self.assertEqual("abc 34", found) 408*16467b97STreehugger Robot 409*16467b97STreehugger Robot 410*16467b97STreehugger Robot def testAutoDupMultiple(self): 411*16467b97STreehugger Robot grammar = textwrap.dedent( 412*16467b97STreehugger Robot r''' 413*16467b97STreehugger Robot grammar T8; 414*16467b97STreehugger Robot options { 415*16467b97STreehugger Robot language=Python3; 416*16467b97STreehugger Robot output=AST; 417*16467b97STreehugger Robot } 418*16467b97STreehugger Robot a : ID ID INT; 419*16467b97STreehugger Robot ID : 'a'..'z'+ ; 420*16467b97STreehugger Robot INT : '0'..'9'+; 421*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 422*16467b97STreehugger Robot ''') 423*16467b97STreehugger Robot 424*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 425*16467b97STreehugger Robot r''' 426*16467b97STreehugger Robot tree grammar TP8; 427*16467b97STreehugger Robot options { 428*16467b97STreehugger Robot language=Python3; 429*16467b97STreehugger Robot output=AST; 430*16467b97STreehugger Robot ASTLabelType=CommonTree; 431*16467b97STreehugger Robot tokenVocab=T8; 432*16467b97STreehugger Robot } 433*16467b97STreehugger Robot a : ID ID INT 434*16467b97STreehugger Robot ; 435*16467b97STreehugger Robot ''') 436*16467b97STreehugger Robot 437*16467b97STreehugger Robot found = self.execTreeParser( 438*16467b97STreehugger Robot grammar, 'a', 439*16467b97STreehugger Robot treeGrammar, 'a', 440*16467b97STreehugger Robot "a b 3" 441*16467b97STreehugger Robot ) 442*16467b97STreehugger Robot 443*16467b97STreehugger Robot self.assertEqual("a b 3", found) 444*16467b97STreehugger Robot 445*16467b97STreehugger Robot 446*16467b97STreehugger Robot def testAutoDupTree(self): 447*16467b97STreehugger Robot grammar = textwrap.dedent( 448*16467b97STreehugger Robot r''' 449*16467b97STreehugger Robot grammar T9; 450*16467b97STreehugger Robot options { 451*16467b97STreehugger Robot language=Python3; 452*16467b97STreehugger Robot output=AST; 453*16467b97STreehugger Robot } 454*16467b97STreehugger Robot a : ID INT -> ^(ID INT); 455*16467b97STreehugger Robot ID : 'a'..'z'+ ; 456*16467b97STreehugger Robot INT : '0'..'9'+; 457*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 458*16467b97STreehugger Robot ''') 459*16467b97STreehugger Robot 460*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 461*16467b97STreehugger Robot r''' 462*16467b97STreehugger Robot tree grammar TP9; 463*16467b97STreehugger Robot options { 464*16467b97STreehugger Robot language=Python3; 465*16467b97STreehugger Robot output=AST; 466*16467b97STreehugger Robot ASTLabelType=CommonTree; 467*16467b97STreehugger Robot tokenVocab=T9; 468*16467b97STreehugger Robot } 469*16467b97STreehugger Robot a : ^(ID INT) 470*16467b97STreehugger Robot ; 471*16467b97STreehugger Robot ''') 472*16467b97STreehugger Robot 473*16467b97STreehugger Robot found = self.execTreeParser( 474*16467b97STreehugger Robot grammar, 'a', 475*16467b97STreehugger Robot treeGrammar, 'a', 476*16467b97STreehugger Robot "a 3" 477*16467b97STreehugger Robot ) 478*16467b97STreehugger Robot 479*16467b97STreehugger Robot self.assertEqual("(a 3)", found) 480*16467b97STreehugger Robot 481*16467b97STreehugger Robot 482*16467b97STreehugger Robot def testAutoDupTreeWithLabels(self): 483*16467b97STreehugger Robot grammar = textwrap.dedent( 484*16467b97STreehugger Robot r''' 485*16467b97STreehugger Robot grammar T10; 486*16467b97STreehugger Robot options { 487*16467b97STreehugger Robot language=Python3; 488*16467b97STreehugger Robot output=AST; 489*16467b97STreehugger Robot } 490*16467b97STreehugger Robot a : ID INT -> ^(ID INT); 491*16467b97STreehugger Robot ID : 'a'..'z'+ ; 492*16467b97STreehugger Robot INT : '0'..'9'+; 493*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 494*16467b97STreehugger Robot ''') 495*16467b97STreehugger Robot 496*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 497*16467b97STreehugger Robot r''' 498*16467b97STreehugger Robot tree grammar TP10; 499*16467b97STreehugger Robot options { 500*16467b97STreehugger Robot language=Python3; 501*16467b97STreehugger Robot output=AST; 502*16467b97STreehugger Robot ASTLabelType=CommonTree; 503*16467b97STreehugger Robot tokenVocab=T10; 504*16467b97STreehugger Robot } 505*16467b97STreehugger Robot a : ^(x=ID y=INT) 506*16467b97STreehugger Robot ; 507*16467b97STreehugger Robot ''') 508*16467b97STreehugger Robot 509*16467b97STreehugger Robot found = self.execTreeParser( 510*16467b97STreehugger Robot grammar, 'a', 511*16467b97STreehugger Robot treeGrammar, 'a', 512*16467b97STreehugger Robot "a 3" 513*16467b97STreehugger Robot ) 514*16467b97STreehugger Robot 515*16467b97STreehugger Robot self.assertEqual("(a 3)", found) 516*16467b97STreehugger Robot 517*16467b97STreehugger Robot 518*16467b97STreehugger Robot def testAutoDupTreeWithListLabels(self): 519*16467b97STreehugger Robot grammar = textwrap.dedent( 520*16467b97STreehugger Robot r''' 521*16467b97STreehugger Robot grammar T11; 522*16467b97STreehugger Robot options { 523*16467b97STreehugger Robot language=Python3; 524*16467b97STreehugger Robot output=AST; 525*16467b97STreehugger Robot } 526*16467b97STreehugger Robot a : ID INT -> ^(ID INT); 527*16467b97STreehugger Robot ID : 'a'..'z'+ ; 528*16467b97STreehugger Robot INT : '0'..'9'+; 529*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 530*16467b97STreehugger Robot ''') 531*16467b97STreehugger Robot 532*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 533*16467b97STreehugger Robot r''' 534*16467b97STreehugger Robot tree grammar TP11; 535*16467b97STreehugger Robot options { 536*16467b97STreehugger Robot language=Python3; 537*16467b97STreehugger Robot output=AST; 538*16467b97STreehugger Robot ASTLabelType=CommonTree; 539*16467b97STreehugger Robot tokenVocab=T11; 540*16467b97STreehugger Robot } 541*16467b97STreehugger Robot a : ^(x+=ID y+=INT) 542*16467b97STreehugger Robot ; 543*16467b97STreehugger Robot ''') 544*16467b97STreehugger Robot 545*16467b97STreehugger Robot found = self.execTreeParser( 546*16467b97STreehugger Robot grammar, 'a', 547*16467b97STreehugger Robot treeGrammar, 'a', 548*16467b97STreehugger Robot "a 3" 549*16467b97STreehugger Robot ) 550*16467b97STreehugger Robot 551*16467b97STreehugger Robot self.assertEqual("(a 3)", found) 552*16467b97STreehugger Robot 553*16467b97STreehugger Robot 554*16467b97STreehugger Robot def testAutoDupTreeWithRuleRoot(self): 555*16467b97STreehugger Robot grammar = textwrap.dedent( 556*16467b97STreehugger Robot r''' 557*16467b97STreehugger Robot grammar T12; 558*16467b97STreehugger Robot options { 559*16467b97STreehugger Robot language=Python3; 560*16467b97STreehugger Robot output=AST; 561*16467b97STreehugger Robot } 562*16467b97STreehugger Robot a : ID INT -> ^(ID INT); 563*16467b97STreehugger Robot ID : 'a'..'z'+ ; 564*16467b97STreehugger Robot INT : '0'..'9'+; 565*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 566*16467b97STreehugger Robot ''') 567*16467b97STreehugger Robot 568*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 569*16467b97STreehugger Robot r''' 570*16467b97STreehugger Robot tree grammar TP12; 571*16467b97STreehugger Robot options { 572*16467b97STreehugger Robot language=Python3; 573*16467b97STreehugger Robot output=AST; 574*16467b97STreehugger Robot ASTLabelType=CommonTree; 575*16467b97STreehugger Robot tokenVocab=T12; 576*16467b97STreehugger Robot } 577*16467b97STreehugger Robot a : ^(b INT) ; 578*16467b97STreehugger Robot b : ID ; 579*16467b97STreehugger Robot ''') 580*16467b97STreehugger Robot 581*16467b97STreehugger Robot found = self.execTreeParser( 582*16467b97STreehugger Robot grammar, 'a', 583*16467b97STreehugger Robot treeGrammar, 'a', 584*16467b97STreehugger Robot "a 3" 585*16467b97STreehugger Robot ) 586*16467b97STreehugger Robot 587*16467b97STreehugger Robot self.assertEqual("(a 3)", found) 588*16467b97STreehugger Robot 589*16467b97STreehugger Robot 590*16467b97STreehugger Robot def testAutoDupTreeWithRuleRootAndLabels(self): 591*16467b97STreehugger Robot grammar = textwrap.dedent( 592*16467b97STreehugger Robot r''' 593*16467b97STreehugger Robot grammar T13; 594*16467b97STreehugger Robot options { 595*16467b97STreehugger Robot language=Python3; 596*16467b97STreehugger Robot output=AST; 597*16467b97STreehugger Robot } 598*16467b97STreehugger Robot a : ID INT -> ^(ID INT); 599*16467b97STreehugger Robot ID : 'a'..'z'+ ; 600*16467b97STreehugger Robot INT : '0'..'9'+; 601*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 602*16467b97STreehugger Robot ''') 603*16467b97STreehugger Robot 604*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 605*16467b97STreehugger Robot r''' 606*16467b97STreehugger Robot tree grammar TP13; 607*16467b97STreehugger Robot options { 608*16467b97STreehugger Robot language=Python3; 609*16467b97STreehugger Robot output=AST; 610*16467b97STreehugger Robot ASTLabelType=CommonTree; 611*16467b97STreehugger Robot tokenVocab=T13; 612*16467b97STreehugger Robot } 613*16467b97STreehugger Robot a : ^(x=b INT) ; 614*16467b97STreehugger Robot b : ID ; 615*16467b97STreehugger Robot ''') 616*16467b97STreehugger Robot 617*16467b97STreehugger Robot found = self.execTreeParser( 618*16467b97STreehugger Robot grammar, 'a', 619*16467b97STreehugger Robot treeGrammar, 'a', 620*16467b97STreehugger Robot "a 3" 621*16467b97STreehugger Robot ) 622*16467b97STreehugger Robot 623*16467b97STreehugger Robot self.assertEqual("(a 3)", found) 624*16467b97STreehugger Robot 625*16467b97STreehugger Robot 626*16467b97STreehugger Robot def testAutoDupTreeWithRuleRootAndListLabels(self): 627*16467b97STreehugger Robot grammar = textwrap.dedent( 628*16467b97STreehugger Robot r''' 629*16467b97STreehugger Robot grammar T14; 630*16467b97STreehugger Robot options { 631*16467b97STreehugger Robot language=Python3; 632*16467b97STreehugger Robot output=AST; 633*16467b97STreehugger Robot } 634*16467b97STreehugger Robot a : ID INT -> ^(ID INT); 635*16467b97STreehugger Robot ID : 'a'..'z'+ ; 636*16467b97STreehugger Robot INT : '0'..'9'+; 637*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 638*16467b97STreehugger Robot ''') 639*16467b97STreehugger Robot 640*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 641*16467b97STreehugger Robot r''' 642*16467b97STreehugger Robot tree grammar TP14; 643*16467b97STreehugger Robot options { 644*16467b97STreehugger Robot language=Python3; 645*16467b97STreehugger Robot output=AST; 646*16467b97STreehugger Robot ASTLabelType=CommonTree; 647*16467b97STreehugger Robot tokenVocab=T14; 648*16467b97STreehugger Robot } 649*16467b97STreehugger Robot a : ^(x+=b y+=c) ; 650*16467b97STreehugger Robot b : ID ; 651*16467b97STreehugger Robot c : INT ; 652*16467b97STreehugger Robot ''') 653*16467b97STreehugger Robot 654*16467b97STreehugger Robot found = self.execTreeParser( 655*16467b97STreehugger Robot grammar, 'a', 656*16467b97STreehugger Robot treeGrammar, 'a', 657*16467b97STreehugger Robot "a 3" 658*16467b97STreehugger Robot ) 659*16467b97STreehugger Robot 660*16467b97STreehugger Robot self.assertEqual("(a 3)", found) 661*16467b97STreehugger Robot 662*16467b97STreehugger Robot 663*16467b97STreehugger Robot def testAutoDupNestedTree(self): 664*16467b97STreehugger Robot grammar = textwrap.dedent( 665*16467b97STreehugger Robot r''' 666*16467b97STreehugger Robot grammar T15; 667*16467b97STreehugger Robot options { 668*16467b97STreehugger Robot language=Python3; 669*16467b97STreehugger Robot output=AST; 670*16467b97STreehugger Robot } 671*16467b97STreehugger Robot a : x=ID y=ID INT -> ^($x ^($y INT)); 672*16467b97STreehugger Robot ID : 'a'..'z'+ ; 673*16467b97STreehugger Robot INT : '0'..'9'+; 674*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 675*16467b97STreehugger Robot ''') 676*16467b97STreehugger Robot 677*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 678*16467b97STreehugger Robot r''' 679*16467b97STreehugger Robot tree grammar TP15; 680*16467b97STreehugger Robot options { 681*16467b97STreehugger Robot language=Python3; 682*16467b97STreehugger Robot output=AST; 683*16467b97STreehugger Robot ASTLabelType=CommonTree; 684*16467b97STreehugger Robot tokenVocab=T15; 685*16467b97STreehugger Robot } 686*16467b97STreehugger Robot a : ^(ID ^(ID INT)) 687*16467b97STreehugger Robot ; 688*16467b97STreehugger Robot ''') 689*16467b97STreehugger Robot 690*16467b97STreehugger Robot found = self.execTreeParser( 691*16467b97STreehugger Robot grammar, 'a', 692*16467b97STreehugger Robot treeGrammar, 'a', 693*16467b97STreehugger Robot "a b 3" 694*16467b97STreehugger Robot ) 695*16467b97STreehugger Robot 696*16467b97STreehugger Robot self.assertEqual("(a (b 3))", found) 697*16467b97STreehugger Robot 698*16467b97STreehugger Robot 699*16467b97STreehugger Robot def testDelete(self): 700*16467b97STreehugger Robot grammar = textwrap.dedent( 701*16467b97STreehugger Robot r''' 702*16467b97STreehugger Robot grammar T16; 703*16467b97STreehugger Robot options { 704*16467b97STreehugger Robot language=Python3; 705*16467b97STreehugger Robot output=AST; 706*16467b97STreehugger Robot } 707*16467b97STreehugger Robot a : ID ; 708*16467b97STreehugger Robot ID : 'a'..'z'+ ; 709*16467b97STreehugger Robot INT : '0'..'9'+; 710*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 711*16467b97STreehugger Robot ''') 712*16467b97STreehugger Robot 713*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 714*16467b97STreehugger Robot r''' 715*16467b97STreehugger Robot tree grammar TP16; 716*16467b97STreehugger Robot options { 717*16467b97STreehugger Robot language=Python3; 718*16467b97STreehugger Robot output=AST; 719*16467b97STreehugger Robot ASTLabelType=CommonTree; 720*16467b97STreehugger Robot tokenVocab=T16; 721*16467b97STreehugger Robot } 722*16467b97STreehugger Robot a : ID -> 723*16467b97STreehugger Robot ; 724*16467b97STreehugger Robot ''') 725*16467b97STreehugger Robot 726*16467b97STreehugger Robot found = self.execTreeParser( 727*16467b97STreehugger Robot grammar, 'a', 728*16467b97STreehugger Robot treeGrammar, 'a', 729*16467b97STreehugger Robot "abc" 730*16467b97STreehugger Robot ) 731*16467b97STreehugger Robot 732*16467b97STreehugger Robot self.assertEqual("", found) 733*16467b97STreehugger Robot 734*16467b97STreehugger Robot def testSetMatchNoRewrite(self): 735*16467b97STreehugger Robot grammar = textwrap.dedent( 736*16467b97STreehugger Robot r''' 737*16467b97STreehugger Robot grammar T; 738*16467b97STreehugger Robot options { 739*16467b97STreehugger Robot language=Python3; 740*16467b97STreehugger Robot output=AST; 741*16467b97STreehugger Robot } 742*16467b97STreehugger Robot a : ID INT ; 743*16467b97STreehugger Robot ID : 'a'..'z'+ ; 744*16467b97STreehugger Robot INT : '0'..'9'+; 745*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 746*16467b97STreehugger Robot ''') 747*16467b97STreehugger Robot 748*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 749*16467b97STreehugger Robot r''' 750*16467b97STreehugger Robot tree grammar TP; 751*16467b97STreehugger Robot options { 752*16467b97STreehugger Robot language=Python3; 753*16467b97STreehugger Robot output=AST; 754*16467b97STreehugger Robot ASTLabelType=CommonTree; 755*16467b97STreehugger Robot tokenVocab=T; 756*16467b97STreehugger Robot } 757*16467b97STreehugger Robot a : b INT; 758*16467b97STreehugger Robot b : ID | INT; 759*16467b97STreehugger Robot ''') 760*16467b97STreehugger Robot 761*16467b97STreehugger Robot found = self.execTreeParser( 762*16467b97STreehugger Robot grammar, 'a', 763*16467b97STreehugger Robot treeGrammar, 'a', 764*16467b97STreehugger Robot "abc 34" 765*16467b97STreehugger Robot ) 766*16467b97STreehugger Robot 767*16467b97STreehugger Robot self.assertEqual("abc 34", found) 768*16467b97STreehugger Robot 769*16467b97STreehugger Robot 770*16467b97STreehugger Robot def testSetOptionalMatchNoRewrite(self): 771*16467b97STreehugger Robot grammar = textwrap.dedent( 772*16467b97STreehugger Robot r''' 773*16467b97STreehugger Robot grammar T; 774*16467b97STreehugger Robot options { 775*16467b97STreehugger Robot language=Python3; 776*16467b97STreehugger Robot output=AST; 777*16467b97STreehugger Robot } 778*16467b97STreehugger Robot a : ID INT ; 779*16467b97STreehugger Robot ID : 'a'..'z'+ ; 780*16467b97STreehugger Robot INT : '0'..'9'+; 781*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 782*16467b97STreehugger Robot ''') 783*16467b97STreehugger Robot 784*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 785*16467b97STreehugger Robot r''' 786*16467b97STreehugger Robot tree grammar TP; 787*16467b97STreehugger Robot options { 788*16467b97STreehugger Robot language=Python3; 789*16467b97STreehugger Robot output=AST; 790*16467b97STreehugger Robot ASTLabelType=CommonTree; 791*16467b97STreehugger Robot tokenVocab=T; 792*16467b97STreehugger Robot } 793*16467b97STreehugger Robot a : (ID|INT)? INT ; 794*16467b97STreehugger Robot ''') 795*16467b97STreehugger Robot 796*16467b97STreehugger Robot found = self.execTreeParser( 797*16467b97STreehugger Robot grammar, 'a', 798*16467b97STreehugger Robot treeGrammar, 'a', 799*16467b97STreehugger Robot "abc 34") 800*16467b97STreehugger Robot 801*16467b97STreehugger Robot self.assertEqual("abc 34", found) 802*16467b97STreehugger Robot 803*16467b97STreehugger Robot 804*16467b97STreehugger Robot def testSetMatchNoRewriteLevel2(self): 805*16467b97STreehugger Robot grammar = textwrap.dedent( 806*16467b97STreehugger Robot r''' 807*16467b97STreehugger Robot grammar T; 808*16467b97STreehugger Robot options { 809*16467b97STreehugger Robot language=Python3; 810*16467b97STreehugger Robot output=AST; 811*16467b97STreehugger Robot } 812*16467b97STreehugger Robot a : x=ID INT -> ^($x INT); 813*16467b97STreehugger Robot ID : 'a'..'z'+ ; 814*16467b97STreehugger Robot INT : '0'..'9'+; 815*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 816*16467b97STreehugger Robot ''') 817*16467b97STreehugger Robot 818*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 819*16467b97STreehugger Robot r''' 820*16467b97STreehugger Robot tree grammar TP; 821*16467b97STreehugger Robot options { 822*16467b97STreehugger Robot language=Python3; 823*16467b97STreehugger Robot output=AST; 824*16467b97STreehugger Robot ASTLabelType=CommonTree; 825*16467b97STreehugger Robot tokenVocab=T; 826*16467b97STreehugger Robot } 827*16467b97STreehugger Robot a : ^(ID (ID | INT) ) ; 828*16467b97STreehugger Robot ''') 829*16467b97STreehugger Robot 830*16467b97STreehugger Robot found = self.execTreeParser( 831*16467b97STreehugger Robot grammar, 'a', 832*16467b97STreehugger Robot treeGrammar, 'a', 833*16467b97STreehugger Robot "abc 34" 834*16467b97STreehugger Robot ) 835*16467b97STreehugger Robot 836*16467b97STreehugger Robot self.assertEqual("(abc 34)", found) 837*16467b97STreehugger Robot 838*16467b97STreehugger Robot 839*16467b97STreehugger Robot def testSetMatchNoRewriteLevel2Root(self): 840*16467b97STreehugger Robot grammar = textwrap.dedent( 841*16467b97STreehugger Robot r''' 842*16467b97STreehugger Robot grammar T; 843*16467b97STreehugger Robot options { 844*16467b97STreehugger Robot language=Python3; 845*16467b97STreehugger Robot output=AST; 846*16467b97STreehugger Robot } 847*16467b97STreehugger Robot a : x=ID INT -> ^($x INT); 848*16467b97STreehugger Robot ID : 'a'..'z'+ ; 849*16467b97STreehugger Robot INT : '0'..'9'+; 850*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 851*16467b97STreehugger Robot ''') 852*16467b97STreehugger Robot 853*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 854*16467b97STreehugger Robot r''' 855*16467b97STreehugger Robot tree grammar TP; 856*16467b97STreehugger Robot options { 857*16467b97STreehugger Robot language=Python3; 858*16467b97STreehugger Robot output=AST; 859*16467b97STreehugger Robot ASTLabelType=CommonTree; 860*16467b97STreehugger Robot tokenVocab=T; 861*16467b97STreehugger Robot } 862*16467b97STreehugger Robot a : ^((ID | INT) INT) ; 863*16467b97STreehugger Robot ''') 864*16467b97STreehugger Robot 865*16467b97STreehugger Robot found = self.execTreeParser( 866*16467b97STreehugger Robot grammar, 'a', 867*16467b97STreehugger Robot treeGrammar, 'a', 868*16467b97STreehugger Robot "abc 34" 869*16467b97STreehugger Robot ) 870*16467b97STreehugger Robot 871*16467b97STreehugger Robot self.assertEqual("(abc 34)", found) 872*16467b97STreehugger Robot 873*16467b97STreehugger Robot 874*16467b97STreehugger Robot ## REWRITE MODE 875*16467b97STreehugger Robot 876*16467b97STreehugger Robot def testRewriteModeCombinedRewriteAndAuto(self): 877*16467b97STreehugger Robot grammar = textwrap.dedent( 878*16467b97STreehugger Robot r''' 879*16467b97STreehugger Robot grammar T17; 880*16467b97STreehugger Robot options { 881*16467b97STreehugger Robot language=Python3; 882*16467b97STreehugger Robot output=AST; 883*16467b97STreehugger Robot } 884*16467b97STreehugger Robot a : ID INT -> ^(ID INT) | INT ; 885*16467b97STreehugger Robot ID : 'a'..'z'+ ; 886*16467b97STreehugger Robot INT : '0'..'9'+; 887*16467b97STreehugger Robot WS : (' '|'\\n') {$channel=HIDDEN;} ; 888*16467b97STreehugger Robot ''') 889*16467b97STreehugger Robot 890*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 891*16467b97STreehugger Robot r''' 892*16467b97STreehugger Robot tree grammar TP17; 893*16467b97STreehugger Robot options { 894*16467b97STreehugger Robot language=Python3; 895*16467b97STreehugger Robot output=AST; 896*16467b97STreehugger Robot ASTLabelType=CommonTree; 897*16467b97STreehugger Robot tokenVocab=T17; 898*16467b97STreehugger Robot rewrite=true; 899*16467b97STreehugger Robot } 900*16467b97STreehugger Robot a : ^(ID INT) -> ^(ID["ick"] INT) 901*16467b97STreehugger Robot | INT // leaves it alone, returning $a.start 902*16467b97STreehugger Robot ; 903*16467b97STreehugger Robot ''') 904*16467b97STreehugger Robot 905*16467b97STreehugger Robot found = self.execTreeParser( 906*16467b97STreehugger Robot grammar, 'a', 907*16467b97STreehugger Robot treeGrammar, 'a', 908*16467b97STreehugger Robot "abc 34" 909*16467b97STreehugger Robot ) 910*16467b97STreehugger Robot 911*16467b97STreehugger Robot self.assertEqual("(ick 34)", found) 912*16467b97STreehugger Robot 913*16467b97STreehugger Robot 914*16467b97STreehugger Robot found = self.execTreeParser( 915*16467b97STreehugger Robot grammar, 'a', 916*16467b97STreehugger Robot treeGrammar, 'a', 917*16467b97STreehugger Robot "34" 918*16467b97STreehugger Robot ) 919*16467b97STreehugger Robot 920*16467b97STreehugger Robot self.assertEqual("34", found) 921*16467b97STreehugger Robot 922*16467b97STreehugger Robot 923*16467b97STreehugger Robot def testRewriteModeFlatTree(self): 924*16467b97STreehugger Robot grammar = textwrap.dedent( 925*16467b97STreehugger Robot r''' 926*16467b97STreehugger Robot grammar T18; 927*16467b97STreehugger Robot options { 928*16467b97STreehugger Robot language=Python3; 929*16467b97STreehugger Robot output=AST; 930*16467b97STreehugger Robot } 931*16467b97STreehugger Robot a : ID INT -> ID INT | INT ; 932*16467b97STreehugger Robot ID : 'a'..'z'+ ; 933*16467b97STreehugger Robot INT : '0'..'9'+; 934*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 935*16467b97STreehugger Robot ''') 936*16467b97STreehugger Robot 937*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 938*16467b97STreehugger Robot r''' 939*16467b97STreehugger Robot tree grammar TP18; 940*16467b97STreehugger Robot options { 941*16467b97STreehugger Robot language=Python3; 942*16467b97STreehugger Robot output=AST; 943*16467b97STreehugger Robot ASTLabelType=CommonTree; 944*16467b97STreehugger Robot tokenVocab=T18; 945*16467b97STreehugger Robot rewrite=true; 946*16467b97STreehugger Robot } 947*16467b97STreehugger Robot s : ID a ; 948*16467b97STreehugger Robot a : INT -> INT["1"] 949*16467b97STreehugger Robot ; 950*16467b97STreehugger Robot ''') 951*16467b97STreehugger Robot 952*16467b97STreehugger Robot found = self.execTreeParser( 953*16467b97STreehugger Robot grammar, 'a', 954*16467b97STreehugger Robot treeGrammar, 's', 955*16467b97STreehugger Robot "abc 34" 956*16467b97STreehugger Robot ) 957*16467b97STreehugger Robot self.assertEqual("abc 1", found) 958*16467b97STreehugger Robot 959*16467b97STreehugger Robot 960*16467b97STreehugger Robot def testRewriteModeChainRuleFlatTree(self): 961*16467b97STreehugger Robot grammar = textwrap.dedent( 962*16467b97STreehugger Robot r''' 963*16467b97STreehugger Robot grammar T; 964*16467b97STreehugger Robot options {language=Python3; output=AST;} 965*16467b97STreehugger Robot a : ID INT -> ID INT | INT ; 966*16467b97STreehugger Robot ID : 'a'..'z'+ ; 967*16467b97STreehugger Robot INT : '0'..'9'+; 968*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 969*16467b97STreehugger Robot ''') 970*16467b97STreehugger Robot 971*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 972*16467b97STreehugger Robot r''' 973*16467b97STreehugger Robot tree grammar TP; 974*16467b97STreehugger Robot options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 975*16467b97STreehugger Robot s : a ; 976*16467b97STreehugger Robot a : b ; 977*16467b97STreehugger Robot b : ID INT -> INT ID 978*16467b97STreehugger Robot ; 979*16467b97STreehugger Robot ''') 980*16467b97STreehugger Robot 981*16467b97STreehugger Robot found = self.execTreeParser( 982*16467b97STreehugger Robot grammar, 'a', 983*16467b97STreehugger Robot treeGrammar, 's', 984*16467b97STreehugger Robot "abc 34") 985*16467b97STreehugger Robot self.assertEqual("34 abc", found) 986*16467b97STreehugger Robot 987*16467b97STreehugger Robot 988*16467b97STreehugger Robot def testRewriteModeChainRuleTree(self): 989*16467b97STreehugger Robot grammar = textwrap.dedent( 990*16467b97STreehugger Robot r''' 991*16467b97STreehugger Robot grammar T; 992*16467b97STreehugger Robot options {language=Python3; output=AST;} 993*16467b97STreehugger Robot a : ID INT -> ^(ID 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=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1003*16467b97STreehugger Robot s : a ; 1004*16467b97STreehugger Robot a : b ; // a.tree must become b.tree 1005*16467b97STreehugger Robot b : ^(ID INT) -> INT 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.assertEqual("34", found) 1014*16467b97STreehugger Robot 1015*16467b97STreehugger Robot 1016*16467b97STreehugger Robot def testRewriteModeChainRuleTree2(self): 1017*16467b97STreehugger Robot grammar = textwrap.dedent( 1018*16467b97STreehugger Robot r''' 1019*16467b97STreehugger Robot grammar T; 1020*16467b97STreehugger Robot options {language=Python3; 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=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1031*16467b97STreehugger Robot tokens { X; } 1032*16467b97STreehugger Robot s : a* b ; // only b contributes to tree, but it's after a*; s.tree = b.tree 1033*16467b97STreehugger Robot a : X ; 1034*16467b97STreehugger Robot b : ^(ID INT) -> INT 1035*16467b97STreehugger Robot ; 1036*16467b97STreehugger Robot """) 1037*16467b97STreehugger Robot 1038*16467b97STreehugger Robot found = self.execTreeParser( 1039*16467b97STreehugger Robot grammar, 'a', 1040*16467b97STreehugger Robot treeGrammar, 's', 1041*16467b97STreehugger Robot "abc 34") 1042*16467b97STreehugger Robot self.assertEqual("34", found) 1043*16467b97STreehugger Robot 1044*16467b97STreehugger Robot 1045*16467b97STreehugger Robot def testRewriteModeChainRuleTree3(self): 1046*16467b97STreehugger Robot grammar = textwrap.dedent( 1047*16467b97STreehugger Robot r''' 1048*16467b97STreehugger Robot grammar T; 1049*16467b97STreehugger Robot options {language=Python3; output=AST;} 1050*16467b97STreehugger Robot a : 'boo' ID INT -> 'boo' ^(ID INT) ; 1051*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1052*16467b97STreehugger Robot INT : '0'..'9'+; 1053*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1054*16467b97STreehugger Robot ''') 1055*16467b97STreehugger Robot 1056*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1057*16467b97STreehugger Robot r""" 1058*16467b97STreehugger Robot tree grammar TP; 1059*16467b97STreehugger Robot options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1060*16467b97STreehugger Robot tokens { X; } 1061*16467b97STreehugger Robot s : 'boo' a* b ; // don't reset s.tree to b.tree due to 'boo' 1062*16467b97STreehugger Robot a : X ; 1063*16467b97STreehugger Robot b : ^(ID INT) -> INT 1064*16467b97STreehugger Robot ; 1065*16467b97STreehugger Robot """) 1066*16467b97STreehugger Robot 1067*16467b97STreehugger Robot found = self.execTreeParser( 1068*16467b97STreehugger Robot grammar, 'a', 1069*16467b97STreehugger Robot treeGrammar, 's', 1070*16467b97STreehugger Robot "boo abc 34") 1071*16467b97STreehugger Robot self.assertEqual("boo 34", found) 1072*16467b97STreehugger Robot 1073*16467b97STreehugger Robot 1074*16467b97STreehugger Robot def testRewriteModeChainRuleTree4(self): 1075*16467b97STreehugger Robot grammar = textwrap.dedent( 1076*16467b97STreehugger Robot r""" 1077*16467b97STreehugger Robot grammar T; 1078*16467b97STreehugger Robot options {language=Python3; output=AST;} 1079*16467b97STreehugger Robot a : 'boo' ID INT -> ^('boo' ^(ID INT)) ; 1080*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1081*16467b97STreehugger Robot INT : '0'..'9'+; 1082*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1083*16467b97STreehugger Robot """) 1084*16467b97STreehugger Robot 1085*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1086*16467b97STreehugger Robot r""" 1087*16467b97STreehugger Robot tree grammar TP; 1088*16467b97STreehugger Robot options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1089*16467b97STreehugger Robot tokens { X; } 1090*16467b97STreehugger Robot s : ^('boo' a* b) ; // don't reset s.tree to b.tree due to 'boo' 1091*16467b97STreehugger Robot a : X ; 1092*16467b97STreehugger Robot b : ^(ID INT) -> INT 1093*16467b97STreehugger Robot ; 1094*16467b97STreehugger Robot """) 1095*16467b97STreehugger Robot 1096*16467b97STreehugger Robot found = self.execTreeParser( 1097*16467b97STreehugger Robot grammar, 'a', 1098*16467b97STreehugger Robot treeGrammar, 's', 1099*16467b97STreehugger Robot "boo abc 34") 1100*16467b97STreehugger Robot self.assertEqual("(boo 34)", found) 1101*16467b97STreehugger Robot 1102*16467b97STreehugger Robot 1103*16467b97STreehugger Robot def testRewriteModeChainRuleTree5(self): 1104*16467b97STreehugger Robot grammar = textwrap.dedent( 1105*16467b97STreehugger Robot r""" 1106*16467b97STreehugger Robot grammar T; 1107*16467b97STreehugger Robot options {language=Python3; output=AST;} 1108*16467b97STreehugger Robot a : 'boo' ID INT -> ^('boo' ^(ID INT)) ; 1109*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1110*16467b97STreehugger Robot INT : '0'..'9'+; 1111*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1112*16467b97STreehugger Robot """) 1113*16467b97STreehugger Robot 1114*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1115*16467b97STreehugger Robot r""" 1116*16467b97STreehugger Robot tree grammar TP; 1117*16467b97STreehugger Robot options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1118*16467b97STreehugger Robot tokens { X; } 1119*16467b97STreehugger Robot s : ^(a b) ; // s.tree is a.tree 1120*16467b97STreehugger Robot a : 'boo' ; 1121*16467b97STreehugger Robot b : ^(ID INT) -> INT 1122*16467b97STreehugger Robot ; 1123*16467b97STreehugger Robot """) 1124*16467b97STreehugger Robot 1125*16467b97STreehugger Robot found = self.execTreeParser( 1126*16467b97STreehugger Robot grammar, 'a', 1127*16467b97STreehugger Robot treeGrammar, 's', 1128*16467b97STreehugger Robot "boo abc 34") 1129*16467b97STreehugger Robot self.assertEqual("(boo 34)", found) 1130*16467b97STreehugger Robot 1131*16467b97STreehugger Robot 1132*16467b97STreehugger Robot def testRewriteOfRuleRef(self): 1133*16467b97STreehugger Robot grammar = textwrap.dedent( 1134*16467b97STreehugger Robot r""" 1135*16467b97STreehugger Robot grammar T; 1136*16467b97STreehugger Robot options {language=Python3; output=AST;} 1137*16467b97STreehugger Robot a : ID INT -> ID INT | INT ; 1138*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1139*16467b97STreehugger Robot INT : '0'..'9'+; 1140*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1141*16467b97STreehugger Robot """) 1142*16467b97STreehugger Robot 1143*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1144*16467b97STreehugger Robot r""" 1145*16467b97STreehugger Robot tree grammar TP; 1146*16467b97STreehugger Robot options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1147*16467b97STreehugger Robot s : a -> a ; 1148*16467b97STreehugger Robot a : ID INT -> ID INT ; 1149*16467b97STreehugger Robot """) 1150*16467b97STreehugger Robot 1151*16467b97STreehugger Robot found = self.execTreeParser( 1152*16467b97STreehugger Robot grammar, 'a', 1153*16467b97STreehugger Robot treeGrammar, 's', 1154*16467b97STreehugger Robot "abc 34") 1155*16467b97STreehugger Robot self.assertEqual("abc 34", found) 1156*16467b97STreehugger Robot 1157*16467b97STreehugger Robot 1158*16467b97STreehugger Robot def testRewriteOfRuleRefRoot(self): 1159*16467b97STreehugger Robot grammar = textwrap.dedent( 1160*16467b97STreehugger Robot r""" 1161*16467b97STreehugger Robot grammar T; 1162*16467b97STreehugger Robot options {language=Python3; output=AST;} 1163*16467b97STreehugger Robot a : ID INT INT -> ^(INT ^(ID INT)); 1164*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1165*16467b97STreehugger Robot INT : '0'..'9'+; 1166*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1167*16467b97STreehugger Robot """) 1168*16467b97STreehugger Robot 1169*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1170*16467b97STreehugger Robot r""" 1171*16467b97STreehugger Robot tree grammar TP; 1172*16467b97STreehugger Robot options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1173*16467b97STreehugger Robot s : ^(a ^(ID INT)) -> a ; 1174*16467b97STreehugger Robot a : INT ; 1175*16467b97STreehugger Robot """) 1176*16467b97STreehugger Robot 1177*16467b97STreehugger Robot found = self.execTreeParser( 1178*16467b97STreehugger Robot grammar, 'a', 1179*16467b97STreehugger Robot treeGrammar, 's', 1180*16467b97STreehugger Robot "abc 12 34") 1181*16467b97STreehugger Robot # emits whole tree when you ref the root since I can't know whether 1182*16467b97STreehugger Robot # you want the children or not. You might be returning a whole new 1183*16467b97STreehugger Robot # tree. Hmm...still seems weird. oh well. 1184*16467b97STreehugger Robot self.assertEqual("(12 (abc 34))", found) 1185*16467b97STreehugger Robot 1186*16467b97STreehugger Robot 1187*16467b97STreehugger Robot def testRewriteOfRuleRefRootLabeled(self): 1188*16467b97STreehugger Robot grammar = textwrap.dedent( 1189*16467b97STreehugger Robot r""" 1190*16467b97STreehugger Robot grammar T; 1191*16467b97STreehugger Robot options {language=Python3; output=AST;} 1192*16467b97STreehugger Robot a : ID INT INT -> ^(INT ^(ID INT)); 1193*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1194*16467b97STreehugger Robot INT : '0'..'9'+; 1195*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1196*16467b97STreehugger Robot """) 1197*16467b97STreehugger Robot 1198*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1199*16467b97STreehugger Robot r""" 1200*16467b97STreehugger Robot tree grammar TP; 1201*16467b97STreehugger Robot options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1202*16467b97STreehugger Robot s : ^(label=a ^(ID INT)) -> a ; 1203*16467b97STreehugger Robot a : INT ; 1204*16467b97STreehugger Robot """) 1205*16467b97STreehugger Robot 1206*16467b97STreehugger Robot found = self.execTreeParser( 1207*16467b97STreehugger Robot grammar, 'a', 1208*16467b97STreehugger Robot treeGrammar, 's', 1209*16467b97STreehugger Robot "abc 12 34") 1210*16467b97STreehugger Robot # emits whole tree when you ref the root since I can't know whether 1211*16467b97STreehugger Robot # you want the children or not. You might be returning a whole new 1212*16467b97STreehugger Robot # tree. Hmm...still seems weird. oh well. 1213*16467b97STreehugger Robot self.assertEqual("(12 (abc 34))", found) 1214*16467b97STreehugger Robot 1215*16467b97STreehugger Robot 1216*16467b97STreehugger Robot def testRewriteOfRuleRefRootListLabeled(self): 1217*16467b97STreehugger Robot grammar = textwrap.dedent( 1218*16467b97STreehugger Robot r""" 1219*16467b97STreehugger Robot grammar T; 1220*16467b97STreehugger Robot options {language=Python3; output=AST;} 1221*16467b97STreehugger Robot a : ID INT INT -> ^(INT ^(ID INT)); 1222*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1223*16467b97STreehugger Robot INT : '0'..'9'+; 1224*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1225*16467b97STreehugger Robot """) 1226*16467b97STreehugger Robot 1227*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1228*16467b97STreehugger Robot r""" 1229*16467b97STreehugger Robot tree grammar TP; 1230*16467b97STreehugger Robot options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1231*16467b97STreehugger Robot s : ^(label+=a ^(ID INT)) -> a ; 1232*16467b97STreehugger Robot a : INT ; 1233*16467b97STreehugger Robot """) 1234*16467b97STreehugger Robot 1235*16467b97STreehugger Robot found = self.execTreeParser( 1236*16467b97STreehugger Robot grammar, 'a', 1237*16467b97STreehugger Robot treeGrammar, 's', 1238*16467b97STreehugger Robot "abc 12 34") 1239*16467b97STreehugger Robot # emits whole tree when you ref the root since I can't know whether 1240*16467b97STreehugger Robot # you want the children or not. You might be returning a whole new 1241*16467b97STreehugger Robot # tree. Hmm...still seems weird. oh well. 1242*16467b97STreehugger Robot self.assertEqual("(12 (abc 34))", found) 1243*16467b97STreehugger Robot 1244*16467b97STreehugger Robot 1245*16467b97STreehugger Robot def testRewriteOfRuleRefChild(self): 1246*16467b97STreehugger Robot grammar = textwrap.dedent( 1247*16467b97STreehugger Robot r""" 1248*16467b97STreehugger Robot grammar T; 1249*16467b97STreehugger Robot options {language=Python3; output=AST;} 1250*16467b97STreehugger Robot a : ID INT -> ^(ID ^(INT INT)); 1251*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1252*16467b97STreehugger Robot INT : '0'..'9'+; 1253*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1254*16467b97STreehugger Robot """) 1255*16467b97STreehugger Robot 1256*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1257*16467b97STreehugger Robot r""" 1258*16467b97STreehugger Robot tree grammar TP; 1259*16467b97STreehugger Robot options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1260*16467b97STreehugger Robot s : ^(ID a) -> a ; 1261*16467b97STreehugger Robot a : ^(INT INT) ; 1262*16467b97STreehugger Robot """) 1263*16467b97STreehugger Robot 1264*16467b97STreehugger Robot found = self.execTreeParser( 1265*16467b97STreehugger Robot grammar, 'a', 1266*16467b97STreehugger Robot treeGrammar, 's', 1267*16467b97STreehugger Robot "abc 34") 1268*16467b97STreehugger Robot self.assertEqual("(34 34)", found) 1269*16467b97STreehugger Robot 1270*16467b97STreehugger Robot 1271*16467b97STreehugger Robot def testRewriteOfRuleRefLabel(self): 1272*16467b97STreehugger Robot grammar = textwrap.dedent( 1273*16467b97STreehugger Robot r""" 1274*16467b97STreehugger Robot grammar T; 1275*16467b97STreehugger Robot options {language=Python3; output=AST;} 1276*16467b97STreehugger Robot a : ID INT -> ^(ID ^(INT INT)); 1277*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1278*16467b97STreehugger Robot INT : '0'..'9'+; 1279*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1280*16467b97STreehugger Robot """) 1281*16467b97STreehugger Robot 1282*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1283*16467b97STreehugger Robot r""" 1284*16467b97STreehugger Robot tree grammar TP; 1285*16467b97STreehugger Robot options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1286*16467b97STreehugger Robot s : ^(ID label=a) -> a ; 1287*16467b97STreehugger Robot a : ^(INT INT) ; 1288*16467b97STreehugger Robot """) 1289*16467b97STreehugger Robot 1290*16467b97STreehugger Robot found = self.execTreeParser( 1291*16467b97STreehugger Robot grammar, 'a', 1292*16467b97STreehugger Robot treeGrammar, 's', 1293*16467b97STreehugger Robot "abc 34") 1294*16467b97STreehugger Robot self.assertEqual("(34 34)", found) 1295*16467b97STreehugger Robot 1296*16467b97STreehugger Robot 1297*16467b97STreehugger Robot def testRewriteOfRuleRefListLabel(self): 1298*16467b97STreehugger Robot grammar = textwrap.dedent( 1299*16467b97STreehugger Robot r""" 1300*16467b97STreehugger Robot grammar T; 1301*16467b97STreehugger Robot options {language=Python3; output=AST;} 1302*16467b97STreehugger Robot a : ID INT -> ^(ID ^(INT INT)); 1303*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1304*16467b97STreehugger Robot INT : '0'..'9'+; 1305*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1306*16467b97STreehugger Robot """) 1307*16467b97STreehugger Robot 1308*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1309*16467b97STreehugger Robot r""" 1310*16467b97STreehugger Robot tree grammar TP; 1311*16467b97STreehugger Robot options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1312*16467b97STreehugger Robot s : ^(ID label+=a) -> a ; 1313*16467b97STreehugger Robot a : ^(INT INT) ; 1314*16467b97STreehugger Robot """) 1315*16467b97STreehugger Robot 1316*16467b97STreehugger Robot found = self.execTreeParser( 1317*16467b97STreehugger Robot grammar, 'a', 1318*16467b97STreehugger Robot treeGrammar, 's', 1319*16467b97STreehugger Robot "abc 34") 1320*16467b97STreehugger Robot self.assertEqual("(34 34)", found) 1321*16467b97STreehugger Robot 1322*16467b97STreehugger Robot 1323*16467b97STreehugger Robot 1324*16467b97STreehugger Robot def testRewriteModeWithPredicatedRewrites(self): 1325*16467b97STreehugger Robot grammar = textwrap.dedent( 1326*16467b97STreehugger Robot r''' 1327*16467b97STreehugger Robot grammar T19; 1328*16467b97STreehugger Robot options { 1329*16467b97STreehugger Robot language=Python3; 1330*16467b97STreehugger Robot output=AST; 1331*16467b97STreehugger Robot } 1332*16467b97STreehugger Robot a : ID INT -> ^(ID["root"] ^(ID INT)) | INT -> ^(ID["root"] INT) ; 1333*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1334*16467b97STreehugger Robot INT : '0'..'9'+; 1335*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1336*16467b97STreehugger Robot ''') 1337*16467b97STreehugger Robot 1338*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1339*16467b97STreehugger Robot r''' 1340*16467b97STreehugger Robot tree grammar TP19; 1341*16467b97STreehugger Robot options { 1342*16467b97STreehugger Robot language=Python3; 1343*16467b97STreehugger Robot output=AST; 1344*16467b97STreehugger Robot ASTLabelType=CommonTree; 1345*16467b97STreehugger Robot tokenVocab=T19; 1346*16467b97STreehugger Robot rewrite=true; 1347*16467b97STreehugger Robot } 1348*16467b97STreehugger Robot s : ^(ID a) { self.buf += $s.start.toStringTree() }; 1349*16467b97STreehugger Robot a : ^(ID INT) -> {True}? ^(ID["ick"] INT) 1350*16467b97STreehugger Robot -> INT 1351*16467b97STreehugger Robot ; 1352*16467b97STreehugger Robot ''') 1353*16467b97STreehugger Robot 1354*16467b97STreehugger Robot found = self.execTreeParser( 1355*16467b97STreehugger Robot grammar, 'a', 1356*16467b97STreehugger Robot treeGrammar, 's', 1357*16467b97STreehugger Robot "abc 34" 1358*16467b97STreehugger Robot ) 1359*16467b97STreehugger Robot 1360*16467b97STreehugger Robot self.assertEqual("(root (ick 34))", found) 1361*16467b97STreehugger Robot 1362*16467b97STreehugger Robot 1363*16467b97STreehugger Robot def testWildcardSingleNode(self): 1364*16467b97STreehugger Robot grammar = textwrap.dedent( 1365*16467b97STreehugger Robot r''' 1366*16467b97STreehugger Robot grammar T; 1367*16467b97STreehugger Robot options { 1368*16467b97STreehugger Robot language=Python3; 1369*16467b97STreehugger Robot output=AST; 1370*16467b97STreehugger Robot } 1371*16467b97STreehugger Robot a : ID INT -> ^(ID["root"] INT); 1372*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1373*16467b97STreehugger Robot INT : '0'..'9'+; 1374*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1375*16467b97STreehugger Robot ''') 1376*16467b97STreehugger Robot 1377*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1378*16467b97STreehugger Robot r''' 1379*16467b97STreehugger Robot tree grammar TP; 1380*16467b97STreehugger Robot options { 1381*16467b97STreehugger Robot language=Python3; 1382*16467b97STreehugger Robot output=AST; 1383*16467b97STreehugger Robot ASTLabelType=CommonTree; 1384*16467b97STreehugger Robot tokenVocab=T; 1385*16467b97STreehugger Robot } 1386*16467b97STreehugger Robot s : ^(ID c=.) -> $c 1387*16467b97STreehugger Robot ; 1388*16467b97STreehugger Robot ''') 1389*16467b97STreehugger Robot 1390*16467b97STreehugger Robot found = self.execTreeParser( 1391*16467b97STreehugger Robot grammar, 'a', 1392*16467b97STreehugger Robot treeGrammar, 's', 1393*16467b97STreehugger Robot "abc 34" 1394*16467b97STreehugger Robot ) 1395*16467b97STreehugger Robot 1396*16467b97STreehugger Robot self.assertEqual("34", found) 1397*16467b97STreehugger Robot 1398*16467b97STreehugger Robot def testWildcardUnlabeledSingleNode(self): 1399*16467b97STreehugger Robot grammar = textwrap.dedent( 1400*16467b97STreehugger Robot r''' 1401*16467b97STreehugger Robot grammar T; 1402*16467b97STreehugger Robot options {language=Python3; output=AST;} 1403*16467b97STreehugger Robot a : ID INT -> ^(ID INT); 1404*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1405*16467b97STreehugger Robot INT : '0'..'9'+; 1406*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1407*16467b97STreehugger Robot ''') 1408*16467b97STreehugger Robot 1409*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1410*16467b97STreehugger Robot r''' 1411*16467b97STreehugger Robot tree grammar TP; 1412*16467b97STreehugger Robot options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T;} 1413*16467b97STreehugger Robot s : ^(ID .) -> ID 1414*16467b97STreehugger Robot ; 1415*16467b97STreehugger Robot ''') 1416*16467b97STreehugger Robot 1417*16467b97STreehugger Robot found = self.execTreeParser( 1418*16467b97STreehugger Robot grammar, 'a', 1419*16467b97STreehugger Robot treeGrammar, 's', 1420*16467b97STreehugger Robot "abc 34") 1421*16467b97STreehugger Robot self.assertEqual("abc", found) 1422*16467b97STreehugger Robot 1423*16467b97STreehugger Robot 1424*16467b97STreehugger Robot def testWildcardGrabsSubtree(self): 1425*16467b97STreehugger Robot grammar = textwrap.dedent( 1426*16467b97STreehugger Robot r''' 1427*16467b97STreehugger Robot grammar T; 1428*16467b97STreehugger Robot options {language=Python3; output=AST;} 1429*16467b97STreehugger Robot a : ID x=INT y=INT z=INT -> ^(ID[\"root\"] ^($x $y $z)); 1430*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1431*16467b97STreehugger Robot INT : '0'..'9'+; 1432*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1433*16467b97STreehugger Robot ''') 1434*16467b97STreehugger Robot 1435*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1436*16467b97STreehugger Robot r''' 1437*16467b97STreehugger Robot tree grammar TP; 1438*16467b97STreehugger Robot options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T;} 1439*16467b97STreehugger Robot s : ^(ID c=.) -> $c 1440*16467b97STreehugger Robot ; 1441*16467b97STreehugger Robot ''') 1442*16467b97STreehugger Robot 1443*16467b97STreehugger Robot found = self.execTreeParser( 1444*16467b97STreehugger Robot grammar, 'a', 1445*16467b97STreehugger Robot treeGrammar, 's', 1446*16467b97STreehugger Robot "abc 1 2 3") 1447*16467b97STreehugger Robot self.assertEqual("(1 2 3)", found) 1448*16467b97STreehugger Robot 1449*16467b97STreehugger Robot 1450*16467b97STreehugger Robot def testWildcardGrabsSubtree2(self): 1451*16467b97STreehugger Robot grammar = textwrap.dedent( 1452*16467b97STreehugger Robot r''' 1453*16467b97STreehugger Robot grammar T; 1454*16467b97STreehugger Robot options {language=Python3; output=AST;} 1455*16467b97STreehugger Robot a : ID x=INT y=INT z=INT -> ID ^($x $y $z); 1456*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1457*16467b97STreehugger Robot INT : '0'..'9'+; 1458*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1459*16467b97STreehugger Robot ''') 1460*16467b97STreehugger Robot 1461*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1462*16467b97STreehugger Robot r''' 1463*16467b97STreehugger Robot tree grammar TP; 1464*16467b97STreehugger Robot options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T;} 1465*16467b97STreehugger Robot s : ID c=. -> $c 1466*16467b97STreehugger Robot ; 1467*16467b97STreehugger Robot ''') 1468*16467b97STreehugger Robot 1469*16467b97STreehugger Robot found = self.execTreeParser( 1470*16467b97STreehugger Robot grammar, 'a', 1471*16467b97STreehugger Robot treeGrammar, 's', 1472*16467b97STreehugger Robot "abc 1 2 3") 1473*16467b97STreehugger Robot self.assertEqual("(1 2 3)", found) 1474*16467b97STreehugger Robot 1475*16467b97STreehugger Robot 1476*16467b97STreehugger Robot def testWildcardListLabel(self): 1477*16467b97STreehugger Robot grammar = textwrap.dedent( 1478*16467b97STreehugger Robot r''' 1479*16467b97STreehugger Robot grammar T; 1480*16467b97STreehugger Robot options {language=Python3; output=AST;} 1481*16467b97STreehugger Robot a : INT INT INT ; 1482*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1483*16467b97STreehugger Robot INT : '0'..'9'+; 1484*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1485*16467b97STreehugger Robot ''') 1486*16467b97STreehugger Robot 1487*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1488*16467b97STreehugger Robot r''' 1489*16467b97STreehugger Robot tree grammar TP; 1490*16467b97STreehugger Robot options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T;} 1491*16467b97STreehugger Robot s : (c+=.)+ -> $c+ 1492*16467b97STreehugger Robot ; 1493*16467b97STreehugger Robot ''') 1494*16467b97STreehugger Robot 1495*16467b97STreehugger Robot found = self.execTreeParser( 1496*16467b97STreehugger Robot grammar, 'a', 1497*16467b97STreehugger Robot treeGrammar, 's', 1498*16467b97STreehugger Robot "1 2 3") 1499*16467b97STreehugger Robot self.assertEqual("1 2 3", found) 1500*16467b97STreehugger Robot 1501*16467b97STreehugger Robot 1502*16467b97STreehugger Robot def testWildcardListLabel2(self): 1503*16467b97STreehugger Robot grammar = textwrap.dedent( 1504*16467b97STreehugger Robot r''' 1505*16467b97STreehugger Robot grammar T; 1506*16467b97STreehugger Robot options {language=Python3; output=AST; ASTLabelType=CommonTree;} 1507*16467b97STreehugger Robot a : x=INT y=INT z=INT -> ^($x ^($y $z) ^($y $z)); 1508*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1509*16467b97STreehugger Robot INT : '0'..'9'+; 1510*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1511*16467b97STreehugger Robot ''') 1512*16467b97STreehugger Robot 1513*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1514*16467b97STreehugger Robot r''' 1515*16467b97STreehugger Robot tree grammar TP; 1516*16467b97STreehugger Robot options {language=Python3; output=AST; ASTLabelType=CommonTree; tokenVocab=T; rewrite=true;} 1517*16467b97STreehugger Robot s : ^(INT (c+=.)+) -> $c+ 1518*16467b97STreehugger Robot ; 1519*16467b97STreehugger Robot ''') 1520*16467b97STreehugger Robot 1521*16467b97STreehugger Robot found = self.execTreeParser( 1522*16467b97STreehugger Robot grammar, 'a', 1523*16467b97STreehugger Robot treeGrammar, 's', 1524*16467b97STreehugger Robot "1 2 3") 1525*16467b97STreehugger Robot self.assertEqual("(2 3) (2 3)", found) 1526*16467b97STreehugger Robot 1527*16467b97STreehugger Robot 1528*16467b97STreehugger Robot def testRuleResultAsRoot(self): 1529*16467b97STreehugger Robot grammar = textwrap.dedent( 1530*16467b97STreehugger Robot r''' 1531*16467b97STreehugger Robot grammar T; 1532*16467b97STreehugger Robot options { 1533*16467b97STreehugger Robot language=Python3; 1534*16467b97STreehugger Robot output=AST; 1535*16467b97STreehugger Robot } 1536*16467b97STreehugger Robot a : ID '=' INT -> ^('=' ID INT); 1537*16467b97STreehugger Robot ID : 'a'..'z'+ ; 1538*16467b97STreehugger Robot INT : '0'..'9'+; 1539*16467b97STreehugger Robot COLON : ':' ; 1540*16467b97STreehugger Robot WS : (' '|'\n') {$channel=HIDDEN;} ; 1541*16467b97STreehugger Robot ''') 1542*16467b97STreehugger Robot 1543*16467b97STreehugger Robot treeGrammar = textwrap.dedent( 1544*16467b97STreehugger Robot r''' 1545*16467b97STreehugger Robot tree grammar TP; 1546*16467b97STreehugger Robot options { 1547*16467b97STreehugger Robot language=Python3; 1548*16467b97STreehugger Robot output=AST; 1549*16467b97STreehugger Robot rewrite=true; 1550*16467b97STreehugger Robot ASTLabelType=CommonTree; 1551*16467b97STreehugger Robot tokenVocab=T; 1552*16467b97STreehugger Robot } 1553*16467b97STreehugger Robot a : ^(eq e1=ID e2=.) -> ^(eq $e2 $e1) ; 1554*16467b97STreehugger Robot eq : '=' | ':' {pass} ; // bug in set match, doesn't add to tree!! booh. force nonset. 1555*16467b97STreehugger Robot ''') 1556*16467b97STreehugger Robot 1557*16467b97STreehugger Robot found = self.execTreeParser( 1558*16467b97STreehugger Robot grammar, 'a', 1559*16467b97STreehugger Robot treeGrammar, 'a', 1560*16467b97STreehugger Robot "abc = 34") 1561*16467b97STreehugger Robot self.assertEqual("(= 34 abc)", found) 1562*16467b97STreehugger Robot 1563*16467b97STreehugger Robot 1564*16467b97STreehugger Robotif __name__ == '__main__': 1565*16467b97STreehugger Robot unittest.main() 1566