不确定有限状态自动机的确定化(NFATODFA)2008-12-0522:11#includeiostream#includestring#defineMAXS100usingnamespacestd;stringNODE;//结点集合stringCHANGE;//终结符集合intN;//NFA边数structedge{stringfirst;stringchange;stringlast;};structchan{stringltab;stringjihe[MAXS];};voidkong(inta){inti;for(i=0;ia;i++)cout'';}//排序voidpaixu(string&a){inti,j;charb;for(j=0;ja.length();j++)for(i=0;ia.length();i++)if(NODE.find(a[i])NODE.find(a[i+1])){b=a[i];a[i]=a[i+1];a[i+1]=b;}}voideclouse(charc,string&he,edgeb[]){intk;for(k=0;kN;k++){if(c==b[k].first[0])if(b[k].change==*){if(he.find(b[k].last)he.length())he+=b[k].last;eclouse(b[k].last[0],he,b);}}}voidmove(chan&he,intm,edgeb[]){inti,j,k,l;k=he.ltab.length();l=he.jihe[m].length();for(i=0;ik;i++)for(j=0;jN;j++)if((CHANGE[m]==b[j].change[0])&&(he.ltab[i]==b[j].first[0]))if(he.jihe[m].find(b[j].last[0])he.jihe[m].length())he.jihe[m]+=b[j].last[0];for(i=0;il;i++)for(j=0;jN;j++)if((CHANGE[m]==b[j].change[0])&&(he.jihe[m][i]==b[j].first[0]))if(he.jihe[m].find(b[j].last[0])he.jihe[m].length())he.jihe[m]+=b[j].last[0];}//输出voidoutputfa(intlen,inth,chan*t){inti,j,m;coutI;for(i=0;ilen;i++)cout'I'CHANGE[i];coutendl-------------------------endl;for(i=0;ih;i++){cout''t[i].ltab;m=t[i].ltab.length();for(j=0;jlen;j++){kong(8-m);m=t[i].jihe[j].length();coutt[i].jihe[j];}coutendl;}}voidmain(){edge*b=newedge[MAXS];inti,j,k,m,n,h,x,y,len;boolflag;stringjh[MAXS],endnode,ednode,sta;cout请输入NFA各边信息(起点条件[空为*]终点),以#结束:endl;for(i=0;iMAXS;i++){cinb[i].first;if(b[i].first==#)break;cinb[i].changeb[i].last;}N=i;/*for(j=0;jN;j++)coutb[j].firstb[j].changeb[j].lastendl;*/for(i=0;iN;i++){if(NODE.find(b[i].first)NODE.length())NODE+=b[i].first;if(NODE.find(b[i].last)NODE.length())NODE+=b[i].last;if((CHANGE.find(b[i].change)CHANGE.length())&&(b[i].change!=*))CHANGE+=b[i].change;}len=CHANGE.length();cout结点中属于终态的是:endl;cinendnode;for(i=0;iendnode.length();i++)if(NODE.find(endnode[i])NODE.length()){cout所输终态不在集合中,错误!endl;return;}//coutendnode=endnodeendl;chan*t=newchan[MAXS];t[0].ltab=b[0].first;h=1;eclouse(b[0].first[0],t[0].ltab,b);//求e-clouse//coutt[0].ltabendl;for(i=0;ih;i++){for(j=0;jt[i].ltab.length();j++)for(m=0;mlen;m++)eclouse(t[i].ltab[j],t[i].jihe[m],b);//求e-clousefor(k=0;klen;k++){//coutt[i].jihe[k]-;move(t[i],k,b);//求move(I,a)//coutt[i].jihe[k]endl;for(j=0;jt[i].jihe[k].length();j++)eclouse(t[i].jihe[k][j],t[i].jihe[k],b);//求e-clouse}for(j=0;jlen;j++){paixu(t[i].jihe[j]);//对集合排序以便比较for(k=0;kh;k++){flag=operator==(t[k].ltab,t[i].jihe[j]);if(flag)break;}if(!flag&&t[i].jihe[j].length())t[h++].ltab=t[i].jihe[j];}}coutendl状态转换矩阵如下:endl;outputfa(len,h,t);//输出状态转换矩阵//状态重新命名string*d=newstring[h];NODE.erase();coutendl重命名:endl;for(i=0;ih;i++){sta=t[i].ltab;t[i].ltab.erase();t[i].ltab='A'+i;NODE+=t[i].ltab;cout'{'sta}=t[i].ltabendl;for(j=0;jendnode.length();j++)if(sta.find(endnode[j])sta.length())d[1]=ednode+=t[i].ltab;for(k=0;kh;k++)for(m=0;mlen;m++)if(sta==t[k].jihe[m])t[k].jihe[m]=t[i].ltab;}for(i=0;iNODE.length();i++)if(ednode.find(NODE[i])ednode.length())d[0]+=NODE[i];endnode=ednode;coutendlDFA如下:endl;outputfa(len,h,t);//输出DFAcout其中终态为:endnodeendl;//DFA最小化m=2;sta.erase();flag=0;for(i=0;im;i++){//coutd[i]=d[i]endl;for(k=0;klen;k++){//coutICHANGE[k]endl;y=m;for(j=0;jd[i].length();j++){for(n=0;ny;n++){if(d[n].find(t[NODE.find(d[i][j])].jihe[k])d[n].length()||t[NODE.find(d[i][j])].jihe[k].length()==0){if(t[NODE.find(d[i][j])].jihe[k].length()==0)x=m;elsex=n;if(!sta.length()){sta+=x+48;}elseif(sta[0]!=x+48){d[m]+=d[i][j];flag=1;d[i].erase(j,1);//coutd[i]endl;j--;}break;//跳出n}}//n}//jif(flag){m++;flag=0;}//coutsta=staendl;sta.erase();}//k}//icoutendl集合划分:;for(i=0;im;i++)cout{d[i]};coutendl;//状态重新命名chan*md=newchan[m];NODE.erase();coutendl重命名:endl;for(i=0;im;i++){md[i].ltab='A'+i;NODE+=md[i].ltab;cout{d[i]}=md[i].ltabendl;}for(i=0;im;i++)for(k=0;klen;k++)for(j=0;jh;j++){if(d[i][0]==t[j].ltab[0]){for(n=0;nm;n++){if(!t[j].jihe[k].length())break;elseif(d[n].find(t[j].jihe[k])d[n].length()){md[i].jihe[k]=md[n].ltab;break;}}break;}}ednode.erase();for(i=0;im;i++)for(j=0;jendnode.length();j++)if(d[i].find(endnode[j])d[i].length()&&ednode.find(md[i].ltab))ednode+=md[i].ltab;endnode=ednode;coutendl最小化DFA如下:endl;outputfa(len,m,md);cout其中终态为:endnodeendl;}/////////////////////////////////测试数据:i*11a11b11*22a32b43a54b55*66a66b66*f#f////////////////////////////////运行结果:请输入NFA各边信息(起点条件[空为*]终点),以#结束:i*11a11b11*22a32b43a54b55*66a66b66*f#结点中属于终态的是:f状态转换矩阵如下:IIaIb-------------------------i1212312412312356f12412412312456f12356f12356f1246f12456f1236f12456f1246f1236f12456f1236f12356f1246f重命名:{i12}=A{123}=B{124}=C{12356f}=D{12456f}=E{1246f}=F{1236f}=GDFA如下:IIaIb-------------------------ABCBDCCBEDDFEGEFGEGDF其中终态为:DEFG集合划分:{A}{DEFG}{B}{C}重命名:{A}=A{DEFG}=B{B}=C{C}=D最小化DFA如下:IIaIb-------------------------ACDBBBCBDDCB其中终态为:B