ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:131.39KB ,
资源ID:29966473      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/29966473.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(非确定有限自动机的确定化分析.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

非确定有限自动机的确定化分析.docx

1、非确定有限自动机的确定化分析课程设计报告课程:编译原理学号:姓名: 班级:教师:时间:2014.5-2014.6.20计算机科学与技术系设计名称:非确定有限自动机的确定化设计内容、目的与要求:设计内容:编程实现对输入NFA转换成DFA输出的功能。设计要求:输入非确定的有限自动机,输出确定化的有限自动机。设计目的:实现NFA到DFA的转化。计划与进度安排:2014.5.262014.5.30 预设计的基础上,进一步查阅资料,完善设计方案,形成 书面材料。2014.5.312014.6.10 设计总体方案,构建绘制流程框图,编写代码,上机调试。2014.6.112014.6.17 测试程序,优化代

2、码,增强功能,撰写设计报告。2014.6.182014.6.20 继续测试代码、检查设计报告,准备参加答辩,然后根据 教师反馈意见,修改、完善设计报告。设计过程、步骤(可加页):1.需求分析 由于很多计算机系统都配有多个高级语言的编译程序,对有些高级语言甚至配置了几个不同性能的编译程序。从功能上看,一个编译程序就是一个语言翻译程序。语言翻译程序把源语言书写的程序翻译成目标语言的等价程序。经过编译程序的设计可以大大提高学生的编程能力。 编译程序的工作过程通常是词法分析、语法分析、语义分析、代码生成、代码优化。由于现在有很多词法分析程序工具都是基于有穷自动机的,而词法分析又是语法分析的基础,所以我

3、们有必要进行有穷自动机的确定化和最小化。编译程序的这些过程的执行先后就构成了编译程序的逻辑结构。有穷自动机(也称有限自动机)作为一种识别装置,它能准确地识别正规集,即识别正规文法所定义的语言和正规式所表示的集合,引入有穷自动机这个理论,正是为词法分析程序的自动构造寻找特殊的方法和工具。正规表达式与自动机理论在词法构造乃至整个编译器构造过程中起着至关重要的作用,同时它们被广泛应用于计算机科学的各个领域,它们与计算机其它学科之间也有着很大的联系。2.设计需知2.1 NFA和DFA的概念NFA(nondeterministic finite-state automata)即非确定有限自动机, 一个非

4、确定的有限自动机NFA M是一个五元式: NFA M=(S, , , S0, F)其中 S有限状态集 输入符号加上,即自动机的每个结点所射出的弧可以是中一个字符或是. S0初态集 F终态集 转换函数 S 2S (2S -S的幂集S的子集构成的集合)DFA(deterministic finite-state automata)即确定有限自动机,一个确定的有限自动机DFA M是一个五元式: M=(S, ,, S0, Z) 其中: S 有限状态集 输入字母表 映射函数(也称状态转换函数) SS (s,a)=S , S, S S, a S0 初始状态 S0 S Z终止状态集 ZS2.2 NFA和DF

5、A之间的联系在非确定的有限自动机NFA中,由于某些状态的转移需从若干个可能的后续状态中进行选择,故一个NFA对符号串的识别就必然是一个试探的过程。这种不确定性给识别过程带来的反复,无疑会影响到FA的工作效率。而DFA则是确定的,将NFA转化为DFA将大大提高工作效率,因此将NFA转化为DFA是有其一定必要的。3.设计方案 (1) 如果读入NFA,则将其转化为DFA并最小化,输入测试字符串,输出测试结果。 (2)如果读入DFA,则直接将其最小化,输入测试字符串,输出测试结果。4. DFA实现原理4.1 NFA转换成等价的DFA将NFA转换成等价的DFA里,NFA到相应的DFA的构造的基本思想是让

6、DFA的每一个状态对应NFA的一组状态。也就是说让DFA使用它的状态去记录在NFA读入一个输入符号后可能达到的所有状态,在读入输入符号之后,DFA处在a1a2.an那样一个状态,该状态表示这个NFA的状态的一个子集T,T是从NFA的开始状态沿着某个标记为a1a2.an可以达到的那些状态构成的。对状态集合I的几个有关运算:(1) 状态集合I的-闭包,表示为-closure(I),定义为一状态集,是状态集中的任何状态S经任意条弧而能够到达的状态的集合。(2) 状态集合I的a弧转换,表示为move(I,a)定义为状态集合J,其中J是所有那些可从I中的某一状态经过一条a弧而到达的状态的全体。4.2 N

7、FA的确定化 1.子集法先把DFA M中的Q和F置为空集;M的开始状态q0=q0,把q0置为未标记后加入到Q中;如果Q中存在未标记的状态q1,q2,,qi,则对每个a定义:(q1,q2,,qi,a)=p1,p2,pi当且仅当(q1,q2,,qi,a)=p1,p2,pi。如果q1,q2,,qi不在Q中,则把它置为为标记后加入到Q中;如果p1,p2,pi中至少有一个是M的终态,则同时把p1,p2,pi加入到F中;然后给Q中所有的状态都标记为止;重复执行(3),直到不能向Q中加入新状态,并且Q中所有的状态都有标记为止;重新命名Q中的状态,最后获得等价的DFA M。 2.对含变迁的NFA的确定化:置Q

8、, F为空集;令q0=_CLOSURE(q0),并把q0置为未标记后加入到Q中;如果Q中存在未标记状态q1,q2,qi,则对每个a定义:d(q1,q2,qi,a)=p1,p2,pj当且仅当d(q1,q2,qi,a)=r1,r2,rk, _CLOSURE(r1,r2,rk)= p1,p2,pj。如果p1,p2,pj不在Q中,则把它置为未标记后加入到Q中;如果p1,p2,pj中至少有一个是M的终态,则同时把p1,p2,pj加入到F中;然后给Q中的状态q1,q2,qi加上标记;重复执行,直到不能向Q中加入新状态,并且Q中所有的状态都有标记为止;重新命名Q中的状态,然后获得等价的DFA M4.3实现方

9、法(1)有穷自动机的确定化:在main()函数中通过使用move()和eclouse()和outputfa()函数来实现;(2)确定的有穷自动机的最小化:在main()函数中使用chan结构体来实现,在该函数中还调用了outputfa()函数。4.4设计流程图 1.输入NFA各边信息,通过输入(起点 条件空为* 终点)三项进行输入以#为输入结束;然后再输入各结点中的终结点;输入完成后系统开始执行,先生成NFA状态转换矩阵,重命名,输出DFA状态转换矩阵,最后对DFA状态转换矩阵进行最小化输出。NFA-DFA处理流程图如下图图4.4-1所示。图4.4-1 NFA-DFA处理流程图2.NFA转换为

10、DFA的原理及过程通过以下例子说明: 假如输入的NFA如图4.4-2所示: 图4.4-2 NFA状态转换图对于图4.2-2中的状态转换图的状态转换矩阵为:在图4.2-2中的状态转换图加一个起始状态X和结束状态Y,I为起始节点X经过一个或多个边到达的状态集,Ia为X,1经过a边到达的结点的闭包,Ib经过b边到达的结点的闭包;知道Ia和Ib列都在I列中出现为止。如下表4.2.1所示: 表4.2.1状态转换矩阵 I Ia Ib X,1 2,3,Y 2,3,Y 2,3,Y对表4.2.1的状态转换矩阵进行重新命名,令A=X,1,B=2,3,Y,转换结果如下表4.2.2所示: 表4.2.2重命名的状态转换

11、矩阵 I Ia Ib A B B B 表4.2.2相对应的 DFA状态转换图为下图图4.2-2所示: 图4.2-2 DFA状态图结果与分析(可以加页): 1.对于下图1中的NFA: 图1 NFA状态图2.输入图1中NFA的各边信息:如下截图 图2所示: 图2 输入各边信息截图3.对于图1的NFA状态转换矩阵和重命名后的状态矩阵如下截图图3所示: 图3 DFA状态矩阵截图 4.将图3中的状态矩阵图最小化,如下截图图4所示: 图4 最小化的DFA5.根据图4最小化的DFA状态转换矩阵,画出DFA状态转换图,如下图 图5所示: 图5 DFA状态装换图设计体会与建议: 编译原理是一门重要但难学的课程,

12、因为编译原理是关于编写编译器的技术,编译器的编写一直被认为是十分困难的事情,所以这次选到课程设计的课题就有些无从下手的感觉,感觉任务挺艰巨的。设计要求从理论上就不太好理解,不像以前的设计编写一个应用程序实现常见的功能,这次的课程设计注重各种算法的实现,比如用子集法实现不确定的有限自动机的确定化、又能够分割法实现确定的有限自动机的最小化。课题虽然感觉难懂了一些,但我想不管结果如何,只要自己努力,尽力了就行。小组各成员始终相信“世上无难事,只怕有心人”。由于课程设计有几周的时间,时间很充裕,所以这在这几周设计中,我们小组团结合作,互帮互助,大家都感觉这几周过的非常充实,尽管累了点。同时通过这次课程

13、设计我们深深地感觉到团队的力量,深深体会到“团结就是力量”。当我们开始困惑无从下手时,我们你一句我一句的意见很快让我们找到了前进的方向。当自己遇到疑难时,和组员一起讨论解决了问题感觉非常欣慰,无助和孤独感也顿时消失。通过这次课程设计给我另一个很大的体会是:流程图的重要性。说实话,每次不管是课程设计报告还是实习报告,我们最害怕做的就是画流程图,所以每次报告中能省则省。而这次发现根据系统需实现的功能和算法画出流程图后,就很清楚地知道我们的程序需要哪些模块,每个模块需要实现什么功能。所以在我们以后的学习中我们不能畏惧画流程图,我们要积极锻炼我们画流程图的能力,从而来帮助我们提高编程的能力。每次的课程

14、设计,和以前的相比,我发现了自己的一次又一次的进步,因为越到最后,越会发现自己的不足,就会想着怎样去改进,怎样去完善自己的系统,所以每学期的课程设计是很必要的,因为我在这些过程中都学到了很多知识。附源代码:#include#include#define MAXS 100using namespace std;string NODE; /结点集合string CHANGE; /终结符集合int N; /NFA边数struct edge string first; string change; string last; ;struct chan string ltab; string jiheMA

15、XS; ;void kong(int a) int i; for(i=0;ia;i+) cout ;/排序void paixu(string &a) int i,j; char b; for(j=0;ja.length();j+) for(i=0;iNODE.find(ai+1) b=ai; ai=ai+1; ai+1=b; void eclouse(char c,string &he,edge b) int k; for(k=0;khe.length() he+=bk.last; eclouse(bk.last0,he,b); void move(chan &he,int m,edge b)

16、 int i,j,k,l; k=he.ltab.length(); l=he.jihem.length(); for(i=0;ik;i+) for(j=0;jhe.jihem.length() he.jihem+=bj.last0; for(i=0;il;i+) for(j=0;jhe.jihem.length() he.jihem+=bj.last0;/输出void outputfa(int len,int h,chan *t) int i,j,m; cout I ; for(i=0;ilen;i+) coutICHANGEi ; coutendl-endl; for(i=0;ih;i+)

17、cout ti.ltab; m=ti.ltab.length(); for(j=0;jlen;j+) kong(8-m); m=ti.jihej.length(); coutti.jihej; coutendl; void main() edge *b=new edgeMAXS; int i,j,k,m,n,h,x,y,len; bool flag; string jhMAXS,endnode,ednode,sta; cout请输入NFA各边信息(起点 条件空为* 终点),以#结束:endl; for(i=0;ibi.first; if(bi.first=#) break; cinbi.cha

18、ngebi.last; N=i; for(i=0;iNODE.length() NODE+=bi.first; if(NODE.find(bi.last)NODE.length() NODE+=bi.last; if(CHANGE.find(bi.change)CHANGE.length()&(bi.change!=*) CHANGE+=bi.change; len=CHANGE.length(); cout结点中属于终态的是:endnode; for(i=0;iNODE.length() cout所输终态不在集合中,错误!endl; return; chan *t=new chanMAXS;

19、 t0.ltab=b0.first; h=1; eclouse(b0.first0,t0.ltab,b); /求e-clouse for(i=0;ih;i+) for(j=0;jti.ltab.length();j+) for(m=0;mlen;m+) eclouse(ti.ltabj,ti.jihem,b); /求e-clouse for(k=0;klen;k+) move(ti,k,b); /求move(I,a) for(j=0;jti.jihek.length();j+) eclouse(ti.jihekj,ti.jihek,b); /求e-clouse for(j=0;jlen;j+)

20、 paixu(ti.jihej); /对集合排序以便比较 for(k=0;kh;k+) flag=operator=(tk.ltab,ti.jihej); if(flag) break; if(!flag&ti.jihej.length() th+.ltab=ti.jihej; coutendl状态转换矩阵如下:endl; outputfa(len,h,t); /输出状态转换矩阵 /状态重新命名 string *d=new stringh; NODE.erase(); coutendl重命名:endl; for(i=0;ih;i+) sta=ti.ltab; ti.ltab.erase();

21、ti.ltab=A+i; NODE+=ti.ltab; coutsta=ti.ltabendl; for(j=0;jendnode.length();j+) if(sta.find(endnodej)sta.length() d1=ednode+=ti.ltab; for(k=0;kh;k+) for(m=0;mlen;m+) if(sta=tk.jihem) tk.jihem=ti.ltab; for(i=0;iednode.length() d0+=NODEi; endnode=ednode; coutendlDFA如下:endl; outputfa(len,h,t); /输出DFA co

22、ut其中终态为:endnodeendl; /DFA最小化 m=2; sta.erase(); flag=0; for(i=0;im;i+) for(k=0;klen;k+) y=m; for(j=0;jdi.length();j+) for(n=0;ny;n+) if(dn.find(tNODE.find(dij).jihek)dn.length()|tNODE.find(dij).jihek.length()=0) if(tNODE.find(dij).jihek.length()=0) x=m; else x=n; if(!sta.length() sta+=x+48; else if(s

23、ta0!=x+48) dm+=dij; flag=1; di.erase(j,1); j-; break; /跳出n if(flag) m+; flag=0; sta.erase(); coutendl集合划分:; for(i=0;im;i+) coutdi ; coutendl;/状态重新命名 chan *md=new chanm; NODE.erase(); coutendl重命名:endl; for(i=0;im;i+) mdi.ltab=A+i; NODE+=mdi.ltab; coutdi=mdi.ltabendl; for(i=0;im;i+) for(k=0;klen;k+) f

24、or(j=0;jh;j+) if(di0=tj.ltab0) for(n=0;nm;n+) if(!tj.jihek.length() break; else if(dn.find(tj.jihek)dn.length() mdi.jihek=mdn.ltab; break; break; ednode.erase(); for(i=0;im;i+) for(j=0;jendnode.length();j+) if(di.find(endnodej)di.length()&ednode.find(mdi.ltab) ednode+=mdi.ltab; endnode=ednode; coutendl最小化DFA如下:endl; outputfa(len,m,md); cout其中终态为:endnodeendl;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1