-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathinterpreter.py
More file actions
57 lines (49 loc) · 2.22 KB
/
interpreter.py
File metadata and controls
57 lines (49 loc) · 2.22 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
__author__ = 'Roland'
from tokenizer import token,Tokenizer
from tree import tree,parseTree
import math
class InterpretError(Exception):
pass
class interpreter:
functions = { 'sin':math.sin,'cos':math.cos,'ln':math.log,'erfc':math.erfc,'lgamma':math.lgamma,
'+':lambda a,b:a+b,'-':lambda a,b:a-b,'*':lambda a,b:a*b,'/':lambda a,b:a/b,'%':lambda a,b:a%b,'^':lambda a,b:a**b,}
def __init__(self):
self.vars = { }
def evaluate(self,expression):
if isinstance(expression,tree):
if expression.value == '=':
return self.assign(expression)
left = self.getValue(expression.left)
right = self.getValue(expression.right)
if type(expression.value) == str and expression.value in self.functions:
if right!=None:
return self.functions[expression.value](left,right)
else:
return self.functions[expression.value](float(left))
raise InterpretError("Should be a tree here")
def assign(self,expression):
if not self.type(expression.left,'identifier'):
raise InterpretError("Assignments must be done to a variable!")
self.vars[expression.left.value] = self.getValue(expression.right)
return self.vars[expression.left.value]
def type(self,element,expected):
return element != None and type(element) != int and type(element) != float and type(element) != str and element.type == expected
def getValue(self,element):
if self.type(element,'node'):
element = self.evaluate(element)
if self.type(element,'number'):
element = int(element.value)
if self.type(element,'identifier'):
if element.value in self.vars:
element = self.vars[element.value]
else:
raise InterpretError("No such variable "+element.value)
if type(element) == str:
if element in self.vars:
return self.vars[element]
else:
try:
element = int(element)
except ValueError:
raise InterpretError("Variable "+element+" doesn't exist")
return element