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
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
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
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)