-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinterpreter.py
More file actions
52 lines (39 loc) · 1.78 KB
/
interpreter.py
File metadata and controls
52 lines (39 loc) · 1.78 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
40
41
42
43
44
45
46
47
48
49
50
51
52
from nodes import *
from values import Number
class Interpreter:
def __init__(self, symbol_table):
self.symbol_table = symbol_table
def visit(self, node):
method_name = f"visit_{type(node).__name__}" # type(node).__name__ is the name of the 'node' attribute
method = getattr(self, method_name) # getattr(self, method_name) is the same as self.visit_ + type(self.node)
return method(node)
def visit_NumberNode(self, node):
return Number(node.value)
def visit_AddNode(self, node):
return Number(self.visit(node.node_1).value + self.visit(node.node_2).value)
def visit_SubtractNode(self, node):
return Number(self.visit(node.node_1).value - self.visit(node.node_2).value)
def visit_MultiplyNode(self, node):
return Number(self.visit(node.node_1).value * self.visit(node.node_2).value)
def visit_DivideNode(self, node):
try:
return Number(self.visit(node.node_1).value / self.visit(node.node_2).value)
except:
print("ERROR: math error: cannot divide by 0")
def visit_MinusNode(self, node):
return Number(-(self.visit(node.node).value))
def visit_PlusNode(self, node):
return Number(-(self.visit(node.node).value))
def visit_VarAssignNode(self, node):
if hasattr(node.var_value_token, 'value'):
self.symbol_table.set(node.var_name_token.value, node.var_value_token.value)
return Number(node.var_value_token.value)
else:
self.symbol_table.set(node.var_name_token.value, self.visit(node.var_value_token))
return Number(self.visit(node.var_value_token)) # return the value of the variable
def visit_VarAccessNode(self, node):
var_name = node.var_name_token.value
value = (self.symbol_table.get(var_name))
if not value:
return print(f"'{var_name}' is not defined")
return Number(value)