有限自动机的构造与识别

一、实验目标  
1、掌握有穷状态自动机的概念;  
2、掌握有穷状态自动机的存储及表示方法;
3、掌握有穷状态自动机与正则式之间的关系。

二、实验要求
1、输入正规式;
2、构造该正规式的有穷状态自动机;
3. 以五元组形式输出。

三、实验代码

#include<iostream> 
#include<string> 
#include<vector> 
using namespace std; 
#define max 100 
struct edge{  
string first;
string change;
string last;
};  
int N;
vector<int> value;
string closure(string a,edge *b) 
{ int i,j; 
for(i=0;i<a.length();i++) 
{ 
for(j=0;j<N;j++) 
{ 
if(b[j].first[0]==a[i]&&b[j].change=="&") 
{ 
a=a+b[j].last[0];  
}  
}  
} 
return a;  
}  
string move(string jihe,char ch,edge *b) 
{ 
int i,j; 
string s="";  
for(i=0;i<jihe.length();i++)  
{ 
 for(j=0;j<N;j++)
{ 
if(b[j].first[0]==jihe[i]&&b[j].change[0]==ch) 
s=s+b[j].last;  
}  
}  
return s;  
} 
string sort(string t) 
{ 
int k,i,j; 
char tt;  
for(i=0;i<t.length()-1;i++) 
{ 
k=i;  
for(j=i+1;j<t.length();j++) 
{ 
if(t[j]<t[k])k=j;  
}  
tt=t[k];t[k]=t[i];t[i]=tt;  
} 
return t;
} 
void main() 
{  
int i,j,x=0,h,length,m,d=0; 
string Change;
string First,Last;
string T[max],ss; 
edge *b=new edge[max];  
cout<<"请输入各边信息:起点条件(空用&表示)终点,以输入#结束。"<<endl; 
for(i=0;i<max;i++) 
{ 
cin>>b[i].first; 
if(b[i].first=="#")break; 
else 
 cin>>b[i].change>>b[i].last; 
} 
N=i;  
cout<<"请输入该NFA的初态及终态:"<<endl; 
cin>>First>>Last;  
cout<<"请输入此NFA状态中的输入符号即边上的条件:"<<endl; 
cin>>Change;  
T[x]=closure(First,b); 
T[x]=sort(T[x]); 
value.push_back(0); 
i=0;  
while(value[i]==0&&value.size()) 
{ 
value[i]=1;  
for(j=0;j<Change.length();j++) 
{ 
ss="";  
ss=move(T[i],Change[j],b); 
length=value.size(); 
 
for(h=0;h<length;h++) 
{  
 if(T[h]==sort(closure(ss,b)))break; 
}  
if(h==length) 
{ 
T[++x]=sort(closure(ss,b)); 
value.push_back(0);  
 }
} 
i++; 
}  
edge *DFA=new edge[max];  
for(i=0;i<=x;i++)
{ 
for(j=0;j<Change.length();j++) 
{ 
DFA[d].first=T[i]; 
DFA[d].change=Change[j]; 
ss="";  
ss=sort(closure(move(T[i],Change[j],b),b)); 
for(m=0;m<=x;m++) 
if(ss==T[m])DFA[d++].last=T[m];  
}  
}  
cout<<"此NFA构造的DFA的各边信息如下:"<<endl<<"起点条件终点"<<endl; 
for(i=0;i<d;i++) 
{
for(m=0;m<=x;m++) 
{ 
if(DFA[i].first==T[m])cout<<m<<" "<<DFA[i].change;  
}
for(m=0;m<=x;m++)  
if(DFA[i].last==T[m])cout<<" "<<m<<endl;; 
}  
cout<<"该DFA的初态为:"; 
for(m=0;m<=x;m++) 
{ 
for(j=0;j<T[m].length();j++) 
{ 
ss=T[m];  
if(ss[j]==First[0])cout<<m<<endl;  
 
}  
}  
cout<<"该DFA的终态为:"; 
for(m=0;m<=x;m++) 
{ 
for(j=0;j<T[m].length();j++) 
{ 
ss=T[m];  
if(ss[j]==Last[0])cout<<m<<"  "; 
}  
} 
cout<<endl; 
system("pause");  
} 

 

posted @ 2016-11-25 14:58  050朱小彬  阅读(359)  评论(0编辑  收藏  举报