Repository navigation
Expand file tree
/
Copy pathTokenHandler.py
More file actions
103 lines (78 loc) · 3.48 KB
/
Copy pathTokenHandler.py
File metadata and controls
103 lines (78 loc) · 3.48 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
import re
from ParserException import ParserException
import VariableException
class TokenHandler(object):
variables = {}
def __init__(self, tokens):
self.tokens = tokens
self.executedtokens = []
def create_Tokens(self, filename):
lines = []
scan = open(filename, "r")
for text in scan:
lines.extend(text.lower().split())
scan.close()
for text in lines:
self.tokens.extend(text.split())
def getCurrentToken(self):
return self.tokens[0]
def isVariable(self, token):
return (token.isalpha() and len(token) == 1)
def isMathOperator(self, token):
return (token is "+" or token is "-" or token is "*" or token is "/")
def isConstant(self, token):
return re.match(r'\d+', token)
def isComparisonOperator(self, token):
return (token is "<" or token is ">" or token is "<=" or token is ">=" or token is "=" or token is "/=")
def readTokenValue(self, token):
if(self.isVariable(token)):
variablevalue = self.variables.get(token)
if variablevalue == None:
raise ParserException("Variable " + token + " not assigned.")
return variablevalue
elif(self.isConstant(token)):
return int(token)
else:
raise VariableException("Not a valid variable: " + token)
def ConditionIsTrue(self, tokens, outcondition):
currenttoken = tokens[0]
leftvalue = self.readTokenValue(currenttoken)
outcondition.append(currenttoken)
self.match(currenttoken, tokens)
currenttoken = tokens[0]
if(currenttoken == "<"):
return leftvalue < self.readBooleanTokens(outcondition, tokens, currenttoken)
if(currenttoken == ">"):
return leftvalue > self.readBooleanTokens(outcondition, tokens, currenttoken)
if(currenttoken == "<="):
return leftvalue <= self.readBooleanTokens(outcondition, tokens, currenttoken)
if(currenttoken == ">="):
return leftvalue >= self.readBooleanTokens(outcondition, tokens, currenttoken)
if(currenttoken == "="):
return leftvalue == self.readBooleanTokens(outcondition, tokens, currenttoken)
if(currenttoken == "/="):
return leftvalue != self.readBooleanTokens(outcondition, tokens, currenttoken)
raise ParserException("Not a valid condition")
def readBooleanTokens(self, outcondition, tokens, currenttoken):
outcondition.append(currenttoken)
self.match(currenttoken, tokens)
currenttoken = tokens[0]
rightvalue = self.readTokenValue(currenttoken)
outcondition.append(currenttoken)
self.match(currenttoken, tokens)
return rightvalue;
def match(self, token, matchtokens):
#print("[%s]" % ', '.join(matchtokens))
if token == matchtokens[0]:
self.executedtokens.append(token)
del matchtokens[0]
else:
raise ParserException("Unexpected token: " + token)
def resetTokens(self):
self.tokens = self.executedtokens
tokenSize = len(self.executedtokens)
self.executedtokens = None
return tokenSize
def moveAhead(self, numberofElements):
for i in range(numberofElements):
self.match(self.getCurrentToken(), self.tokens)