#include "semcheck.h" /*********************************************************************** * find_nullable_vertices.pp * * * * nullable : set treated of Adjacency 0 * * nonnullable : set treated of Adjacency 1 * ************************************************************************/ #define NULLABLE 1 #define UNKNOWN 2 #define NONEMPTY 3 void Cd_graph::find_nullable_vertices() { adjacencies->find_nullable_vertices(); } void Adjacency_Nlist::find_nullable_vertices() { int done =0; while (done == 0) { done = 1; Adjacency_list_iterator next(*this); Adjacency* each; while (each = next()) each->find_nullable_vertices(this,each,done); } } void Adjacency::find_nullable_vertices(Adjacency_Nlist* adjs,Adjacency*curr,int& done) { if (this->get_treated()!=NULL) return; ns->find_nullable_vertices(adjs,this,done); } void Neighbors::find_nullable_vertices(Adjacency_Nlist* adjs,Adjacency*curr,int& done) { } void Neighbors_wc::find_nullable_vertices(Adjacency_Nlist* adjs,Adjacency*curr,int& done) { } void Repetit_n::find_nullable_vertices(Adjacency_Nlist* adjs,Adjacency*curr,int& done) { sandwiched->find_nullable_vertices(adjs,curr,done); } void Kernel_Sandwich::find_nullable_vertices(Adjacency_Nlist* adjs,Adjacency*curr,int& done) { int r1 = NULLABLE; int r2 = NULLABLE; int r3 = NULLABLE; first->nullable(r1); second->nullable(r2); inner->nullable(adjs,r3); if ((r1==NULLABLE) && (r2==NULLABLE) && (r3==NULLABLE)) { curr->set_treated(new DemNumber(NULLABLE)); done = 0; } else if ((r1==NONEMPTY) || (r2==NONEMPTY) || (r2==NONEMPTY)) { curr->set_treated(new DemNumber(NONEMPTY)); done = 0; } } void Construct_ns::find_nullable_vertices(Adjacency_Nlist* adjs,Adjacency*curr,int& done) { this->Neighbors_wc::find_nullable_vertices(adjs,curr,done); int r = NULLABLE; this->get_construct_ns()->nullable(adjs,r); if (r==NULLABLE) { curr->set_treated(new DemNumber(NULLABLE)); done = 0; } else if (r==NONEMPTY) { curr->set_treated(new DemNumber(NONEMPTY)); done = 0; } } void Alternat_ns::find_nullable_vertices(Adjacency_Nlist* adjs,Adjacency*curr,int& done) { this->Neighbors_wc::find_nullable_vertices(adjs,curr,done); int r = NULLABLE; alternat_ns->nullable(adjs,r); if (r==NULLABLE) { curr->set_treated(new DemNumber(NULLABLE)); done = 0; } else if (r==NONEMPTY) { curr->set_treated(new DemNumber(NONEMPTY)); done = 0; } } void Syntax_vertex_List::nullable(int& r) { Syntax_vertex_list_iterator next(*this); Syntax_vertex * each; while (each = next()) each->nullable(r); } void Syntax_vertex::nullable(int& r) { } void Regular_syntax::nullable(int& r) { r = NONEMPTY; } void Term_Bar_list::nullable(Adjacency_Nlist* adjs,int &r) { Term_list_iterator next(*this); Term* each; int r2; int unknown = 0; while( each = next()) { each->nullable(adjs,r2); if (r2==NULLABLE) { r = NULLABLE; return; } else if (r2==UNKNOWN) unknown = 1; } if (unknown) r = UNKNOWN; else r = NONEMPTY; } void Term::nullable(Adjacency_Nlist* adjs,int &r) { vertex->nullable(adjs,r); } void Vertex::nullable(Adjacency_Nlist* adjs,int &r) { adjs->check_nullable(this,r); } void Adjacency_Nlist::check_nullable(Vertex * v,int & r) { Adjacency_list_iterator next(*this); Adjacency* each; while (each = next()) { if (each->get_source()->g_equal(v)) if (each->get_treated()==NULL) { r = UNKNOWN; return; } else if (each->get_treated()->get_val()==NULLABLE) { r = NULLABLE; return; } else { r = NONEMPTY; return; } } r = NONEMPTY; } void Kernel::nullable(Adjacency_Nlist* adjs,int &r) { if (nonempty) nonempty->nullable(adjs,r); else r=NULLABLE; } void Any_vertex_List::nullable(Adjacency_Nlist* adjs,int &r) { Any_vertex_list_iterator next(*this); Any_vertex* each; int r2; while(each= next()) { each->nullable(adjs,r2); if (r2 == NONEMPTY) { r = NONEMPTY; return; } else if (r2 == UNKNOWN) { r = UNKNOWN; return; } } r = NULLABLE; } void Any_vertex::nullable(Adjacency_Nlist* adjs,int &r) { } void Regular_syntax::nullable(Adjacency_Nlist* adjs,int &r) { r = NONEMPTY; } void Optional_term::nullable(Adjacency_Nlist* adjs,int &r) { return; } void Opt_labeled_term::nullable(Adjacency_Nlist* adjs,int &r) { vertex->nullable(adjs,r); }