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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

本文(编译实验三NFA转换成DFA和DFA化简.docx)为本站会员(b****6)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

编译实验三NFA转换成DFA和DFA化简.docx

1、编译实验三NFA转换成DFA和DFA化简实验三(一)NFA DFA(2小时)一. 问题描述NFADFA。1. 实验目的:学会编程实现子集构造法。2. 实验任务:存储NFA与DFA,编程实现子集构造法将NFA转换成DFA。3. 实验内容:(1)确定NFA与DFA的存储格式,为3个以上测试NFA准备好存储文件。(2)用C或JAVA语言编写将NFA转换成DFA的子集构造法的程序。(3)经测试无误。测试不易。可求出NFA与DFA的语言集合的某个子集(如长度小于某个N),再证实两个语言集合完全相同!(4)测试用例参考:将下列语言用RE表示,再转换成NFA使用:(a) 以a开头和结尾的小字字母串;a (a

2、|b|z)*a | a(b) 不包含三个连续的b的,由字母a与b组成的字符串;(e | b | bb) (a | ab | abb)*(c) (aa|b)*(a|bb)*二算法描述1. NFA的输入:分别输入NFA的“字符集”、“状态集”、“开始状态”、“接受状态集”、“状态转换表”等内容,并保存在设定的变量中。2. NFA的存储与读写:将上述NFA的五元组保存在一个文本文件中。存储格式如下所示(以下图中NFA为例):2 / 字符集中的字符个数 (以下两行也可合并成一行)a b / 以空格分隔的字符集。4 / 状态个数 (以下两行也可合并成一行)1 2 3 4 / 状态编号。若约定总是用从1开

3、始的连续数字表示,则此行可省略1 / 开始状态的编号。若约定为1,则此行可省略1 / 结束状态个数。若约定为1,则此行可省略3 / 结束状态的编号3 2 1 / 状态1的所有出去的转换。按字符集中的字符顺序给出,并在最左边加上一列关于e的转换。-1表示出错状态。多个状态用逗号分隔。-1 1 -1-1 3 4-1 -1 33. 基本算法描述存储格式如上所示,程序开始时,从文件中读取数据以获得NFA中的各种信息。根据子集构造法,构造相应的函数。子集构造法伪代码如下:初始时,-closure(S0)是Dstates中唯一的状态且未被标记;whileDstates中存在一个未标记的状态Tdobegin

4、 标记T;for每个输入符号adobeginU:=-closure(move(T,a);ifU没在Dstates中then将U作为一个未被标记的状态添加到Dstates. DtranT,a:=Uendend-closure的计算将T中所有状态压入栈stack;将-closure(T)初始化为T;whilestack不空dobegin将栈顶元素t弹出栈;for每个这样的状态u:从t到u有一条标记为的边do ifu不在-closure(T)中dobegin 将u添加到-closure(T); 将u压入栈stack中endend子集构造法的流程图:实验三(二)DFA化简(2小时)一. 问题描述 DF

5、A化简1实验目的:学会编程实现等价划分法化简DFA。2实验任务:先完善DFA,再化简DFA。3实验内容:(1)准备3个以上测试DFA文件。(2)DFA手动完善。(状态转换映射要是满映射)(3)用C或JAVA语言编写用等价划分法化简DFA的程序。(4)经测试无误。测试不易。可求出两个DFA的语言集合的某个子集(如长度小于某个N),再证实两个语言集合完全相同!(5)编写实验报告。要求同实验一,不再详述。二算法描述1.DFA的化简得到新的DFA之后,并没有完成任务,因为通过NFA转化成DFA不一定是最简的,也就是说,有多余的状态可以被删除,而我们需要的是得到一个唯一的最简的DFA12,也就是说,NF

6、A转化为DFA之后,还需要化简,也就是最小化。2.化简的理论基础DFA的化简是指:寻找一个状态数最少的DFAM,使得L(M)=L(M)。化简的方法是消去DFAM中的多余状态(或无用状态),合并等价状态。DFA中的多余状态是指这样的状态:从开始状态出发,读入任何输入串都不能到达的那个状态;或者从这个状态没有通路到达终态。两个状态S和T等价是指:如果从状态S出发能读出某个字W而停于终态,从T出发也能读出同样的字W而停于终态;反之,从T出发能读出同样的字W而停于终态,从S出发也能读出某个字W而停于终态。3.化简的基本思想化简DFA的基本思想是指导它的状态分成一些互不相交的子集,每一个子集中的状态都不

7、是等价的,不同子集中的状态可以由某个输入串来区别,最后将不能区别的每个子集用一个状态来做代表13-15,这种方法称为“分割法”。具体过程是:(1)将M的所有状态分成两个子集终态集和非终态集;(2)考察每一个子集,若发现某子集中的状态不等价,将其划分为两个集合;(3)重复第(2)步,继续考察已得到的每一个子集,直到没有任何一个子集需要继续划分为止。这时DFA的状态被分成若干个互不相交的子集。(4)从每个子集中选出一个状态做代表即可得到最简的DFA。三程序分析通过本设计所要求达到的目的是:充分理解和掌握NFA,DFA以及NFA确定化过程的相关概念和知识,理解和掌握子集法的相关知识和应用,现在需要编

8、程实现对输入NFA转换成DFA输出的功能。程序总框图如下:功能图如下:4运行结果 5. 实验问题及心得通过此次对从NFA到DFA的转化和DFA的化简的设计,使我更好的理解了NFA确定化过程的相关知识,很好的理解了子集法的演算过程。还有DFA的化简过程有了更好地理解。经过多次试验,在正确输入相关数据的情况下,程序能正常运行,当错误操作或输入错误数据时,程序将应错误自动关闭。经过这次课程设计,也让我深刻的认识到实践才是最重要的。书本只能教给我们基础知识,要怎样运用,将那些知识真正吸收,转化为自己的智慧,只有通过实践才能达到。编译原理是一门实用性很强,对我们的专业很有帮助的科目,我将会继续努力,不断

9、增加自己的知识面,把编译原理学习的更好。6. 附录#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 jiheMAXS;void kong(int a) int i; for(i=0;ia;i+) cout ;/排序void paixu(string &a) int i,j; c

10、har 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) int i,j,k,l; k=he.ltab.length(); l=he.jihem.length(); for(i=0;ik;i+) for(j=0;jhe.jih

11、em.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+) cout ti.ltab; m=ti.ltab.length(); for(j=0;jlen;j+) kong(8-m); m=ti.jihej.length(); co

12、utti.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.changebi.last; N=i; /*for(j=0;jN;j+) coutbj.firstbj.changebj.lastendl;*/ for(i=0;iNODE.l

13、ength() 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; /coutendnode=endnodeendl; chan *t=new chanMAXS; t0.lt

14、ab=b0.first; h=1; eclouse(b0.first0,t0.ltab,b);/求e-clouse /coutt0.ltabendl; 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+) /coutti.jihek; move(ti,k,b);/求move(I,a) /coutti.jihekendl; for(j=0;jti.jihek.length();j+) eclouse(ti.jihe

15、kj,ti.jihek,b);/求e-clouse for(j=0;jlen;j+) 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

16、=0;ih;i+) sta=ti.ltab; ti.ltab.erase(); 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; coutendl

17、DFA如下:endl; outputfa(len,h,t); /输出DFA cout其中终态为:endnodeendl;/DFA最小化 m=2; sta.erase(); flag=0; for(i=0;im;i+) /coutdi=diendl; for(k=0;klen;k+) /coutICHANGEkendl; 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(d

18、ij).jihek.length()=0) x=m; else x=n; if(!sta.length() sta+=x+48; else if(sta0!=x+48) dm+=dij; flag=1; di.erase(j,1); /coutdiendl; j-; break; /跳出n /n /j if(flag) m+;flag=0; /coutsta=staendl; sta.erase(); /k /i coutendl集合划分:; for(i=0;im;i+) coutdi; coutendl; /状态重新命名 chan *md=new chanm; NODE.erase(); c

19、outendl重命名: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+) for(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-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2