子集构造法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
编译原理
课程名称
子集构造法
题目
信息与控制工程学院
院(系)
专业班级
姓名
学号
叶娜
指导教师
2017年 4 月 30 日
。
目录
一、实验目的 (2)
二、实验要求、内容 (2)
三、实验设备 (2)
四、实验原理及步骤 (2)
五、程序源代码 (4)
六、存在的问题及体会 (5)
精选资料,欢迎下载
。
一、实验目的
掌握将非确定有限自动机确定化的方法和过程
二、实验要求、内容
实验要求:
1.输入一个NFA,输出一个接受同一正规集的DFA
2.采用C++语言,实现该算法
3.编制测试程序
4.调试程序
实验步骤:
1. NFA关系图
2. 通过一个转换算法将NFA转换为DFA
3. 显示DFA关系图
三、实验设备
开发系统:Windows 10
开发工具:Visual Studio 2013
四、实验原理及步骤
1、NFA与DFA之间的联系
将NFA转换成等价的DFA的基本思想是让DFA的每一个状态对应NFA的一组状态,也就是说让DFA使用它的状态去记录在NFA读入一个输入符号后可能达到的所有状态,在读入输入符号之后,DFA处在a1a2......an那样一个状态,该状
精选资料,欢迎下载
。
精选资料,欢迎下载
态表示这个NFA 的状态的一个子集T ,T 是从NFA 的开始状态沿着某个标记为a1a2......an 可以达到的那些状态构成的。
2、 DFA 的化简
得到新的DFA 之后,并没有完成任务,因为通过NFA 转化成DFA 不一定是最简单的,即有多余的状态可以删除,即NFA 转换成DFA 之后,还需要化简,确定化。化简DFA 的基本思想是将它的状态分成一些互不相交的子集,每一个子集中的状态都不是等价的,不同子集中的状态可以由某个输入串来区别,最后将不能区别的每个子集用一个状态来做代表,具体方法如下:
(1)将M 的所有状态分成两个子集,即终态集和非终态集;
(2)考察每一个子集,若发现某子集中的状态不等价,将其划分为两个集合; (3)重复第(2)步,继续考察一得到的每一个子集,直到没有任何一个子集需要继续划分为止。此时DFA 的状态被分为若干个互不相交的子集;
(4)从每个子集中选出一个状态做代表即可得到最简的DFA 。
3、流程图
总模块NFA 图结构
状态转换表
DFA 图结构
初始化状态转
换矩阵
状态转换操作
图3-1程序总框图
。
开始
输入NFA,初
始化NFA
初步转化为DFA
重命名化简
结束
图4-2 功能图五、程序源代码
部分代码:
void child_method()
{
int m,n;
for(m=0;m<100;m++)
for(n=0;n<100;n++)
Dtran[m][n]='#';
for(m=0;m<100;m++)
DFA[m].flag=-1;
State S0,U;
S0.flag=0;
S0.count=1;
S0.H[0]=first;
State T;
T=closure(S0);
精选资料,欢迎下载
。
T.mark=0;
T.flag=0;
DFA[numof_Dtran++]=T;
memset(useof_DFA,0,sizeof(useof_DFA));
int j=check_inDFA();
int k;
while(j!=-1)
{
useof_DFA[j]=1;
for(k=0;k { U=closure(move(DFA[j],alpha[k])); //if U不在DFA中 if(!check_whetherin_DFA(U)) { U.mark=numof_Dtran; DFA[numof_Dtran++]=U; } Dtran[DFA[j].mark][U.mark]=alpha[k]; } j=check_inDFA(); } } 六、存在的问题及体会 虽然在此之前学习了很多的编程语言,但是对于编程还不是那么熟练。对于此次的编译原理实验,要求用子集构造法来求NFA转换为DFA的算法实现,由于在课上对于本节的知识点掌握的也只是表面,因而要用算法来实现对于我来说还是有些困难。对于此次的程序首先需要实现NFA转换为DFA,其次就是NFA的确定化。这两方面的实现都是有些难度,起初对于程序的实现毫无头绪,之后在同 精选资料,欢迎下载 。 学与老师的讲解下有了相应的了解,然后再在网上查阅相关资料以及相关程序算法的博客,向同学请教,解读别人的算法,加深自己的理解。经过长时间的调试之后,该程序终于得以成功实现。 经过此次的实验,更加加深了我对子集构造法NFA转换DFA相关算法的理解,也更加深刻地认识到上机实践的重要作用,同时使我对编译原理课程的进一步理解,理论与实践结合对于软件开发学习的重要性。 精选资料,欢迎下载