【編譯原理 第三章 重點之一】NFA轉化為DFA
阿新 • • 發佈:2019-02-12
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++;//加進去 } } }