使用列表法对文法进行转化将这个表作为程序的输入。输入样例为P117第六题。
#include<bits/stdc++.h>
using namespace std;
struct GRAM
{
//$代表空
string a;
string b;
string c;
};
int main()
{
int num,len;
GRAM gram[100];
int time=0,n,n1;
//
cout<<"请输入图结构(以#结束):"<<endl;
for(len=0;len<100;len++)
{
cin>>gram[len].a;
if(gram[len].a=="#")
break;
else
{
cin>>gram[len].b;
cin>>gram[len].c;
}
}
num=len;
//初始化
GRAM dfa[100];
dfa[0].a=gram[0].a;
/*dfa[0].b=gram[0].b;
dfa[0].c=gram[0].c;*/
//填表
time++;
for(int i=0;i<100;i++)
{
for(int j=0;j<dfa[i].a.length();j++)
{
//添加b
for(int k=0;k<num;k++)
{
if(dfa[i].a[j]==gram[k].a[0])
{
if(gram[k].b!="$")
{
dfa[i].b+=gram[k].b;
}
else
dfa[i].b+="";
}
}
//去除相同的字母
string ustr(dfa[i].b);
sort(ustr.begin(), ustr.end());
ustr.erase(unique(ustr.begin(), ustr.end()), ustr.end() );
dfa[i].b=ustr;
}
//cout<< dfa[i].b<<endl;
for(n=0;n<time;n++)
{
if(dfa[i].b==dfa[n].a)
{
break;
}
}
if(n==time)
{
dfa[time].a=dfa[i].b;
time++;
//cout<<time<<"添加B"<<endl;
}
//添加c
for(int j=0;j<dfa[i].a.length();j++)
{
for(int k=0;k<num;k++)
{
if(dfa[i].a[j]==gram[k].a[0])
{
if(gram[k].c!="$")
{
dfa[i].c+=gram[k].c;
}
else
dfa[i].c+="";
}
}
//去除相同的字母
string ustr(dfa[i].c);
sort(ustr.begin(), ustr.end());
ustr.erase(unique(ustr.begin(), ustr.end()), ustr.end() );
dfa[i].c=ustr;
}
//cout<<dfa[i].c<<endl;
for(n1=0;n1<time;n1++)
{
if(dfa[i].c==dfa[n1].a)
{
break;
}
}
if(n1==time)
{
//cout<<i+1<<endl;
dfa[time].a=dfa[i].c;
time++;
//cout<<time<<"添加C"<<endl;
}
}
//cout<<time<<endl;
cout<<"NFA-->DFA:"<<endl;
for(int i=0;i<time-1;i++)
{
cout<<dfa[i].a<<" "<<dfa[i].b<<" "<<dfa[i].c<<endl;
}
cout<<"最后图中的状态为:"<<endl;
/*int f;
for(int i=0;i<time;i++)
{
if(dfa[i].a.find('Z') !=string::npos)
{
dfa[i].a="Z";
}
for(f=0;f<i;f++)
{
if(dfa[i].a==dfa[f].a)
{
break;
}
}
if(f==i)
{
cout<<dfa[i].a<<endl;
}
else
{
continue;
}
}*/
for(int i=0;i<time-1;i++)
{
cout<<dfa[i].a<<endl;
}
}