编译原理实验报告3.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《编译原理实验报告3.doc》由会员分享,可在线阅读,更多相关《编译原理实验报告3.doc(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、实验三 词法分析有穷自动机的应用实验目的:一: 输入正则文法二:FA1 生成FA(DFA或NFA)2 运行FA,DFA(自动);NFA(交互)3 *NFADFA实验设想: 对输入的文法存储并判断是确定的有穷状态自动机还是不确定是有穷状态自动机,并给出标准的表示形式,若是DFA,可直接测试一个符号串是否是文法的句子, 即能否被有穷状态机接受,给出过程及结果;若是NFA,首先将其转化为DFA,再测试一个符号串是否是文法的句子,亦即是否能被DFA接受。例如:输入文法规则的数目:7输入开始状态: S输入文法 Z:=Za Z:=Bb Z:=Aa B:=Ab B:=b A:=Ba A:=a 此为确定有穷状
2、态自动机!DFA D=(Z,A,B,a,b,M,S,Z)其中M: M(Z,a)=Z M(B,b)=Z M(B,a)=A M(A,a)=Z M(A,b)=B M(S,b)=B M(S,a)=A 输入要推导的符号串:ababaa M(S,ababaa)=M(M(S,a),babaa)=M(A,babaa)=M(M(A,b),abaa)=M(B,abaa)=M(M(B,a),baa)=M(A,baa)=M(M(A,b),aa)=M(B,aa)=M(M(B,a),a)=M(A,a)=Z该符号串能被有穷状态所接受!输入文法规则的数目:7输入开始状态: S输入规则:Z:=Ab Z:=Ba Z:=Zc A:
3、=Ba A:=a B:=Ab B:=b文法规则存储完毕! 此为非确定有穷状态自动机!NFA N=(Z,B,A,b,a,c,M,S,Z)其中M: M(A,a)=$ M(A,b)=Z,B M(A,c)=$ M(B,a)=Z,A M(B,b)=$ M(B,c)=$ M(Z,a)=$ M(Z,b)=$ M(Z,c)=Z M(S,a)=A M(S,b)=B M(S,c)=$将NFA转化为DFA!DFA N=(S,B,A,AZ,BZ,Z,b,a,c, M,S,F)其中M: M(S,b)=B M(S,a)=A M(B,a)=AZ M(A,b)=BZ M(AZ,b)=BZ M(AZ,c)=Z M(BZ,a)=
4、AZ M(BZ,c)=Z M(Z,c)=Z其中F=AZ,BZ,Z输入要推导的字符串:ababc M(S,ababc)=M(M(S,a),babc)=M(A,babc)=M(M(A,b),abc)=M(BZ,abc)=M(M(BZ,a),bc)=M(AZ,bc)=M(M(AZ,b),c)=M(BZ,c)=ZZ属于终止状态集合!该字符串能被有穷状态所接受!实验结果:参考程序#include#includestruct LeftItem;struct RightNode /存储状态转换关系中弧与终止状态结点结构 char tran; char nextstate; RightNode* nextsi
5、bling; RightNode(char x,char y) tran=x; nextstate=y; nextsibling=NULL;struct LeftItem /存储状态转换关系中初始状态结点结构char state; RightNode* link;struct StateItem /存放确定化的NFA状态结点结构char newstates10; StateItem() newstates0=0;int CheckState(LeftItem Array,int size) RightNode* p; RightNode* q;for(int i=0;inextsibling;
6、if(q=NULL) return 1;while(q!=NULL)if(p-tran=q-tran) return 0;q=q-nextsibling;return 1;int CheckExist(StateItem SArray,int& length,char temp)/将NFA确定化创建二维矩阵时判别新产生的状态是否在状态数组中存储过int i=0,k,m;while(ilength)length+;m=length;return m;else return k;int getcount1(LeftItem Array,int size) /取得FA中状态的个数 char temp
7、20; int len=0,count=0;int i,j;RightNode* pNode;for(i=0;isize;i+)pNode=Arrayi.link;while(pNode) for(j=0;jnextstate=tempj) break;if(j=len) count+; templen=pNode-nextstate;len+;pNode=pNode-nextsibling; return count;int getcount2(LeftItem Array,int size) /取得FA中输入字母的个数 char temp20; int len=0,count=0;int
8、i,j;RightNode* pNode;for(i=0;isize;i+)pNode=Arrayi.link;while(pNode) for(j=0;jtran=tempj) break;if(j=len) count+; templen=pNode-tran;len+;pNode=pNode-nextsibling; return count;int getstate(RightNode* pNode,char arc) /判定一个状态是否能通过一条弧进入下一状态while(pNode)if(pNode-tran=arc) return 1;pNode=pNode-nextsibling
9、;return 0;void Sort(char A,int n) /将取得的新状态进行排序for(int i=n-1;i0;i-)for(int j=0;ji;j+)if(Aj+1Aj)char temp=Aj+1;Aj+1=Aj;Aj=temp;void Bianli1(LeftItem Array,int size) /输出FA中有穷非空的状态集合 char temp20; int len=0;int i,j;RightNode* pNode;for(i=0;isize;i+)pNode=Arrayi.link;while(pNode) for(j=0;jnextstate=tempj)
10、 break;if(j=len) if(len=0) coutnextstate;elsecout,nextstate; templen=pNode-nextstate;len+;pNode=pNode-nextsibling;void Bianli2(LeftItem Array,int size) /输出FA中有穷的输入字母表 char temp20; int len=0;int i,j;RightNode* pNode;for(i=0;isize;i+)pNode=Arrayi.link;while(pNode) for(j=0;jtran=tempj) break;if(j=len)
11、if(len=0) couttran;elsecout,tran; templen=pNode-tran;len+;pNode=pNode-nextsibling;void Bianli31(LeftItem Array,int size) /输出DFA状态转换关系的集合M int i; RightNode* pNode; for(i=0;isize;i+) pNode=Arrayi.link; while(pNode!=NULL)cout M(Arrayi.state,tran)=nextstatenextsibling;void Bianli32(LeftItem Array,int si
12、ze) /输出NFA状态转换关系集合M char K20; int len=0;int i,j;RightNode* pNode;RightNode* qNode;for(i=0;isize;i+)pNode=Arrayi.link;while(pNode) for(j=0;jtran=Kj) break;if(j=len) Klen=pNode-tran;len+;pNode=pNode-nextsibling; Sort(K,len);for(i=0;isize;i+) for(j=0;jlen;j+) pNode=Arrayi.link;cout M(Arrayi.state,Kj)=;
13、if(getstate(pNode,Kj) couttran=Kj) qNode=pNode-nextsibling; coutnextstate; break; pNode=pNode-nextsibling; while(qNode) if(qNode-tran=Kj) cout,nextstate; qNode=qNode-nextsibling; coutendl;elsecout$endl;void Initiate(LeftItem Array,int size,char TArray) /将FA中的输入字母表存入数组TArrayint len=0;int i,j;RightNod
14、e* pNode;for(i=0;isize;i+)pNode=Arrayi.link;while(pNode) for(j=0;jtran=TArrayj) break;if(j=len) TArraylen=pNode-tran;len+;pNode=pNode-nextsibling;void GetState(LeftItem Array,int size,char nstate,char arc,char temp) /将NFA确定化创建二维矩阵时取得新状态int i=0;while(nstatei!=0) for(int j=0;jtran=arc) int k=0; while(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 报告
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内