#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