void print(set_item R) { cout<<"======================================================="<<endl; set_item::iterator it=R.begin(); for(;it!=R.end();it++) cout<<it->lhs<<"->"<<it->rhs<<" "<<it->lhd<<endl; cout<<"======================================================="<<endl; }
set_item Closure(set_item I) { cout<<"Finding Closure of "<<endl; print(I); set_item S; LR item; queue<LR>Q; set<char>F; set<char>::iterator it2; item_it itr=I.begin(); for(;itr!=I.end();itr++) { S.insert(*itr); Q.push(*itr); } int a,i; string t; LR t3; int t2; while(!(Q.empty())) { item=Q.front(); Q.pop(); a=find_dot(item.rhs); // cout<<"A "<<a<<endl; if(a==item.rhs.length()) continue; else if(Term.find(item.rhs[a])!=Term.end()) continue; else{ t=item.rhs.substr(a+1,item.rhs.length()-a-1); t+=item.lhd; cout<<"T string : "<<t<<endl; F=Find_first(t); t2=SYM[item.rhs[a]]; it2=F.begin(); for(i=0;i<V[t2].size();i++) { it2=F.begin(); for(;it2!=F.end();it2++) { make_LR(t3,item.rhs[a],"."+V[t2][i],*it2); if(S.find(t3)==S.end()) { S.insert(t3); Q.push(t3); } } } } } print(S); // cin>>i; return S; }
set_item Goto(set_item I,char ch) { int a; set_item S; item_it it=I.begin(); LR t3; for(;it!=I.end();it++) { a=(*it).rhs.find('.')+1; if((*it).rhs[a]==ch){ make_LR(t3,(*it).lhs,shift_Dot((*it).rhs),(*it).lhd); S.insert(t3); } } S=Closure(S); gto.insert(mp(mp(I,ch),S)); return S; }
set_item Goto(set_item I,char ch) { int a; set_item S; item_it it=I.begin(); LR t3; for(;it!=I.end();it++) { a=find_dot((*it).rhs); if((*it).rhs[a]==ch){ make_LR(t3,(*it).lhs,shift_Dot((*it).rhs),(*it).lhd); S.insert(t3); } } cout<<"GOTO OF "<<ch<<endl; print(S); // cin>>a; S=Closure(S); gto.insert(mp(mp(I,ch),S)); return S; }