【编译原理 第三章 重点之一】NFA转化为DFA

NFA转化为DFA:

书上的伪代码:

【编译原理 第三章 重点之一】NFA转化为DFA

【编译原理 第三章 重点之一】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++;//加进去 
			}
		}
	}