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