(@ // String variables used to build the new names for expanded classes static char expname1[100]; static char expname2[100]; @) // Expand parameterized classes *operation* int expand_params(char* filename) *init* (@ 1 @) *wrapper* Cd_graph *prefix* (@ cout << endl << "Expanding parameterization ..." << endl; if (filename != NULL) { filebuf in_file; if (in_file.open(filename, input) != 0) cout << "sem-check: " << filename << " recreated." << endl; else in_file.close(); ofstream OutFile(filename); if (!OutFile) { cout << "sem-check: error: cannot open file " << filename << endl; return_val = 0; } else { OutFile << "// Parameterization-expanded class dictionary." << endl << endl; } this->expand_params1(); Adjacency_Nlist* adjnl = this->get_adjacencies(); this->set_adjacencies(new Adjacency_Nlist); adjnl->expand_params8(this); this->g_print(OutFile); OutFile.close(); } else { this->expand_params1(); Adjacency_Nlist* adjnl = this->get_adjacencies(); this->set_adjacencies(new Adjacency_Nlist); adjnl->expand_params8(this); } @) // Traverse the class dictionary, expanding parameterized classes along the way. *operation* void expand_params1() *traverse* *from* Cd_graph *to-stop* {Term, Syntax_vertex} *carry* *in* Cd_graph* graph = (@ this @) *along* *from* Cd_graph *carry* *inout* Any_vertex_List* vlist *along* *from* Neighbors *to* {Optional_term, Syntax_vertex, Inherit_term, Labeled, Regular} *carry* *inout* Opt_labeled_term_Sandwich* olts *along* *from* Neighbors *to* {Optional_term, Syntax_vertex, Inherit_term, Labeled, Regular} *wrapper* Cd_graph *prefix* (@ if (this->get_terminal_sets() == NULL) { Vertex_Comma_list* vcl = new Vertex_Comma_list; Vertex* v1 = new Vertex; Vertex* v2 = new Vertex; Vertex* v3 = new Vertex; Vertex* v4 = new Vertex; Vertex* v5 = new Vertex; v1->set_vertex_name(new DemIdent("DemText")); vcl->append(v1); v2->set_vertex_name(new DemIdent("DemReal")); vcl->append(v2); v3->set_vertex_name(new DemIdent("DemString")); vcl->append(v3); v4->set_vertex_name(new DemIdent("DemIdent")); vcl->append(v4); v5->set_vertex_name(new DemIdent("DemNumber")); vcl->append(v5); this->set_terminal_sets(vcl); } @) *wrapper* Adjacency *prefix* (@ // Skip parameterized classes if (this->get_parameters() != NULL) return; @) *wrapper* Neighbors *prefix* (@ vlist = NULL; olts = NULL; @) *wrapper* Neighbors_wc *prefix* (@ vlist = new Any_vertex_List; @) *suffix* (@ delete this->get_construct_ns(); this->set_construct_ns(vlist); @) *wrapper* {Optional_term, Inherit_term, Syntax_vertex, Labeled} *prefix* (@ if ((olts == NULL) && (vlist != NULL)) { vlist->append(this); } @) *wrapper* Regular *prefix* (@ char* newlabel = this->get_vertex()->expand_params3(); char* ptr1 = newlabel; char* ptr2 = expname2; while (*ptr1) { if ((*ptr1 >= 'A') && (*ptr1 <= 'Z')) *ptr2 = *ptr1 + ('a' - 'A'); else *ptr2 = *ptr1; ptr1++; ptr2++; } *ptr2 = '\0'; DemIdent* lname = new DemIdent(expname2); lname->set_line_number(this->get_vertex()->find_line_number()); Labeled* label = new Labeled; label->set_staticspec(this->get_staticspec()); label->set_accessorspec(this->get_accessorspec()); label->set_vertex(this->get_vertex()); label->set_label_name(lname); if (olts == NULL) { if (vlist != NULL) { vlist->append(label); } } else { olts->set_inner(label); } @) *wrapper* Term *prefix* (@ char* name = this->expand_params3(); if (this->get_actual_parameters()) { // If this is a parameterized class, check to see whether // the expanded version exists. If not, copy the // class, append it to the CD and expand the parameters. Vertex* newvertex = new Vertex(); DemIdent* vname = new DemIdent(name); newvertex->set_vertex_name(vname); if (graph->find_adjacency(newvertex) == NULL) { Adjacency* newadj = (Adjacency*) graph->find_adjacency(this->get_vertex()) ->g_copy(); newadj->expand_params6(this, (Vertex*)newvertex->g_copy()); graph->get_adjacencies()->append(newadj); } this->get_actual_parameters()->g_delete(); this->set_actual_parameters(NULL); this->get_vertex()->g_delete(); this->set_vertex(newvertex); } @) *wrapper* Opt_labeled_term_Sandwich *prefix* (@ olts = this; @) *suffix* (@ olts = NULL; @) *wrapper* Alternat_ns *prefix* (@ if (this->get_common() == NULL) { this->set_common(new Common); } @) // Return the expanded vertex name for this Term. *operation* char* expand_params3() *init* (@ NULL @) *traverse* *from* Term *bypassing* ->Term,actual_parameters,* *to* Vertex *wrapper* Vertex *prefix* (@ return_val = this->get_vertex_name()->get_val(); @) *wrapper* Term *suffix* (@ if (this->get_actual_parameters()) { expname1[0] = '\0'; this->get_actual_parameters()->expand_params4(); strcat(expname1, return_val); return_val = &expname1[1]; } @) // Generate expanded class name for actual parameters. *operation* void expand_params4() *traverse* *from* Term_Comma_list *to-stop* Term *wrapper* Term *prefix* (@ if (this->get_actual_parameters()) { this->get_actual_parameters()->expand_params4(); strcat(expname1, this->get_term_name()); strcat(expname1, "_"); } else { strcpy(expname2, "_"); strcat(expname2, this->get_term_name()); strcat(expname2, "_"); strcat(expname2, expname1); strcpy(expname1, expname2); } @) // Expand a new parameterized class *operation* void expand_params6(Term* t, Vertex* v) *traverse* *from* Adjacency *to* Term *carry* *in* Vertex_Comma_list* params = (@ this->get_parameters() @) *along* *from* Adjacency *to* Term *wrapper* Adjacency *prefix* (@ this->get_source()->g_delete(); this->set_source(v); @) *suffix* (@ this->get_parameters()->g_delete(); this->set_parameters(NULL); @) *wrapper* Term *prefix* (@ int index = params->expand_params7(this->get_vertex()); if (index >= 0) { Term* ti = t->get_actual_parameters()->n_th(index); this->set_vertex((Vertex*)ti->get_vertex()->g_copy()); this->set_moduleRef((TermRef*)ti->get_moduleRef()->g_copy()); if (ti->get_actual_parameters() == NULL) this->set_actual_parameters(NULL); else this->set_actual_parameters((Term_Comma_list*) ti->get_actual_parameters()->g_copy()); } @) // Search Parameter list for a given Term *operation* int expand_params7(Vertex* v) *init* (@ -1 @) *traverse* *from* Vertex_Comma_list *to* Vertex *carry* *inout* int index = (@ 0 @) *along* *from* Vertex_Comma_list *to* Vertex *wrapper* Vertex *prefix* (@ index++; if (this->g_equal(v)) return_val = index; @) // Reconstruct Cd_graph, removing parametrized classes *operation* void expand_params8(Cd_graph* g) *traverse* *from* Adjacency_Nlist *to-stop* Adjacency *wrapper* Adjacency *prefix* (@ if (this->get_parameters() == NULL) { g->get_adjacencies()->append(this); } @)