1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/tests/getattr_visitor.py Sat Jan 21 00:03:13 2017 +0100
1.3 @@ -0,0 +1,104 @@
1.4 +class Expr:
1.5 +
1.6 + "An expression."
1.7 +
1.8 + name = "Expr"
1.9 +
1.10 + def __init__(self, ops):
1.11 + self.ops = ops
1.12 +
1.13 + def children(self):
1.14 + return self.ops
1.15 +
1.16 +class Binary:
1.17 +
1.18 + "A binary operator."
1.19 +
1.20 + name = "Binary"
1.21 +
1.22 + def __init__(self, left, op, right):
1.23 + self.left = left
1.24 + self.op = op
1.25 + self.right = right
1.26 +
1.27 + def children(self):
1.28 + return self.left, self.right
1.29 +
1.30 +class Unary:
1.31 +
1.32 + "A unary operator."
1.33 +
1.34 + name = "Unary"
1.35 +
1.36 + def __init__(self, op, operand):
1.37 + self.op = op
1.38 + self.operand = operand
1.39 +
1.40 + def children(self):
1.41 + return self.operand,
1.42 +
1.43 +class Value:
1.44 +
1.45 + "A general value."
1.46 +
1.47 + name = "Value"
1.48 +
1.49 + def __init__(self, value):
1.50 + self.value = value
1.51 +
1.52 + def children(self):
1.53 + return ()
1.54 +
1.55 +class Visitor:
1.56 +
1.57 + "Visit nodes in an expression tree."
1.58 +
1.59 + def __init__(self):
1.60 + self.indent = 0
1.61 +
1.62 + def visit(self, node):
1.63 +
1.64 + # Obtain the method for the node name.
1.65 +
1.66 + fn = getattr(self, node.name)
1.67 +
1.68 + # Call the method.
1.69 +
1.70 + fn(node)
1.71 +
1.72 + # Visit the node's children.
1.73 +
1.74 + self.visitChildren(node)
1.75 +
1.76 + def visitChildren(self, node):
1.77 + self.indent += 1
1.78 + for n in node.children():
1.79 + self.visit(n)
1.80 + self.indent -= 1
1.81 +
1.82 + def writeIndent(self):
1.83 + i = 0
1.84 + while i < self.indent:
1.85 + print "",
1.86 + i += 1
1.87 +
1.88 + def Expr(self, node):
1.89 + self.writeIndent()
1.90 + print "Expression..."
1.91 +
1.92 + def Binary(self, node):
1.93 + self.writeIndent()
1.94 + print "Binary operation", node.op
1.95 +
1.96 + def Unary(self, node):
1.97 + self.writeIndent()
1.98 + print "Unary operation", node.op
1.99 +
1.100 + def Value(self, node):
1.101 + self.writeIndent()
1.102 + print "Value", node.value
1.103 +
1.104 +# Test the visitor with an example expression.
1.105 +
1.106 +expr = Expr([Binary(Value(1), "+", Binary(Unary("-", Value(2)), "*", Value(3)))])
1.107 +Visitor().visit(expr)