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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

实验一利用子集法构造DFA.docx

1、实验一 利用子集法构造DFA实验一 利用子集法构造DFA一、实验目的 掌握将非确定有限自动机确定化的方法和过程2、实验要求及内容 实验要求:1.输入一个NFA,输出一个接受同一正规集的DFA;2.采用C+语言,实现该算法;3.编制测试程序;4.调试程序。 实验步骤:1.输入一个NFA关系图;2.通过一个转换算法将NFA转换为DFA;3.显示DFA关系图。三、实验环境 计算机、Windows 操作系统、Visual C+ 程序集成环境。4、程序代码#include stdafx.h#include#include#include#include#includeusing namespace st

2、d;struct edgeint start,end;char c;E100,Ekong100;/E保存所有的边,Ekong保存转换字符为空的边struct Stateint H100;/状态集合int count;/状态集合中的元素个数int flag;/是否是接受状态int mark;/状态编号;int n;/n:边数int nk=0;/空字符转换的边数int first,accept;/开始状态,接受状态char alpha100;/输入字母表,#代表空串int numof_char=0;/字母表中的字符个数int useof_char256;/该转换字符是否用过int f200;/状态

3、属性标志:0表示始态,1表示接受态,-1表示中间态State DFA100;/DFA状态集int useof_DFA100;/标志构造出来的状态是否已存在int numof_Dtran=0;/最后得到的DFA中的状态数char Dtran100100;/DFA状态转换表void input()int i,s,e;char ch;cout请输入转换的有向边数n:n;cout请输入NFA的开始状态:first;cout请输入NFA的接受状态(输入-1结束):accept;while(accept!=-1)faccept=1; cinaccept;cout请输入NFA,起点,终点,转换字符(#表示空

4、字符):endl;int k=0;for(i=0;isech; Ei.start=s; Ei.end=e; Ei.c=ch; if(ch!=#&!useof_charch) alphanumof_char+=ch;useof_charch=1; if(ch=#) Ekongnk.start=s;Ekongnk.end=e;Ekongnk.c=ch;nk+; State move(State T,char s)/c!=#State temp;temp.count=0;temp.mark=T.mark;int i,j=0,k=0;for(i=0;iT.count;i+)j=0; while(jn)

5、 if(Ej.start=T.Hi&Ej.c=s) temp.Htemp.count+=Ej.end; j+;return temp;void arriveBynone(int t,int result,int& num)/搜索状态t通过一个或多个空字符到达的状态,结果存在result中int k=0;int m=0;num=0;stack S;S.push(t);int j;while(!S.empty() j=S.top(); S.pop(); m=0; while(mnk) if(Ekongm.start=j) resultnum+=Ekongm.end; S.push(Ekongm.e

6、nd); m+; bool check(int i,State T)/判断状态i是否在T中int j;for(j=0;jT.count;j+)if(T.Hj=i)return true;return false;State closure(State T)/求闭包stack STACK;State temp;int i,j,k;for(i=0;iT.count;i+) STACK.push(T.Hi); temp.Hi=T.Hi;temp.count=T.count;temp.mark=T.mark; while(!STACK.empty() int t=STACK.top(); STACK.

7、pop(); /搜索状态t通过一个或多个空字符到达的状态 int search_result100; int num; arriveBynone(t,search_result,num); for(j=0;jnum;j+) if(!check(search_resultj,temp) temp.Htemp.count+=search_resultj; STACK.push(search_resultj); for(k=0;ktemp.count;k+) if(ftemp.Hk=1) temp.flag=1; break; if(ftemp.Hk=0) temp.flag=0; break; s

8、ort(temp.H,temp.H+temp.count);for(i=0;inumof_Dtran;i+) if(temp.count!=DFAi.count) continue; sort(DFAi.H,DFAi.H+DFAi.count); for(j=0;j=DFAi.count) temp.mark=DFAi.mark;return temp;int check_inDFA()/检查DFA中是否存在未被标记的状态,有则返回标号,否则返回-1 int i; for(i=0;inumof_Dtran;i+) if(!useof_DFAi) return i;return -1;bool

9、check_whetherin_DFA(State T)int i,j;sort(T.H,T.H+T.count);for(i=0;inumof_Dtran;i+) if(T.count!=DFAi.count) continue; sort(DFAi.H,DFAi.H+DFAi.count); for(j=0;j=DFAi.count) return true;if(i=numof_Dtran) return false;else return true;void child_method()int m,n;for(m=0;m100;m+) for(n=0;n100;n+) Dtranmn=

10、#; for(m=0;m100;m+) DFAm.flag=-1; State S0,U;S0.flag=0;S0.count=1;S0.H0=first;State T;T=closure(S0);T.mark=0;T.flag=0;DFAnumof_Dtran+=T;memset(useof_DFA,0,sizeof(useof_DFA);int j=check_inDFA(); int k; while(j!=-1) useof_DFAj=1; for(k=0;knumof_char;k+) U=closure(move(DFAj,alphak); /if U不在DFA中 if(!che

11、ck_whetherin_DFA(U) U.mark=numof_Dtran; DFAnumof_Dtran+=U; DtranDFAj.markU.mark=alphak; j=check_inDFA();void print()int i,j;for(i=0;inumof_Dtran;i+) couti:; for(j=0;jDFAi.count;j+) coutDFAi.Hj ; if(DFAi.flag=1) cout此为DFA的接受状态; if(DFAi.flag=0) cout此为DFA的开始状态; coutendl;coutendl;for(i=0;inumof_Dtran;i+

12、) for(j=0;jnumof_Dtran;j+) if(Dtranij!=#) coutij By Dtranijendl; void judge(string ch) int i,j,k;int num=ch.length(); State temp; k=0; for(i=0;inum;i+) for(j=0;jnumof_Dtran;j+) if(Dtrankj=alphai) temp=DFAj; k=j; break; if(temp.flag!=1) cout字符串 ch无法由该DFA得到endl;else cout字符串 ch可以由该DFA得到endl;coutendl;in

13、t _tmain(int argc, _TCHAR* argv)input();child_method();couts) judge(s);system(pause);return 0;5、实验结果6、算法分析使用子集构造法对非确定有限自动机进行确定化的过程中存在大量重复计算的问题。为解决此问题,基于非确定有限自动机的特点并针对子集构造法的不足,提出了一种优化的非确定有限自动机确定化算法。首先定义了识别符的有效引出状态集概念并证明了-closure的并定理以保证算法的正确性,其次给出了用于避免重复计算的识别符的有效引出状态集的构造子算法和单状态集的-closure的求算子算法,基于这两个子算

14、法给出了优化的非确定有限自动机确定化算法,最后将算法应用于实例,实验结果表明计算量远小于子集构造法的计算量。相比子集构造法,算法能更有效地对非确定有限自动机进行确定化。七、实验小结以前上课时有许多的问题并没有真正的认识到,但通过这次实验,使我掌握了许多更重要的知识点。通过实验,我们可以知道将NFA转换成接受同样语言的DFA的算法称为子集构造算法。NFA变换到DFA的基本思想是:让DFA的每个状态对应NFA的一个状态集。实验实现了NFA到DFA的转换。实验二 THOMPSON 算法的实现一、实验目的 掌握将正规表达式转换为NFA的方法和过程3、实验要求及内容1. 输入一个正规表达式,输出一个接受

15、同一语言的NFA2. 采用C+语言,实现该算法3. 编制测试程序4. 调试程序 三、实验环境 计算机、Windows 操作系统、Visual C+ 程序集成环境。四、程序代码#include Thompson.hvoid main() string Regular_Expression = (a|b)*abb; cell NFA_Cell; input(Regular_Expression);/调试需要先屏蔽 Regular_Expression = add_join_symbol(Regular_Expression); Regular_Expression = postfix(Regula

16、r_Expression); NFA_Cell = express_2_NFA(Regular_Expression); Display(NFA_Cell);cell express_2_NFA(string expression) int length = expression.size(); char element; cell Cell,Left,Right; stack STACK; for(int i=0;ilength;i+) element = expression.at(i); switch(element) case |: Right = STACK.top(); STACK

17、.pop(); Left = STACK.top(); STACK.pop(); Cell = do_Unite(Left,Right); STACK.push(Cell); break; case *: Left = STACK.top(); STACK.pop(); Cell = do_Star(Left); STACK.push(Cell); break; case +: Right = STACK.top(); STACK.pop(); Left = STACK.top(); STACK.pop(); Cell = do_Join(Left,Right); STACK.push(Cel

18、l); break; default: Cell = do_Cell(element); STACK.push(Cell); cout处理完毕!endl; Cell = STACK.top(); STACK.pop(); return Cell;cell do_Unite(cell Left,cell Right) cell NewCell; NewCell.EdgeCount=0; edge Edge1,Edge2,Edge3,Edge4; state StartState = new_StateNode(); state EndState = new_StateNode(); Edge1.

19、StartState = StartState; Edge1.EndState = Left.EdgeSet0.StartState; Edge1.TransSymbol = #; Edge2.StartState = StartState; Edge2.EndState = Right.EdgeSet0.StartState; Edge2.TransSymbol = #; Edge3.StartState = Left.EdgeSetLeft.EdgeCount-1.EndState; Edge3.EndState = EndState; Edge3.TransSymbol = #; Edg

20、e4.StartState = Right.EdgeSetRight.EdgeCount-1.EndState; Edge4.EndState = EndState; Edge4.TransSymbol = #;/先将Left和Right的EdgeSet复制到NewCell cell_EdgeSet_Copy(NewCell,Left); cell_EdgeSet_Copy(NewCell,Right); /将新构建的四条边加入EdgeSet NewCell.EdgeSetNewCell.EdgeCount+ = Edge1; NewCell.EdgeSetNewCell.EdgeCount+

21、 = Edge2; NewCell.EdgeSetNewCell.EdgeCount+ = Edge3; NewCell.EdgeSetNewCell.EdgeCount+ = Edge4; /构建NewCell的启示状态和结束状态 NewCell.StartState = StartState; NewCell.EndState = EndState; return NewCell;/处理 abcell do_Join(cell Left,cell Right) for(int i=0;iRight.EdgeCount;i+) if(Right.EdgeSeti.StartState.Sta

22、teNpare(Right.StartState.StateName)=0) Right.EdgeSeti.StartState = Left.EndState; STATE_NUM-; else if(Right.EdgeSeti.EndState.StateNpare(Right.StartState.StateName)=0) Right.EdgeSeti.EndState = Left.EndState; STATE_NUM-; Right.StartState = Left.EndState; cell_EdgeSet_Copy(Left,Right); Left.EndState

23、= Right.EndState; return Left;cell do_Star(cell Cell) cell NewCell; NewCell.EdgeCount=0; edge Edge1,Edge2,Edge3,Edge4; state StartState = new_StateNode(); state EndState = new_StateNode(); /构建边 Edge1.StartState = StartState; Edge1.EndState = EndState; Edge1.TransSymbol = #; Edge2.StartState = Cell.E

24、ndState; Edge2.EndState = Cell.StartState; Edge2.TransSymbol = #; Edge3.StartState = StartState; Edge3.EndState = Cell.StartState; Edge3.TransSymbol = #; Edge4.StartState = Cell.EndState; Edge4.EndState = EndState; Edge4.TransSymbol = #; /构建单元 cell_EdgeSet_Copy(NewCell,Cell); NewCell.EdgeSetNewCell.

25、EdgeCount+ = Edge1; NewCell.EdgeSetNewCell.EdgeCount+ = Edge2; NewCell.EdgeSetNewCell.EdgeCount+ = Edge3; NewCell.EdgeSetNewCell.EdgeCount+ = Edge4; NewCell.StartState = StartState; NewCell.EndState = EndState; return NewCell;cell do_Cell(char element) cell NewCell; NewCell.EdgeCount=0; edge NewEdge

26、; state StartState = new_StateNode(); state EndState = new_StateNode(); NewEdge.StartState = StartState; NewEdge.EndState = EndState; NewEdge.TransSymbol = element; NewCell.EdgeSetNewCell.EdgeCount+ = NewEdge; NewCell.StartState = NewCell.EdgeSet0.StartState; NewCell.EndState = NewCell.EdgeSet0.EndState;/EdgeCount此时为1 return NewCell;void cell_EdgeSet_Copy(cell

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

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