1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport unittest 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport textwrap 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport antlr3.tree 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport testbase 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass T(testbase.ANTLRTest): 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def walkerClass(self, base): 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver class TWalker(base): 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def __init__(self, *args, **kwargs): 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver base.__init__(self, *args, **kwargs) 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.traces = [] 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def traceIn(self, ruleName, ruleIndex): 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.traces.append('>'+ruleName) 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def traceOut(self, ruleName, ruleIndex): 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.traces.append('<'+ruleName) 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def recover(self, input, re): 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # no error recovery yet, just crash! 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return TWalker 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def setUp(self): 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.compileGrammar() 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.compileGrammar('t047treeparserWalker.g', options='-trace') 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testWalker(self): 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input = textwrap.dedent( 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '''\ 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char c; 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int x; 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver void bar(int x); 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int foo(int y, char d) { 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int i; 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i=0; i<3; i=i+1) { 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver x=3; 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver y=5; 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver cStream = antlr3.StringStream(input) 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = self.getLexer(cStream) 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tStream = antlr3.CommonTokenStream(lexer) 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = self.getParser(tStream) 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r = parser.program() 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual( 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r.tree.toStringTree(), 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "(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)))))" 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = antlr3.tree.CommonTreeNodeStream(r.tree) 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.setTokenStream(tStream) 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = self.getWalker(nodes) 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.program() 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # FIXME: need to crosscheck with Java target (compile walker with 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # -trace option), if this is the real list. For now I'm happy that 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # it does not crash ;) 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual( 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.traces, 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver [ '>program', '>declaration', '>variable', '>type', '<type', 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '>declarator', '<declarator', '<variable', '<declaration', 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '>declaration', '>variable', '>type', '<type', '>declarator', 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '<declarator', '<variable', '<declaration', '>declaration', 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '>functionHeader', '>type', '<type', '>formalParameter', 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '>type', '<type', '>declarator', '<declarator', 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '<formalParameter', '<functionHeader', '<declaration', 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '>declaration', '>functionHeader', '>type', '<type', 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '>formalParameter', '>type', '<type', '>declarator', 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '<declarator', '<formalParameter', '>formalParameter', '>type', 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '<type', '>declarator', '<declarator', '<formalParameter', 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '<functionHeader', '>block', '>variable', '>type', '<type', 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '>declarator', '<declarator', '<variable', '>stat', '>forStat', 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '>expr', '>expr', '>atom', '<atom', '<expr', '<expr', '>expr', 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '>expr', '>atom', '<atom', '<expr', '>expr', '>atom', '<atom', 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '<expr', '<expr', '>expr', '>expr', '>expr', '>atom', '<atom', 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '<expr', '>expr', '>atom', '<atom', '<expr', '<expr', '<expr', 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '>block', '>stat', '>expr', '>expr', '>atom', '<atom', '<expr', 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '<expr', '<stat', '>stat', '>expr', '>expr', '>atom', '<atom', 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '<expr', '<expr', '<stat', '<block', '<forStat', '<stat', 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '<block', '<declaration', '<program' 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ] 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ) 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def testRuleLabelPropertyRefText(self): 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.compileGrammar() 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.compileGrammar('t047treeparserWalker.g', options='-trace') 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver input = textwrap.dedent( 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver '''\ 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver char c; 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ''') 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver cStream = antlr3.StringStream(input) 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = self.getLexer(cStream) 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tStream = antlr3.CommonTokenStream(lexer) 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser = self.getParser(tStream) 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r = parser.variable() 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes = antlr3.tree.CommonTreeNodeStream(r.tree) 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver nodes.setTokenStream(tStream) 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker = self.getWalker(nodes) 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver r = walker.variable() 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.failUnlessEqual(r, 'c') 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverif __name__ == '__main__': 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver unittest.main() 123