1 class Expr: 2 3 "An expression." 4 5 name = "Expr" 6 7 def __init__(self, ops): 8 self.ops = ops 9 10 def children(self): 11 return self.ops 12 13 class Binary: 14 15 "A binary operator." 16 17 name = "Binary" 18 19 def __init__(self, left, op, right): 20 self.left = left 21 self.op = op 22 self.right = right 23 24 def children(self): 25 return self.left, self.right 26 27 class Unary: 28 29 "A unary operator." 30 31 name = "Unary" 32 33 def __init__(self, op, operand): 34 self.op = op 35 self.operand = operand 36 37 def children(self): 38 return self.operand, 39 40 class Value: 41 42 "A general value." 43 44 name = "Value" 45 46 def __init__(self, value): 47 self.value = value 48 49 def children(self): 50 return () 51 52 class Visitor: 53 54 "Visit nodes in an expression tree." 55 56 def __init__(self): 57 self.indent = 0 58 59 def visit(self, node): 60 61 # Obtain the method for the node name. 62 63 fn = getattr(self, node.name) 64 65 # Call the method. 66 67 fn(node) 68 69 # Visit the node's children. 70 71 self.visitChildren(node) 72 73 def visitChildren(self, node): 74 self.indent += 1 75 for n in node.children(): 76 self.visit(n) 77 self.indent -= 1 78 79 def writeIndent(self): 80 i = 0 81 while i < self.indent: 82 print "", 83 i += 1 84 85 def Expr(self, node): 86 self.writeIndent() 87 print "Expression..." 88 89 def Binary(self, node): 90 self.writeIndent() 91 print "Binary operation", node.op 92 93 def Unary(self, node): 94 self.writeIndent() 95 print "Unary operation", node.op 96 97 def Value(self, node): 98 self.writeIndent() 99 print "Value", node.value 100 101 # Test the visitor with an example expression. 102 103 expr = Expr([Binary(Value(1), "+", Binary(Unary("-", Value(2)), "*", Value(3)))]) 104 Visitor().visit(expr)