import IPython
TabVar = []
TabVal = []
def split(str): #recebe uma string e devolve uma lista com suas palavras separadas
wlist = []
currw = "" #current word
for i in range (0, len(str)):
ch = str[i]
if (ch.isspace() == False): #se não for um espaço
if (ch.isalnum()): #se for um identificador
if(currw.isalnum()): #se a palavra atual for um identificador
currw = currw + ch
elif(currw != ""):#se a palavra atual for um símbolo
wlist.append(currw)
currw = ch
else: #se a palavra atual estiver vazia
currw = ch
else: #se for um símbolo
if(currw != ""): #se a palavra atual não estiver vazia
if (currw.isalnum()): #se a palavra atual for um identificador
wlist.append(currw)
currw = ch
elif(currw.isspace()):
currw = ch
else: #se for um símbolo
if currw == "*" and ch == "*":
currw = currw + ch
elif ch == '+' and str[i+1].isalnum(): #operador unário
wlist.append(currw)
currw = '#'
elif ch == '-' and str[i+1].isalnum(): #operador unário
wlist.append(currw)
currw = '_'
else:
wlist.append(currw)
currw = ch
else:
if ch == '+' and not wlist[-1].isalnum() and str[i+1].isalnum():#operador unário
currw = '#'
elif ch == '-' and not wlist[-1].isalnum() and str[i+1].isalnum():#operador unário
currw = '_'
else:
currw = ch
else: #se for um espaço
if(currw.isspace() == False and currw != ""):wlist.append(currw)
currw = ""
if (currw != ""): wlist.append(currw)
return wlist
def TraduzPosFixa(exp):
stack = []
posfixa = []
prioridade = {'_' : '5', '#' : '5', '**' : '4', '/' : '3', '*': '3',
'+' : '2', '-' : '2', '=' : '1', '(' : '0'} #hash table com as prioridades
try:
for c in exp:
if c.isalnum():
posfixa.append(c)
else:
if (c == "("):
stack.append(c)
elif (c == ")"): #parenteses mudam a prioridade
op = stack.pop()
while (op != "("):
posfixa.append(op)
op = stack.pop()
else:
while len(stack) != 0 and prioridade[c] <= prioridade[stack[-1]]:
posfixa.append(stack.pop())
stack.append(c)
while len(stack) != 0:
posfixa.append(stack.pop())
except:
return posfixa, False
return posfixa, True
def CalcPosFixa(listaexp):
try:
global TabVal
global TabVar
if listaexp[-1] == '=':
for i in range(1,len(listaexp)): #substituição de variáveis pelos seus valores
symbol = listaexp[i]
if symbol.isdigit():
listaexp[i] = float(symbol)
elif symbol.isalpha():
index = TabVar.index(symbol)
listaexp[i] = TabVal[index]
else:
for i in range(0,len(listaexp)): #substituição de variáveis pelos seus valores
symbol = listaexp[i]
if symbol.isdigit():
listaexp[i] = float(symbol)
elif symbol.isalpha():
index = TabVar.index(symbol)
listaexp[i] = TabVal[index]
while len(listaexp) > 1:
for i in range(len(listaexp)):
symbol = listaexp[i]
num = 0.0
if isinstance(symbol, str) and not symbol.isalnum():
if symbol == "_":
listaexp[i-1] = -listaexp[i-1]
listaexp.remove('_')
break
elif symbol == "#":
listaexp[i-1] = +listaexp[i-1]
listaexp.remove('#')
break
elif symbol == "+":
num = listaexp[i-2] + listaexp[i-1]
elif symbol == "-":
num = listaexp[i-2] - listaexp[i-1]
elif symbol == "**":
num = listaexp[i-2] ** listaexp[i-1]
elif symbol == "*":
num = listaexp[i-2] * listaexp[i-1]
elif symbol == "/":
num = listaexp[i-2] / listaexp[i-1]
elif symbol == '=':
var = listaexp[i-2]
val = listaexp[i-1]
try:
varindex = TabVar.index(var)
except:
TabVar.append(var)
TabVal.append(val)
varindex = TabVar.index(var)
TabVal[varindex] = val
return val
listaexp[i-2] = '?' #muda-se o conteúdo para usar remove,
listaexp[i-1] = '?' #dessa forma não há risco de deletar o item errado por acidente
listaexp[i] = num
listaexp.remove('?')
listaexp.remove('?')
break
return listaexp[0]
except:
return None
while True:
#escrever o prompt, ler input
expr = input(">>> ")
#separar os termos da entrada em uma lista
expr_infixa = split(expr)
expr_posfixa = TraduzPosFixa(expr_infixa)
if expr_posfixa[1] == True:
output = CalcPosFixa(expr_posfixa[0])
if output != None:
print(output)
else:
print("Ocorreu um erro no cálculo")
else:
print("Ocorreu um erro na sintaxe")
# your code goes here