#include<bits/stdc++.h>
#define N 10
char vt[10];
char vn[10];
struct fa
{
char a,b,c;
};
fa wenfa[10];
void shuru3(int o)
{
int i;
for(i=0;i<o;i++)
{
scanf("\n%c%c%c",&wenfa[i].a,&wenfa[i].b,&wenfa[i].c);
if(wenfa[i].c=='#') wenfa[i].c='Z';
}
}
int where1(char x)
{
int i=0;
while(vt[i]!=x)
{
i++;
}
return i+1;
}
int where2(char x)
{
int i=0;
while(vn[i]!=x)
{
i++;
}
return i+1;
}
int main()
{
int o,i,j,m,n,k,l,d;//o是文法数目, n是非终结符数目,m是终结符数目, k是数组行号,l是数组列号,d是重输;
char liu[10][10],g,q,s[N];
printf("请输入非终结符:\n");
for(i=0;;i++)
{
vt[i]=getchar();
if(vt[i]=='\n')
{ n=i+1;break;}
}
printf("请输入终结符:\n");
for(i=0;;i++)
{
vn[i]=getchar();
if(vn[i]=='\n')
{m=i+1;break;}
}
printf("你有几条文法:\n");
scanf("%d",&o);
printf("请输入你的文法:\n");
shuru3(o);
//vt[n]='Z';
//printf("%d %d",n,m);
for(i=1;i<=m;i++)
{
//printf("%5c",vn[i-1]);
liu[0][i]=vn[i-1];
}
for(i=1;i<=n;i++)
{
liu[i][0]=vt[i-1];
//printf("%c",vt[i-1]);
// printf("\n");
}
for(j=0;j<=o;j++)
{
liu[0][0]=' ';
// printf("%c %c %c\n",wenfa[j].a,wenfa[j].b,wenfa[j].c);
k=where1(wenfa[j].a);
l=where2(wenfa[j].b);
g=wenfa[j].c;
liu[k][l]= g;
}
liu[4][1]=' ';
liu[4][2]=' ';
for(i=0;i<=n;i++)
{
for(j=0;j<=m;j++)
{
printf("%4c",liu[i][j]);
}
printf("\n");
}
printf("请输入待识别的字母串\n");
scanf("%s",s);
for(i=0;i<=strlen(s);i++){
if(s[i]=='#')s[i]='Z';}
fa sc[10];
for(i=0;i<=strlen(s);i++){
sc[0].a='S';
sc[i].b=s[i];
sc[i].c=liu[where1(sc[i].a )][where2(s[i])];
sc[i+1].a=sc[i].c;
if(sc[i].c=='Z'){
printf("congratulations!\n");break;}
if(sc[i].b=='Z'){
printf("sorry!");break;}
}
for(j=0;j<=i;j++){
printf("%c%c%c\n",sc[j].a,sc[j].b,sc[j].c);
}
printf("1:once again 2:over\n");
scanf("%d",&d);
if(d==1){
printf("请输入待识别的字母串\n");
scanf("%s",s);
for(i=0;i<=strlen(s);i++){
if(s[i]=='#')s[i]='Z';}
fa sc[10];
for(i=0;i<=strlen(s);i++){
sc[0].a='S';
sc[i].b=s[i];
sc[i].c=liu[where1(sc[i].a )][where2(s[i])];
sc[i+1].a=sc[i].c;
if(sc[i].c=='Z'){
printf("congratulations!\n");break;}
if(sc[i].b=='Z'){
printf("sorry!\n");return 0;}
}
for(j=0;j<=i;j++){
printf("%c%c%c\n",sc[j].a,sc[j].b,sc[j].c);
}
}
else printf("goodbey!");
return 0;
}
/*
SAB
ab
6
SaA
SbB
AaA
AbB
BbA
Ba#
*/