1## This file is part of PyANTLR. See LICENSE.txt for license 2## details..........Copyright (C) Wolfgang Haefelinger, 2004. 3## 4## $Id$ 5 6import sys 7import antlr 8 9class Parser(antlr.LLkParser): 10 def __init__(self,*args): 11 super(Parser,self).__init__(*args) 12 self.num_err = 0 13 self.num_wrn = 0 14 15 def reportError(self,err): 16 self.num_err += 1 17 super(Parser,self).reportError(err) 18 19 def reportWarning(self,err): 20 self.num_wrn += 1 21 super(Parser,self).reportWarning(err) 22 23 24 25 26 27class Walker(antlr.TreeParser): 28 def __init__(self,*args): 29 super(Walker,self).__init__(*args) 30 self.depth = 0 31 32 def tofloat(self,ast): 33 s = ast.getText() 34 return float(s) 35 36 37 def howmanysiblings(self,ast): 38 if ast == None: 39 return -1 40 41 r = 0 42 ast = ast.getNextSibling() 43 while(ast != None) : 44 r += 1 45 ast = ast.getNextSibling() 46 return r 47 48 def traceIn(self,s,ast) : 49 self.depth += 1 50 print ">" * self.depth 51 print " " + s + "( `" 52 if (ast==None): 53 print("()") 54 else: 55 print(ast.toStringList()) 56 print " ') | siblings:",self.howmanysiblings(ast) 57 58 59 def traceOut(self,s,ast): 60 self.depth += 1 61 print(">" * self.depth) 62 print(" " + s + "( `") 63 if (ast==None): 64 print("()") 65 else: 66 print(ast.toStringList()) 67 print(" ')") 68 self.depth -= 1 69 70 71class TNode(antlr.CommonAST): 72 def __init__(self,token=None): 73 antlr.CommonAST.__init__(self,token) 74 75 ### change printing style 76 def toStringTree(self): 77 ts = "" 78 kid = self.getFirstChild() 79 if kid: 80 ts += "{" 81 ts += " " + self.toString() 82 if kid: 83 ts += kid.toStringList() 84 ts += "}" 85 return ts 86 87class BodyNode(antlr.CommonAST): 88 def __init__(self,token=None): 89 antlr.CommonAST.__init__(self,token) 90 91 ### change printing style 92 def toStringTree(self): 93 ts = "BODY: " 94 kid = self.getFirstChild() 95 if kid: 96 ts += "{" 97 ts += " " + self.toString() 98 if kid: 99 ts += kid.toStringList() 100 ts += "}" 101 return ts 102 103class ExprNode(antlr.CommonAST): 104 def __init__(self,token=None): 105 antlr.CommonAST.__init__(self,token) 106 107 ### change printing style 108 def toStringTree(self): 109 ts = "EXPR: " 110 kid = self.getFirstChild() 111 if kid: 112 ts += "{" 113 ts += " " + self.toString() 114 if kid: 115 ts += kid.toStringList() 116 ts += "}" 117 return ts 118 119 120class NumberNode(antlr.CommonAST): 121 def __init__(self,token=None): 122 antlr.CommonAST.__init__(self,token) 123 124 ### change printing style 125 def toStringTree(self): 126 ts = "NUMBER: " 127 kid = self.getFirstChild() 128 if kid: 129 ts += "{" 130 ts += " " + self.toString() 131 if kid: 132 ts += kid.toStringList() 133 ts += "}" 134 return ts 135 136 137 138 139 140class Visitor(antlr.ASTVisitor): 141 def __init__(self,*args): 142 super(Visitor,self).__init__(*args) 143 self.level = 0 144 if not args: 145 self.cout = sys.stdout 146 return 147 if isinstance(args[0],file): 148 self.cout = args[0] 149 return 150 assert 0 151 152 def tabs(self): 153 print " " * self.level 154 155 def printf(self,fmt,*args): 156 if not args: 157 sys.stdout.write(fmt) 158 return 159 argv = tuple(args) 160 self.cout.write(fmt % argv) 161 162 def flush(self): 163 self.cout.flush() 164 165 def visit1(self,node): 166 if not node: 167 self.printf(" nil ") 168 return 169 170 c = node.getType() 171 t = node.getText() 172 k = node.getFirstChild() 173 s = node.getNextSibling() 174 175 self.printf("( <%s> ",c) 176 if t: 177 self.printf(" %s ",t) 178 self.visit1(k); 179 self.visit1(s); 180 self.printf(")") 181 182 def visit(self,node): 183 self.visit1(node); 184 self.printf("\n") 185 186 187 188def main(): 189 import CalcLexer 190 import CalcParser 191 import CalcWalker 192 193 L = CalcLexer.Lexer() 194 P = CalcParser.Parser(L) 195 P.setFilename(L.getFilename()) 196 197 ### Parse the input expression 198 P.body() 199 200 if(P.num_err>0): 201 print "*** " + P.num_err + " error(s) while parsing." 202 print ">>> exit(1)" 203 import sys 204 sys.exit(1) 205 206 ast = P.getAST() 207 208 if not ast: 209 print "stop - no AST generated." 210 import sys 211 sys.exit(1) 212 213 ###show tree 214 print "Tree: " + ast.toStringTree() 215 print "List: " + ast.toStringList() 216 print "Node: " + ast.toString() 217 print "visit>>" 218 visitor = Visitor() 219 visitor.visit(ast); 220 print "visit<<" 221 222 W = CalcWalker.Walker() 223 s = W.body(ast) 224 print "*sum =>",s 225 226 227if __name__ == "__main__": 228 main() 229