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