1import sys 2import antlr 3 4 5class Visitor(antlr.ASTVisitor): 6 def __init__(self,*args): 7 super(Visitor,self).__init__(*args) 8 self.level = 0 9 if not args: 10 self.cout = sys.stdout 11 return 12 if isinstance(args[0],file): 13 self.cout = args[0] 14 return 15 assert 0 16 17 def tabs(self): 18 print " " * self.level 19 20 def printf(self,fmt,*args): 21 if not args: 22 sys.stdout.write(fmt) 23 return 24 argv = tuple(args) 25 self.cout.write(fmt % argv) 26 27 def flush(self): 28 self.cout.flush() 29 30 def visit1(self,node): 31 if not node: 32 self.printf(" nil ") 33 return 34 35 c = node.getType() 36 t = node.getText() 37 k = node.getFirstChild() 38 s = node.getNextSibling() 39 40 self.printf("( <%s> ",c) 41 if t: 42 self.printf(" %s ",t) 43 self.visit1(k); 44 self.visit1(s); 45 self.printf(")") 46 47 def visit(self,node): 48 self.visit1(node); 49 self.printf("\n") 50 51 52 53def main(): 54 import expr_l 55 import expr_p 56 57 L = expr_l.Lexer() 58 P = expr_p.Parser(L) 59 P.setFilename(L.getFilename()) 60 61 ### Parse the input expression 62 try: 63 P.expr() 64 except antlr.ANTLRException, ex: 65 print "*** error(s) while parsing." 66 print ">>> exit(1)" 67 import sys 68 sys.exit(1) 69 70 71 ast = P.getAST() 72 73 if not ast: 74 print "stop - no AST generated." 75 import sys 76 sys.exit(0) 77 78 ###show tree 79 print "Tree: " + ast.toStringTree() 80 print "List: " + ast.toStringList() 81 print "Node: " + ast.toString() 82 print "visit>>" 83 visitor = Visitor() 84 visitor.visit(ast); 85 print "visit<<" 86 87 88if __name__ == "__main__": 89 import sys 90 main() 91