ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:186.45KB ,
资源ID:20936136      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/20936136.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(DFA的编程实现含源代码实验报告剖析Word格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

DFA的编程实现含源代码实验报告剖析Word格式.docx

1、能将保存在内存变量中的DFA写入DFA文件,也能将DFA文件读入内存中。(思考:对稀疏DFA(转换表中为空的地方较多)或用“或”表达转换的DFA(如下的测试用例三),如何改进DFA转换表的表达。)(3)DFA的正确性检查:检查所有集合的元素的唯一性。检查“开始状态”是否唯一,并是否包含在“状态集”中。检查“接受状态集”是否为空,并是否包含在“状态集”中。检查“状态转换表”是否满足DFA的要求。检查“状态转换表”并非填满时的处理是否得当(4)DFA的语言集列表显示:输入待显示的字符串的最大长度N,输出以上定义的DFA的语言集中长度N的所有规则字符串。(提示:注意算法中while循环的次数)(5)

2、DFA的规则字符串判定:输入(或用字符集随机生成)一个字符串,模拟DFA识别字符串的过程判定该字符串是否是规则字符串(属于DFA的语言集)。测试用例:DFA(一)DFA(二)DFA(三)实验要求:按照编译原理及实践参考书第二章中描述的“while循环+双层case选择”的算法编程实现一般的DFA。要求能通过以上三个测试用例的测试。完成内容中(1)(5)部分,可得C。完成内容中(1)(2)(5)部分,可得B。完成内容中(1)(2)(4)(5)部分,可得A。完成全部内容,可得奖励。判定算法概要:准备:开始状态s0, 接受状态集F, 状态转换表T(s, c), sS, cSc = getchar()

3、;s = 开始状态s0;while ( c != EOF ) / 输入未结束则循环s = T(s, c);if (s = NULL) error();if (s 接受状态集F) accept ();else error ();通用DFA存储格式的建议:(用以上的第三个测试DFA为例)3 / 字符集中的字符个数 (以下两行也可合并成一行)/ * o / 以空格分隔的字符集。O代表任意非/和*的字符5 / 状态个数 (以下两行也可合并成一行)1 2 3 4 5 / 状态编号。若约定总是用从1开始的连续数字表示,则此行可省略1 / 开始状态的编号。若约定为1,则此行可省略1 / 结束状态个数。5 /

4、 结束状态的编号2 -1 -1 / 状态1的所有出去的转换。按字符集中的字符顺序给出。-1表示出错状态-1 3 -13 4 35 4 3-1 -1 -1实验报告:同时上交纸质报告与电子版报告。纸质报告以实验分析、实验中遇到的问题及解决方法、实验测试(含屏幕截图)、实验心得等为主,不得大量引用源程序(引用源程序总行数不得超过100行)。电子版报告以源程序、测试用例、输出文件等为主,包括纸质报告的电子版,须确保提并的源程序能编译运行,否则不要上交。电子版请发送到*,邮件标题请写明学号、姓名与实验编号,形如: 姓名。不得抄袭实验报告与源程序,否则后果自负!提高内容:(1)图形化的用户界面;(2)任意

5、DFA的状态转换图、状态转换表的图形绘制;附实验报告 源码实验一DFA的编程实现实验分析:DFA的初始化一个DFA的基本信息 状态集、字符集、开始状态、结束状态集、状态转换表;在程序中状态集、字符集、开始状态、结束状态集都用string类型来表示,即可不用考虑用户输入内容的长度。但缺点是字符集只能是字符而不可以是字符串。状态转换表:为三个字符的字符串,第一个为当前状态,第二个为输入字符,第三个为下一状态。 用vector容器存放转换函数的内容字符串判断初始化一个DFA,后可以通过一下算法判断一个字符串是否符合该DFA。开始状态s0, 接受状态集F, 状态转换表T(s, c), s S, c i

6、f (s 接受状态集F)error ();在实际编写代码中的体现为void identify() /判断字符串 coutstr; int i=0; char present=StartStates; while(istr.length() present=move(present,stri);/move函数即去遍历转换表,返回下个状态 if(present=N) / N 即为move返回错误的状态, break; i+; if(FinalStates.find(present)!=FinalStates.npos)/如果返回的状态用find函数 属于最终状态集则表示识别 cout该自动机识别此

7、字符串 else该自动机不识别此字符串 对DFA的存储与读写将DNF的信息写入文件中,第一行:字符集;第二行:状态集;第三行:开始状态;第四行:结束状态集;以下行写入状态转换表按照既定的规定读取文件中的数据将其赋值,然后初始化DFA即可;DFA的语言集列表显示:这一个模块应该是这个实验中比较难的一部分了。我并没有使用while循环的这个做法。而是用函数递归,通过所有字符集的路径去遍历整个DFA。最后将符合条件的字符串输出;void Traversal(char present, int N,string strass=)/遍历DFA的语言集列表 if(present=|N0)/若路径已经大于N

8、或者当前状态错误,停止递归 return; N-;=FinalStates.npos)该自动机识别字符串:strass for(int i=0;iAlphabet.length();i+) string temp; temp=strass; strass+=Alphabeti; Traversal(move(present,Alphabeti),N,strass); strass=temp;递归终止条件的判断。当N- 时, N小于0,或者遍历到无路可走是便终止遇到的问题:对于递归的终止条件写得不够明确。 递归前对字符串赋值strass赋值,递归后应该还原,这一点没有想到。调试了很久。 总结,对

9、递归的具体编写 还是不熟悉。目前的代码,字符集和状态只能是一个字符,若要优化可以用vector容器存储即可;实验用例:实验结果:判断字符串:显示小于N的语言集:读取DFA文件:实验总结:在这次实验中,学习对一般的DFA的表达方法与编程实现方法。对课本提供的算法有了更深刻的认识。在编写和调试代码的过程中对自身的编程能力也有了很大的提高。对自动机和其识别语言有了更透彻的理解。在动手编程之前一定要好好明确实验的理论准备和思路的理清,能帮助我们在实验过程中少走更多的弯路。总之在这次实验中收获很多,提高了动手能力和分析问题的能力。源代码:/构造一个DFA#includevectorfstreamusin

10、g namespace std;class TransitionTablepublic: char present; /当前状态 char next; /下一状态 char input; /输入字符 TransitionTable(char P,char I,char D) present=P; next=D; input=I;class DFA DFA()1、手动输入,2、读取txt文件 int select;select; if(select=1) inti(); if(select=2) read(); string States; /状态集 char StartStates; /开始状

11、态 string FinalStates; /结束状态集 string Alphabet; /字符集 vector Trans; /转换函数 void inti() /初始化自动机请输入有限状态集S:States;请输入字符集A:Alphabet;请输入转换函数MOVE -格式为:当前状态-输入字符-下一状态:(输入#结束输入) int j=0; while(true) char input4; cininput; if(strcmp(input,#)=0) TransitionTable Temp(input0,input1,input2); Trans.push_back(Temp);请输

12、入开始状态集S0:StartStates;请输入结束状态集F:FinalStates; void identify() /识别字符串请输入字符串:)/ N 即为move返回错误的状态,; char move(char P,char I) /move 转换函数Trans.size(); if(Transi.present=P&Transi.input=I) return Transi.next; return void read() /从txt文件中读取DNF的信息 char temp10; fstream ff(DNF.txt,ios:in); ff.getline(temp,10); Alp

13、habet=temp; States=temp; StartStates=temp0; FinalStates=temp0; while(!ff.eof() ff.getline(temp,10); TransitionTable Temp(temp0,temp1,temp2); /*将DNF的信息写入文件中, 第一行: 第二行: 第三行: 第四行: 以下行写入状态转换表*/ void write()out); ffAlphabetStatesStartStatesFinalStates ffTransi.presentTransi.inputTransi.next ff.close(); v

14、oid Traversal(char present, int N,string strass=) /遍历 DFA的语言集列表显示0) else if(FinalStates.find(present)=FinalStates.npos&N return ;int main() DFA example; example.identify(); int N; coutN; example.Traversal(example.StartStates,N); example.write(); system(pause); return 0;/*测试用例输入状态转换表0a10b21b22a11a32b33a33b3#2b55b53b45a66b44a66a34b5*/

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1