1 #include<string.h> 2 #include<stdio.h> 3 #include<stdlib.h> 4 int main() 5 { 6 char p[30][30]; 7 char q[30][30]; 8 int line=0; 9 int n; 10 int i,j; 11 int count=0; 12 int k,t=0; 13 int flag=0; 14 int l,m=0; 15 char VN[30]={'\0'}; 16 char VT[30]={'\0'}; 17 printf("请输入规则个数"); 18 scanf("%d",&n); 19 line=n; 20 for(i=0;i<30;i++) 21 for(j=0;j<30;j++) 22 { 23 p[i][j]='\0'; 24 q[i][j]='\0'; 25 } 26 printf("请输入文法:\n"); 27 for(i=0;i<line;i++) 28 { 29 scanf("%s",p[i]); 30 } 31 l=0; 32 m=0; 33 for(i=0;i<line;i++) 34 { 35 for(j=0;j<30&&(p[i][j]!='\0');j++) 36 { 37 if(p[i][j]<='z'&&p[i][j]>='a'||(p[i][j]<='9'&&p[i][j]>='0')) 38 { 39 flag=0; 40 for(t=0;VN[t]!='\0';t++) 41 { 42 if(VN[t]==p[i][j]) 43 { 44 flag=1; 45 break; 46 } 47 } 48 if(flag==0) 49 { 50 VN[l]=p[i][j]; 51 l++; 52 } 53 } 54 if(p[i][j]<='Z'&&p[i][j]>='A') 55 { 56 flag=0; 57 for(t=0;t<30&&(VT[t]!='\0');t++) 58 { 59 if(VT[t]==p[i][j]) 60 { 61 flag=1; 62 break; 63 } 64 } 65 if(flag==0) 66 { 67 VT[m]=p[i][j]; 68 m++; 69 } 70 } 71 } 72 } 73 count=0; 74 k=0; 75 for(i=0;i<line;i++) 76 { 77 for(j=4;j<30&&(p[i][j]!='\0');j++) 78 { 79 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')) 80 { 81 q[count][k]=p[i][j]; 82 k++; 83 } 84 else 85 { 86 count++; 87 k=0; 88 } 89 } 90 count++; 91 k=0; 92 } 93 flag=0; 94 for(i=0;i<count;i++) 95 { 96 for(j=i+1;j<count;j++) 97 { 98 if(strcmp(q[i],q[j])==0) 99 { 100 flag=1; 101 break; 102 } 103 } 104 } 105 if(flag==1) 106 { 107 printf("是非确定的有穷状态自动机,即NFA\n\n"); 108 printf("构造的有穷状态自动机为:\n"); 109 printf("NFA N=(K,E(总和的意思),M,{S},{Z})\n"); 110 } 111 else 112 { 113 printf("是确定的有穷状态自动机,即DFA\n\n\n"); 114 printf("构造的有穷状态自动机为:\n"); 115 printf("DFA N=(K,E(总和的意思),M,{S},{Z})\n"); 116 } 117 printf("其中,\nK={S"); 118 for(i=0;i<30&&(VT!='\0');i++) 119 { 120 printf(",%c",VT[i]); 121 } 122 printf("}\n"); 123 printf("E={"); 124 for(i=0;i<30&&(VN[i]!='\0');i++) 125 { 126 printf("%c ",VN[i]); 127 } 128 printf("}\n"); 129 //分离文法 130 k=0; 131 count=0; 132 for(i=0;i<line;i++) 133 { 134 j=4; 135 while(p[i][j]!='\0') 136 { 137 if(k<4) 138 { 139 q[count][k]=p[i][k]; 140 k++; 141 } 142 else 143 { 144 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')) 145 { 146 q[count][k]=p[i][j]; 147 k++; 148 j++; 149 } 150 if(p[i][j]=='l') 151 { 152 count++; 153 k=0; 154 j++; 155 } 156 } 157 } 158 count++; 159 k=0; 160 } 161 printf("\n"); 162 //打印 163 printf("M:\n"); 164 l=0; 165 while(VN[l]!='\0') 166 { 167 printf("M(S,%c)={",VN[l]); 168 for(i=0;i<30;i++) 169 { 170 for(j=4;j<30&&(q[i][j]!='\0');j++) 171 { 172 if(VN[l]==q[i][j]&&(q[i][j+1]=='\0')&&(q[i][j-1]=='=')) 173 printf("%c",q[i][0]); 174 } 175 } 176 printf("}\t"); 177 l++; 178 } 179 printf("\n"); 180 l=0; 181 k=0; 182 while(VT[k]!='\0') 183 { 184 l=0; 185 while(VN[l]!='\0') 186 { 187 printf("M(%c,%c)={",VT[k],VN[l]); 188 for(i=0;i<30;i++) 189 { 190 for(j=4;j<30&&(q[i][j]!='\0');j++) 191 { 192 if(VT[k]==q[i][j]&&VN[l]==q[i][j+1]) 193 printf("%c",q[i][0]); 194 } 195 } 196 printf("}\t"); 197 l++; 198 } 199 k++; 200 printf("\n"); 201 } 202 system("pause"); 203 } 204