收藏 分享(赏)

DFA的编程实现(含源代码、实验报告).doc

上传人:春华秋实 文档编号:3677631 上传时间:2018-11-15 格式:DOC 页数:14 大小:296.50KB
下载 相关 举报
DFA的编程实现(含源代码、实验报告).doc_第1页
第1页 / 共14页
DFA的编程实现(含源代码、实验报告).doc_第2页
第2页 / 共14页
DFA的编程实现(含源代码、实验报告).doc_第3页
第3页 / 共14页
DFA的编程实现(含源代码、实验报告).doc_第4页
第4页 / 共14页
亲,该文档总共14页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、实验一(一)程序设计语言及其编译器实现概览(2 小时)实验目的:学习一门简单的程序设计语言的定义及其编译器实现实验任务:针对一门简单的程序设计语言,阅读其定义文档,初步了解其编译器的源代码。实验内容:(1)选择一门语言:TINY 或其它语言也可(需自备其编译器的源代码) 。(2)阅读其定义文档,了解语言定义的方法,包括:词法、语法、语义、运行时环境、目标机器、目标语言等内容。(3)了解其编译器源代码。 对 TINY 语言编译器,其源代码由多个文件组成,请弄清楚每个文件的作用是什么。详情请见编译原理及实践第 1.7 节。请做一个 C+工程文件(Win32 Console Application,

2、 tiny.dsp) ,把它们组织起来,然后编译成可执行文件(tiny.exe),即为TINY 语言编译器。然后用它编译 TINY 语言示例源代码 (sample.tny)。看看编译生成的目标文件(sample.tm)是怎样的。要运行目标程序,还需要一个虚拟机,名为 TM 机。TM 机是以软件形式存在的,其源代码为 tm.c,需要编译生成可执行文件 tm.exe。然后将目标程序作为 TM 机的输入运行 TM 机即可得到所期待的结果。要求读懂main.c、globals.h、util.h、scan.h 和 util.c、scan.c 等文件,三人一组进行讨论,给每一行加上注释,总结你们各自对程序

3、的理解和阅读程序的收获,每组提交 1 份加了注释的文件和心得。有能力的同学可加上 tm.c。实验一(二)DFA 的编程实现(2 小时)实验目的:通过本次实验,加深对 DFA 及其识别的语言的理解,学习对一般的 DFA 的表达方法与编程实现方法。实验任务:编写一个 C 语言程序,模拟实现 DFA 识别字符串的过程。实验内容:(1)DFA 的输入;(2)DFA 的存储与读写;(3)DFA 的正确性检查;(4)DFA 的语言集列表显示;(5)DFA 的规则字符串判定;内容说明:(1)DFA 的输入:分别输入 DFA 的“字符集” 、 “状态集” 、 “开始状态” 、 “接受状态集” 、 “状态转换表

4、”等内容,并保存在设定的变量中。(2)DFA 的存储与读写:将上述 DFA 的五元组保存在一个文本文件中,扩展名指定为.dfa 。请自行设计 DFA文件的存储格式,并说明其含义。能将保存在内存变量中的 DFA 写入 DFA 文件,也能将DFA 文件读入内存中。 (思考:对稀疏 DFA(转换表中为空的地方较多)或用 “或”表达转换的 DFA(如下的测试用例三) ,如何改进 DFA 转换表的表达。 )(3)DFA 的正确性检查:检查所有集合的元素的唯一性。检查“开始状态”是否唯一,并是否包含在“状态集”中。检查“接受状态集”是否为空,并是否包含在“状态集”中。检查“状态转换表”是否满足 DFA 的

5、要求。检查“状态转换表”并非填满时的处理是否得当(4)DFA 的语言集列表显示:输入待显示的字符串的最大长度 N,输出以上定义的 DFA 的语言集中长度N 的所有规则字符串。 (提示:注意算法中 while 循环的次数)(5)DFA 的规则字符串判定:输入(或用字符集随机生成)一个字符串,模拟 DFA 识别字符串的过程判定该字符串是否是规则字符串(属于 DFA 的语言集) 。测试用例:DFA(一)DFA(二)DFA(三)实验要求:按照编译原理及实践参考书第二章中描述的“while 循环+双层 case 选择”的算法编程实现一般的 DFA。要求能通过以上三个测试用例的测试。完成内容中(1) (5

6、)部分,可得 C。完成内容中(1) (2) (5)部分,可得 B。完成内容中(1) (2) (4) (5)部分,可得 A。完成全部内容,可得奖励。判定算法概要:准备:开始状态 s0, 接受状态集 F, 状态转换表 T(s, c), sS, cc = getchar();s = 开始状态 s0;while ( c != EOF ) / 输入未结束则循环s = T(s, c);if (s = NULL)error();c = getchar();if (s 接受状态集 F)accept ();elseerror ();通用 DFA 存储格式的建议:(用以上的第三个测试 DFA 为例)3 / 字符集

7、中的字符个数 (以下两行也可合并成一行)/ * o / 以空格分隔的字符集。O 代表任意非/和*的字符5 / 状态个数 (以下两行也可合并成一行)1 2 3 4 5 / 状态编号。若约定总是用从 1 开始的连续数字表示,则此行可省略1 / 开始状态的编号。若约定为 1,则此行可省略1 / 结束状态个数。若约定为 1,则此行可省略5 / 结束状态的编号2 -1 -1 / 状态 1 的所有出去的转换。按字符集中的字符顺序给出。-1 表示出错状态-1 3 -13 4 35 4 3-1 -1 -1实验报告:同时上交纸质报告与电子版报告。纸质报告以实验分析、实验中遇到的问题及解决方法、实验测试(含屏幕截

8、图) 、实验心得等为主,不得大量引用源程序(引用源程序总行数不得超过 100 行) 。电子版报告以源程序、测试用例、输出文件等为主,包括纸质报告的电子版,须确保提并的源程序能编译运行,否则不要上交。电子版请发送到,邮件标题请写明学号、姓名与实验编号,形如: 。不得抄袭实验报告与源程序,否则后果自负!提高内容:(1)图形化的用户界面;(2)任意 DFA 的状态转换图、状态转换表的图形绘制;附实验报告 源码实验一 DFA 的编程实现实验目的:通过本次实验,加深对 DFA 及其识别的语言的理解,学习对一般的 DFA 的表达方法与编程实现方法。实验任务:编写一个 C 语言程序,模拟实现 DFA 识别字

9、符串的过程。实验内容:(1)DFA 的输入;(2)DFA 的存储与读写;(3)DFA 的正确性检查;(4)DFA 的语言集列表显示;(5)DFA 的规则字符串判定;实验分析:DFA 的初始化一个 DFA 的基本信息 状态集、字符集、开始状态、结束状态集、状态转换表;在程序中状态集、字符集、开始状态、结束状态集都用 string 类型来表示,即可不用考虑用户输入内容的长度。但缺点是字符集只能是字符而不可以是字符串。状态转换表:为三个字符的字符串,第一个为当前状态,第二个为输入字符,第三个为下一状态。 用 vector 容器存放转换函数的内容字符串判断初始化一个 DFA,后可以通过一下算法判断一个

10、字符串是否符合该 DFA。判定算法概要:准备:开始状态 s0, 接受状态集 F, 状态转换表 T(s, c), sS, cc = getchar();s = 开始状态 s0;while ( c != EOF ) / 输入未结束则循环s = T(s, c);if (s = NULL)error();c = getchar();if (s 接受状态集 F)accept ();elseerror ();在实际编写代码中的体现为void identify() /判断字符串coutstr;int i=0;char present=StartStates;while(i容器存储即可;实验用例:实验结果:D

11、FA的初始化判断字符串:显示小于N的语言集:读取DFA 文件:实验总结:在这次实验中,学习对一般的 DFA 的表达方法与编程实现方法。对课本提供的算法有了更深刻的认识。在编写和调试代码的过程中对自身的编程能力也有了很大的提高。对自动机和其识别语言有了更透彻的理解。在动手编程之前一定要好好明确实验的理论准备和思路的理清,能帮助我们在实验过程中少走更多的弯路。总之在这次实验中收获很多,提高了动手能力和分析问题的能力。源代码:/构造一个DFA#include#include#include#includeusing namespace std;class TransitionTablepublic:

12、char present; /当前状态char next; /下一状态char input; /输入字符TransitionTable(char P,char I,char D)present=P;next=D;input=I;class DFApublic:DFA()coutselect;if(select=1)inti();if(select=2)read();string States; /状态集char StartStates; /开始状态string FinalStates; /结束状态集string Alphabet; /字符集vector Trans; /转换函数void int

13、i() /初始化自动机coutStates;coutAlphabet;coutinput;if(strcmp(input,“#“)=0)break;TransitionTable Temp(input0,input1,input2);Trans.push_back(Temp);coutStartStates;coutFinalStates;void identify() /识别字符串coutstr;int i=0;char present=StartStates;while(iN;example.Traversal(example.StartStates,N);example.write();system(“pause“);return 0;/*测试用例输入状态转换表0a10b21b22a11a32b33a33b3#0a10b22a11b21a32b53a35b53b45a66b44a66a34b5*/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 规范标准 > 实验

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报