import unittest import textwrap import antlr3 import antlr3.tree import testbase class T(testbase.ANTLRTest): def walkerClass(self, base): class TWalker(base): def __init__(self, *args, **kwargs): base.__init__(self, *args, **kwargs) self.traces = [] def traceIn(self, ruleName, ruleIndex): self.traces.append('>'+ruleName) def traceOut(self, ruleName, ruleIndex): self.traces.append('<'+ruleName) def recover(self, input, re): # no error recovery yet, just crash! raise return TWalker def setUp(self): self.compileGrammar() self.compileGrammar('t047treeparserWalker.g', options='-trace') def testWalker(self): input = textwrap.dedent( '''\ char c; int x; void bar(int x); int foo(int y, char d) { int i; for (i=0; i<3; i=i+1) { x=3; y=5; } } ''') cStream = antlr3.StringStream(input) lexer = self.getLexer(cStream) tStream = antlr3.CommonTokenStream(lexer) parser = self.getParser(tStream) r = parser.program() self.failUnlessEqual( r.tree.toStringTree(), "(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)))))" ) nodes = antlr3.tree.CommonTreeNodeStream(r.tree) nodes.setTokenStream(tStream) walker = self.getWalker(nodes) walker.program() # FIXME: need to crosscheck with Java target (compile walker with # -trace option), if this is the real list. For now I'm happy that # it does not crash ;) self.failUnlessEqual( walker.traces, [ '>program', '>declaration', '>variable', '>type', '<type', '>declarator', '<declarator', '<variable', '<declaration', '>declaration', '>variable', '>type', '<type', '>declarator', '<declarator', '<variable', '<declaration', '>declaration', '>functionHeader', '>type', '<type', '>formalParameter', '>type', '<type', '>declarator', '<declarator', '<formalParameter', '<functionHeader', '<declaration', '>declaration', '>functionHeader', '>type', '<type', '>formalParameter', '>type', '<type', '>declarator', '<declarator', '<formalParameter', '>formalParameter', '>type', '<type', '>declarator', '<declarator', '<formalParameter', '<functionHeader', '>block', '>variable', '>type', '<type', '>declarator', '<declarator', '<variable', '>stat', '>forStat', '>expr', '>expr', '>atom', '<atom', '<expr', '<expr', '>expr', '>expr', '>atom', '<atom', '<expr', '>expr', '>atom', '<atom', '<expr', '<expr', '>expr', '>expr', '>expr', '>atom', '<atom', '<expr', '>expr', '>atom', '<atom', '<expr', '<expr', '<expr', '>block', '>stat', '>expr', '>expr', '>atom', '<atom', '<expr', '<expr', '<stat', '>stat', '>expr', '>expr', '>atom', '<atom', '<expr', '<expr', '<stat', '<block', '<forStat', '<stat', '<block', '<declaration', '<program' ] ) def testRuleLabelPropertyRefText(self): self.compileGrammar() self.compileGrammar('t047treeparserWalker.g', options='-trace') input = textwrap.dedent( '''\ char c; ''') cStream = antlr3.StringStream(input) lexer = self.getLexer(cStream) tStream = antlr3.CommonTokenStream(lexer) parser = self.getParser(tStream) r = parser.variable() nodes = antlr3.tree.CommonTreeNodeStream(r.tree) nodes.setTokenStream(tStream) walker = self.getWalker(nodes) r = walker.variable() self.failUnlessEqual(r, 'c') if __name__ == '__main__': unittest.main()