NFA转化为DFA编译原理实验报告.docxVIP

  • 195
  • 0
  • 约3.72千字
  • 约 8页
  • 2016-08-21 发布于湖北
  • 举报
NFA转化为DFA编译原理实验报告

编译原理实验报告实验名称 正则表达式与有限自动机院 系 信息工程学院 班 级 计算机科学与技术1班 学 号 2013550336 姓 名 朱义 实验目的通过本次实验,加深对正则表达式,NFA,DFA及其识别的语言的理解二、实验题目编程实现NFA确定化为NFA的过程算法思想一个自动机是一个五元组,分别是状态集,符号集,f函数,起始状态,终止状态使用子集法的步骤是:将起始状态求闭包,得到S0。从0开始直到totss对每个子集求各个字符所能到达的新子集将其加入tot+1子集中。检查tot+1子集是否与之前的子集重合或者为空,如果重合或为空则子集不增加。记录新的状态转换函数。3. 根据NFA转化为DFA的过程一步步模拟进行操作。数据结构介绍程序里将NFA五元组分别储存在以下数据结构里初态集储存在 int数组 sta_statu[maxs]里 maxs为元素的最大数终态集储存在 int数组 end_statu[maxs]里字符集储存在 char数组 cha[maxs]里状态储存为0~n-1(n个状态情况)状态转换函数储存于结构 stuct statu里struct Edge{ //转化边 char cost; //消耗 int dest; //指向的终点};struct statu { Edge node[50]; // 终点 int cnt;//边的数量 statu() { cnt=0; for(int i=0;i50;i++) {node[i].cost=#; node[i].dest=0;} }}sta[50];//起点具体实现使用子集法实现:函数接口解释: void creat_subset(void); 构造子集函数 Ins(int a,int ss) 用深搜(dfs)求状态ss的闭包,并将闭包里的所有元素加入到子集closure[a]里。void ins_subset(int a,int ss,char target) 求状态ss通过字符target所能到达的所有状态,并将这些状态加入到子集closure[a]里。int check(int tt) 检查子集closure[tt]是否与之前的子集重合,为空则返回-2,不重合返回-1,重合则返回重合的子集下标。void print(void) 输出DFA的五元组信息。 1.将起始状态求闭包,得到S0。 将初状态里所有的元素及其能通过e空路所到的状态加入closure[0]作为初始子集for(int i=0;ict_sta_statu;i++) // 求起始状态求闭包,得到S0 { closure[0].members.insert(sta_statu[i]); ins(0,sta_statu[i]); } // e_closure(s0)2.从0开始直到totss对每个子集求各个字符所能到达的新子集将其加入tot+1子集中。for(tempss=0;tempss=totss;tempss++)//tempss 表示当前运算的状态下表 totss表示总共的状态数 新生产的状态子集加入到 closur[tot+1]中 { for(int j=0;jct_cha;j++) for(it=closure[tempss].members.begin();it!=closure[tempss].members.end();it++) { ins_subset(totss+1,*it,cha[j]); }}void ins_subset(int a,int beg,char target)// 求状态ss通过字符target所能到达的所有状态,并将这些状态加入到子集closure[a]里。{ for(int i=0;ista[beg].cnt;i++) { if(sta[beg].node[i].cost == target) { closure[a].members.insert(sta[beg].node[i].dest); ins(a,sta[beg].node[i].dest);//求出这些状态后用dfs求其能经过ε空路所到达的状态也加入closure[a]

文档评论(0)

1亿VIP精品文档

相关文档