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(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 """ if fila.__len__(): # Cria um novo objeto fila para adicionar os valores fila_sintetica = Fila() #Variavel de apoio para juntar a string valor = '' for a in range(fila.__len__()): if fila._deque[a] in '-+/*(){}[]': if valor: if '.' in valor: fila_sintetica.enfileirar(float(valor)) else: fila_sintetica.enfileirar(int(valor)) valor = '' fila_sintetica.enfileirar(fila._deque[a]) else: valor = valor + fila._deque[a] if valor: if '.' in valor: fila_sintetica.enfileirar(float(valor)) else: fila_sintetica.enfileirar(int(valor)) return fila_sintetica else: raise ErroSintatico
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 """ fila = Fila() #Aqui ficam os numeros e o Token nt = R"0123456789.-+*/{}[]()" if expressao: valor = '' for a in expressao: if a in nt: if a in '.-+*/{}[]()': if valor: fila.enfileirar(valor) valor = '' fila.enfileirar(a) else: valor = valor + a else: raise ErroLexico() if valor: fila.enfileirar(valor) return fila