-
Notifications
You must be signed in to change notification settings - Fork 40
/
Copy pathEvaluate2.3.2.py
137 lines (94 loc) · 3.5 KB
/
Evaluate2.3.2.py
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
## Evaluate 2.3.2
## 大步语义
## python 3.4
class Number(object):
def __init__(self, value):
self.value = value
def __str__(self):
return str(self.value)
def evaluate(self, environment):
return self
class Boolean(object):
def __init__(self, value):
self.value = value
def __str__(self):
return str(self.value)
def evaluate(self, environment):
return self
class Variable(object):
def __init__(self,name):
self.name = name
def evaluate(self, environment):
return environment[self.name]
class Add(object):
def __init__(self, left, right):
self.left = left
self.right = right
def evaluate(self, environment):
return Number(self.left.evaluate(environment).value + self.right.evaluate(environment).value)
class Multiply(object):
def __init__(self, left, right):
self.left = left
self.right = right
def evaluate(self, environment):
return Number(self.left.evaluate(environment).value * self.right.evaluate(environment).value)
class LessThan(object):
def __init__(self, left, right):
self.left = left
self.right = right
def evaluate(self, environment):
return Boolean(self.left.evaluate(environment).value < self.right.evaluate(environment).value)
class Assign(object):
def __init__(self, name, expression):
self.name = name
self.expression = expression
def evaluate(self, environment):
return dict(environment, **{self.name:self.expression.evaluate(environment)} )
class DoNothing(object):
def evaluate(self, environment):
return environment
class If(object):
def __init__(self, condition, consequence, alternative):
self.condition = condition
self.consequence = consequence
self.alternative = alternative
def evaluate(self, environment):
if self.condition.evaluate(environment).value == Boolean(True).value:
return self.consequence.evaluate(environment)
elif self.condition.evaluate(environment).value == Boolean(False).value:
return self.alternative.evaluate(environment)
class Sequence(object):
def __init__(self, first, second):
self.first = first
self.second = second
def evaluate(self, environment):
return self.second.evaluate(self.first.evaluate(environment))
class While(object):
def __init__(self, condition, body):
self.condition = condition
self.body = body
def evaluate(self, environment):
if self.condition.evaluate(environment).value == Boolean(True).value:
return self.evaluate(self.body.evaluate(environment))
elif self.condition.evaluate(environment).value == Boolean(False).value:
return environment
##test
print(Number(21).evaluate({}))
print(Boolean(True).evaluate({}))
print(Variable('x').evaluate({'x':1212}))
print(LessThan(
Add(Variable('x'), Number(2)),
Variable('y')
).evaluate({'x':Number(2), 'y':Number(5)}))
statement = Sequence(
Assign('x', Add(Number(1), Number(1))),
Assign('y', Add(Variable('x'), Number(3)))
)
print(statement.evaluate({}))
print(dict([(k, v.value) for k,v in statement.evaluate({}).items()]))
statement = While(
LessThan(Variable('x'), Number(5)),
Assign('x', Multiply(Variable('x'), Number(3)))
)
print(statement.evaluate({'x': Number(1)}))
print(dict([(k, v.value) for k,v in statement.evaluate({'x': Number(1)}).items()]))