#include<string.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
char p[30][30];//存放文法
char q[30][30];
int line=0;
int n;
int i,j;
int count=0;
int k,t=0;
int flag=0;
int l,m=0;
char VN[30]={'\0'};//存放非終結符号
char VT[30]={'\0'};//存放終結符号
printf("請輸入規則個數");
scanf("%d",&n);
line=n;
for(i=0;i<30;i++)//給字元串數組p,q全部指派為'\0'
for(j=0;j<30;j++)
{
p[i][j]='\0';
q[i][j]='\0';
}
printf("請輸入文法:\n");
for(i=0;i<line;i++)
{
scanf("%s",p[i]);
}
//把字元分為終結符和非終結符
l=0;
m=0;
for(i=0;i<line;i++)
{
for(j=0;j<30&&(p[i][j]!='\0');j++)
{
//非終結符放入數組VN中
if(p[i][j]<='z'&&p[i][j]>='a'||(p[i][j]<='9'&&p[i][j]>='0'))
{
flag=0;
for(t=0;VN[t]!='\0';t++)
{
if(VN[t]==p[i][j])
{
flag=1;break;
}
}
if(flag==0)
{
VN[l]=p[i][j];
l++;
}
}
//終結符放在數組VT中
if(p[i][j]<='Z'&&p[i][j]>='A')
{
flag=0;
for(t=0;t<30&&(VT[t]!='\0');t++)
{
if(VT[t]==p[i][j])
{
flag=1;
break;
}
}
if(flag==0)
{
VT[m]=p[i][j];
m++;
}
}
}
}
//把規則右部分分離,放入數組q中
count=0;
k=0;
for(i=0;i<line;i++)
{
for(j=4;j<30&&(p[i][j]!='\0');j++)
{
if((p[i][j]<='z'&&p[i][j]>='a')||(p[i][j]<='Z'&&p[i][j]>='A')||(p[i][j]<='9'&&p[i][j]>='0'))
{
q[count][k]=p[i][j];
k++;
}
else
{
count++;
k=0;
}
}
count++;
k=0;
}
//判斷是确定的還是非确定的有窮狀态自動機,并進行前半部分列印
//判斷依據:q數組中每一行字元串是否相同
flag=0;
for(i=0;i<count;i++)
{
for(j=i+1;j<count;j++)
{
if(strcmp(q[i],q[j])==0)
{
flag=1;
break;
}
}
}
if(flag==1)
{
printf("是非确定的有窮狀态自動機,即NFA\n\n");
printf("構造的有窮狀态自動機為:\n");
printf("NFA N=(K,E(總和的意思),M,{S},{Z})\n");
}
else
{
printf("是确定的有窮狀态自動機,即DFA\n\n\n");
printf("構造的有窮狀态自動機為:\n");
printf("DFA N=(K,E(總和的意思),M,{S},{Z})\n");
}
printf("其中,\nK={S");
for(i=0;i<30&&(VT!='\0');i++)
{
printf(",%c",VT[i]);
}
printf("}\n");
printf("E={");
for(i=0;i<30&&(VN[i]!='\0');i++)
{
printf("%c ",VN[i]);
}
printf("}\n");
//分離文法
k=0;
count=0;
for(i=0;i<line;i++)
{
j=4;
while(p[i][j]!='\0')
{
if(k<4)
{
q[count][k]=p[i][k];
k++;
}
else
{
if((p[i][j]<='z'&&p[i][j]>='a')||(p[i][j]<='Z'&&p[i][j]>='A')||(p[i][j]<='9'&&p[i][j]>='0'))
{
q[count][k]=p[i][j];
k++;
j++;
}
if(p[i][j]=='l')
{
count++;
k=0;
j++;
}
}
}
count++;
k=0;
}
printf("\n");
//列印M後部分
printf("M:\n");
l=0;
while(VN[l]!='\0')
{
printf("M(S,%c)={",VN[l]);
for(i=0;i<30;i++)
{
for(j=4;j<30&&(q[i][j]!='\0');j++)
{
if(VN[l]==q[i][j]&&(q[i][j+1]=='\0')&&(q[i][j-1]=='='))
printf("%c",q[i][0]);
}
}
printf("}\t");
l++;
}
printf("\n");
l=0;k=0;
while(VT[k]!='\0')
{
l=0;
while(VN[l]!='\0')
{
printf("M(%c,%c)={",VT[k],VN[l]);
for(i=0;i<30;i++)
{
for(j=4;j<30&&(q[i][j]!='\0');j++)
{
if(VT[k]==q[i][j]&&VN[l]==q[i][j+1])
printf("%c",q[i][0]);
}
}
printf("}\t");
l++;
}
k++;
printf("\n");
}
system("pause");
}