编译实验三(nfa转换成dfa和dfa化简).docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译实验三(nfa转换成dfa和dfa化简)

实验三(一)NFA(DFA(2小时) 一. 问题描述 NFA(DFA。 1. 实验目的:学会编程实现子集构造法。 2. 实验任务:存储NFA与DFA,编程实现子集构造法将NFA转换成DFA。 3. 实验内容:(1)确定NFA与DFA的存储格式,为3个以上测试NFA准备好存储文件。(2)用C或JAVA语言编写将NFA转换成DFA的子集构造法的程序。(3)经测试无误。测试不易。可求出NFA与DFA的语言集合的某个子集(如长度小于某个N),再证实两个语言集合完全相同!(4)测试用例参考:将下列语言用RE表示,再转换成NFA使用: (a) 以a开头和结尾的小字字母串;a (a|b|…|z)*a | a (b) 不包含三个连续的b的,由字母a与b组成的字符串;(( | b | bb) (a | ab | abb)* (c) (aa|b)*(a|bb)* 二.算法描述 NFA的输入: 分别输入NFA的“字符集”、“状态集”、“开始状态”、“接受状态集”、“状态转换表”等内容,并保存在设定的变量中。 NFA的存储与读写: 将上述NFA的五元组保存在一个文本文件中。存储格式如下所示(以下图中NFA为例): 2 // 字符集中的字符个数 (以下两行也可合并成一行) a b // 以空格分隔的字符集。 4 // 状态个数 (以下两行也可合并成一行) 1 2 3 4 // 状态编号。若约定总是用从1开始的连续数字表示,则此行可省略 1 // 开始状态的编号。若约定为1,则此行可省略 1 // 结束状态个数。若约定为1,则此行可省略 3 // 结束状态的编号 3 2 1 // 状态1的所有出去的转换。按字符集中的字符顺序给出,并在最左边加上一列关于(的转换。-1表示出错状态。多个状态用逗号分隔。 -1 1 -1 -1 3 4 -1 -1 3 基本算法描述 存储格式如上所示,程序开始时,从文件中读取数据以获得NFA中的各种信息。根据子集构造法,构造相应的函数。 子集构造法伪代码如下: 初始时,?ε-closure(S0)?是?Dstates?中唯一的状态且未被标记;? while?Dstates?中存在一个未标记的状态T?do?begin? 标记T;? ????for?每个输入符号?a?do?begin? U?:=??ε-closure?(?move??(T,?a)?);? if?U?没在Dstates中?then? 将U作为一个未被标记的状态添加到?Dstates.? Dtran?[?T,?a?]?:=?U? end? end ε-closure?的计算 将T中所有状态压入栈stack;? 将ε-closure?(T)?初始化为T;? while??stack不空?do?begin? 将栈顶元素t弹出栈;? ????for?每个这样的状态u:从t到u有一条标记为?ε的边do??????? ?if?u?不在ε-closure?(?T?)中?do?begin???????? 将u?添加到ε-closure?(?T?); 将u压入栈stack中????? end? end 子集构造法的流程图: 实验三(二)DFA化简(2小时) 一. 问题描述 DFA化简 实验目的:学会编程实现等价划分法化简DFA。 实验任务:先完善DFA,再化简DFA。 实验内容: (1)准备3个以上测试DFA文件。 (2)DFA手动完善。(状态转换映射要是满映射) (3)用C或JAVA语言编写用等价划分法化简DFA的程序。 (4)经测试无误。测试不易。可求出两个DFA的语言集合的某个子集(如长度小于某个N),再证实两个语言集合完全相同! (5)编写实验报告。要求同实验一,不再详述。 二.算法描述 1.?DFA的化简? 得到新的DFA之后,并没有完成任务,因为通过NFA转化成DFA不一定是最简的,也就是说,有多余的状态可以被删除,而我们需要的是得到一个唯一的最简的DFA[12],也就是说,NFA转化为DFA之后,还需要化简,也就是最小化。?? 2.化简的理论基础? DFA的化简是指:寻找一个状态数最少的DFA??M,使得L(M)=L(M’)。化简的方法是消去DFA??M中的多余状态(或无用状态),合并等价状态。? DFA中的多余状态是指这样的状态:从开始状态出发,读入任何输入串都不能到达的那个状态;或者从这个状态没有通路到达终态。? 两个状态S?和T等价是指:如果从状态S出发能读出某个字W而停于终态,从T出发也能读出同样的字W而停于终态;反之,从T出发能读出同样的字W而停于终态,从S出发也能读出某个字W而停于终态。?? 3.化简的基本思想? 化简DFA的基本思想是指导它的状态分成一些互不相交的子集,每一个子集中的状态都不是等价的,不同子集中的状态可以由某个输入串

文档评论(0)

celkhn5460 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档