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