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 13*16467b97STreehugger Robot self.traces = [] 14*16467b97STreehugger Robot 15*16467b97STreehugger Robot 16*16467b97STreehugger Robot def traceIn(self, ruleName, ruleIndex): 17*16467b97STreehugger Robot self.traces.append('>'+ruleName) 18*16467b97STreehugger Robot 19*16467b97STreehugger Robot 20*16467b97STreehugger Robot def traceOut(self, ruleName, ruleIndex): 21*16467b97STreehugger Robot self.traces.append('<'+ruleName) 22*16467b97STreehugger Robot 23*16467b97STreehugger Robot 24*16467b97STreehugger Robot def recover(self, input, re): 25*16467b97STreehugger Robot # no error recovery yet, just crash! 26*16467b97STreehugger Robot raise 27*16467b97STreehugger Robot 28*16467b97STreehugger Robot return TWalker 29*16467b97STreehugger Robot 30*16467b97STreehugger Robot 31*16467b97STreehugger Robot def setUp(self): 32*16467b97STreehugger Robot self.compileGrammar() 33*16467b97STreehugger Robot self.compileGrammar('t047treeparserWalker.g', options='-trace') 34*16467b97STreehugger Robot 35*16467b97STreehugger Robot 36*16467b97STreehugger Robot def testWalker(self): 37*16467b97STreehugger Robot input = textwrap.dedent( 38*16467b97STreehugger Robot '''\ 39*16467b97STreehugger Robot char c; 40*16467b97STreehugger Robot int x; 41*16467b97STreehugger Robot 42*16467b97STreehugger Robot void bar(int x); 43*16467b97STreehugger Robot 44*16467b97STreehugger Robot int foo(int y, char d) { 45*16467b97STreehugger Robot int i; 46*16467b97STreehugger Robot for (i=0; i<3; i=i+1) { 47*16467b97STreehugger Robot x=3; 48*16467b97STreehugger Robot y=5; 49*16467b97STreehugger Robot } 50*16467b97STreehugger Robot } 51*16467b97STreehugger Robot ''') 52*16467b97STreehugger Robot 53*16467b97STreehugger Robot cStream = antlr3.StringStream(input) 54*16467b97STreehugger Robot lexer = self.getLexer(cStream) 55*16467b97STreehugger Robot tStream = antlr3.CommonTokenStream(lexer) 56*16467b97STreehugger Robot parser = self.getParser(tStream) 57*16467b97STreehugger Robot r = parser.program() 58*16467b97STreehugger Robot 59*16467b97STreehugger Robot self.failUnlessEqual( 60*16467b97STreehugger Robot r.tree.toStringTree(), 61*16467b97STreehugger Robot "(VAR_DEF char c) (VAR_DEF int x) (FUNC_DECL (FUNC_HDR void bar (ARG_DEF int x))) (FUNC_DEF (FUNC_HDR int foo (ARG_DEF int y) (ARG_DEF char d)) (BLOCK (VAR_DEF int i) (for (= i 0) (< i 3) (= i (+ i 1)) (BLOCK (= x 3) (= y 5)))))" 62*16467b97STreehugger Robot ) 63*16467b97STreehugger Robot 64*16467b97STreehugger Robot nodes = antlr3.tree.CommonTreeNodeStream(r.tree) 65*16467b97STreehugger Robot nodes.setTokenStream(tStream) 66*16467b97STreehugger Robot walker = self.getWalker(nodes) 67*16467b97STreehugger Robot walker.program() 68*16467b97STreehugger Robot 69*16467b97STreehugger Robot # FIXME: need to crosscheck with Java target (compile walker with 70*16467b97STreehugger Robot # -trace option), if this is the real list. For now I'm happy that 71*16467b97STreehugger Robot # it does not crash ;) 72*16467b97STreehugger Robot self.failUnlessEqual( 73*16467b97STreehugger Robot walker.traces, 74*16467b97STreehugger Robot [ '>program', '>declaration', '>variable', '>type', '<type', 75*16467b97STreehugger Robot '>declarator', '<declarator', '<variable', '<declaration', 76*16467b97STreehugger Robot '>declaration', '>variable', '>type', '<type', '>declarator', 77*16467b97STreehugger Robot '<declarator', '<variable', '<declaration', '>declaration', 78*16467b97STreehugger Robot '>functionHeader', '>type', '<type', '>formalParameter', 79*16467b97STreehugger Robot '>type', '<type', '>declarator', '<declarator', 80*16467b97STreehugger Robot '<formalParameter', '<functionHeader', '<declaration', 81*16467b97STreehugger Robot '>declaration', '>functionHeader', '>type', '<type', 82*16467b97STreehugger Robot '>formalParameter', '>type', '<type', '>declarator', 83*16467b97STreehugger Robot '<declarator', '<formalParameter', '>formalParameter', '>type', 84*16467b97STreehugger Robot '<type', '>declarator', '<declarator', '<formalParameter', 85*16467b97STreehugger Robot '<functionHeader', '>block', '>variable', '>type', '<type', 86*16467b97STreehugger Robot '>declarator', '<declarator', '<variable', '>stat', '>forStat', 87*16467b97STreehugger Robot '>expr', '>expr', '>atom', '<atom', '<expr', '<expr', '>expr', 88*16467b97STreehugger Robot '>expr', '>atom', '<atom', '<expr', '>expr', '>atom', '<atom', 89*16467b97STreehugger Robot '<expr', '<expr', '>expr', '>expr', '>expr', '>atom', '<atom', 90*16467b97STreehugger Robot '<expr', '>expr', '>atom', '<atom', '<expr', '<expr', '<expr', 91*16467b97STreehugger Robot '>block', '>stat', '>expr', '>expr', '>atom', '<atom', '<expr', 92*16467b97STreehugger Robot '<expr', '<stat', '>stat', '>expr', '>expr', '>atom', '<atom', 93*16467b97STreehugger Robot '<expr', '<expr', '<stat', '<block', '<forStat', '<stat', 94*16467b97STreehugger Robot '<block', '<declaration', '<program' 95*16467b97STreehugger Robot ] 96*16467b97STreehugger Robot ) 97*16467b97STreehugger Robot 98*16467b97STreehugger Robot def testRuleLabelPropertyRefText(self): 99*16467b97STreehugger Robot self.compileGrammar() 100*16467b97STreehugger Robot self.compileGrammar('t047treeparserWalker.g', options='-trace') 101*16467b97STreehugger Robot 102*16467b97STreehugger Robot input = textwrap.dedent( 103*16467b97STreehugger Robot '''\ 104*16467b97STreehugger Robot char c; 105*16467b97STreehugger Robot ''') 106*16467b97STreehugger Robot 107*16467b97STreehugger Robot cStream = antlr3.StringStream(input) 108*16467b97STreehugger Robot lexer = self.getLexer(cStream) 109*16467b97STreehugger Robot tStream = antlr3.CommonTokenStream(lexer) 110*16467b97STreehugger Robot parser = self.getParser(tStream) 111*16467b97STreehugger Robot r = parser.variable() 112*16467b97STreehugger Robot 113*16467b97STreehugger Robot nodes = antlr3.tree.CommonTreeNodeStream(r.tree) 114*16467b97STreehugger Robot nodes.setTokenStream(tStream) 115*16467b97STreehugger Robot walker = self.getWalker(nodes) 116*16467b97STreehugger Robot r = walker.variable() 117*16467b97STreehugger Robot 118*16467b97STreehugger Robot self.failUnlessEqual(r, 'c') 119*16467b97STreehugger Robot 120*16467b97STreehugger Robot 121*16467b97STreehugger Robotif __name__ == '__main__': 122*16467b97STreehugger Robot unittest.main() 123