NFA转化为DFA编译原理试验报告_第1页
NFA转化为DFA编译原理试验报告_第2页
NFA转化为DFA编译原理试验报告_第3页
NFA转化为DFA编译原理试验报告_第4页
NFA转化为DFA编译原理试验报告_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编译原理实验报告实验名称正则表达式与有限自动机院系信息工程学院班 级计算机科学与技术1班学号 2013550336姓 名朱义精品资料一、 实验目的通过本次实验,加深对正则表达式, NFA ,DFA 及其识别的语言的理解二、实验题目编程实现 NFA 确定化为 NFA 的过程三、算法思想1. 一个自动机是一个五元组,分别是 2. 使用子集法的步骤是:1) 将起始状态求闭包,得到 S0 。2) 从 0 开始直到 totss 对每个子集求各个字符所能到达的新子集将其加入 tot+1 子集 中。3) 检查 tot+1 子集是否与之前的子集重合或者为空 ,如果重合或为空则子集不增加。4) 记录新的状态转换

2、函数。3. 根据 NFA 转化为 DFA 的过程一步步模拟进行操作。四、数据结构介绍程序里将 NFA 五元组分别储存在以下数据结构里初态集储存在 int 数组 sta_statumaxs 里 maxs 为元素的最大数终态集储存在 int 数组 end_statumaxs 里字符集储存在 char 数组 chamaxs 里状态储存为 0n-1 ( n 个状态情况)状态转换函数储存于结构 stuct statu 里struct Edge /转化边char cost;/ 消耗int dest;/ 指向的终点;struct statuEdge node50; / 终点int cnt;/ 边的数量sta

3、tu()cnt=0;for(int i=0;i50;i+)nodei.cost=#;nodei.dest=0;sta50;/ 起点五、具体实现使用子集法实现:函数接口解释:void creat_subset(void); 构造子集函数Ins(int a,int ss) 用深搜( dfs )求状态 ss 的闭包,并将闭包里的所有元素加入到子集 closurea 里。void ins_subset(int a,int ss,char target)求状态 ss 通过字符 target 所能到达的所有状态,并将这些状态加入到子集 closurea 里。int check(int tt) 检查子集 c

4、losurett 是否与之前的子集重合, 为空则返回 -2 ,不重合返 回-1,重合则返回重合的子集下标。void print(void) 输出 DFA 的五元组信息。1. 将起始状态求闭包,得到 S0 。将初状态里所有的元素及其能通过 e 空路所到的状态加入 closure0 作为初始子 集for(int i=0;ict_sta_statu;i+)/ 求起始状态求闭包,得到 S0closure0.members.insert(sta_statui);ins(0,sta_statui); / e_closure(s0)2. 从 0 开始直到 totss 对每个子集求各个字符所能到达的新子集将其

5、加入tot+1 子集中。表示当前运算的状态下表for(tempss=0;tempss=totss;tempss+)/tempss totss 表示总共的状态数 新生产的状态子集加入到 closurtot+1 中for(int j=0;jct_cha;j+)for(it=closuretempss.members.begin();it!=closuretempss.members.end();it+)ins_subset(totss+1,*it,chaj);void ins_subset(int a,int beg,char target)/ 求状态 ss 通过字符 target 所能到达的所有

6、 状态,并将这些状态加入到子集 closurea 里。for(int i=0;t;i+)if(stabeg.nodei.cost = target)closurea.members.insert(stabeg.nodei.dest);ins(a,stabeg.nodei.dest);求出这些状态后用 dfs求其能经过&空路所到达的状态也加入 closureareturn ;void ins(int a,int beg)/ 求集合的& 闭包for(int i=0;t;i+)if(stabeg.nodei.cost=#)closurea.members.insert(stabeg.nodei.dest); ins(a,stabeg.nodei.dest);3. 检查 tot+1 子集是否与之前的子集重合或者为空,如果重合或为空则子集不增加int check(int tt)if(closurett.members.empty()return -2;/为空则返回 -2set:iterator isa,isb;for(int i=0;i execution time : 3H.181 s ress any ke to cantinue八、实验总结这次实验

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论