- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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)