#include "treeprop.h" /****************************************************************************** Tree property checker. File name :single_inherit.c Author :Christos Stamelos. Version :II Date :14 Jan 1991. ******************************************************************************/ /* this file contains the implementation of the single * * inheritance checker */ int Demeter_in::inheritance_reporter( ) { return input->inheritance_reporter(); } //++ pure virtual //++ int Input::inheritance_reporter() = 0; int Cd_graph::inheritance_reporter() { return adjacencies->inheritance_reporter(); } int Adjacency_nlist::inheritance_reporter() { Adjacency_list_iterator next_arg(*this); Adjacency_ each_arg; Inheritanceentry_list *inheritancelist_in = new Inheritanceentry_list(); Inheritancereport *tinheritancereport = new Inheritancereport(inheritancelist_in); while (each_arg = next_arg()) each_arg->add_inheritance( tinheritancereport ); return ( tinheritancereport->print_out() ); } void Adjacency::add_inheritance(Inheritancereport *tinheritancereport ) { ns->add_inheritance( tinheritancereport , source->get_vertex_name()); } void Neighbors::add_inheritance(Inheritancereport *tinheritancereport, DemIdent *vertex_name) { } void Repetit_n::add_inheritance(Inheritancereport *tinheritancereport, DemIdent *vertex_name) { } void Neighbors_wc::add_inheritance(Inheritancereport *tinheritancereport, DemIdent *vertex_name) { construct_ns->add_inheritance(tinheritancereport,vertex_name); } void Construct_ns::add_inheritance(Inheritancereport *tinheritancereport, DemIdent *vertex_name) { this->Neighbors_wc::add_inheritance(tinheritancereport,vertex_name); } void Any_vertex_list::add_inheritance(Inheritancereport *tinheritancereport, DemIdent *vertex_name) { Any_vertex_list_iterator next_arg(*this); Any_vertex_ each_arg; while (each_arg = next_arg()) each_arg->add_inheritance( tinheritancereport , vertex_name ); } void Any_vertex::add_inheritance(Inheritancereport *tinheritancereport, DemIdent *vertex_name) { } void Opt_labeled_term::add_inheritance(Inheritancereport *tinheritancereport, DemIdent *vertex_name) { // end of the propagation. } void Optional_term::add_inheritance(Inheritancereport *tinheritancereport, DemIdent *vertex_name) { // end of the propagation. } void Syntax_vertex::add_inheritance(Inheritancereport *tinheritancereport, DemIdent *vertex_name) { // end of the propagation. } void Inherit_term::add_inheritance(Inheritancereport *tinheritancereport, DemIdent *vertex_name) { inherited->add_explicit_inheritance(tinheritancereport,vertex_name); } void Term_comma_list::add_explicit_inheritance( Inheritancereport *tinheritancereport, DemIdent *vertex_name) { Term_list_iterator next_arg(*this); Term_ each_arg; while (each_arg = next_arg()) each_arg->add_explicit_inheritance(tinheritancereport,vertex_name); } void Term::add_explicit_inheritance(Inheritancereport *tinheritancereport, DemIdent *vertex_name) { tinheritancereport->add_inheritance(vertex_name,vertex->get_vertex_name()); } void Inheritancereport::add_inheritance(DemIdent* subclass,DemIdent* superclass) { inheritancelist->add_inheritance(subclass,superclass); } void Inheritanceentry_list::add_inheritance(DemIdent* subclass,DemIdent* superclass) { // check if there exists entry in report with symbolname == subclass. int find = 0; Inheritanceentry_list_iterator next_arg(*this); Inheritanceentry_ each_arg; while (each_arg = next_arg()){ if ( subclass->g_equal( each_arg->get_symbolname()) ){ find = 1; break; } } /* if yes add the superclass to the superclasses list. Increment the numofsuperclasses by 1. */ if ( find ){ DemNumber *tnum = new DemNumber(); tnum = each_arg->get_numofsuper(); int tt ; tt = tnum->get_val()+1; DemNumber *newnum = new DemNumber(tt); each_arg->set_numofsuper(newnum ); each_arg->superclass_append(superclass); } else{ // if no create a new entry and add it to the reporter. Term_list *iterm_list = new Term_list(); DemNumber *in_num = new DemNumber( 0 ); Inheritanceentry *iinherit = new Inheritanceentry( subclass , in_num , iterm_list); iinherit->superclass_append(superclass); this->append(iinherit); this->add_inheritance( subclass , superclass ); } } void Inheritanceentry::superclass_append( DemIdent *tident ) { Vertex *ivertex = new Vertex( tident); Normal *iterm = new Normal( ); iterm->Term::set_vertex(ivertex ); superclasses->append(iterm); } void Alternat_ns::add_inheritance(Inheritancereport *tinheritancereport, DemIdent *vertex_name) { alternat_ns->add_inheritance( tinheritancereport , vertex_name ); if(common) this->Neighbors_wc::add_inheritance(tinheritancereport,vertex_name); } void Term_bar_list::add_inheritance(Inheritancereport *tinheritancereport, DemIdent *vertex_name) { Term_list_iterator next_arg(*this); Term_ each_arg; while (each_arg = next_arg()) tinheritancereport->add_inheritance( (each_arg->get_vertex())->get_vertex_name(),vertex_name); } int Inheritancereport::print_out() { return inheritancelist->print_out(); } int Inheritanceentry_list::print_out() { int maxinherit = 0; int temp = 0; Inheritanceentry_list_iterator next_arg(*this); Inheritanceentry_ each_arg; while (each_arg = next_arg()) if ( (temp = (each_arg->get_numofsuper())->get_val()) > maxinherit ) maxinherit = temp; if ( maxinherit > 1 ){ cout << "\nThe input class dictiorary contains multi-inherited classes\n"; cout << "These are:\n"; for ( temp=maxinherit;temp>1;temp-- ){ Inheritanceentry_list_iterator next_arg(*this); Inheritanceentry_ each_arg; while (each_arg = next_arg()) if ( (each_arg->get_numofsuper())->get_val() == temp ){ cout << "\n"; each_arg->print_out(); cout << "\n"; } } return 0; } else{ cout <<"\nThe input class dictiorary contains only " << "single inherited classes.\n"; return 1; } } void Inheritanceentry::print_out() { cout << " Class name : ";symbolname->pp(); cout << "\n"; cout << " Number of super classes : ";numofsuper->pp(); cout << "\n"; cout << " List of super classes :\n[ ";superclasses->print_out(); } void Term_list::print_out() { Term_list_iterator next_arg(*this); Term_ each_arg; each_arg = next_arg(); while (each_arg = next_arg()){ each_arg->pp(); cout << " " ; } cout << " ]\n"; }