-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patharithmetics.py
More file actions
174 lines (135 loc) · 3.81 KB
/
Copy patharithmetics.py
File metadata and controls
174 lines (135 loc) · 3.81 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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#from copy import copy
from abc import ABCMeta, abstractmethod
class AExp:
__metaclass__ = ABCMeta
"""Abstract base class for arithmetic expressions"""
@abstractmethod
def evaluate(self,state):
pass
def __add__(self,other):
return Operation('+',self,other)
def __sub__(self,other):
return Operation('-',self,other)
def __mul__(self,other):
return Operation('*',self,other)
def __eq__(self,other):
return Comparison('=',self,other)
def __le__(self,other):
return Comparison('<=',self,other)
class BExp:
__metaclass__ = ABCMeta
"""Abstract base class for logical expressions"""
@abstractmethod
def evaluate(self,state):
pass
class Number(AExp):
"""An AExp wrapper for an integer"""
def __init__(self,number):
super(Number,self).__init__()
self.__n = int(number)
def evaluate(self,state):
return self.__n
def __str__(self):
return str(self.__n)
class Var(AExp):
"""An AExp that represents a variable"""
def __init__(self,varname):
super(Var,self).__init__()
self.__n = varname
def evaluate(self,state):
return state.get_val(self.__n)
def get_name(self):
return self.__n
def __str__(self):
return self.__n
class Operation(AExp):
"""
An AExp that wraps an operation, such as +,- or * between two Aexp
"""
def __init__(self,operation,exp1,exp2):
super(Operation,self).__init__()
self.__op = operation
self.__e1 = exp1
self.__e2 = exp2
def evaluate(self,state):
v1 = self.__e1.evaluate(state)
if v1 == None:
return None
v2 = self.__e2.evaluate(state)
if v2 == None:
return None
if self.__op == '+':
return v1+v2
if self.__op == '-':
return v1-v2
if self.__op == '*':
return v1*v2
return None
def __str__(self):
return '('+str(self.__e1)+str(self.__op)+str(self.__e2)+')'
class BoolVal(BExp):
"""
A wrapper for boolean values
"""
def __init__(self,value):
super(BoolVal,self).__init__()
self.__v = value
def evaluate(self,state):
return self.__v
def __str__(self):
return str(self.__v)
class Not(BExp):
"""
A BExp for logical negation
"""
def __init__(self,bexp):
super(Not,self).__init__()
self.__e = bexp
def evaluate(self,state):
v = self.__e.evaluate(state)
if v == None:
return None
return not v
def __str__(self):
return chr(172)+str(self.__e)
class And(BExp):
"""
A BExp for logical and
"""
def __init__(self,bexp1,bexp2):
super(And,self).__init__()
self.__e1 = bexp1
self.__e2 = bexp2
def evaluate(self,state):
v1 = self.__e1.evaluate(state)
if v1 == None:
return None
v2 = self.__e2.evaluate(state)
if v2 == None:
return None
return v1 and v2
def __str__(self):
return '('+str(self.__e1)+' and '+str(self.__e2)+')'
class Comparison(BExp):
"""
A BExp for comparing AExp with == or <=
"""
def __init__(self,operator,aexp1,aexp2):
super(Comparison,self).__init__()
self.__op = operator
self.__e1 = aexp1
self.__e2 = aexp2
def evaluate(self,state):
v1 = self.__e1.evaluate(state)
if v1 == None:
return None
v2 = self.__e2.evaluate(state)
if v2 == None:
return None
if self.__op == '=':
return v1 == v2
if self.__op == '<=':
return v1 <= v2
return None
def __str__(self):
return '('+str(self.__e1)+' '+self.__op+' '+str(self.__e2)+')'