#include "semcheck.h" /***************************************************************** ** File Name : match_parameters.c ** ** ** ** #formal parameters = #actual parameters ** *****************************************************************/ int Cd_graph::match_parameters() { return adjacencies->match_parameters(this); } int Adjacency_Nlist::match_parameters(Cd_graph *cdgraph) { int result = SUCCESS; Adjacency_list_iterator next_Adjacency(*this); Adjacency_ each_Adjacency; while (each_Adjacency=next_Adjacency()) if (each_Adjacency->match_parameters(cdgraph)!=SUCCESS) result = ERROR_MATCH; return (result); } int Adjacency::match_parameters(Cd_graph *cdgraph) { if (parameters) return ns->match_parameters(cdgraph,this); else return SUCCESS; } int Neighbors::match_parameters(Cd_graph *cdgraph,Adjacency *adjacency) { return 0; } int Construct_ns::match_parameters(Cd_graph *cdgraph,Adjacency *adjacency) { return this->get_construct_ns()->match_parameters(cdgraph,adjacency); } int Alternat_ns::match_parameters(Cd_graph *cdgraph,Adjacency *adjacency) { if ((alternat_ns->match_parameters(cdgraph,adjacency)==SUCCESS) && (this->get_construct_ns()->match_parameters(cdgraph,adjacency)==SUCCESS)) return (SUCCESS); else return (ERROR_MATCH); } int Repetit_n::match_parameters(Cd_graph *cdgraph,Adjacency *adjacency) { return sandwiched->match_parameters(cdgraph,adjacency); } int Kernel_Sandwich::match_parameters(Cd_graph *cdgraph,Adjacency *adjacency) { return inner->match_parameters(cdgraph,adjacency); } int Kernel::match_parameters(Cd_graph *cdgraph,Adjacency *adjacency) { int result2 = repeated->match_parameters(cdgraph,adjacency); int result1 = SUCCESS; if (nonempty) result1 = nonempty->match_parameters(cdgraph,adjacency); if ((result1==SUCCESS)&&(result2==SUCCESS)) return (SUCCESS); else return (ERROR_MATCH); } int Term_Sandwich::match_parameters(Cd_graph *cdgraph,Adjacency *adjacency) { return inner->match_parameters(cdgraph,adjacency); } int Any_vertex_List::match_parameters(Cd_graph *cdgraph,Adjacency *adjacency) { int result = SUCCESS; Any_vertex_list_iterator next(*this); Any_vertex_ each; while (each=next()) if (each->match_parameters(cdgraph,adjacency)==ERROR_MATCH) result = ERROR_MATCH; return (result); } int Any_vertex::match_parameters(Cd_graph *cdgraph,Adjacency *adjacency) { return SUCCESS; } int Regular::match_parameters(Cd_graph *cdgraph,Adjacency *adjacency) { return (this->get_vertex()->match_parameters(cdgraph,adjacency)); } int Labeled::match_parameters(Cd_graph *cdgraph,Adjacency *adjacency) { return (this->get_vertex()->match_parameters(cdgraph,adjacency)); } int Optional_term::match_parameters(Cd_graph *cdgraph,Adjacency *adjacency) { return (opt->match_parameters(cdgraph,adjacency)); } int Opt_labeled_term_Sandwich::match_parameters(Cd_graph *cdgraph,Adjacency *adjacency) { return (inner->match_parameters(cdgraph,adjacency)); } int Syntax_vertex::match_parameters(Cd_graph *cdgraph,Adjacency *adjacency) { return (SUCCESS); } int Inherit_term::match_parameters(Cd_graph *cdgraph,Adjacency *adjacency) { return (inherited->match_parameters(cdgraph,adjacency)); } int Term_Bar_list::match_parameters(Cd_graph *cdgraph,Adjacency *adjacency) { int result = SUCCESS; Term_list_iterator next(*this); Term_ each; while (each=next()) if (each->match_parameters(cdgraph,adjacency)==ERROR_MATCH) result = ERROR_MATCH; return (result); } int Term_Comma_list::match_parameters(Cd_graph *cdgraph,Adjacency *adjacency) { int result = SUCCESS; Term_list_iterator next(*this); Term_ each; while (each=next()) if (each->match_parameters(cdgraph,adjacency)==ERROR_MATCH) result = ERROR_MATCH; return (result); } int Term::match_parameters(Cd_graph *cdgraph,Adjacency *adjacency) { int result = SUCCESS; Vertex *a_vertex = this->get_vertex(); Term_Comma_list *act_pars = this->get_actual_parameters(); result = cdgraph->check_no_pars(a_vertex,act_pars,adjacency); if ((act_pars)&&(act_pars->match_parameters(cdgraph,adjacency)==ERROR_MATCH)) result = ERROR_MATCH; return (result); } int Cd_graph::check_no_pars(Vertex *source,Term_Comma_list *act_pars,Adjacency *adjacency) { int result = SUCCESS; if (terminal_sets) result = terminal_sets-> check_no_pars(source,act_pars,adjacency); if (foreign_classes) if (foreign_classes-> check_no_pars(source,act_pars,adjacency)==ERROR_MATCH) result = ERROR_MATCH; if (adjacencies->check_no_pars(source,act_pars,adjacency)==ERROR_MATCH) result = ERROR_MATCH; return (result); } int Adjacency_Nlist::check_no_pars(Vertex*vertex,Term_Comma_list *act_pars,Adjacency *adjacency) { int result = SUCCESS; Adjacency_list_iterator next(*this); Adjacency_ each; while (each=next()) if (each->check_no_pars(vertex,act_pars,adjacency)==ERROR_MATCH) result = ERROR_MATCH; return (result); } int Adjacency::check_no_pars(Vertex *vertex,Term_Comma_list *act_pars,Adjacency *adjacency) { int result; if (source->g_equal(vertex)) { if (parameters) { if (act_pars) { if ((act_pars->number_of_parts())==(parameters->number_of_parts())) result = SUCCESS; else result = ERROR_MATCH; } else result = ERROR_MATCH; } else { if (act_pars) result = ERROR_MATCH; else result = SUCCESS; } } else result = SUCCESS; if (result==ERROR_MATCH) { cerr << toolname << ": error: near line " << adjacency->get_source()->get_vertex_name()->get_line_number() << " '"; source->pp(cerr); cerr << "' is used with wrong number of parameters.\n" << endl; } return (result); } int Vertex_Comma_list::check_no_pars(Vertex *source,Term_Comma_list *act_pars,Adjacency *adjacency) { Vertex_list_iterator next_vertex(*this); Vertex_ each_vertex; while (each_vertex=next_vertex()) if (each_vertex->g_equal(source)) if (act_pars) { cerr << toolname << ": error: near line " << source->get_vertex_name()->get_line_number() << " '"; source->pp(cerr); cerr << "' should be a terminal without parameters.\n" << endl; return (ERROR_MATCH); } else return (SUCCESS); return (SUCCESS); } int Term_Comma_list::check_no_pars(Vertex *source,Term_Comma_list *act_pars,Adjacency *adjacency) { Term_list_iterator next_Term(*this); Term_ each_Term; while (each_Term=next_Term()) if (each_Term->get_vertex()->g_equal(source)) if (each_Term->get_actual_parameters()) { cerr << toolname << ": error: near line " << source->get_vertex_name()->get_line_number() << " foreign class '"; source->pp(cerr); sem_out << "' cannot be parameterized.\n" << endl; return ERROR_MATCH; } else if (act_pars) { cerr << toolname << ": error: near line " << source->get_vertex_name()->get_line_number() << " class '"; source->pp(cerr); cerr << "' should be a foreign class without parameters.\n" << endl; return (ERROR_MATCH); } else return (SUCCESS); return (SUCCESS); }