#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,∑,M,{S},{Z})\n");
}
else
{
printf("是确定的有窮狀态自動機,即DFA\n\n\n");
printf("構造的有窮狀态自動機為:\n");
printf("DFA D=(K,∑,M,{S},{Z})\n");
}
printf("其中,\nK = {S");
for(i = 0;i < 30 && (VT[i]!='\0');i++)
{
printf(",%c",VT[i]);
}
printf("}\n");
printf("∑={");
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] == '|')
{
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");
}