Ejemplo n.º 1
0
def avaliar(expressao):
    """
    Função que avalia expressão aritmetica retornando se valor se não houver nenhum erro
    :param expressao: string com expressão aritmética
    :return: valor númerico com resultado
    """
    fila = analise_sintatica(analise_lexica(expressao))
    pilha = Pilha()
    v1,v2,v3=None,None,None
    r=0
    for c in fila:
        pilha.empilhar(c)
        if len(pilha)>=3:
            v3 = pilha.desempilhar()
            v2 = pilha.desempilhar()
            v1 = pilha.desempilhar()
            if str(v3) not in '({[)}]' and str(v1) not in '(){}[]' and str(v2) in '+-/*':
                if str(v2) == '+':
                    r = v1 + v3
                elif str(v2) == '-':
                    r = v1 - v3
                elif str(v2) == '/':
                    r = v1/v3
                elif str(v2) == "*":
                    r = v1*v3
                pilha.empilhar(r)
            else:
                pilha.empilhar(v1)
                pilha.empilhar(v2)
                pilha.empilhar(v3)
        if str(c) in ')}]':
            pilha.desempilhar()
            r=pilha.desempilhar()
            pilha.desempilhar()
            pilha.empilhar(r)
            if len(pilha)>=3:
                v3 = pilha.desempilhar()
                v2 = pilha.desempilhar()
                v1 = pilha.desempilhar()
                if str(v3) not in '({[)}]' and str(v1) not in '(){}[]' and str(v2) in '+-/*':
                    if str(v2) == '+':
                        r = v1 + v3
                    elif str(v2) == '-':
                        r = v1 - v3
                    elif str(v2) == '/':
                        r = v1/v3
                    elif str(v2) == "*":
                        r = v1*v3
                    pilha.empilhar(r)
                else:
                    pilha.empilhar(v1)
                    pilha.empilhar(v2)
                    pilha.empilhar(v3)
    return pilha.topo()
Ejemplo n.º 2
0
def avaliar(expressao):
    if expressao:
        fila=analise_sintatica(analise_lexica(expressao))

        if fila.__len__()==1:
            return fila.primeiro()
        else:
            pilha=Pilha()
            for i in range(fila.__len__()):
                pilha.empilhar(fila._deque[i])

                if pilha.__len__()>=3 and str(pilha.topo()) not in '-+*/(){}[]':
                    valor=pilha.topo()
                    pilha.desempilhar()
                    #verificação de sinais
                    if pilha.topo()=='+':
                        pilha.desempilhar()
                        valor=pilha.desempilhar()+valor
                        pilha.empilhar(valor)
                        valor=''
                    elif pilha.topo()=='-':
                        pilha.desempilhar()
                        valor=pilha.desempilhar()-valor
                        pilha.empilhar(valor)
                        valor=''
                    elif pilha.topo()=='*':
                        pilha.desempilhar()
                        valor=pilha.desempilhar()*valor
                        pilha.empilhar(valor)
                        valor=''
                    elif pilha.topo()=='/':
                        pilha.desempilhar()
                        valor=pilha.desempilhar()/valor
                        pilha.empilhar(valor)
                        valor=''
                    else:
                        pilha.empilhar(valor)

                elif str(pilha.topo()) in ')}]' and i==fila.__len__() - 1:
                    pilha.desempilhar()

                    while len(pilha)>1:
                        if str(pilha.topo()) not in '-+*/(){}[]':
                            valor=pilha.topo()
                            pilha.desempilhar()
                            #verificação de sinais
                            if pilha.topo()=='+':
                                pilha.desempilhar()
                                valor=pilha.desempilhar()+valor
                                pilha.empilhar(valor)
                                valor=''
                            elif pilha.topo()=='-':
                                pilha.desempilhar()
                                valor=pilha.desempilhar()-valor
                                pilha.empilhar(valor)
                                valor=''
                            elif pilha.topo()=='*':
                                pilha.desempilhar()
                                valor=pilha.desempilhar()*valor
                                pilha.empilhar(valor)
                                valor=''
                            elif pilha.topo()=='/':
                                pilha.desempilhar()
                                valor=pilha.desempilhar()/valor
                                pilha.empilhar(valor)
                                valor=''
                            elif str(pilha.topo()) in '(){}[]':
                                pilha.desempilhar()
                                pilha.empilhar(valor)
                            else:
                                pilha.empilhar(valor)
                        else:
                            pilha.desempilhar()
            return pilha.topo()
    raise ErroSintatico()
Ejemplo n.º 3
0
def avaliar(expressao):
    """
    Função que avalia expressão aritmetica retornando se valor se não houver nenhum erro
    :param expressao: string com expressão aritmética
    :return: valor númerico com resultado

    Complexidade*:

    tempo: O(n)
    Memoria: O(n)
    """

    if expressao:

        fila = analise_sintatica(analise_lexica(expressao))

        # print(fila._deque)

        if fila.__len__() == 1:
            return fila.primeiro()
        else:
            pilha = Pilha()

            for i in range(fila.__len__()):

                pilha.empilhar(fila._deque[i])

                if pilha.__len__() >= 3 and str(pilha.topo()) not in "-+*/(){}[]":

                    valor = pilha.topo()
                    pilha.desempilhar()

                    if pilha.topo() == "+":
                        pilha.desempilhar()
                        valor = pilha.desempilhar() + valor
                        pilha.empilhar(valor)
                        valor = ""
                    elif pilha.topo() == "-":
                        pilha.desempilhar()
                        valor = pilha.desempilhar() - valor
                        pilha.empilhar(valor)
                        valor = ""
                    elif pilha.topo() == "*":
                        pilha.desempilhar()
                        valor = pilha.desempilhar() * valor
                        pilha.empilhar(valor)
                        valor = ""
                    elif pilha.topo() == "/":
                        pilha.desempilhar()
                        valor = pilha.desempilhar() / valor
                        pilha.empilhar(valor)
                        valor = ""
                    else:
                        pilha.empilhar(valor)

                elif str(pilha.topo()) in ")}]" and i == fila.__len__() - 1:
                    pilha.desempilhar()

                    # print(pilha._lista)

                    while len(pilha) > 1:

                        if str(pilha.topo()) not in "-+*/(){}[]":
                            valor = pilha.topo()
                            pilha.desempilhar()

                            if pilha.topo() == "+":
                                pilha.desempilhar()
                                valor = pilha.desempilhar() + valor
                                pilha.empilhar(valor)
                                valor = ""
                            elif pilha.topo() == "-":
                                pilha.desempilhar()
                                valor = pilha.desempilhar() - valor
                                pilha.empilhar(valor)
                                valor = ""
                            elif pilha.topo() == "*":
                                pilha.desempilhar()
                                valor = pilha.desempilhar() * valor
                                pilha.empilhar(valor)
                                valor = ""
                            elif pilha.topo() == "/":
                                pilha.desempilhar()
                                valor = pilha.desempilhar() / valor
                                pilha.empilhar(valor)
                                valor = ""
                            elif str(pilha.topo()) in "(){}[]":
                                pilha.desempilhar()
                                pilha.empilhar(valor)
                            else:
                                pilha.empilhar(valor)
                        else:
                            pilha.desempilhar()

            # print('Nova pilha: ',pilha._lista, 'Tamanho: ', len(pilha))

            return pilha.topo()

    raise ErroSintatico()
Ejemplo n.º 4
0
def avaliar(expressao):
    token2 = R".-+*/{}[]()"
    token3 = R"(){}[]"
    num3 = '+'
    if expressao:
        fila = analise_sintatica(analise_lexica(expressao))
        if fila.__len__() == 1:
            return fila.primeiro()
        else:
            pilha = Pilha()
            for lex in range(fila.__len__()):
                pilha.empilhar(fila._deque[lex])
                if pilha.__len__() >= 3 and str(pilha.topo()) not in token2:
                    num = pilha.topo()
                    pilha.desempilhar()
                    if pilha.topo() == num3:
                        pilha.desempilhar()
                        num = pilha.desempilhar() + num
                        pilha.empilhar(num)
                    elif pilha.topo() == '-':
                        pilha.desempilhar()
                        num = pilha.desempilhar() - num
                        pilha.empilhar(num)

                    elif pilha.topo() == '*':
                        pilha.desempilhar()
                        num = pilha.desempilhar() * num
                        pilha.empilhar(num)

                    elif pilha.topo() == '/':
                        pilha.desempilhar()
                        num = pilha.desempilhar() / num
                        pilha.empilhar(num)

                    else:
                        pilha.empilhar(num)
                elif str(pilha.topo()) in ')}]' and lex == fila.__len__() - 1:
                    pilha.desempilhar()
                    while len(pilha) > 1:
                        if str(pilha.topo()) not in token2:
                            num = pilha.topo()
                            pilha.desempilhar()
                            if pilha.topo() == num3:
                                pilha.desempilhar()
                                num = pilha.desempilhar() + num
                                pilha.empilhar(num)

                            elif pilha.topo() == '/':
                                pilha.desempilhar()
                                num = pilha.desempilhar() / num
                                pilha.empilhar(num)

                            elif pilha.topo() == '*':
                                pilha.desempilhar()
                                num = pilha.desempilhar() * num
                                pilha.empilhar(num)

                            elif pilha.topo() == '-':
                                pilha.desempilhar()
                                num = pilha.desempilhar() - num
                                pilha.empilhar(num)

                            elif str(pilha.topo()) in token3:
                                pilha.desempilhar()
                                pilha.empilhar(num)
                            else:
                                pilha.empilhar(num)
                        else:
                            pilha.desempilhar()
            return pilha.topo()
    raise ErroSintatico()
def avaliar(expressao):
    """ Avalia a expressao e ve se está correta.
     Tempo de execução O(n)
     Espaço de memoria O(n)
     :param expressao: recebe a expressao a ser analisada
    :return: erro na expressao
    """
    if expressao:
        fila = analise_sintatica(analise_lexica(expressao))
        tamanho = len(fila)
        if tamanho == 1:
            return fila.primeiro()
        else:
            pilha = Pilha()
            for n in range(tamanho):
                pilha.empilhar(fila._deque[n])
                if pilha.__len__() >= 3 and str(pilha.topo()) not in '-+*/(){}[]':
                    valor = pilha.topo()
                    pilha.desempilhar()
                    if pilha.topo() == '+':
                        pilha.desempilhar()
                        valor = pilha.desempilhar() + valor
                        pilha.empilhar(valor)
                    elif pilha.topo() == '-':
                        pilha.desempilhar()
                        valor = pilha.desempilhar() - valor
                        pilha.empilhar(valor)
                    elif pilha.topo() == '*':
                        pilha.desempilhar()
                        valor = pilha.desempilhar() * valor
                        pilha.empilhar(valor)
                    elif pilha.topo() == '/':
                        pilha.desempilhar()
                        valor = pilha.desempilhar() / valor
                        pilha.empilhar(valor)
                    else:
                        pilha.empilhar(valor)
                elif str(pilha.topo()) in ')}]' and n == tamanho - 1:
                    pilha.desempilhar()
                    while len(pilha) > 1:
                        if str(pilha.topo()) not in '-+*/(){}[]':
                            valor = pilha.topo()
                            pilha.desempilhar()
                            if pilha.topo() == '+':
                                pilha.desempilhar()
                                valor = pilha.desempilhar() + valor
                                pilha.empilhar(valor)
                            elif pilha.topo() == '-':
                                pilha.desempilhar()
                                valor = pilha.desempilhar() - valor
                                pilha.empilhar(valor)
                            elif pilha.topo() == '*':
                                pilha.desempilhar()
                                valor = pilha.desempilhar() * valor
                                pilha.empilhar(valor)
                            elif pilha.topo() == '/':
                                pilha.desempilhar()
                                valor = pilha.desempilhar() / valor
                                pilha.empilhar(valor)
                            elif str(pilha.topo()) in '(){}[]':
                                pilha.desempilhar()
                                pilha.empilhar(valor)
                            else:
                                pilha.empilhar(valor)
                        else:
                            pilha.desempilhar()
            return pilha.topo()
    raise ErroSintatico()