-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathast_node.py
More file actions
150 lines (127 loc) · 3.89 KB
/
ast_node.py
File metadata and controls
150 lines (127 loc) · 3.89 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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
class Exp():
def evaluate(self, env):
print("TODO")
return 0
def evaluate_type(self):
return 'Null'
class ValueExp(Exp):
def __init__(self, value):
super().__init__()
self.value = value
def evaluate(self, env):
return self.value
class VariableExp(Exp):
def __init__(self, name):
super().__init__()
self.name = name
def evaluate(self, env):
if self.name in env:
return env[self.name]
else:
print("{} is not defined".format(self.name))
return 0
class BinExp(Exp):
def __init__(self, left, right):
super().__init__()
self.left = left
self.right = right
class ExpPlus(BinExp):
def evaluate(self, env):
return self.left.evaluate(env) + self.right.evaluate(env)
class ExpMinus(BinExp):
def evaluate(self, env):
return self.left.evaluate(env) - self.right.evaluate(env)
class ExpDiv(BinExp):
def evaluate(self, env):
return self.left.evaluate(env) / self.right.evaluate(env)
class ExpMulti(BinExp):
def evaluate(self, env):
return self.left.evaluate(env) * self.right.evaluate(env)
class ExpAnd(BinExp):
def evaluate(self, env):
if self.left.evaluate(env) == 1 and self.right.evaluate(env) == 1:
return 1
else:
return 0
class ExpOr(BinExp):
def evaluate(self, env):
if self.left.evaluate(env) == 1 or self.right.evaluate(env) == 1:
return 1
else:
return 0
class ExpGt(BinExp):
def evaluate(self, env):
if self.left.evaluate(env) > self.right.evaluate(env):
return 1
else:
return 0
class ExpIf(Exp):
def __init__(self, condition, if_exp, then_exp):
super().__init__()
self.condition = condition
self.if_exp = if_exp
self.then_exp = then_exp
def evaluate(self, env):
if(self.condition.evaluate(env) == 1):
return self.if_exp.evaluate(env)
else:
return self.then_exp.evaluate(env)
class AssignExp(Exp):
def __init__(self, name, value):
super().__init__()
self.name = name
self.value = value
def evaluate(self, env):
val = self.value.evaluate(env)
env[self.name] = val
return val
class SentencesExp(Exp):
def __init__(self, exps):
super().__init__()
self.exps = exps
def evaluate(self, env):
val = ''
for s in self.exps:
val = s.evaluate(env)
return val
class PrintExp(Exp):
def __init__(self, value):
super().__init__()
self.value = value
def evaluate(self, env):
val = self.value.evaluate(env)
print("Print Exp Output: {}".format(val))
return val
class WhileExp(Exp):
def __init__(self, condition, exp):
super().__init__()
self.condition = condition
self.exp = exp
def evaluate(self, env):
val = ''
while( self.condition.evaluate(env) == 1):
val = self.exp.evaluate(env)
return val
class FuncDefExp(Exp):
def __init__(self, name, exp, variables):
self.name = name
self.exp = exp
self.variables = variables
def evaluate(self, env):
env[self.name] = { 'f': self.exp, 'v': self.variables}
return self.name
class FuncCallExp(Exp):
def __init__(self, name, variables):
self.name = name
self.variables = variables
def evaluate(self, env):
f = env[self.name]
if(len(f['v']) != len(self.variables)):
print('variables incorrect')
new_env = env.copy()
for i in range(len(self.variables)):
new_env[f['v'][i]] = self.variables[i].evaluate(env)
value = f['f'].evaluate(new_env)
for k in env.keys():
env[k] = new_env[k]
return value