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