#include "semcheck.h" /***************************************************************** ** File Name : proper_alternatives ** ** ** ** All alternatives must be defined by construction classes or ** ** by alternation classes that will eventually be defined by ** ** construction classes. ** ** Since we will check alternation cycles,and cycle-free ** ** properties,we can simpliify the task be checking that ** ** all the alternatives can be repetition classes. ** ** ** ******************************************************************/ int Cd_graph::proper_alternatives() { return adjacencies->proper_alternatives(this); } int Adjacency_Nlist::proper_alternatives(Cd_graph *cdgraph) { int result = SUCCESS; Adjacency_list_iterator next_Adjacency(*this); Adjacency_ each_Adjacency; while (each_Adjacency=next_Adjacency()) if (each_Adjacency->proper_alternatives(cdgraph)==ERROR_PROPER) result = ERROR_PROPER; Adjacency_list_iterator next_Adj(*this); Adjacency_ each_Adj; while (each_Adj=next_Adj()) if (each_Adj->get_associated()) { delete each_Adj->get_associated(); each_Adj->set_associated(NULL); } return (result); } int Adjacency::proper_alternatives(Cd_graph *cdgraph) { return ns->proper_alternatives(cdgraph,source); } int Neighbors::proper_alternatives(Cd_graph *cdgraph,Vertex*svertex) { return (SUCCESS); // For Construct_ns and Repetit_n } int Alternat_ns::proper_alternatives(Cd_graph *cdgraph,Vertex*svertex) { return alternat_ns->proper_alternatives(cdgraph,svertex); } int Term_Bar_list::proper_alternatives(Cd_graph *cdgraph,Vertex*svertex) { static Vertex_Comma_list * terminalsSets = cdgraph->get_terminal_sets(); int result = SUCCESS; Vertex * a_Vertex; Adjacency_List* assoc = new Adjacency_List(); Term_list_iterator nextt(*this); Term* eacht; while (eacht=nextt()) { a_Vertex = eacht->get_vertex(); Adjacency_List * alt_assoc = eacht->compute_associted(cdgraph->get_adjacencies()); if (alt_assoc) { Adjacency_list_iterator next_Adj(*assoc); Adjacency* each_Adj; while (each_Adj = next_Adj()) { if (each_Adj->get_source()->g_equal(a_Vertex)) { cerr << toolname << ": error: on line " << eacht->get_vertex()->get_vertex_name()->get_line_number() << " "; eacht->pp(cerr); cerr << " is duplicated as an alternative of "; svertex->pp(cerr); cerr << "." << endl; result = ERROR_PROPER; break; } } Adjacency_list_iterator next_Adjacency(*alt_assoc); Adjacency* each_Adjacency; while (each_Adjacency=next_Adjacency()) assoc->append(each_Adjacency); } if (cdgraph->alternative_isnot_rep(a_Vertex)==ERROR_PROPER) { cerr << toolname << ": error: " << eacht->get_vertex()->get_vertex_name()->get_line_number() << " "; eacht->pp(cerr); cerr << ", a repetition class, " << "cannot be an alternative of "; svertex->pp(cerr); cerr << "." << endl; result = ERROR_PROPER; } else if (terminalsSets!=NULL) { Vertex_list_iterator nextv(*terminalsSets); Vertex* eachv; while (eachv = nextv()) { if (eachv->g_equal(a_Vertex)) { cerr << toolname << ": error: " << eacht->get_vertex()->get_vertex_name()->get_line_number() << " "; eacht->pp(cerr); cerr << ", a terminal class, " << "cannot be an alternative of "; svertex->pp(cerr); cerr << "." << endl; result = ERROR_PROPER; } } } else { char* n = a_Vertex->get_vertex_name()->get_val(); if (!(strcmp(n,"DemString") && strcmp(n,"DemNumber") && strcmp(n,"DemReal") && strcmp(n,"DemIdent") && strcmp(n,"DemText"))) { cerr << toolname << ": error: " << eacht->get_vertex()->get_vertex_name()->get_line_number() << " "; eacht->pp(cerr); cerr << ", a terminal class, " << "cannot be an alternative of "; svertex->pp(cerr); cerr << "." << endl; result = ERROR_PROPER; } } } delete assoc; return (result); } int Cd_graph::alternative_isnot_rep(Vertex *a_Vertex) { return adjacencies->alternative_isnot_rep(a_Vertex); } int Adjacency_Nlist::alternative_isnot_rep(Vertex *a_Vertex) { Adjacency_list_iterator next_Adjacency(*this); Adjacency_ each_Adjacency; while (each_Adjacency=next_Adjacency()) if (each_Adjacency->alternative_isnot_rep(a_Vertex)==ERROR_PROPER) return (ERROR_PROPER); return (SUCCESS); } int Adjacency::alternative_isnot_rep(Vertex *a_Vertex) { if (source->g_equal(a_Vertex)) return ns->alternative_isnot_rep(); else return (SUCCESS); } int Neighbors::alternative_isnot_rep() { return (SUCCESS); // For Construct_ns and Alternat_ns } int Repetit_n::alternative_isnot_rep() { return ERROR_PROPER; }