简单有限自动机
1 #include<stdio.h> 2 #include<string.h> 3 #define N 50 4 5 6 void main() 7 { 8 int i; 9 static char x[N]; 10 int n; 11 int temp; 12 int semp1=0; 13 int semp2=0; 14 int semps,semp3; 15 printf("输入简单正规式:"); 16 scanf("%s",&x); 17 n=strlen(x); 18 for(i=0;i<n;i++) 19 { 20 if(x[i]=='|') 21 { 22 temp=i; 23 break; 24 } 25 } 26 if(i==n&&x[i-1]!='|') temp=n; 27 for(i=0;i<temp;i++) 28 { 29 if(x[i]=='*') 30 { 31 printf("f<%d,$>=%d\n",semp1,semp1+1); 32 semp1=semp1+1; 33 printf("f<%d,%c>=%d\n",semp1,x[i-1],semp1); 34 printf("f<%d,$>=%d\n",semp1,semp1+1); 35 semp1=semp1+1; 36 } 37 else if(x[i]!='*'&&x[i+1]!='*') 38 { 39 printf("f<%d,%c>=%d\n",semp1,x[i],semp1+1); 40 semp1=semp1+1; 41 } 42 semps=semp1; 43 } 44 for(i=temp+1;i<n;i++) 45 { 46 if(i==temp+1) 47 { 48 semp2=0; 49 if(((i==n-1)&&(x[i!='*']))||(i==(n-2))&&(x[i+1]=='*')) 50 { 51 semp3=semps; 52 if(x[i]=='*') 53 { 54 printf("f<%d,~>=%d\n",semp2,semp1+1); 55 semp1=semp1+1; 56 printf("f<%d,%c>=%d\n",semp1,x[i-1],semp1); 57 printf("f<%d,~>=%d\n",semp1,semp3); 58 semp1=semp1+1; 59 } 60 else if(x[i]!='*'&&x[i+1]!='*') 61 { 62 printf("f<%d,%c>=%d\n",semp2,x[i],semp1); 63 semp1=semp1+1; 64 } 65 else if(x[i]!='*'&&x[i+1]=='*') 66 { 67 printf("f<%d,~>=%d\n",semp2,semp1+1); 68 semp1=semp1+1; 69 printf("f<%d,%c>=%d\n",semp1,x[i],semp1); 70 printf("f<%d,~>=%d\n",semp1,semp3); 71 semp1=semp1+1; 72 } 73 else if(((i-1)==(n-2))&&(x[i+1]=='*')) 74 { 75 printf("f<%d,~>=%d\n",semp2,semp1+1); 76 semp1=semp1+1; 77 printf("f<%d,%c>=%d\n",semp1,x[i],semp1); 78 printf("f<%d,~>=%d\n",semp1,semp3); 79 semp1=semp1+1; 80 } 81 } 82 83 else 84 { 85 semp3=semps; 86 if((x[i]=='*')&&((i-1)!=temp+1)) 87 { 88 printf("f<%d,$>=%d\n",semp2,semp1+1); 89 semp1=semp1+1; 90 printf("f<%d,%c>=%d\n",semp1,x[i-1],semp1); 91 printf("f<%d,$>=%d\n",semp1,semp1+1); 92 semp1=semp1+1; 93 } 94 else if(x[i]!='*'&&x[i+1]!='*') 95 { 96 printf("f<%d,%c>=%d\n",semp2,x[i],semp1+1); 97 semp1=semp1+1; 98 } 99 else if(x[i]!='*'&&x[i+1]=='*'&&i==n-1) 100 { 101 printf("f<%d,$>=%d\n",semp2,semp1+1); 102 semp1=semp1+1; 103 printf("f<%d,%c>=%d\n",semp1,x[i],semp1); 104 printf("f<%d,$>=%d\n",semp1,semp3); 105 semp1=semp1+1; 106 } 107 else if(x[i]!='*'&&x[i+1]=='*'&&i==temp+1&&i!=n-2) 108 { 109 printf("f<%d,$>=%d\n",semp2,semp1+1); 110 semp1=semp1+1; 111 printf("f<%d,%c>=%d\n",semp1,x[i],semp1); 112 printf("f<%d,$>=%d\n",semp1,semp1+1); 113 semp1=semp1+1; 114 } 115 116 } 117 118 } 119 120 121 122 else 123 { 124 semp3=semps; 125 if(i==n-1) 126 { 127 /*if(x[i]=='*') 128 { 129 printf("f<%d,~>=%d\n",semp1,semp1+1); 130 semp1=semp1+1; 131 printf("f<%d,%c>=%d\n",semp1,x[i-1],semp1); 132 printf("f<%d,~>=%d\n",semp1,semp3); 133 semp1=semp1+1; 134 }*/ 135 136 if(x[i]!='*'&&x[i+1]!='*') 137 { 138 printf("f<%d,%c>=%d\n",semp1,x[i],semp3); 139 semp1=semp1+1; 140 } 141 } 142 143 else 144 { 145 if((x[i]=='*')&&(i-1!=temp+1)) 146 { 147 printf("f<%d,$>=%d\n",semp1,semp1+1); 148 semp1=semp1+1; 149 printf("f<%d,%c>=%d\n",semp1,x[i-1],semp1); 150 printf("f<%d,$>=%d\n",semp1,semp1+1); 151 semp1=semp1+1; 152 } 153 else if(x[i]!='*'&&x[i+1]!='*') 154 { 155 printf("f<%d,%c>=%d\n",semp1,x[i],semp1+1); 156 semp1=semp1+1; 157 } 158 159 else if((x[i]!='*'&&x[i+1]=='*')&&(i!=temp+1)) 160 { 161 printf("f<%d,~>=%d\n",semp1,semp1+1); 162 semp1=semp1+1; 163 printf("f<%d,%c>=%d\n",semp1,x[i],semp1); 164 printf("f<%d,~>=%d\n",semp1,semp3); 165 semp1=semp1+1; 166 } 167 } 168 169 } 170 } 171 }