實驗二:利用子集構造法實現nfa到dfa的轉換
【問題描述】利用子集構造法實現nfa到dfa的轉換。nfa的確定化
【輸入形式】nfa
參見樣例。其中,第一列表示狀態名,終狀態用f表示;第二列和第三列分別表示輸入字元a和b所到達的狀態。
【輸出形式】dfa
參見樣例。其中,第一列表示輸入狀態名;第二列表示重新命名的狀態名,第三列和第四列分別表示輸入字元a和b所到達的狀態。
【要求】
確定各個子程式的功能並畫出流程圖
設計子集構造演算法
編碼、除錯通過(c/c++語言編寫)
設計3-5個nfa測試例項,檢驗程式能否輸出正確的dfa。
樣例中的nfa狀態轉換矩陣是由下圖nfa狀態轉換圖得到
【樣例輸入】
0 1
2 f
【樣例輸出】
abcbd
cecdfg
efgffg
g 【樣例說明】
【評分標準】與輸出不一致,0分。完成正確,2分。檢查通過,3分。
#include
#include
#include
#include
#include
using
namespace
std;
string end;
const
int maxn=100;
int max=0;
struct node
}g[maxn];
//建圖
void create()
}int k=a;
while(str[k]!='}'&&str[k]!='n')
str_a+=str[k];
++k;
}k=b;
while(str[k]!='}'&&str[k]!='n')
str_b+=str[k];
++k;
}node* p=&g[d];
for(int i=0;iif(isdigit(str_a[i])&&int(str_a[i]-'0')>max)
max=int(str_a[i]-'0');
while(p->next_a!=null)
p=p->next_a;
p->next_a=new node;
p=p->next_a;
p->data=str_a[i];
}p=&g[d];
for(int i=0;iif(isdigit(str_b[i])&&int(str_b[i]-'0')>max)
max=int(str_b[i]-'0');
while(p->next_b!=null)
p=p->next_b;
p->next_b=new node;
p=p->next_b;
p->data=str_b[i];}}
max++;
for(int i=0;i<=max;i++) //替換掉所有的f
p=g[i].next_b;
while(p!=null)
}end+='0'+max;
}//輸出首元素
void output(string str)
"; else
cout
<
<
}else
cout
<
}}//獲取後繼狀態,k==0是找輸入a的,否則是b的
string get_next(node* p,int k=0)
return str;
}//刪除重複元素
void del(string &str)
}}//輸出最終狀態
void print()
c='\0'; //初始化清空一次
it=m1.find(str_a);
if(str_a.length()>0&&it==m1.end()) //如果沒在集合內部
else
if(str_a.length()>0)
c='a'+m1.find(str_a)->second;
cout
/輸出 輸入a後的結果
if(str_a.length()>0)
q.push(str_a);
c='\0'; //初始化清空一次
it=m1.find(str_b);
if(str_b.length()>0&&it==m1.end())
else
if(str_b.length()>0)
c='a'+m1.find(str_b)->second;
if(str_b.length()>0)
q.push(str_b);
cout
/輸出 輸入b後的結果
}}int main()
/*0
1 2
f */
編譯原理隨記 NFA轉DFA子集構造演算法
編譯原理隨記 正規表示式記號和狀態圖 lex程式的組成部分 宣告部分 就是宣告變數命名 符號 常量 正則定義這些 轉換規則 就是類似於狀態圖的狀態轉換一樣,每乙個輸入字元都會進行乙個 塊處理,這個處理就叫轉換規則。比如 p1 p2 每乙個 p 代表乙個正規表示式 可複雜可簡單 action 就代表執...
NFA到DFA的轉換
include include include include include include define max 100 using namespace std struct edge struct newj 得到的狀態集合 struct relation 集合和集合之間的轉換聯絡 void g...
編譯原理 NFA構造DFA
本題摘自北郵的編譯原理與技術。首先,根據此圖構造狀態轉換表 表中第一列第一行表示從第乙個符號b通過任意個空轉換能到達的節點,ia表示由此行的狀態陣列 可以看作0狀態 經過乙個a可以到達的節點,同理,ib表示由狀態陣列經過乙個b可以到達的節點。當然,有些人可能覺得和看作兩個狀態不合理,他們之間不是有交...