【编译原理】DFA的生成与字符串的识别.docVIP

【编译原理】DFA的生成与字符串的识别.doc

  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文档。上传文档
查看更多
PAGE PAGE 22 实 验 报 告 实验项目列表 序号 实验项目名称 成绩 01 DFA的生成与字符串的识别 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 总评成绩: 教员签字: 实验名称 DFA的生成与字符串的识别 二、实验目的 1.掌握正规文法与FA之间的转换; 2.掌握通过DFA识别字符串的具体操作过程。 三、实验内容和要求 程序A (1)输入输出 输入:正规文法 输出:FA (2)具体功能 本程序的具体功能包括以下两项: 1)输入正规文法,并构造其等价的FA; 2)对构造出的FA进行判断:是NFA晒是DFA。 程序B (1)输入输出 输入:DFA,字符串 输出:字符串的DFA识别过程(状态转换轨迹)及错误信息或成功识别信息。 (2)具体功能 本程序的具体功能包括以下4项: 1)输入DFA; 2)输入一个字符串; 3)对输入的字符串用DFA进行识别,并输出识别的过程(DFA状态转换轨迹); 4)若DFA成功识别(输入串结束时到达某终态),则给出成功识别的信息。若字符串不能为DFA所识别(在某状态下遇某输入符不能进行正常的状态转换),则给出错误信息并结束程序的运行。 四、实验环境 1.硬件环境:PC机 2.软件环境:Windows操作系统,VC++集成开发环境 五、算法设计思想 对于程序A,首先考虑的是正规文法的存储。根据情况可以将左右部分开存储,也可采用结构体的方式,将一个文法存储在一个结构体节点里。本程序采用了前者。将每个正规文法的左部存储在x[]字符组里,右部的终结符存储在y[]中。在用户输入了正规文法之后,分别考虑两种情况:1.右部只有一个终结符;2.右部有一个终结符和一个非终结符。根据两种情况分别对文法做如下存储:情况一在z[]里存入默认的终态‘Z’;情况二在z[]里存储右部的非终结符。 然后,为了使结果一目了然,设计者采用简易表格输出了对应FA的初态,终态,状态集,字母表等主要信息。在最后将文法的格式转化成状态矩阵的格式,并输出相应表格。 最后,对输入文法本身进行了判断:若存在某一产生式左部和右部终结符均相同,但右部非终结符不同的情况,则输入文法所对应的FA为NFA;反之,若不存在这样的情况则为DFA。 对于程序B,根据需要采用了结构体的存储方式。DAF[].A用于存储当前状态,DAF[].B用于存储输入符,DAF[].C用于存储后继状态。变量start用于存储当前状态量,outstr[]存储已识别通过的状态。开始识别时,读入一个字符,采用顺序查找的方法找到与当前状态和输入符均符合的结点,将此时的DAF[].C赋值给start,并存入输出字串outstr[]。然后循环。若某次查找无法找到对应的后继状态,报错。当查找到终态时,若此时字串也读取完毕则识别成功,若不然则继续。若字串读取完毕而未到终态,报错。 六、主要问题与解决方法 问题一:对于程序A,当输出状态集和字母表时会出现重复的元素,因此重新使用了字符数组xx[],yy[],zz[]来重新存储需要输出的元素,使输出的字符不重复。 问题二:对于表格的制作与输出,采用了光标控制的方法。运用gotoxy函数解决了按行和按字符位从左到右的输入局限性,能灵活的控制输入的位置,界面更加友好。 七、实验结果 按照实验的要求,程序A实现了正规文法到有穷自动机的转换,输出的FA信息较为详细,表格化的输出方式能够让用户清晰的得到自己需要的信息。最后能够准确给出有穷自动机类型的判断,且整个用户界面友好美观。 程序B实现了输入DFA的存储以及字符串的识别功能,并能够给出识别的状态转换轨迹。程序使用方法较为简便。 以下是程序的用户运行界面截图: 程序A运行界面: 程序B运行界面: 八、体会、质疑、建议 本次实验帮助编写者巩固了关于状态集、初态、终态字母表等基本术语的概念,对实验者熟练掌握正规文法与FA的相互转换、词法分析的基本流程等课堂知识起到了很好的实践作用。对于整个程序的编写也锻炼了程序编写者将算法思想转化为程序代码的能力。 本次实验是编译原理课程的第一次实验。课程本身是具有一定难度的,实验的过程使得实验者对课堂上一些晦涩难懂的知识点得到了更好的理解,并且锻炼了编程能力,积累了一定的实践经验,希望编译原理课程能够安排更多的实验课程。 九、源代码 程序A代码: #includestdio.h #includestdlib.h #includestring.h #includeiostream.h #includewindows.h//用以删除多余的中间文件 #define M 10 void gotoxy(int x,int y){ COORD coo

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档