#include "semcheck.h" /* define_once.c ** */ int Cd_graph::define_once() { int result = SUCCESS; if (terminal_sets && foreign_classes) { Vertex_list_iterator next_vertex(*terminal_sets); Vertex* each_vertex; while (each_vertex = next_vertex()) if (foreign_classes->contains(each_vertex)) { result = ERROR_DONCE; cerr << toolname << ": error: on line " << each_vertex->get_vertex_name()->get_line_number() << " '"; each_vertex->pp(cerr); cerr << "' is both a terminal and exrternal class.\n" << endl; } } if (adjacencies->define_once(this) == ERROR_DONCE) result = ERROR_DONCE; return (result); } int Adjacency_Nlist::define_once(Cd_graph *cdgraph) { int no_of_adjacencies = this->number_of_parts(); int result = SUCCESS; while (no_of_adjacencies) { Adjacency *a_adjacency= (Adjacency *)this->get_data_member(no_of_adjacencies-1); if (a_adjacency-> define_once(cdgraph,no_of_adjacencies-1)==ERROR_DONCE) { result = ERROR_DONCE; cerr << toolname << ": error: near line " << a_adjacency->get_source()->get_vertex_name()->get_line_number() << endl; } no_of_adjacencies--; } return (result); } int Adjacency::define_once(Cd_graph *cdgraph,int position) { int result=cdgraph->define_more_that_once(source,position); if (ns->define_before(parameters,cdgraph)==ERROR_DONCE) result = ERROR_DONCE; return (result); } int Cd_graph::define_more_that_once(Vertex *source,int position) { int result = SUCCESS; if (terminal_sets) result = terminal_sets->define_more_that_once(source); if (result==ERROR_DONCE) { cerr << "\tclass: '"; source->pp(cerr); cerr << "' on line " << source->get_vertex_name()->get_line_number() << " is a terminal and cannot be redefined.\n" << endl; } if (foreign_classes) result = foreign_classes->define_more_that_once(source); if (result==ERROR_DONCE) { cerr << "\tclass: '"; source->pp(cerr); cerr <<"' on line " << source->get_vertex_name()->get_line_number() << " is an external class and cannot be redefined.\n" << endl; } while (position) { position--; Adjacency *a_adjacency = (Adjacency *) adjacencies->get_data_member(position); if (a_adjacency->define_more_that_once(source)==ERROR_DONCE) { result = ERROR_DONCE; sem_out << "\tclass: '"; source->pp(cerr); cerr <<"' on line " << source->get_vertex_name()->get_line_number() << " is redefined.\n" << endl; } } return (result); } int Adjacency::define_more_that_once(Vertex *avertex) { if (source->g_equal(avertex)) return (ERROR_DONCE); else return (SUCCESS); } int Term_Comma_list::define_more_that_once(Vertex *source) { Term_list_iterator next_Term(*this); Term_ each_Term; while (each_Term=next_Term()) if (each_Term->get_vertex()->g_equal(source)) return (ERROR_DONCE); return (SUCCESS); } int Vertex_Comma_list::define_more_that_once(Vertex *source) { Vertex_list_iterator next_vertex(*this); Vertex_ each_vertex; while (each_vertex=next_vertex()) if (each_vertex->g_equal(source)) return (ERROR_DONCE); return (SUCCESS); } int Neighbors::define_before(Vertex_Comma_list *parameters,Cd_graph *cdgraph) { return SUCCESS; } int Construct_ns::define_before(Vertex_Comma_list *parameters,Cd_graph *cdgraph) { return this->get_construct_ns() ->define_before(parameters,cdgraph); } int Alternat_ns::define_before(Vertex_Comma_list *parameters,Cd_graph *cdgraph) { int result2 = SUCCESS; int result1 = alternat_ns->define_before(parameters,cdgraph); result2 = this->get_construct_ns() ->define_before(parameters,cdgraph); if ((result1==SUCCESS)&&(result2==SUCCESS)) return (SUCCESS); else return (ERROR_DONCE); } int Repetit_n::define_before(Vertex_Comma_list *parameters,Cd_graph *cdgraph) { return sandwiched->define_before(parameters,cdgraph); } int Kernel_Sandwich::define_before(Vertex_Comma_list *parameters,Cd_graph *cdgraph) { return inner->define_before(parameters,cdgraph); } int Kernel::define_before(Vertex_Comma_list *parameters,Cd_graph *cdgraph) { int result1 = SUCCESS; int result2 = repeated->define_before(parameters,cdgraph); if (nonempty) result1 = nonempty->define_before(parameters,cdgraph); if ((result1==SUCCESS)&&(result2==SUCCESS)) return (SUCCESS); else return (ERROR_DONCE); } int Term_Sandwich::define_before(Vertex_Comma_list *parameters, Cd_graph *cdgraph) { return inner->define_before(parameters,cdgraph); } int Any_vertex_List::define_before(Vertex_Comma_list *parameters,Cd_graph *cdgraph) { int result = SUCCESS; Any_vertex_list_iterator next_Any_vertex(*this); Any_vertex_ each_Any_vertex; while (each_Any_vertex=next_Any_vertex()) if (each_Any_vertex->define_before(parameters,cdgraph)==ERROR_DONCE) result = ERROR_DONCE; return (result); } int Any_vertex::define_before(Vertex_Comma_list *parameters,Cd_graph *cdgraph) { return SUCCESS; } int Regular::define_before(Vertex_Comma_list *parameters,Cd_graph *cdgraph) { return (this->get_vertex()->define_before(parameters,cdgraph)); } int Labeled::define_before(Vertex_Comma_list *parameters,Cd_graph *cdgraph) { return (this->get_vertex()->define_before(parameters,cdgraph)); } int Optional_term::define_before(Vertex_Comma_list *parameters,Cd_graph *cdgraph) { return (opt->define_before(parameters,cdgraph)); } int Opt_labeled_term_Sandwich::define_before(Vertex_Comma_list *parameters, Cd_graph *cdgraph) { return (inner->define_before(parameters,cdgraph)); } int Syntax_vertex::define_before(Vertex_Comma_list *parameters,Cd_graph *cdgraph) { return (SUCCESS); } int Inherit_term::define_before(Vertex_Comma_list *parameters,Cd_graph *cdgraph) { return (inherited->define_before(parameters,cdgraph)); } int Term_Bar_list::define_before(Vertex_Comma_list *parameters,Cd_graph *cdgraph) { int result = SUCCESS; Term_list_iterator next_Term(*this); Term_ each_Term; while (each_Term=next_Term()) if (each_Term->define_before(parameters,cdgraph)==ERROR_DONCE) result = ERROR_DONCE; return (result); } int Term_Comma_list::define_before(Vertex_Comma_list *parameters,Cd_graph *cdgraph) { int result = SUCCESS; Term_list_iterator next_Term(*this); Term_ each_Term; while (each_Term=next_Term()) if (each_Term->define_before(parameters,cdgraph)==ERROR_DONCE) result = ERROR_DONCE; return (result); } int Term::define_before(Vertex_Comma_list *parameters,Cd_graph *cdgraph) { return SUCCESS; } int Normal::define_before(Vertex_Comma_list *parameters,Cd_graph *cdgraph) { static LocalRef* localRef = new LocalRef(); int result = SUCCESS; Vertex *a_vertex = this->get_vertex(); Term_Comma_list *act_par = this->get_actual_parameters(); if (parameters) { if (parameters->contains(a_vertex)) return SUCCESS; } if (!localRef->g_equal(this->get_moduleRef())) return SUCCESS; if (cdgraph->contains(a_vertex) == 0) { result=ERROR_DONCE; cerr << "\tundefined class: '"; this->get_vertex()->pp(cerr); cerr << "' on line " << this->get_vertex()->get_vertex_name()->get_line_number() << "\n" << endl; } if ((act_par)&&(act_par->define_before(parameters,cdgraph)==ERROR_DONCE)) result = ERROR_DONCE; return (result); } int Vertex_Comma_list::contains(Vertex *vertex) { Vertex_list_iterator next_vertex(*this); Vertex_ each_vertex; while (each_vertex=next_vertex()) if (each_vertex->g_equal(vertex)) return (1); return (0); } int Term_Comma_list::contains(Vertex *vertex) { Term_list_iterator next_Term(*this); Term_ each_Term; while (each_Term=next_Term()) if (each_Term->get_vertex()->g_equal(vertex)) return (1); return (0); } int Cd_graph::contains(Vertex *vertex) { int result = 0; if (terminal_sets) result = terminal_sets->contains(vertex); if ((result ==0)&&(foreign_classes)) result = foreign_classes->contains(vertex); if (result==0) result = adjacencies->contains(vertex); return result; } int Adjacency_Nlist::contains(Vertex *vertex) { Adjacency_list_iterator next_Adjacency(*this); Adjacency_ each_Adjacency; while (each_Adjacency=next_Adjacency()) if (each_Adjacency->contains(vertex)==1) return (1); return (0); } int Adjacency::contains(Vertex *vertex) { if (source->g_equal(vertex)) return (1); return (0); }