1、=M(B,aa)=M(M(B,a),a)=M(A,a)=Z该符号串能被有穷状态所接受 !B:=b输入规则:Z:=Ab Z:=Ba Z:=Zc A:=a B:=Ab文法规则存储完毕!此为非确定有穷状态自动机!NFA N=(Z,B,A,b,a,c,M,S,Z)M(A,a)=$M(A,b)=Z,BM(A,c)=$M(B,a)=Z,AM(B,b)=$M(B,c)=$M(Z,a)=$M(Z,b)=$M(Z,c)=ZM(S,a)=AM(S,b)=BM(S,c)=$将NFA转化为DFA!DFA N=(S,B,A,AZ,BZ,Z,b,a,c, M,S,F)其中MM(S,b)=B(S,a)=A(B,a)=AZ(
2、A,b)=BZ(AZ,b)=BZ(AZ,c)=Z(BZ,a)=AZ(BZ,c)=Z(Z,c)=Z 其中 F=AZ,BZ,Z 输入要推导的字符串:ababc(S,ababc) =M(M(S,a),babc) =M(A,babc) =M(A,b),abc) =M(BZ,abc) =M(BZ,a),bc) =M(AZ,bc) =M(AZ,b),c) =M(BZ,c) =ZZ属于终止状态集合! 该字符串能被有穷状态所接受实验结果:abah 曰 * z B- A A h- B Tn=-三=- =s z z z B B A A一 屉赶;皿d血a屉!JRdEi法规则存储完毕此为确定有穷状态自动机,DFA箕中
3、Fl:MB,bB,a=AA,aft,b=BMCS.hS,a-n 生危fa请 退出请捋m 请输入要推导的符号串:ababaa MCr ababaa =MCM =MA,babaa =MCI1lbaa =MCB.abaa.baa5 =MCAr baa) -rKM,aaB,aaJ=M競符号串能被有穷状态所接受*b a c a b8A B z B a A b -一 =一 = 一一 一一 s数 gZ:A:B; w则则则则则则则 f 畐 m-劈 _鸟-a_=&g 生遽巒 运行m请按2 退岀雷霽一花为非确定有穷状态自动机?UFA H-Z,B.A.,M.,ZMnpn:n=$B,cttZ,c=HCE,a-S,bB
4、 n=$ 将NPA转牝为DFfH DFA N1 =SJ, LB, Eft, AZ,LBZJ, tai, Lc, MJ , S,FJ 其中护:CSl,b=*BHJCB,a-CAZlMJ =EBZJNJ=ZJM1=tAZJNJCBZl,c-rZlmj =iZ其中 F,=MJ Mf ,babc-Mf rAJ,b,abcW IB却 “beLAZlRbcMJM,.cEBZl,c-Z参考程序#includeString.hstruct Leftitem;struct RightNode /存储状态转换关系中弧与终止状态结点结构char tran;char nextstate;RightNode* next
5、sibling;RightNode(char x,char y)tran=x; nextstate=y; nextsibling=NULL;struct Leftitem /存储状态转换关系中初始状态结点结构char state;RightNode* link;存放确定化的NFA状态结点结构struct Stateitemchar newstates10;Stateitem()newstates0=0;/ int CheckState(Leftltem Array,int size)RightNode* p;RightNode* q;for(int i=0;inextsibling; if(q
6、=NULL) return 1; while(q!=NULL)if(p_tran=q_tran) return 0; q=q-return 1; int CheckExist(Stateltem SArray,int& length,char temp)/将NFA确定化创建二维矩阵时判别新产生的状态是否在状态数组中存储过int i=0,k,m;while(ilength)length+;m=length;return m;elsereturn k;int getcount1(Leftltem Array,int size) /取得 FA 中状态的个数char temp20;int len=0,
7、count=0;int i,j;RightNode* pNode;for(i=0;pNode=Arrayi.link;while(pNode)for(j=0;jnextstate=tempj) break;if(j=len)count+;templen=pNode-nextstate;len+;pNode=pNode-return count;int getcount2(Leftltem Array,int size) /取得 FA 中输入字母的个数tran=tempj) break;tran;int getstate(RightNode* pNode,char arc) 判定一个状态是否能通
8、过一条弧进入下一状态tran=arc) return 1;return 0;void Sort(char A,int n) /将取得的新状态进行排序for(int i=n_1;i0;i_)for(int j=O;i;if(Aj+1coutvoid Bianli2(Leftltem Array,int size)输岀FA中有穷的输入字母表 elsetra n; len+; pNode=pNode- void Bianli31(LeftItem Array,int size)输岀DFA状态转换关系的集合 M int i;while(pNode!coutvv M(vArrayi.statevvtra
9、nvv)=nextstateSort(K,len);coutvvKjvvif(getstate(pNode,Kj)while(qNode)if(qNode-vvqNode-qNode=qNode-endl;$vvendl;TArrayvoid lnitiate(Leftltem Array,int size,char TArray) 将 FA 中的输入字母表存入数组ivsize;jvlen;tran=TArrayj) break;TArraylen=pNode- void GetState(Leftltem Array,int size,char nstate,char arc,char te
10、mp) /将NFA确定化创建二维矩阵时取得新状态int i=0;while(nstatei!=for(int j=0;jvsize;if(Arrayj.state=nstatei)RightNode* p=Arrayj.link;while(p!tran=arc)int k=0;while(tempk!if(p-nextstate=tempk) break; k+;if(tempk=tempk=p-tempk+1=0:p=p- void Change(Stateltem SArray,char temp,int& length,int MArray20,int index,int i)/取得新
11、状态后对状态数组以及状态转换矩阵进行对应变化int k;if(temp0!k=CheckExist(SArray,length,temp);MArrayindexi=k;if(k=length)strcpy(SArraylength.newstates,temp);char FindNewState(Leftltem Array,int size,char S,char arc) / 得到当前状态的下一状态if(Arrayi.state=S)RightNode* p=Arrayi.link;tran=arc) return p- p=p-return NULL;/取得输入字母在字母表中的下表
12、int Findy(char TArray,char s)while(TArrayi!if(TArrayi=s) return i; i+; void CreateFA1(Leftltem Array,int size,char start,char end)/根据输入文法创建FA if(CheckState(Array,size)此为确定有穷状态自动机 !DFA D=(此为非确定有穷状态自动机 !NFA N=(Bianli1(Array,size);,Bianli2(Array,size);,M,coutvvstart;else coutvvstartvv coutvvendvv)其中 M:
13、 if(CheckState(Array,size) Bianli31(Array,size);Bianli32(Array,size);length,int void CreateFA2(Leftltem Array,int size,char start,char end,Stateltem SArray,char TArray,int& MArray20)/将NFA转换为DFAint index=0;doi=0;temp0=GetState(Array,size,SArrayindex.newstates,TArrayi,temp);Sort(temp,strlen(temp);Chan
14、ge(SArray,temp,length,MArray,index,i);index+;while(index=length);void Display(StateItem SArray,char TArray,int MArray20,int x,int y,char start,char end)输出确定化的NFAint i,j,k;将 NFA 转化为 DFA!=(ivx;if(i=0) coutvvvvSArrayi.newstatesvvelse coutvv,ivy;if(i=O) coutvTvvTArrayivvTArrayivv, Mstartvv,F)其中 Mx;jvy;i
15、f(MArrayij!=-1)k=MArrayij;(,vvTArrayjvv)=vvSArrayk.newstatesvv其中 F=k=0;j=0;while(SArrayi.newstatesj!if(SArrayi.newstatesj=end) break;j+;if(SArrayi.newstatesj!if(k=0) coutvvk+;void RunFA1(Leftltem Array,int size,char start,char end)char TD20;int i=0,j;char s=start;COUt请输入要推导的符号串:;cinTD;svvTDj!TDj;e ndl;while (TDi!if(TDi+1!cout
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1