NFA转化为DFA的转换算法及实现.docx

上传人:小飞机 文档编号:4886838 上传时间:2023-05-21 格式:DOCX 页数:25 大小:231.78KB
返回 下载 相关 举报
NFA转化为DFA的转换算法及实现.docx_第1页
第1页 / 共25页
NFA转化为DFA的转换算法及实现.docx_第2页
第2页 / 共25页
NFA转化为DFA的转换算法及实现.docx_第3页
第3页 / 共25页
NFA转化为DFA的转换算法及实现.docx_第4页
第4页 / 共25页
NFA转化为DFA的转换算法及实现.docx_第5页
第5页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《NFA转化为DFA的转换算法及实现.docx》由会员分享,可在线阅读,更多相关《NFA转化为DFA的转换算法及实现.docx(25页珍藏版)》请在三一办公上搜索。

1、编译原理课程实践报告设计名称:NFA转化为DFA的转换算法及实现二级学院:数学与计算机科学学院专 业:计算机科学与技术班 级:计科本091班姓 名:学 号:指导老师:日 期: 2012年6月28日摘要有穷自动机分为确定的有穷自动机(DFA)和不确定的有穷自动机(NFA)两 类。两者各有特点、作用于不同的地方,因此需要进行转化NFA转化为DFA的理 论在词法构造乃至整个编译器构造过程中起着至关重要的作用,同时它们被广泛 应用于计算机科学的各个领域,它们与计算机其它学科之间也有着很密切的关 系。本文主要介绍基于编译器构造技术中的由NFA转化为DFA的算法设计和实现 技术:主要包括NFA转化为与其等

2、价的DFA所使用的子集构造算法以及把DFA化简 的算法,实现词法分析,最后使用Visual C+语言加以实现。NFA转化为与其等价的DFA需分两步进行:1、构造NFA的状态的子集的算法; 2、计算s -closure。完成这些子模块的设计后,再通过某一中间模块的总控程 序对其调用,最后再由主程序总调用,也就实现了NFA转化为其等价的DFA,接下 来就是以分割法的思想为指导实现DFA的化简,最后并以实例加以说明。关键词:有穷自动机;NFA ; DFA;转化;化简目录1前言31.1选题的依据和必要性31.2课题意义32 NFA转化为DFA的算法及实现42.1基本定义42.1.2 DFA 的概念.

3、52.1.3 NFA与DFA的矩阵表示52.1.4 NFA向DFA的转换的思路63 DFA的化简73.1化简的理论基础73.2化简的基本思想73.3化简的代码实现84程序设计144.1程序分析144.1.1流程图144.1.2子集构造法164.2具体的转换过程181前言1.1选题的依据和必要性由于很多计算机系统都配有多个高级语言的编译程序,对有些高级语言甚至 配置了几个不同性质的编译程序。从功能上看,一个编译程序就是一个语言翻译 程序。语言翻译程序把源语言书写的程序翻译成目标语言的等价程序。经过编译 程序的设计可以大大提高学生的编程能力。编译程序的工作过程通常是词法分析、语法分析、语义分析、代

4、码生成、代 码优化1。由于现在有很多词法分析程序工具都是基于有穷自动机的,而词法分 析又是语法分析的基础,所以我们有必要进行有穷自动机的确定化和最小化。1.2课题意义编译程序的这些过程的执行先后构成了编译程序的逻辑结构3。有穷自动机 (也称有限自动机)作为一种识别装置,它能准确地识别正规集,即识别正规文 法所定义的语言和正规式所表示的集合,引入有穷自动机这个理论,正是为词法 分析程序的自动构造寻找特殊的方法和工具4。NFA转化为DFA的理论在词法构造 至整个编译器构造过程中起着至关重要的作用,同时它们被广泛应用于计算机科 学的各个领域,它们与计算机其它学科也有着密切的联系。2 NFA转化为DF

5、A的算法及实现编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原 理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中 间代码生成、存储管理、代码优化和目标代码生成。进行NFA转换为DFA的词法分 析和语法分析,首先要对目标对象有有所了解,这就需要对NFA、DFA进一步了解。2.1基本定义NFA,也称不确定的有穷自动机,是由一个五元式定义的数学模型,特点是它 的不确定性,即在当前状态下,读入同一个字符,可能有多个下一状态。DFA,也称确定的有穷自动机,也是由一个五元式定义的数学模型,相对的特 点是它的确定性,即在当前状态下,读入同一个字符,最多有一个后继状态。

6、2.1.1 NFA的概念NFA(nondeterministic finite-state automata)即非确定有限自动机, 一个非确定的有限自动机NFA M是一个五元式:NFA M=(S, ZU5,弘 S0, F)其中S一有限状态集ZU3一输入符号加上e ,即自动机的每个结点所射出的弧可以是 Z中一个字符或是e.S0-初态集F一终态集转换函数SxZ Ute 2S(2S -S的幂集一,的子集构成的集合)状态转换图如图2.1.1:0, 1图2.1.1网人状态转换图2.1.2 。田人的概念DFA(deterministic finite-state automata)即确定有限自动机,一个确

7、定 的有限自动机DFA M是一个五元式:M=(S, S,5, S0, Z)其中:S 有限状态集 一输入字母表5 一映射函数(也称状态转换函数)SX一S5(s,a)=S ,S, SES, a*S0 初始状态SO ESZ一终止状态集Z S图2.1.2 DFA状态转换图2.1.3 !1心与。1淀的矩阵表示一个NFA或者DFA还可以用一个矩阵5表示,矩阵也可以说是状态转换表,它 的优点是可以快速访问给定的状态在给定的输入字符时能转换到的状态集。矩 阵,每个状态一行,每个输入符号和(如果有需要的)各占一列,表的第i行中 与输入符号a对应的表项是一个状态集合,表示NFA或者DFA在状态输入。时所 能到达的

8、状态集合(DFA的集合唯一),即 ( i,a )。如图2.1.1可用表2.3.1.表示:如图2.1.2可用表2.3.2表示:表2.3.2 DFA状态转换表输入状态ab0121322133332.1.4 NFA向DFA的转换的思路从NFA的矩阵表示中可以看出,表项通常是一状态的集合,而在DFA的矩阵 表示中,表项是一个状态,NFA到相应的DFA的构造的基本思路是:DFA的每一 个状态对应NFA的一组状态DFA使用它的状态记录在NFA读入一个输入符号后可能达到的所有状态4。2.2 NFA和DFA之间的联系在非确定的有限自动机NFA中,由于某些状态的转移需从若干个可能的后续 状态中进行选择,故一个N

9、FA对符号串的识别就必然是一个试探的过程。这种不 确定性给识别过程带来的反复,无疑会影响到FA的工作效率。而DFA则是确定 的,将NFA转化为DFA将大大提高工作效率,因此将NFA转化为DFA是有其一定必 要的。3 DFA的化简得到新的DFA之后,并没有完成任务,因为通过NFA转化成DFA不一定是最简 的,也就是说,有多余的状态可以被删除,而我们需要的是得到一个唯一的最简 的DFA12,也就是说,NFA转化为DFA之后,还需要化简,也就是最小化。3.1化简的理论基础DFA的化简是指:寻找一个状态数最少的DFA M,使得L(M)=L(M)。 化简的方法是消去DFA M中的多余状态(或无用状态),

10、合并等价状态。DFA中的多余状态是指这样的状态:从开始状态出发,读入任何输入串都不 能到达的那个状态;或者从这个状态没有通路到达终态。两个状态S和T等价是指:如果从状态S出发能读出某个字可而停于终态,从 T出发也能读出同样的字W而停于终态;反之,从T出发能读出同样的字W而停 于终态,从S出发也能读出某个字W而停于终态。3.2化简的基本思想化简DFA的基本思想是指导它的状态分成一些互不相交的子集,每一个子集 中的状态都不是等价的,不同子集中的状态可以由某个输入串来区别,最后将不 能区别的每个子集用一个状态来做代表13-15,这种方法称为“分割法”。具体过程 是:(1)将M的所有状态分成两个子集终

11、态集和非终态集;(2) 考察每一个子集,若发现某子集中的状态不等价,将其划分为两个集合;(3) 重复第(2)步,继续考察已得到的每一个子集,直到没有任何一个子集 需要继续划分为止。这时DFA的状态被分成若干个互不相交的子集。(4) 从每个子集中选出一个状态做代表即可得到最简的DFA。3.3化简的代码实现#include#include#define MAXS 100 using namespace std;string NODE; /结点集合string CHANGE; 终结符集合int N; /NFA 边数struct edge(string first;string change;stri

12、ng 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;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 m

13、ove(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.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+)coutTCHANGEi”;coutendlendl;for(i=

14、0;ih;i+)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.changebi.las

15、t;N=i;/*for(j=0;jN;j+)coutbj.firstbj.changebj.lastendl;*/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所输终态不在集合中,错误! end

16、l;return;/coutendnode=endnodeendl;chan *t=new chanMAXS;t0.ltab=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) /coutt

17、i.jihekendl;for(j=0;jti.jihek.length();j+)eclouse(ti.jihekj,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(田ag&ti.jihej.length()th+.ltab=ti.jihej;coutendl状态转换矩阵如下:endl;outputfa(len,h,t); 输出状态转换矩阵/状态重新命名string *d=ne

18、w stringh;NODE.erase();coutendl重命名:endl;for(i=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

19、+=NODEi;endnode=ednode;coutendlDFA 如下:endl;outputfa(len,h,t); /输出 DFAcout其中终态为: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(

20、)=0)if(tNODE.find(dij).jihek.length()=0)x=m;elsex=n;if(!sta.length()sta+=x+48;elseif(sta0!=x+48)dm+=dij;flag=1;di.erase(j,l);/coutdiendl;j;break; 跳出 n/nif(flag)(m+;flag=O;/coutsta=staendl;sta.erase();/k/icoutendl集合划分:for(i=0;im;i+)coutdicoutendl;状态重新命名chan *md=new chanm;NODE.eraseQ;coutendl重命名:endl;

21、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(diO=tj,ltabO)(for(n=0;nm;n+)(if(!tj.jihek.length()break;elseif(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其中终态为:endnode =rt m=Bt2 =C 345,=D t45=E t4567=Ft45?=GDFH如下!DFfl如下:I II 10ABBCCDDEF EEFFGFGEF其中终态为:fg集合划分: 重命名: =A =B =C =D =E最小化DFn如下=I II 10ACEEEGADDE EDE其中终态为=BE

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号