def analise_lexica(expressao): """ Executa análise lexica transformando a expressao em fila de objetos: Transforma inteiros em ints Flutuantes em floats e verificar se demais caracteres são validos: +-*/(){}[] :param expressao: string com expressao a ser analisada :return: fila com tokens """ numeros = ["0123456789"] numeros2 = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] ponto = ['.'] operacao = ["+-*/"] simbolos = ["()[]{}"] letras = ["abcdefghijklmnopqrstuvxz"] fila = Fila() for i in expressao: if expressao == '': fila.vazia() else: for j in i: if j in set(numeros) and j in set(ponto) and j in set( operacao) and j in set(simbolos): fila.enfileirar(j) fila.enfileirar(ponto) elif j not in set(letras): fila.enfileirar(j) else: raise ErroLexico return fila
def analise_sintatica(fila): """ Função que realiza analise sintática de tokens produzidos por analise léxica. Executa validações sintáticas e se não houver erro retorn fila_sintatica para avaliacao :param fila: fila proveniente de análise lexica :return: fila_sintatica com elementos tokens de numeros """ novafila = Fila() if fila.vazia(): raise ErroSintatico save = '' while not fila.vazia(): item = fila.desenfileirar() if num(item): save = int(item) if fila.vazia(): novafila.enfileirar(save) return novafila if fila.primeiro() != '.': novafila.enfileirar(save) elif item == '.': item = fila.desenfileirar() save = float(save) save += (float(item)) / (10**(len(item))) novafila.enfileirar(save) else: novafila.enfileirar(item) return novafila
def analise_lexica(expressao): """ Executa análise lexica transformando a expressao em fila de objetos: Transforma inteiros em ints Flutuantes em floats e verificar se demais caracteres são validos: +-*/(){}[] :param expressao: string com expressao a ser analisada :return: fila com tokens """ def caracteres(param1): return param1 in "(){.}[]+-*/" fila = Fila() count = 0 pilha = Pilha() while count != len(expressao): if not (caracteres(expressao[count]) or num(expressao[count])): raise ErroLexico else: if caracteres(expressao[count]): if not pilha.vazia(): fila.enfileirar(pilha.desempilhar()) fila.enfileirar(expressao[count]) if num(expressao[count]): if pilha.vazia(): pilha.empilhar(expressao[count]) else: final = pilha.desempilhar() pilha.empilhar(final + expressao[count]) count += 1 if not pilha.vazia(): fila.enfileirar(pilha.desempilhar()) return fila
def test_float(self): fila = Fila() fila.enfileirar('1234567890') fila.enfileirar('.') fila.enfileirar('4') fila_sintatica = analise_sintatica(fila) self.assertEqual(1234567890.4, fila_sintatica.desenfileirar()) self.assertTrue(fila_sintatica.vazia())
def analise_sintatica(expressao): """ Função que realiza analise sintática de tokens produzidos por analise léxica. Executa validações sintáticas e se não houver erro retorn fila_sintatica para avaliacao :param fila: fila proveniente de análise lexica :return: fila_sintatica com elementos tokens de numeros """ expressao = analise_lexica(expressao) fila2 = Fila() if len(expressao) != 0: for i in expressao: if i in set("{}[]()/+-*") or i in set("0123456789"): fila2.enfileirar(i) #elif i not in set("."): # fila2.enfileirar(float(i)) else: fila2.enfileirar(i) return fila2 else: raise ErroSintatico()
def test_fila_vazia(self): fila = Fila() self.assertRaises(ErroSintatico, analise_sintatica, fila)