#include "semcheck.h" /***************************************************************** ** File Name : pick_extern_types.c ** ** Check the limits on using extenal types and classes ** *****************************************************************/ #include void Cd_graph::pick_extern_types(int &result) { if (foreign_classes == NULL) foreign_classes = new Term_Comma_list(); adjacencies->pick_extern_types(result,foreign_classes); if (foreign_classes->list_length()==0) foreign_classes =NULL; } void *Adjacency_Nlist::pick_extern_types(int &result,Term_Comma_list *foreign_classes) { Adjacency_list_iterator next(*this); Adjacency_ each; while (each=next()) each->pick_extern_types(result,foreign_classes); return NULL; } void Adjacency::pick_extern_types(int &result,Term_Comma_list *foreign_classes) { ns->pick_extern_types(result,foreign_classes,this); } void Neighbors::pick_extern_types(int &result,Term_Comma_list *foreign_classes,Adjacency *adj) { } void Repetit_n::pick_extern_types(int &result,Term_Comma_list *foreign_classes,Adjacency *adj) { sandwiched->pick_extern_types(result,foreign_classes,adj); } void Kernel_Sandwich::pick_extern_types(int &result,Term_Comma_list *foreign_classes,Adjacency *adj) { inner->pick_extern_types(result,foreign_classes,adj); } void Kernel::pick_extern_types(int &result,Term_Comma_list *foreign_classes,Adjacency *adj) { if (nonempty!=NULL) { if (nonempty->get_moduleRef()->getLibName()) { cerr << toolname << ": error: on line " << nonempty->get_vertex()->get_vertex_name()->get_line_number() << " "; nonempty->get_vertex()->pp(cerr); nonempty->get_moduleRef()->pp(cerr); cerr << " can not be used to define repetition" << endl; cerr << "\tclass: "; adj->get_source()->pp(cerr); cerr << endl << endl; result = ERROR_EXTERN; } if (nonempty->get_actual_parameters()!=NULL) nonempty->get_actual_parameters()->pick_extern_types(result,foreign_classes,adj); } repeated->pick_extern_types(result,foreign_classes,adj); } void Term_Sandwich::pick_extern_types(int &result,Term_Comma_list *foreign_classes,Adjacency *adj) { if (inner->get_moduleRef()->getLibName()) { cerr << toolname << ": error: on line " << inner->get_vertex()->get_vertex_name()->get_line_number() << " "; inner->get_vertex()->pp(cerr); inner->get_moduleRef()->pp(cerr); cerr << " can not be used to define repetition" << endl; cerr << "\tclass: "; adj->get_source()->pp(cerr); cerr << endl << endl; result = ERROR_EXTERN; } if (inner->get_actual_parameters()!=NULL) inner->get_actual_parameters()->pick_extern_types(result,foreign_classes,adj); } void Neighbors_wc::pick_extern_types(int &result,Term_Comma_list *foreign_classes,Adjacency *adj) { } void Alternat_ns::pick_extern_types(int &result,Term_Comma_list *foreign_classes,Adjacency *adj) { alternat_ns->pick_extern_types(result,foreign_classes,adj); this->get_construct_ns()->pick_extern_types(result,foreign_classes,adj); } void Term_Bar_list::pick_extern_types(int &result,Term_Comma_list *foreign_classes,Adjacency *adj) { Term_list_iterator next(*this); Term_ each; while (each = next()) { if (each->get_moduleRef()->getLibName()) { cerr << toolname << ": error: on line " << each->get_vertex()->get_vertex_name()->get_line_number() << " "; each->get_vertex()->pp(cerr); each->get_moduleRef()->pp(cerr); cerr << " can not be used as an alternative" << endl; cerr << "\tclass: "; adj->get_source()->pp(cerr); cerr << endl << endl; result = ERROR_EXTERN; } if (each->get_actual_parameters()!=NULL) each->get_actual_parameters()->pick_extern_types(result,foreign_classes,adj); } } void Term_Comma_list::pick_extern_types(int &result,Term_Comma_list *foreign_classes,Adjacency *adj) { Term_list_iterator next(*this); Term_ each; while (each = next()) each->pick_extern_types(result,foreign_classes,adj); } void Construct_ns::pick_extern_types(int &result,Term_Comma_list *foreign_classes,Adjacency *adj) { this->get_construct_ns()->pick_extern_types(result,foreign_classes,adj); } void Any_vertex_List::pick_extern_types(int &result,Term_Comma_list *foreign_classes,Adjacency *adj) { Any_vertex_list_iterator next(*this); Any_vertex_ each; while (each= next()) each->pick_extern_types(result,foreign_classes,adj); } void Any_vertex::pick_extern_types(int &result,Term_Comma_list *foreign_classes,Adjacency *adj) { } void Inherit_term::pick_extern_types(int &result,Term_Comma_list *foreign_classes,Adjacency *adj) { inherited->pick_extern_types(result,foreign_classes,adj); } void Opt_labeled_term::pick_extern_types(int &result,Term_Comma_list *foreign_classes,Adjacency *adj) { this->get_vertex()->pick_extern_types(result,foreign_classes,adj); } void Optional_term::pick_extern_types(int &result,Term_Comma_list *foreign_classes,Adjacency *adj) { opt->pick_extern_types(result,foreign_classes,adj); } void Opt_labeled_term_Sandwich::pick_extern_types(int &result,Term_Comma_list *foreign_classes,Adjacency *adj) { inner->pick_extern_types(result,foreign_classes,adj); } void Term::pick_extern_types(int &result,Term_Comma_list *foreign_classes,Adjacency *adj) { char *mname; if (mname = this->get_moduleRef()->getLibName()) { if (this->get_actual_parameters()!=NULL) { cerr << toolname << ": error: on line " << this->get_vertex()->get_vertex_name()->get_line_number() << " "; cerr << " external type '"; this->pp(cerr); cerr << "' can not have parameters." << endl << endl; result = ERROR_EXTERN; return; } /* char *taskl= "TASK"; char *nihcl= "NIHCL"; char *cl = "C"; char *motif = "MOTIF"; if ((strcmp(taskl,mname)==0) || (strcmp(nihcl,mname)==0) || (strcmp(motif,mname)==0) || (strcmp(cl,mname)==0)) { */ Term_list_iterator next(*foreign_classes); Term_ each; while (each = next()) if (each->g_equal(this)) break; if (each == NULL) foreign_classes->append(this); /* } else { sem_out << "Illegal library name : "; this->get_moduleRef()->pp(sem_out); sem_out << "." << endl; sem_out << "You can only use \"C\", \"TASK\", \"NIHCL\", \"MOTIF\"." << endl << endl; result = ERROR_EXTERN; return; } */ } if (this->get_actual_parameters()!=NULL) this->get_actual_parameters()->pick_extern_types(result,foreign_classes,adj); } /* Term : Normal | CppTerm *common* Vertex TermRef ["*adjacency*" Adjacency "." ] ["(" Comma_list(Term) ")" ] [ "(firstset" Comma_list(Ll1SetElement) ")"] [ "(followset" Comma_list(Ll1SetElement) ")"] . CppTerm = "$" . Normal = . TermRef : LocalRef | ModuleRef. ModuleRef : CompRef | LibRef *common* DemIdent. LocalRef = . CompRef = "@". LibRef = "@@". */ char * TermRef::getLibName() { return NULL; } char * LibRef::getLibName() { return this->get_moduleName()->get_val(); }