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
Exemple #2
0
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
Exemple #3
0
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)