Problem Description
已知正规式为(a|b)*a(a|b)
(1) 构造一个等价的不确定的有限自动机。
(2) 将NFA确定化。
(3) 编写自动机程序,识别输入的单词符号是否合法。
Input 输入多行单词,输入EOF结束
Output 第一行输出表示识别过程的通路
第二行,如果通路的最后一个节点是终止状态,则输出"accept",否则,输出"not accept"。
Sample Input
abaaa
babbaab
Sample Output
{S}-a->{A}-b->{B}-a->{A}-a->{Q}-a->{Q}
accept
{S}-b->{S}-a->{A}-b->{B}-b->{S}-a->{A}-a->{Q}-b->{B}
accept
思路:先将正规式变为不确定有穷自动机,再将NFA确定化和最小化,得到DFA。
C++代码实现:
//
// Created by Visunf Chen on 2020-10-25.
//
#include "iostream"
using namespace std;
int S(string string1);
int A(string string1);
int B(string string1);
int Q(string string1);
int S(string s){
if (s.length()!=0)cout<<"{S}-"<<s[0]<<"->";
if (s.length()==0){
cout<<"{S}"<<endl;
}
if (s[0]=='a')return A(s.substr(1,s.length()));
else if (s[0]=='b')return S(s.substr(1,s.length()));
else return 0;
}
int A(string s){
if (s.length()!=0)cout<<"{A}-"<<s[0]<<"->";
if (s.length()==0){
cout<<"{A}"<<endl;
}
if (s[0]=='a')return Q(s.substr(1,s.length()));
else if (s[0]=='b')return B(s.substr(1,s.length()));
else return 0;
}
int B(string s){
if (s.length()!=0)cout<<"{B}-"<<s[0]<<"->";
if (s.length()==0){
cout<<"{B}"<<endl;
return 1;
}
else if (s[0]=='a')return A(s.substr(1,s.length()));
else if (s[0]=='b')return S(s.substr(1,s.length()));
else return 0;
}
int Q(string s){
if (s.length()!=0)cout<<"{Q}-"<<s[0]<<"->";
if (s.length()==0){
cout<<"{Q}"<<endl;
return 1;
}
else if (s[0]=='a')return Q(s.substr(1,s.length()));
else if (s[0]=='b')return B(s.substr(1,s.length()));
else return 0;
}
int main(){
string str;
while (cin>>str&&str!="EOF"){
if (S(str))cout<<"accept"<<endl;
else cout<<"not accept"<<endl;
}
return 0;
}