def splitTree(node, parent): if len(node.children) > 1: count = 0 values = chooseNewParent(node.name) select = values[0] verifyToChangeParent = values[1] if select == -1: select = math.ceil(len(node.children) / 2) - 1 if verifyToChangeParent == True: new_node = MyNode(name=node.name) new_node.parent = parent parent = new_node addParentInTreeGenerate(new_node) else: getLastChildren(node.children[select]) tempParentGenerateTree[0].parent = parent parent = tempParentGenerateTree[0] for i in node.children: if verifyToChangeParent == False: if count != select: splitTree(i, parent) else: splitTree(i, parent) count += 1 elif len(node.children) == 1: splitTree(node.children[0], parent) else: if parent != None and node != None: if node.name not in listOfIgnore: if node.parent.parent.name in listOfCreateParent: if node.parent.parent.name == "numero": new_node = MyNode(name=node.parent.parent.name) new_node.parent = parent new_node_type = MyNode(name=node.parent.name) new_node_type.parent = new_node node.parent = new_node_type else: new_node = MyNode(name=node.parent.parent.name) new_node.parent = parent node.parent = new_node else: node.parent = parent
def atribuicao(node): id_atribuicao = node.children[0].children[0].children[0].label expressao = node.children[2] tipo_var = None variavel_atual_declarada = False global variaveis_declaradas global escopo_atual for var in variaveis_declaradas: if var['lexema'] == id_atribuicao and var['escopo'] == escopo_atual: variavel_atual_declarada = True tipo_var = var['tipo'] var['usada'] = True if not variavel_atual_declarada: for var in variaveis_declaradas: if var['escopo'] == 'global' and var['lexema'] == id_atribuicao: variavel_atual_declarada = True tipo_var = var['tipo'] var['usada'] = True if not variavel_atual_declarada: global mensagens_erro mensagens_erro.append('Erro: Variável \'{}\' não declarada1'.format(id_atribuicao)) node_novo = MyNode(name=':=', type=":=") node_var = MyNode(name=id_atribuicao, type=tipo_var) node_var.parent = node_novo expressao_resolvida = resolve_expressao(expressao, tipo_var, id_atribuicao) indice = verifica_variavel_declarada_por_nome(id_atribuicao) if indice != -1: variaveis_declaradas[indice]['inicializado'] = True expressao_resolvida.parent = node_novo return node_novo
def declaracao_funcao(node): print("declaracao_funcao") filhos = node.children if (len(filhos) > 1): tipo = filhos[0].children[0].children[0].label cabecalho = filhos[1] else: tipo = "vazio" cabecalho = filhos[0] id_func = cabecalho.children[0].children[0].label entra_escopo(id_func) if id_func in funcoes.keys(): mensagens_erro.append("Erro: Já existe uma função com o nome {}".format(id_func)) global erro erro = True funcoes[id_func] = { "tipo": tipo, "id_func": id_func, "parametros": [], "retornou": False, "utilizada": False, } lista_parametros = cabecalho.children[2] get_lista_parametros_funcao(id_func, lista_parametros) array_params = [] lista_parametros.children = [] lista_par_funcao = funcoes[id_func]["parametros"] for param in lista_par_funcao: node_param_atual = MyNode(name=param["id"], type=param["tipo"], id=param["tipo"]+"-parametro") node_param_atual.parent = lista_parametros array_params.append(node)