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.esta_vazia())
def test_iterar(self): fila = Fila() letras = 'ABCDE' for letra in letras: fila.enfileirar(letra) for letra, letra_desenfileirada in zip(letras, fila): self.assertEqual(letra, letra_desenfileirada) self.assertTrue(fila.esta_vazia())
def test_desenfileirar(self): fila = Fila() letras = 'ABCDE' for letra in letras: fila.enfileirar(letra) for letra in letras: letra_desenfileirada = fila.desenfileirar() self.assertEqual(letra, letra_desenfileirada)
def analise_lexica(expressao: str) -> Fila: """ Executa análise lexica transformando a expressao em fila de objetos: e verificar se demais caracteres são validos: +-*/(){}[] :param expressao: string com expressao a ser analisada :return: fila com tokens """ fila = Fila() for c in expressao: if c in '+-*/(){}[]0123456789.': fila.enfileirar(c) else: raise ErroLexico return fila
def analise_lexica(expressao: str) -> Fila: """ Executa análise lexica transformando a expressao em fila de objetos: e verificar se demais caracteres são validos: +-*/(){}[] :param expressao: string com expressao a ser analisada :return: fila com tokens """ token = Fila() fila_de_tokens = Fila() for letra in expressao: if letra not in caracteres_validos: raise ErroLexico() if letra.isnumeric(): token.enfileirar(letra) else: if not token.esta_vazia(): fila_de_tokens.enfileirar(''.join(token)) token = Fila() fila_de_tokens.enfileirar(letra) if not token.esta_vazia(): fila_de_tokens.enfileirar(''.join(token)) return fila_de_tokens
def test_tamanho(self): fila = Fila() letras = 'ABCDE' for tamanho, letra in enumerate(letras, start=1): fila.enfileirar(letra) assert tamanho == len(fila)
def test_enfileirar_dois_elementos(self): fila = Fila() fila.enfileirar('A') fila.enfileirar('B') self.assertFalse(fila.esta_vazia()) self.assertEqual('A', fila.primeiro())
def analise_sintatica(fila: Fila) -> 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 retorna fila_sintatica para avaliacao Transforma inteiros em ints Flutuantes em floats :param fila: fila proveniente de análise lexica :return: fila_sintatica com elementos tokens de numeros """ if fila.esta_vazia(): raise ErroSintatico() fila_de_valores_sintaticos = Fila() possivel_numero = Fila() for token in fila: if token in caracteres_nao_numericos: if len(possivel_numero) == 1 and token != '.': fila_de_valores_sintaticos.enfileirar( int(possivel_numero.desenfileirar())) elif len(possivel_numero) == 3: numero_str = ''.join(possivel_numero) fila_de_valores_sintaticos.enfileirar(float(numero_str)) possivel_numero = Fila() fila_de_valores_sintaticos.enfileirar(token) else: possivel_numero.enfileirar(token) if len(possivel_numero) == 1: fila_de_valores_sintaticos.enfileirar( int(possivel_numero.desenfileirar())) elif len(possivel_numero) == 3: numero_str = ''.join(possivel_numero) fila_de_valores_sintaticos.enfileirar(float(numero_str)) return fila_de_valores_sintaticos