安徽大学编译原理试验斯_第1页
安徽大学编译原理试验斯_第2页
安徽大学编译原理试验斯_第3页
安徽大学编译原理试验斯_第4页
安徽大学编译原理试验斯_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、不确定的有穷自动机的化简2015年11月25日星期三班级: 软件工程 学号: E21314003 姓名: 李世1. 目的与要求 通过设计、编写和调试,将不确定的有穷自动机转换为与之等价的确定的有穷自动机的程序,使学生了解子集法。掌握转换过程中的相关概念和方法。DFA的表现形式可以是表格或图形。 2. 理论基础有穷自动机(也称有限自动机)作为一种识别装置,它能准确地识别正规集,即识别正规式所表示的集合. 应用有穷自动机这个理论,为词法分析程序的自动构造寻找有效的方法和工具。有穷自动机分为两类,即,确定的有穷自动机(Deterministic Finite Automata)和不确定的有穷自动机(

2、Nondeterministic Finite Automata) 。(1) 不确定的有穷自动机的定义: 一个不确定的有穷自动机(NFA)M是一个五元组: NFA M=K,f,S,Z, 其中: K为状态的有穷非空集; 为有穷输入字母表; f为K * 到K的子集(2K)的一种映射, 2K表示K的幂集(f不是一个单值函数); SK是初始状态集; Z K为终止状态集. 例子: NFA M=(S,P,Z,0,1,f,S,P,Z),其中: f(S,0)=P/函数的结果为集合f(S,1)=S,Z f(P,1)=Z f(Z,0)=P f(Z,1)=P 状态图表示为: 矩阵表示为: (2) 确定的有穷自动机的

3、定义: 一个确定的有穷自动机(DFA)M是一个五元组:M=(K,f,S,Z) 其中: K是一个有穷集,它的每个元素称为一个状态; 是一个有穷字母表,它的每个元素称为一个输入符号,所以也称为输入符号表; f是转换函数,是在KK上的映射,即,如f(ki,a)=kj,(kiK,kjK)就意味着,当前状态为ki,输入符为a时,将转换为下一个状态kj,我们把kj称作ki的一个后继状态; SK是唯一的一个初态; Z K是一个终态集,终态也称可接受状态或结束状态。例子:DFA M=(S,U,V,Q,a,b,f,S,Q),其中f定义为: f(S,a)=U f(V,a)=U f(S,b)=V f(V,b)=Q

4、f(U,a)=Q f(Q,a)=Q f(U,b)=V f(Q,b)=Q 状态图表示为:矩阵表示为:(3) 确定有限自动机和不确定有限自动机DFA是NFA的特例。对每个NFA N一定存在一个DFA ,使得L(M)=L(N)。对每个NFA N存在着与之等价的DFA M。有一种算法,将NFA转换成接受同样语言的DFA.这种算法称为子集法. 子集法的基本思想:让DFA的每一个状态对应NFA的一组状态,也就是让DFA使用它的状态去记录在NFA读入一个输入符号后可能达到的所有状态。注意:与某一NFA等价的DFA不唯一. a) 定义对状态集合I的几个有关运算: 状态集合I的-闭包:表示为-closure(I

5、),定义为一状态集,是状态集I中的任何状态S经任意条弧而能到达的状态的集合。 状态集合I中的任何状态S都属于-closure(I)。状态集合I的a弧转换:表示为move(I, a)定义为状态集合J,其中J是所有那些可从I中的某一状态经过一条a弧而到达的状态的全体。三、调试测试四、程序源代码#include #include #define MAXS 100 using namespace std; string NODE; string CHANGE; int N; struct edge string first; string change; string last; ; struct c

6、han string ltab; string jiheMAXS; ; void kong(int a) int i; for(i=0;ia;i+) cout ; /排序 void paixu(string &a) int i,j; char b; for(j=0;ja.length();j+) for(i=0;iNODE.find(ai+1) b=ai; ai=ai+1; ai+1=b; void eclouse(char c,string &he,edge b) int k; for(k=0;khe.length() he+=bk.last; eclouse(bk.last0,he,b);

7、 void move(chan &he,int m,edge b) int i,j,k,l; k=he.ltab.length(); l=he.jihem.length(); for(i=0;ik;i+) for(j=0;jhe.jihem.length() he.jihem+=bj.last0; for(i=0;il;i+) for(j=0;jhe.jihem.length() he.jihem+=bj.last0; /输出 void outputfa(int len,int h,chan *t) int i,j,m; cout I ; for(i=0;ilen;i+) coutICHANG

8、Ei ; coutendl-endl; for(i=0;ih;i+) cout ti.ltab; m=ti.ltab.length(); for(j=0;jlen;j+) kong(8-m); m=ti.jihej.length(); coutti.jihej; coutendl; void main() edge *b=new edgeMAXS; int i,j,k,m,n,h,x,y,len; bool flag; string jhMAXS,endnode,ednode,sta; cout*endl;cout* 页式地址重定位模拟 *endl;cout* 作者:李世 E21314003

9、*endl;cout* 13级软件工程 *endl;cout*endl;cout请输入NFA各边信息(起点条件空为* 终点),以#结束:endl; for(i=0;ibi.first; if(bi.first=#) break; cinbi.changebi.last; N=i; /*for(j=0;jN;j+) coutbj.firstbj.changebj.lastendl;*/ for(i=0;iNODE.length() NODE+=bi.first; if(NODE.find(bi.last)NODE.length() NODE+=bi.last; if(CHANGE.find(bi

10、.change)CHANGE.length()&(bi.change!=*) CHANGE+=bi.change; len=CHANGE.length(); cout结点中属于终态的是:endnode; for(i=0;iNODE.length() cout所输终态不在集合中,错误!endl; return; /coutendnode=endnodeendl; chan *t=new chanMAXS; t0.ltab=b0.first; h=1; eclouse(b0.first0,t0.ltab,b); /求e-clouse /coutt0.ltabendl; for(i=0;ih;i+)

11、 for(j=0;jti.ltab.length();j+) for(m=0;mlen;m+) eclouse(ti.ltabj,ti.jihem,b); /求e-clouse for(k=0;klen;k+) /coutti.jihek; move(ti,k,b); /求move(I,a) /coutti.jihekendl; for(j=0;jti.jihek.length();j+) eclouse(ti.jihekj,ti.jihek,b); /求e-clouse for(j=0;jlen;j+) paixu(ti.jihej); /对集合排序以便比较 for(k=0;kh;k+) f

12、lag=operator=(tk.ltab,ti.jihej); if(flag) break; if(!flag&ti.jihej.length() th+.ltab=ti.jihej; coutendl状态转换矩阵如下:endl; outputfa(len,h,t); /输出状态转换矩阵 /状态重新命名 string *d=new stringh; NODE.erase(); coutendl重命名:endl; for(i=0;ih;i+) sta=ti.ltab; ti.ltab.erase(); ti.ltab=A+i; NODE+=ti.ltab; coutsta=ti.ltaben

13、dl; for(j=0;jendnode.length();j+) if(sta.find(endnodej)sta.length() d1=ednode+=ti.ltab; for(k=0;kh;k+) for(m=0;mlen;m+) if(sta=tk.jihem) tk.jihem=ti.ltab; for(i=0;iednode.length() d0+=NODEi; endnode=ednode; coutendlDFA如下:endl; outputfa(len,h,t); /输出DFA cout其中终态为:endnodeendl; /DFA最小化 m=2; sta.erase()

14、; flag=0; for(i=0;im;i+) /coutdi=diendl; for(k=0;klen;k+) /coutICHANGEkendl; y=m; for(j=0;jdi.length();j+) for(n=0;ny;n+) if(dn.find(tNODE.find(dij).jihek)dn.length()|tNODE.find(dij).jihek.length()=0) if(tNODE.find(dij).jihek.length()=0) x=m; else x=n; if(!sta.length() sta+=x+48; else if(sta0!=x+48)

15、 dm+=dij; flag=1; di.erase(j,1); /coutdiendl; j-; break; /跳出n /n /j if(flag) m+; flag=0; /coutsta=staendl; sta.erase(); /k /i coutendl集合划分:; for(i=0;im;i+) coutdi ; coutendl; /状态重新命名 chan *md=new chanm; NODE.erase(); coutendl重命名:endl; for(i=0;im;i+) mdi.ltab=A+i; NODE+=mdi.ltab; coutdi=mdi.ltabendl; for(i=0;im;i+) for(k=0;klen;k+) for(j=0;jh;j+) if(di0=tj.ltab0) for(n=0;nm;n+) if(!tj.jihek.length() break; else if(dn.find(tj.jihek)dn.length() mdi.j

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论