



版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、本文格式为word版,下载可任意编辑不确定有穷自动机确定化编译原理实验报告 编译原理试验报告 试验名称 不确定有穷自动机的确定化 试验时间_ 2021 年 4 月 10 日_ 院 系_管理信息工程学院_ 班 级_11 计算机科学与技术_ 学 号_202101020219_ 姓 名_姜高_ 1、 、 试验目的 不确定有穷自动机的确定化 2、 、 试验原理 用子集构造算法构造子集加入子集族中直到收敛(全部构造的子集都已存在于子集族)为止。如原来不确定有穷自动机的五元组形式为:m=(k,f,s,z),其中 k 为状态集,为字母表,f为转换函数,s 为初始态,z 为终态集。用子集族s 代替 k,新的转
2、换函数 d 代替 f,形成新的五元组 m=(s,d,s,z)即将原不确定有穷自动机转换为确定有穷自动机。 3、 、 试验内容 (1) 闭包计算:closure(i) (2) 转换函数:move(i,a) 4、 、 伪 伪 代码 假定构造的子集族为 s=(t1,t2。), k 为状态集: (1) 开头,令 closure(k0)为 s 中唯一成员,并且未被标记 (2) while(c 中存在尚未被标记的子集 t) do 标记 t; for 每输入字母 a do u:=closure(move(t,a); if u 不在 s 中 then 将 u 作为未被标记的子集加在 s 中 5. 代码实现 #
3、includeiostream #includestring #define maxs 100 using namespace std; string node; /结点集合 string change; /终结符集合 int n; /nfa 边数 struct edge string first; string change; string last; ; struct chan string ltab; string jihemaxs; ; void kong(int a) int i; for(i=0;ia;i+) cout ; /排序 void paixu(string a) int
4、i,j; char b; for(j=0;ja.length();j+) for(i=0;ia.length();i+) if(node.find(ai)node.find(ai+1) b=ai; ai=ai+1; ai+1=b; void eclouse(char c,string he,edge b) int k; for(k=0;kn;k+) if(c=bk.first0) if(bk.change=*) if(he.find(bk.last)he.length() he+=bk.last; eclouse(bk.last0,he,b); void move(chan he,int m,
5、edge b) int i,j,k,l; k=he.ltab.length(); l=he.jihem.length(); for(i=0;ik;i+) for(j=0;jn;j+) if(changem=bj.change0)(he.ltabi=bj.first0) if(he.jihem.find(bj.last0)he.jihem.length() he.jihem+=bj.last0; for(i=0;il;i+) for(j=0;jn;j+) if(changem=bj.change0)(he.jihemi=bj.first0) if(he.jihem.find(bj.last0)h
6、e.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+) coutichangei ; 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;
7、 int i,j,k,m,n,h,x,y,len; bool flag; string jhmaxs,endnode,ednode,sta; cout请输入 nfa 各边信息(起点条件空为* 终点),以#结束:endl; for(i=0;imaxs;i+) cinbi.first; if(bi.first=#) break; cinbi.changebi.last; n=i; /*for(j=0;jn;j+) coutbj.firstbj.changebj.lastendl;*/ for(i=0;in;i+) if(node.find(bi.first)node.length() node+=
8、bi.first; if(node.find(bi.last)node.length() node+=bi.last; if(change.find(bi.change)change.length()(bi.change!=*) change+=bi.change; len=change.length(); cout结点中属于终态的是:endl; cinendnode; for(i=0;iendnode.length();i+) if(node.find(endnodei)node.length() cout所输终态不在集合中,错误!endl; return; /coutendnode=end
9、nodeendl; 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+) 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; fo
10、r(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+) flag=operator=(tk.ltab,ti.jihej); if(flag) break; if(!flagti.jihej.length() th+.ltab=ti.jihej; coutendl状态转换矩阵如下:endl; outputfa(len,h,t); /输出状态转换矩阵 /状态重新命名 string *d=new
11、 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.ltabendl; 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;inode
12、.length();i+) if(ednode.find(nodei)ednode.length() d0+=nodei; endnode=ednode; coutendldfa 如下:endl; outputfa(len,h,t); /输出 dfa cout其中终态为:endnodeendl; /dfa 最小化 m=2; sta.erase(); 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(d
13、n.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) dm+=dij; flag=1; di.erase(j,1); /coutdiendl; j-; break; /跳出 n /n /j if(flag) m+; flag=0; /coutsta=staendl; sta.erase(); /k /
14、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.jihek=mdn.ltab; break; break; ednod
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 邢台医学高等专科学校《国民经济核算》2023-2024学年第二学期期末试卷
- 2025-2030年中国afc自动售票检票系统行业动态分析及应用前景预测研究报告
- 日间手术麻醉指南课件
- 甘肃省兰州市城关区天庆实验中学2023-2024学年中考数学考前最后一卷含解析
- 2024-2025新入职工职前安全培训考试试题带答案(基础题)
- 2025企业安全管理人员安全培训考试试题及参考答案【模拟题】
- 2025年公司及项目部安全培训考试试题(答案)
- 2024-2025企业安全管理人员安全培训考试试题(下载)
- 2025年公司、项目部、各个班组三级安全培训考试试题考点精练
- 2025员工安全培训考试试题答案能力提升
- 《旅行社经营管理》考试复习题库及答案
- 北师大版三年级数学下册竞赛卷
- 粤教版五年级下册科学知识点
- 危大工程巡视检查记录表(深基坑)
- 《最好的未来》合唱曲谱
- GB∕T 36765-2018 汽车空调用1,1,1,2-四氟乙烷(气雾罐型)
- 《觉醒年代》朗诵稿
- 小学教育专业毕业论文
- 丽声北极星分级绘本第二级上Dinner for a Dragon 课件
- 水保工程验收检验记录表
- 某县公共资源交易中心政府采购质疑处理办法
评论
0/150
提交评论