-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinterpreter.py
More file actions
39 lines (31 loc) · 1.21 KB
/
Copy pathinterpreter.py
File metadata and controls
39 lines (31 loc) · 1.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/usr/bin/env python3
from token import PLUS, MINUS, MUL, DIV
class NodeVisitor(object):
def visit(self, node):
method_name = 'visit_' + type(node).__name__
visitor = getattr(self, method_name, self.generic_visit)
return visitor(node)
def generic_visit(self, node):
raise Exception('No visit_{} method'.format(type(node).__name__))
class Interpreter(NodeVisitor):
def __init__(self, parser):
self.parser = parser
def visit_BinOp(self, node):
if node.op.type == PLUS:
return self.visit(node.left) + self.visit(node.right)
if node.op.type == MINUS:
return self.visit(node.left) - self.visit(node.right)
if node.op.type == MUL:
return self.visit(node.left) * self.visit(node.right)
if node.op.type == DIV:
return self.visit(node.left) / self.visit(node.right)
def visit_UnaryOp(self, node):
if node.op.type == PLUS:
return self.visit(node.expr)
if node.op.type == MINUS:
return -1 * self.visit(node.expr)
def visit_Num(self, node):
return node.value
def interpret(self):
tree = self.parser.parse()
return self.visit(tree)