/*Genera il codice per il nodo def_stat e controlla i vincoli semantici*/ Code def_stat(Pnode def_stat_node){ //Imposto le due parti del nodo Pnode type_node = def_stat_node->child; Pnode id_list_head_node = def_stat_node->child->brother; //Definisco la variabile che contiene il codice da ritornare Code def_stat_code ; def_stat_code.head = NULL; def_stat_code.tail = NULL; def_stat_code.size = 0; //Sintetizzo il type Pschema schema_type = type(type_node); //Ottengo la id_list int id_list_len; Pname id_list_name = id_list(id_list_head_node,&id_list_len); //Controllo gli errori semantici //id ripetuti Boolean repetition = repeated_names(id_list_name); if (repetition == TRUE){ semerror(def_stat_node,"More than one variable with the same name"); } //variabili già assegnate Pnode id_node; for (id_node = id_list_head_node; id_node!=NULL; id_node=id_node->brother) if (name_in_environment(valname(id_node))) semerror(id_node,"Variable already defined"); //Genero il codice per la definizione delle variabili e inserisco i nomi nel contesto for (id_node = id_list_head_node; id_node!=NULL; id_node=id_node->brother){ //Genero il codice dell'id Code id_code ; int spazio_da_allocare = get_size(schema_type); if (schema_type->type == TABLE) id_code = makecode1(T_NEWTAB,spazio_da_allocare); else id_code = makecode1(T_NEWATOM,spazio_da_allocare); //Inserisco il nome nell'ambiente insert_name_into_environment(valname(id_node)); //Inserisco il nome nella symbol table Pschema schema_symbol = clone_schema(schema_type); schema_symbol->name = valname(id_node); insert(*schema_symbol); //Appendo a def_stat_code l'id_code def_stat_code = appcode(def_stat_code,id_code); } return def_stat_code; }
Code def_stat(Pnode p) { /* def_stat / / type ---> ID ---> ID */ int num_id = 0, op; Code c_temp, code_ret; Pname names; Pnode nodo_type = p->child; Pschema schema; switch (nodo_type->type) { case N_ATOMIC_TYPE: op = T_NEWATOM; break; case N_TABLE_TYPE: op = T_NEWTAB; break; default: noderror(p->child); } /* Operazioni comuni tra dati atomici e table */ // Carico la lista di ID delle variabili names = id_list(p->child->brother, &num_id); // Vincoli semantici if (repeated_names(names)) semerror(p, "Variable redeclaration"); // Controlliamo che nessuna variabile sia nell'environment Pname n; for (n = names; n != NULL; n = n->next) { if (name_in_environment(n->name)) semerror(p, "Variable redeclaration"); // Aggiungo la nuova variabile nell'environment insert_name_into_environment(n->name); } // Genero il codice per allocare ognuna delle variabili code_ret.head = NULL; for (n = names; n != NULL; n = n->next) { // Aggiungo il nome alla Symbol Table schema = type(nodo_type); schema->name = n->name; insert(schema); Value v1; v1.ival = get_size(schema); c_temp = makecode1(op, v1); code_ret = (code_ret.head == NULL ? c_temp : appcode(code_ret, c_temp)); } // Liberiamo la memoria free_name_list(names); return code_ret; }