实验内容
(1)确定 NFA 与 DFA 的存储格式。 要求为 3 个以上测试 NFA 准备好相应有限自动机的存储文件。(可利用实验一(二)的 基础)
(2)用 C 或 C++语言编写将 NFA 转换成 DFA 的子集构造法的程序。
(3)测试验证程序的正确性。 测试不易。可求出 NFA 与 DFA 的语言集合的某个子集(如长度小于某个 N),再证实两 个语言集合完全相同!
(4)测试用例参考:将下列语言用 RE 表示,再转换成 NFA 使用: (a) 以 a 开头和结尾的小字字母串;a (a|b|…|z)a | a (b) 不包含三个连续的 b 的,由字母 a 与 b 组成的字符串;( | b | bb) (a | ab | abb) © (aa|b)(a|bb)
关键代码及讲解
void eclouse(set<int>&s,vector<Table> D)
{
set<int>::const_iterator iter;
int flag=0;
int length=s.size();
for(iter = s.begin() ; iter != s.end() ; ++iter){
for(int k=0;k<D.size();k++)
{
if(*iter==D[k].present)
if(D[k].input=='$')
{
s.insert(D[k].next);
if(s.size()>length)
flag=1;
}
}
}
if(flag==1){
eclouse(s,D);
}
}
求闭包算法
while(!worklist.empty()){
int q=remove(worklist);
worklist.erase(worklist.begin());
for(int i=0;i<E.length();i++){
change(s[q],s[num],E[i],D);
if(s[num].empty()){
continue;
}
eclouse(s[num],D);
int flag=0;
for(int j=0;j<num;j++){
if(equal(s[j],s[num])==1){
flag=1;
Table Temp(q,E[i],j);
D1.push_back(Temp);
break;
}
}
if(flag==1){
s[num].clear();
}
else{
worklist.insert(num);
Table Temp(q,E[i],num);
D1.push_back(Temp);
num++;
}
}
}
转DFA算法
测试用例输出结果