




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程设计报告书课程设计报告书设计名称: nfa 转化为 dfa 的转换算法及实现 课程名称: 编 译 原 理 学生姓名: 专 业: ) 班 别: 学 号: 指导老师: 日 期: 2013 年 7 月 5 日2目目 录录目目 录录.21 1 前言前言.31.1 选题的依据和必要性选题的依据和必要性 .31.2 课题意义课题意义 .32 nfanfa 转化为转化为 dfadfa 的算法及实现的算法及实现.32.1 基本定义基本定义 .32.1.2 dfa的概念的概念.42.1.3 nfa与与dfa的矩阵表示的矩阵表示.52.1.4 nfa向向dfa的转换的思路的转换的思路.63 dfa 的化简的化
2、简.63.1 化简的理论基础化简的理论基础 .63.23.2 化简的基本思想化简的基本思想 .74 4 程序设计程序设计.74.14.1 程序分析程序分析 .74.1.14.1.1 流程图流程图.74.1.24.1.2 子集构造法子集构造法.94.2 实现代码实现代码 .1131 1 . .前言前言1.1 选题的依据和必要性选题的依据和必要性由于很多计算机系统都配有多个高级语言的编译程序,对有些高级语言甚至配置了几个不同性质的编译程序。从功能上看,一个编译程序就是一个语言翻译程序。语言翻译程序把源语言书写的程序翻译成目标语言的等价程序。经过编译程序的设计可以大大提高学生的编程能力。编译程序的工
3、作过程通常是词法分析、语法分析、语义分析、代码生成、代码优化1。由于现在有很多词法分析程序工具都是基于有穷自动机的,而词法分析又是语法分析的基础2,所以我们有必要进行有穷自动机的确定化和最小化。1.2 课题意义课题意义编译程序的这些过程的执行先后构成了编译程序的逻辑结构3。有穷自动机(也称有限自动机)作为一种识别装置,它能准确地识别正规集,即识别正规文法所定义的语言和正规式所表示的集合,引入有穷自动机这个理论,正是为词法分析程序的自动构造寻找特殊的方法和工具4。nfa转化为dfa的理论在词法构造至整个编译器构造过程中起着至关重要的作用,同时它们被广泛应用于计算机科学的各个领域,它们与计算机其它
4、学科也有着密切的联系。2 nfanfa转化为转化为dfadfa的算法及实现的算法及实现编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。进行nfa转换为dfa的词法分析和语法分析,首先要对目标对象有有所了解,这就需要对nfa、dfa进一步了解。2.1 基本定义基本定义nfa,也称不确定的有穷自动机,是由一个五元式定义的数学模型,特点是它的不确定性,即在当前状态下,读入同一个字符,可能有多个下一状态。4dfa,也称确定的有穷自动机,也是由一个五元式定义的数学模型,相
5、对的特点是它的确定性,即在当前状态下,读入同一个字符,最多有一个后继状态。2.1.1nfa 的概念的概念 nfa(nondeterministic finite-state automata)即非确定有限自动机, 一个非确定的有限自动机 nfa m是一个五元式: nfa m=(s, , , s0, f)其中 s有限状态集 s0初态集 f终态集 转换函数 s 2s (2s -s 的幂集s 的子集构成的集合)状态转换图如图2.1.1:11 010,1图图2.1.1 nfa状态转换图状态转换图2.1.2 dfa的概念的概念dfa(deterministic finite-state automata
6、)即确定有限自动机,一个确定的有限自动机 dfa m 是一个五元式: m=(s, ,, s0, z) 其中: s 有限状态集 输入字母表 映射函数(也称状态转换函数) zsp5 ss (s,a)=s , s, s s, a s0 初始状态 s0 s z终止状态集 zsp zppaababba,b图图2.1.2 dfa状态转换图状态转换图2.1.3 nfa与与dfa的矩阵表示的矩阵表示一个nfa或者dfa还可以用一个矩阵5表示,矩阵也可以说是状态转换表,它的优点是可以快速访问给定的状态在给定的输入字符时能转换到的状态集。矩阵,每个状态一行,每个输入符号和(如果有需要的)各占一列,表的第i行中与输
7、入符号a对应的表项是一个状态集合,表示nfa或者dfa在状态i输入a时所能到达的状态集合(dfa的集合唯一) ,即(i,a)6。 (7)如图2.1.1可用表2.3.1.表示:表表2.3.12.3.1 nfanfa状态转换表状态转换表 输入状态01sps,zpzzpp 如图2.1.2可用表2.3.2表示:表表2.3.22.3.2 dfadfa状态转换表状态转换表6 输入状态ab0121322133332.1.4 nfa向向dfa的转换的思路的转换的思路从nfa的矩阵表示中可以看出,表项通常是一状态的集合,而在dfa的矩阵表示中,表项是一个状态,nfa到相应的dfa的构造的基本思路是:dfa的每一
8、个状态对应nfa的一组状态dfa使用它的状态记录在nfa读入一个输入符号后可能达到的所有状态4。2.2 nfa 和和 dfa 之间的联系之间的联系在非确定的有限自动机 nfa 中,由于某些状态的转移需从若干个可能的后续状态中进行选择,故一个 nfa 对符号串的识别就必然是一个试探的过程。这种不确定性给识别过程带来的反复,无疑会影响到 fa 的工作效率。而 dfa 则是确定的,将 nfa 转化为 dfa 将大大提高工作效率,因此将 nfa 转化为 dfa 是有其一定必要的。3 dfa的化简的化简得到新的dfa之后,并没有完成任务,因为通过nfa转化成dfa不一定是最简的,也就是说,有多余的状态可
9、以被删除,而我们需要的是得到一个唯一的最简的dfa12,也就是说,nfa转化为dfa之后,还需要化简,也就是最小化。3.13.1 化简的理论基础化简的理论基础dfa的化简是指:寻找一个状态数最少的dfa m,使得l(m)=l(m) 。化简的方法是消去dfa m中的多余状态(或无用状态) ,合并等价状态。dfa中的多余状态是指这样的状态:从开始状态出发,读入任何输入串都不能到达的那个状态;或者从这个状态没有通路到达终态。7两个状态s 和t等价是指:如果从状态s出发能读出某个字w而停于终态,从t出发也能读出同样的字w而停于终态;反之,从t出发能读出同样的字w而停于终态,从s出发也能读出某个字w而停
10、于终态。3.23.2 化简的基本思想化简的基本思想化简dfa的基本思想是指导它的状态分成一些互不相交的子集,每一个子集中的状态都不是等价的,不同子集中的状态可以由某个输入串来区别,最后将不能区别的每个子集用一个状态来做代表13-15,这种方法称为“分割法”。具体过程是:(1)将m的所有状态分成两个子集终态集和非终态集;(2)考察每一个子集,若发现某子集中的状态不等价,将其划分为两个集合;(3)重复第(2)步,继续考察已得到的每一个子集,直到没有任何一个子集需要继续划分为止。这时dfa的状态被分成若干个互不相交的子集。(4)从每个子集中选出一个状态做代表即可得到最简的dfa。4 4 程序设计程序
11、设计通过本设计所要求达到的目的是:充分理解和掌握nfa,dfa以及nfa确定化过程的相关概念和知识,理解和掌握子集法的相关知识和应用,现在需要编程16-18实现对输入nfa转换成dfa输出的功能。4.14.1 程序分析程序分析4.1.14.1.1 流程图流程图程序总框图如图4.1所示: 8总模块nfa 图结构状态转换表dfa 图结构初始化状态转换矩阵状态转换操作图图4.1 .1 程序总框图程序总框图开始输入 nfa,初始化nfa初步转化为 dfa结束重命名化简9 图图4.1.2 功能图功能图4.1.24.1.2 子集构造法子集构造法已证明:非确定的有限自动机与确定的有限自动机从功能上来说是等价
12、的,也就是说,我们能够从:nfa m dfa m使得 l(m)=l(m)为了使得 nfa 确定化,我们首先给出两个定义:定义 1:集合 i 的 -闭包:令 i 是一个状态集的子集,定义 -closure(i)为:1)若 si,则 s-closure(i) ;2)若 si,则从 s 出发经过任意条 弧能够到达的任何 状态都属于 -closure(i) 。 状态集 -closure(i)称为 i 的 -闭包定义 2:令 i 是 nfa m的状态集的一个子集, a 定义: ia=-closure(j) 其中 j = (s,a)j 是从状态子集 i 中的每个状态出发,经过标记为 a 的弧而达到的状态集
13、合。ia 是状态子集,其元素为 j 中的状态,加上从 j 中每一个状态出发通过 弧到达的状态。给定如图 2 所示的 nfa:10bbaab0123 4图 4.1.3与之等价的 dfa 如图 3:bab0,12,443a图 4.1.411开始求开始状态闭包标记令它为集合 c 中的唯一成员集合 c 中存在尚未被标记子集标记对子集中的每个输入字母求a 子集将加入中结束语是否图图4.1.5 子集构造法的流程图子集构造法的流程图这样就完成了从正规表达式 101(0|1)*011 到 dfa 的转化。4.2 实现代码实现代码#include#include#define maxs 100using nam
14、espace std;string node; /结点集合string change; /终结符集合12int n; /nfa 边数struct edgestring first;string change;string last;struct chanstring 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;
15、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);13void 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.jihem.length()he.jihem+=bj.last0; for(i=0;il;i+)for(j=0;jhe.jihem.length()
16、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();coutti.jihej;coutendl;void main()edge *b=new edgemaxs;int i,j,k,m,n,h,x,y,len;bool flag;
17、string jhmaxs,endnode,ednode,sta;cout请输入 nfa 各边信息(起点 条件空为* 终点) ,以#结束:endl;14for(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.length()node+=bi.first;if(node.find(bi.last)node.length()node+=bi.last;if(change.find(bi.change)
18、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.ltab=b0.first;h=1;eclouse(b0.first0,t0.ltab,b); /求 e-clouse/coutt0.ltabendl;for(i=0;ih;i+) for(j=0;jti.lt
19、ab.length();j+)for(m=0;mlen;m+)eclouse(ti.ltabj,ti.jihem,b); /求 e-clousefor(k=0;klen;k+)/coutti.jihek;move(ti,k,b); /求 move(i,a)/coutti.jihekendl;for(j=0;jti.jihek.length();j+)15eclouse(ti.jihekj,ti.jihek,b); /求 e-clousefor(j=0;jlen;j+)paixu(ti.jihej); /对集合排序以便比较for(k=0;kh;k+)flag=operator=(tk.ltab,
20、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(); ti.ltab=a+i;node+=ti.ltab;coutsta=ti.ltabendl;for(j=0;jendnode.length();j+)
21、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); /输出 dfacout其中终态为:endnodeendl;/dfa 最小化16m=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(dij).jihek.leng
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中传染病知识培训总结课件
- 二手房买卖合同签订注意事项及房产交易税费解析
- 简明电商法规第三章下的电商消费者权益保护合同
- 民俗风情画册设计制作与地方特色推广合同
- 住宅小区车位租赁合同提前解除及费用退还协议
- 离异双方子女抚养费增加协议
- 针对五年期进口铁矿的海运及分销服务合同
- 考研调剂咨询服务协议
- 髋关节影像课件
- 服装制作细节规范手册
- 2025年工会入职考试试题及答案
- 旅游服务安全知识培训课件
- 公司章程制定合同协议书范本模板
- 软件著作权无偿转让合同5篇
- 2025年公安警种知识测试题及答案
- 抵押车贷合同(标准版)
- 2025年秋季学期教科版三年级上册科学教学计划(三篇)
- 2024人教PEP版三年级英语上册全册教案
- 机械制图(第五版)全套课件
- 人卫慕课《走进肺功能》试题答案
- 针刺伤的预防及处理(课堂PPT)
评论
0/150
提交评论