1. 程式人生 > >【編譯原理 第三章 重點之一】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++;//加進去 
			}
		}
	}