【编译原理 第三章 重点之一】NFA转化为DFA
NFA转化为DFA:
书上的伪代码:
第一步:
求初始状态s通过ε到达的所有点的集合*U[0];
部分代码展示:
int ii=0,jj=0;
int U[ns][ns];for(ii=0;ii<ns;ii++)for(jj=0;jj<ns;jj++)U[ii][jj]=0;
int l=0,curr=1,r=1,i=0;
U[0][0]=1;//一个
U[0][1]=1;//初始结点
//在这里再加一个求初始状态只通过“一盆西罗”到达的所有点,
//并存在U[0][];中,并记录个数U[0][0]
while(r>l){
l++;
for(i=0;i<n;i++){//遍历所有的出边
for(j=1;j<=U[l-1][0];j++){//遍历当前扩展集合的所有点
for(k=1;k<=tran[U[l-1][j]][0];k++){//遍历当前点所有的边
if(a[i]==b[U[l-1][j]][k]){//如果有这条边,新建一个集合
U[curr][U[curr][0]]=tran[U[l-1][j]][k];
U[curr][0]++;
}
}
}
//εεεεεεεεεεεεεεεεεεεεεε
//在这里再加一个当前求得的集合只通过
//“一盆西罗”到达的所有点,
//并存在U[curr][];中,并记录个数U[curr][0]
//然后再加一个判断的条件:
//for()循环判断之前的U[][]和现在的U[curr][]是否有重复
//如果有重复,做标记:judge=1;
if(judge==0){//和之前没有重复
curr++;//加进去
}
}
}