Exemplo n.º 1
0
def resolve_expressao_aditiva(exp, tipo_var, id_atrib):
    filho = exp.children[0]
    if filho.label == 'expressao_multiplicativa':
        return resolve_expressao_multiplicativa(filho, tipo_var, id_atrib)
    else:
        filho_esq = exp.children[0]
        filho_dir = exp.children[2]
        a1 = resolve_expressao_aditiva(filho_esq, tipo_var, id_atrib)
        a3 = resolve_expressao_multiplicativa(filho_dir, tipo_var, id_atrib)

        tipo_a1 = a1.type
        tipo_a3 = a3.type

        if tipo_a3 == tipo_a1:
            tipo_operacao = tipo_a3
        else:
            tipo_operacao = "FLUTUANTE"

        nome_operador = exp.children[1].children[0].label
        if nome_operador == "MAIS":
            node_adicao = MyNode(name="+", type=tipo_operacao)
        elif nome_operador == "MENOS":
            node_adicao = MyNode(name="-", type=tipo_operacao)


        a1.parent = node_adicao
        a3.parent = node_adicao
        node_adicao.id = "+-" + tipo_operacao
        return node_adicao
Exemplo n.º 2
0
def resolve_expressao_simples(exp, tipo_var, id_atrib):
    filho = exp.children[0]
    if filho.label == 'expressao_aditiva':
        return resolve_expressao_aditiva(filho, tipo_var, id_atrib)
    else:
        filho_esq = exp.children[0]
        filho_dir = exp.children[2]

        a1 = resolve_expressao_simples(filho_esq, tipo_var, id_atrib)
        a3 = resolve_expressao_aditiva(filho_dir, tipo_var, id_atrib)

        tipo_a1 = a1.type
        tipo_a3 = a3.type

        if tipo_a3 == tipo_a1:
            tipo_operacao = tipo_a3
        else:
            tipo_operacao = "FLUTUANTE"

        nome_operador = exp.children[1].children[0].label
        if nome_operador == "MAIOR":
            node_operacao = MyNode(name=">", type=tipo_operacao)
            node_operacao.id = ">-" + tipo_operacao
        elif nome_operador == "MENOR":
            node_operacao = MyNode(name="<", type=tipo_operacao)
            node_operacao.id = "<-" + tipo_operacao
        elif nome_operador == "IGUAL":
            node_operacao = MyNode(name="=", type=tipo_operacao)
            node_operacao.id = "=-" + tipo_operacao
        elif nome_operador == "DIFERENTE":
            node_operacao = MyNode(name="<>", type=tipo_operacao)
            node_operacao.id = "<>-" + tipo_operacao
        elif nome_operador == "MENOR_IGUAL":
            node_operacao = MyNode(name="<=", type=tipo_operacao)
            node_operacao.id = "<=-" + tipo_operacao
        elif nome_operador == "MAIOR_IGUAL":
            node_operacao = MyNode(name=">=", type=tipo_operacao)
            node_operacao.id = ">=-" + tipo_operacao


        a1.parent = node_operacao
        a3.parent = node_operacao

        return node_operacao
Exemplo n.º 3
0
def resolve_expressao_multiplicativa(exp, tipo_var, id_atrib):
    filho = exp.children[0]
    if filho.label == 'expressao_unaria':
        return resolve_expressao_unaria(filho, tipo_var, id_atrib)
    else:
        filho_esq = exp.children[0]
        filho_dir = exp.children[2]
        a1 = resolve_expressao_multiplicativa(filho_esq, tipo_var, id_atrib)
        a3 = resolve_expressao_unaria(filho_dir, tipo_var, id_atrib)

        tipo_a1 = a1.type
        tipo_a3 = a3.type

        if tipo_a3 == tipo_a1:
            tipo_operacao = tipo_a3
        else:
            tipo_operacao = "FLUTUANTE"

        node_multiplicacao = MyNode(name="*", type=tipo_operacao)
        a1.parent = node_multiplicacao
        a3.parent = node_multiplicacao
        node_multiplicacao.id = "*-" + tipo_operacao

        return node_multiplicacao
Exemplo n.º 4
0
def resolve_expressao_unaria(exp, tipo_var, id_atrib):
    global mensagens_warning
    global mensagens_erro
    global erro
    if len(exp.children) > 1:
        fator = exp.children[1]
    else:
        fator = exp.children[0]

    if fator.children[0].label == 'var':
        var = fator.children[0]
        index_variavel = verifica_variavel_declarada(var)
        if index_variavel < 0:
            nome_var_erro = fator.children[0].children[0].children[0].label
            num = MyNode(name=nome_var_erro, type='error')

        else:
            nome_var = variaveis_declaradas[index_variavel]["lexema"]
            tipo_var_expressao = variaveis_declaradas[index_variavel]["tipo"]
            if tipo_var is not None and tipo_var_expressao != tipo_var:
                mensagens_warning.append("Aviso: Coerção implícita do valor de '{}'".format(nome_var))
                # mensagens_warning.append(
                #     "Aviso: Atribuição de tipos distintos ‘{}’ {} e ‘expressão’ {}1".format(id_atrib, tipo_var,
                #                                                                            tipo_var_expressao))
            if variaveis_declaradas[index_variavel]['inicializado'] == False:
                mensagens_warning.append("Aviso: Variável ‘{}’ declarada e não inicializada em '{}'.".format(nome_var, escopo_atual))
                variaveis_declaradas[index_variavel]['inicializado'] = True
            variaveis_declaradas[index_variavel]['usada'] = True
            num = MyNode(name=nome_var, type=tipo_var_expressao)
            num.id = "var-"+tipo_var_expressao
        return num

    elif fator.children[0].label == 'chamada_funcao':
        if verifica_chamada_funcao(fator.children[0],False):
            # id_func = fator.children[0]
            id_func = fator.children[0].children[0].children[0].label

            lista_args = fator.children[0].children[2]
            arvore_lista_args = resolve_lista_args_func(lista_args)

            funcao_chamada = funcoes[id_func]
            tipo_funcao = funcao_chamada['tipo']
            no_func = MyNode(name=id_func + '()', type=tipo_funcao)
            no_func.id = "chamada_funcao-" + tipo_funcao

            for no in arvore_lista_args:
                no.parent = no_func

            if tipo_var != None and tipo_funcao.lower() != tipo_var.lower():
                mensagens_warning.append("Aviso: Coerção implícita do valor retornado por '{}'".format(id_func))
                # mensagens_warning.append("Aviso: Atribuição de tipos distintos '{}' flutuante e '{}' retorna inteiro2".format(
                #     id_atrib, id_func
                # ))

            return no_func
        else:
            no_func = MyNode(name="error", type="error")
            return no_func

    elif fator.children[0].label == 'numero':
        tipo_num = fator.children[0].children[0].label
        tipo_num = tipos_numeros[tipo_num]

        if tipo_var is not None and tipo_num != tipo_var:
            mensagens_warning.append("Aviso: Coerção implícita do valor atribuído para '{}'".format(id_atrib))
            # mensagens_warning.append(
            #     "Aviso: Atribuição de tipos distintos ‘{}’ {} e ‘expressão’ {}3".format(id_atrib, tipo_var, tipo_num))

        num = fator.children[0].children[0].children[0].label
        novo_node = MyNode(name=num, type=tipo_num)
        novo_node.id = "numero-"+tipo_num
        return novo_node

    elif fator.children[1].label == "expressao":
        return resolve_expressao(fator.children[1], tipo_var, id_atrib)