def avaliar(expressao): if expressao: fila=analise_sintatica(analise_lexica(expressao)) if fila.__len__()==1: return fila.primeiro() else: pilha=Pilha() for i in range(fila.__len__()): pilha.empilhar(fila._deque[i]) if pilha.__len__()>=3 and str(pilha.topo()) not in '-+*/(){}[]': valor=pilha.topo() pilha.desempilhar() #verificação de sinais if pilha.topo()=='+': pilha.desempilhar() valor=pilha.desempilhar()+valor pilha.empilhar(valor) valor='' elif pilha.topo()=='-': pilha.desempilhar() valor=pilha.desempilhar()-valor pilha.empilhar(valor) valor='' elif pilha.topo()=='*': pilha.desempilhar() valor=pilha.desempilhar()*valor pilha.empilhar(valor) valor='' elif pilha.topo()=='/': pilha.desempilhar() valor=pilha.desempilhar()/valor pilha.empilhar(valor) valor='' else: pilha.empilhar(valor) elif str(pilha.topo()) in ')}]' and i==fila.__len__() - 1: pilha.desempilhar() while len(pilha)>1: if str(pilha.topo()) not in '-+*/(){}[]': valor=pilha.topo() pilha.desempilhar() #verificação de sinais if pilha.topo()=='+': pilha.desempilhar() valor=pilha.desempilhar()+valor pilha.empilhar(valor) valor='' elif pilha.topo()=='-': pilha.desempilhar() valor=pilha.desempilhar()-valor pilha.empilhar(valor) valor='' elif pilha.topo()=='*': pilha.desempilhar() valor=pilha.desempilhar()*valor pilha.empilhar(valor) valor='' elif pilha.topo()=='/': pilha.desempilhar() valor=pilha.desempilhar()/valor pilha.empilhar(valor) valor='' elif str(pilha.topo()) in '(){}[]': pilha.desempilhar() pilha.empilhar(valor) else: pilha.empilhar(valor) else: pilha.desempilhar() return pilha.topo() raise ErroSintatico()
def avaliar(expressao): token2 = R".-+*/{}[]()" token3 = R"(){}[]" num3 = '+' if expressao: fila = analise_sintatica(analise_lexica(expressao)) if fila.__len__() == 1: return fila.primeiro() else: pilha = Pilha() for lex in range(fila.__len__()): pilha.empilhar(fila._deque[lex]) if pilha.__len__() >= 3 and str(pilha.topo()) not in token2: num = pilha.topo() pilha.desempilhar() if pilha.topo() == num3: pilha.desempilhar() num = pilha.desempilhar() + num pilha.empilhar(num) elif pilha.topo() == '-': pilha.desempilhar() num = pilha.desempilhar() - num pilha.empilhar(num) elif pilha.topo() == '*': pilha.desempilhar() num = pilha.desempilhar() * num pilha.empilhar(num) elif pilha.topo() == '/': pilha.desempilhar() num = pilha.desempilhar() / num pilha.empilhar(num) else: pilha.empilhar(num) elif str(pilha.topo()) in ')}]' and lex == fila.__len__() - 1: pilha.desempilhar() while len(pilha) > 1: if str(pilha.topo()) not in token2: num = pilha.topo() pilha.desempilhar() if pilha.topo() == num3: pilha.desempilhar() num = pilha.desempilhar() + num pilha.empilhar(num) elif pilha.topo() == '/': pilha.desempilhar() num = pilha.desempilhar() / num pilha.empilhar(num) elif pilha.topo() == '*': pilha.desempilhar() num = pilha.desempilhar() * num pilha.empilhar(num) elif pilha.topo() == '-': pilha.desempilhar() num = pilha.desempilhar() - num pilha.empilhar(num) elif str(pilha.topo()) in token3: pilha.desempilhar() pilha.empilhar(num) else: pilha.empilhar(num) else: pilha.desempilhar() return pilha.topo() raise ErroSintatico()
def avaliar(expressao): """ Função que avalia expressão aritmetica retornando se valor se não houver nenhum erro :param expressao: string com expressão aritmética :return: valor númerico com resultado Complexidade*: tempo: O(n) Memoria: O(n) """ if expressao: fila = analise_sintatica(analise_lexica(expressao)) # print(fila._deque) if fila.__len__() == 1: return fila.primeiro() else: pilha = Pilha() for i in range(fila.__len__()): pilha.empilhar(fila._deque[i]) if pilha.__len__() >= 3 and str(pilha.topo()) not in "-+*/(){}[]": valor = pilha.topo() pilha.desempilhar() if pilha.topo() == "+": pilha.desempilhar() valor = pilha.desempilhar() + valor pilha.empilhar(valor) valor = "" elif pilha.topo() == "-": pilha.desempilhar() valor = pilha.desempilhar() - valor pilha.empilhar(valor) valor = "" elif pilha.topo() == "*": pilha.desempilhar() valor = pilha.desempilhar() * valor pilha.empilhar(valor) valor = "" elif pilha.topo() == "/": pilha.desempilhar() valor = pilha.desempilhar() / valor pilha.empilhar(valor) valor = "" else: pilha.empilhar(valor) elif str(pilha.topo()) in ")}]" and i == fila.__len__() - 1: pilha.desempilhar() # print(pilha._lista) while len(pilha) > 1: if str(pilha.topo()) not in "-+*/(){}[]": valor = pilha.topo() pilha.desempilhar() if pilha.topo() == "+": pilha.desempilhar() valor = pilha.desempilhar() + valor pilha.empilhar(valor) valor = "" elif pilha.topo() == "-": pilha.desempilhar() valor = pilha.desempilhar() - valor pilha.empilhar(valor) valor = "" elif pilha.topo() == "*": pilha.desempilhar() valor = pilha.desempilhar() * valor pilha.empilhar(valor) valor = "" elif pilha.topo() == "/": pilha.desempilhar() valor = pilha.desempilhar() / valor pilha.empilhar(valor) valor = "" elif str(pilha.topo()) in "(){}[]": pilha.desempilhar() pilha.empilhar(valor) else: pilha.empilhar(valor) else: pilha.desempilhar() # print('Nova pilha: ',pilha._lista, 'Tamanho: ', len(pilha)) return pilha.topo() raise ErroSintatico()
def avaliar(expressao): """ Avalia a expressao e ve se está correta. Tempo de execução O(n) Espaço de memoria O(n) :param expressao: recebe a expressao a ser analisada :return: erro na expressao """ if expressao: fila = analise_sintatica(analise_lexica(expressao)) tamanho = len(fila) if tamanho == 1: return fila.primeiro() else: pilha = Pilha() for n in range(tamanho): pilha.empilhar(fila._deque[n]) if pilha.__len__() >= 3 and str(pilha.topo()) not in '-+*/(){}[]': valor = pilha.topo() pilha.desempilhar() if pilha.topo() == '+': pilha.desempilhar() valor = pilha.desempilhar() + valor pilha.empilhar(valor) elif pilha.topo() == '-': pilha.desempilhar() valor = pilha.desempilhar() - valor pilha.empilhar(valor) elif pilha.topo() == '*': pilha.desempilhar() valor = pilha.desempilhar() * valor pilha.empilhar(valor) elif pilha.topo() == '/': pilha.desempilhar() valor = pilha.desempilhar() / valor pilha.empilhar(valor) else: pilha.empilhar(valor) elif str(pilha.topo()) in ')}]' and n == tamanho - 1: pilha.desempilhar() while len(pilha) > 1: if str(pilha.topo()) not in '-+*/(){}[]': valor = pilha.topo() pilha.desempilhar() if pilha.topo() == '+': pilha.desempilhar() valor = pilha.desempilhar() + valor pilha.empilhar(valor) elif pilha.topo() == '-': pilha.desempilhar() valor = pilha.desempilhar() - valor pilha.empilhar(valor) elif pilha.topo() == '*': pilha.desempilhar() valor = pilha.desempilhar() * valor pilha.empilhar(valor) elif pilha.topo() == '/': pilha.desempilhar() valor = pilha.desempilhar() / valor pilha.empilhar(valor) elif str(pilha.topo()) in '(){}[]': pilha.desempilhar() pilha.empilhar(valor) else: pilha.empilhar(valor) else: pilha.desempilhar() return pilha.topo() raise ErroSintatico()