Skip to content

Instantly share code, notes, and snippets.

@amilcar-andrade
Last active October 8, 2015 22:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save amilcar-andrade/3400851 to your computer and use it in GitHub Desktop.
Save amilcar-andrade/3400851 to your computer and use it in GitHub Desktop.
Pyhton: Calculator Parser
import sys
class Number:
def __init__(self, lexeme):
self.lexeme = lexeme
class OpenParenthesis:
lexeme ="("
class CloseParenthesis:
lexeme = ")"
class Operator:
def __init__(self, lexeme):
self.lexeme = lexeme
class WhiteSpace:
def __init__(self, lexeme):
self.lexeme = lexeme
class Tree:
def __init__(self, token):
self.token = token
self.left = None
self.right = None
def getValue(self):
if (isinstance(self.token,Operator)):
if (self.token.lexeme == "+"):
return self.left.getValue() + self.right.getValue()
elif (self.token.lexeme == "-"):
return self.left.getValue() - self.right.getValue()
elif (self.token.lexeme == "/"):
if(self.right.getValue()!=0):
return self.left.getValue() / self.right.getValue()
else:
print("\nNo existe la division sobre 0")
sys.exit()
elif (self.token.lexeme == "*"):
return self.left.getValue() * self.right.getValue()
else:
return self.left.getValue() % self.right.getValue()
elif(isinstance(self.token,Number)):
return float(self.token.lexeme)
else:
print("Token invalido " + str(self.token))
sys.exit()
def toToken(char):
if(char.isdigit()):
return Number(char)
elif(char=='('):
return OpenParenthesis()
elif(char==')'):
return CloseParenthesis()
elif(char == '*' or char == '/' or char == '+' or char == '-' or char == '%'):
return Operator(char)
elif(char == ' '):
return WhiteSpace(char)
else:
print("Error en la cadena caracter invalido " + char)
sys.exit()
print sys.argv
string = sys.argv[1]
sizeString = len(string)
listaTokens = []
pointer = 0
treeList = []
for i in range(0,sizeString):
if(not(isinstance(toToken(string[i]),WhiteSpace))):
listaTokens.append(toToken(string[i]))
def term(token):
global pointer , treeList
if(isinstance(listaTokens[pointer],token)):
treeList.append(Tree(listaTokens[pointer]))
if(isinstance(listaTokens[pointer],CloseParenthesis)):
operator = treeList[-4]
operator.left = treeList[-3]
operator.right = treeList[-2]
del treeList[-5:len(treeList)]
treeList.append(operator)
pointer = pointer + 1
return True
else:
return False
def E():
global pointer , treeList
save = pointer
if(E1()):
return True
else:
del treeList[save:len(treeList)]
pointer = save
if(E2()):
return True
else:
del treeList[save:len(treeList)]
pointer = save
if(E3()):
return True
else:
del treeList[save:len(treeList)]
pointer = save
if(E4()):
return True
else:
del treeList[save:len(treeList)]
return False
def E1():
if(term(OpenParenthesis) and term(Operator) and term(Number) and term(Number) and term(CloseParenthesis)):
return True
else:
return False
def E2():
if(term(OpenParenthesis) and term(Operator) and E() and E() and term(CloseParenthesis)):
return True
else:
return False
def E3():
if(term(OpenParenthesis) and term(Operator) and term(Number) and E() and term(CloseParenthesis)):
return True
else:
return False
def E4():
if(term(OpenParenthesis) and term(Operator) and E() and term(Number) and term(CloseParenthesis)):
return True
else:
return False
print(E())
print treeList[0].getValue()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment