DFA确定化实验报告.docVIP

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

DFA确定化实验报告 课程设计的目的 通过课程设计进一步理解高级语言在计算机中的执行过程,加深对编译原理中重点算法和编译技术的理解,提高自己的编程能力,培养好的程序设计风格。同时通过某种可视化编程语言的应用,具备初步的Windows环境下的编程思想。掌握子集法,即将NFA转换为与之等价的DFA的算法。 课程设计的内容及要求 通过设计编写和调试将不确定的有穷自动机转换为与之等价的确定的有穷自动机的程序,使学生了解子集法,掌握转换过程中的相关概念和方法。 输入一个NFA 输出与之等价的DFA 实现原理 1、构造数据结构: 1)图的数据结构; 2)转换关系的数据结构。 2、求图的开始节点的ε-closure ,作为子集链表的头节点。然后对其ε-closure 中的每个节点,根据转换关系,求出新的子集,将新求出的子集插入到子集链表的尾部。 构造主要的数据结构: struct diagram { int snum; //节点编号 move *transfer; //转换关系 diagram *next; };//图的数据结构 构造主要的数据结构: struct subset { int snum; //节点编号, char closure[MAX]; //该节点中包含原来 的哪些节点,也就是其ε_closure move *transfer; //来源关系 subset *next; };//子集的数据结构 构造主要的数据结构: struct move{ int point; //来自或转向哪一个节点 char input; //转向条件 move *next; };//存储来源关系 算法实现与流程 (1)读取文件中的数据,组成图的初始链表。通常,用自然语言描述这个阶段的工作是烦琐的,用子集矩阵完成这阶段工作具有直观性和简单性。以下过程将描述用子集矩阵法完成从NFA(图1)到DFA的转化: 先将图1运用子集矩阵法,通过运算得到表1。其中s表示状态,即算法描述中的自己族C;a,b表示输入字符。该阶段,可能存在没有参加运算的状态,这些状态就是不可到达的状态。不可到达过程的运算也可通过图论中的可达性进行检查。 将表1转换矩阵中的所有子集重新命名得到表2 矩阵表示形式: 继而,将表2 用状态转换图描述可得到图2。图2 与图1进行比较可得到:状态数明显减少,并且消除了不确定性。 (2)将图的开始节点加入到其子集节点的closure数组中,调用求ε-closure的子函数求出图开始节点的ε-closure 存储在该子集节点的closure数组中。将该子集作为作为子集链表的头节点。 (3)遍历子集链表,对子集节点中closure数组中的每个元素,对其转换输入中的非ε元素,构造一个新的子集节点,将该输入之后所到达的节点插入新构造的子集节点的closure数组中,调用求ε-closure的子函数求该子集节点的ε-closure ,存储在该子集节点的closure数组中。同时构造构造转换关系节点,将该输入字母和来源节点编号填入该转换节点中,将该转换节点挂在刚才新构造的子集节点上。 (4)将新构造的子集节点插入子集链表中。 求ε-closure:遍历closure数组中的每个元素,如果该元素节点的转换输入(图数据结构)中存在ε,则把输入ε之后能到达的那个节点插入closure 数 组(尾插法)。 1)所有的插入操作,在插入的时候都需要比较即将插入的元素是否已经存在于插入对象中,如果已经存在,则不插入。 2)对于子集的插入,采用尾插法,插入的时候给新的子集编号。比较两个子集是否相同,是比较子集数据结构中的closure数组中的元素是否相同。如个有相同的子集,则只把转换关系节点加入到已有的子集节点的转换关系链表中,不插入该子集节点。 3)由于新的子集是在插入时才获得编号,所以,子集节点中转换关系链表和图中的转换链表有含义有所差别。图中的是目的节点,输入字符;子集中是来源节点,输入字符。 4)为了便于比较closure数组,在每次求完ε-closure之后,有必要对closure数组中的元素进行排序。 测试数据 输入表达式:(a|b)*(aa|bb)(a|b)* 结果输出及分析 软件运行环境及限制 Microsoft Visual C++ 6.0 运行环境。 心得体会 在手动从NFA确定DFA的基础上,将算法用C语言实现出来,加深了求DFA的算法的印象。通过设计编写和调试将不确定的有穷自动机转换为与之等价的确定的有穷自动机的程序,更加了解了其中的算法。

文档评论(0)

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

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

1亿VIP精品文档

相关文档