谢先斌.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE 7 实验2 NFA的确定化 一、实验目的 设计并实现将NFA确定化为DFA的子集构造算法,从而更好地理解有限自动机之间的等价性,掌握词法分析器自动产生器的构造技术。该算法也是构造LR分析器的基础。 二、课程设计内容和要求 设计并实现计算状态集合I的ε闭包的算法ε_Closure(I)和转换函数Move(I,a),并在此基础上实现子集构造算法。利用该从NFA到DFA的转换程序,任意输入一个NFA N=(S,Σ,δ, s0, F),输出一个接收同一语言的DFA M=(S’ , Σ’ ,δ’, s0’, F’)。 三、NFA的确定化的算法思想 从NFA N构造一个与其等价的DFA M的子集构造算法,就是要为DFA M构造状态转换表Trans,表中的每个状态是NFA N状态的集合,DFA M将“并行”地模拟NFA N面对输入符号串所有可能的移动。 四、运行结果及程序源码 1.程序运行结果 以课本第41页例3.15:将NFA N确定化为例,其NFA如图1所示。 词法分析图运行结果 2.解题过程 首先确定其初态,命名为0状态。 0=ε-CLOSURE({x})={x} 对初态执行确定化算法,得到如表1所示的DFA M的状态矩阵和如图2所示的DFA M的状态转换矩阵图。 图1NFA确定化后的状态矩阵 Q’ l d A {x} {1, 2, y} ? B {1, 2, y} {2, y} {2, y} C {2, y} {2, y} {2, y} 图1NFA确定化后的DFA 3.程序截图 对上例的输入信息 该程序运行结果 有以上程序运行结果,可以正确的验证程序的正确性。 五、心得体会 这次实验,收获如下: 1.对以前学习的C++程序设计有了一个整体的复习。 2.通过该是我们对NFA的确定化有了一个更为深刻的了解,对NFA确定化的程序构造有个一个更高层侧的认识,为我们更好的学习编译原理了打下了基础。 六、程序源码 //程序源码如下: #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 jihe[MAXS]; }; 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;ia.length();i++) if(NODE.find(a[i])NODE.find(a[i+1])) { b=a[i]; a[i]=a[i+1]; a[i+1]=b; } } void eclouse(char c,string he,edge b[]) { int k; for(k=0;kN;k++) { if(c==b[k].first[0]) if(b[k].change==*) { if(he.find(b[k].last)he.length()) he+=b[k].last; eclouse(b[k].last[0],he,b); } } } void move(chan he,int m,edge b[]) { int i,j,k,l; k=he.ltab.length(); l=he.jihe[m].length(); for(i=0;ik;i++) for(j=0;jN;j++) if((CHANGE[m]==b[j].change[0])(he.ltab[i]==b[j].first[0])) if(he.jihe[m].find(b[j].last[0])he.jihe[m].length()) he.jihe[m]+=b[j].last[0]; for(i=0;il;i++) for(j=0;jN;j++) if((CHANGE[m]==b[j].change[0])(he.jihe[m][i]==b[j].first[0])) if(he.jihe[m].find(b[j].last[0])he.jihe[m].length())

文档评论(0)

linyin1994 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档