1 #include<stdio.h>2 #include <ctype.h>3 #define ok 14 #define error 05 #define MAXREGLUARLONG 406 #define MAXSTATELONG 40 7 #define MAXCAHRSLONG 40 8 typedef int state;9 int iCurrentState=0; //初态以1开始10 int iPreState=0;11 int iLastForkState=0;12 int iForkState=0;13 int iMaxState=0;14 char cRegluarSting[MAXREGLUARLONG]; //输入的正规式字符串15 char cCharSet[MAXCAHRSLONG]; //字符集16 int iStateMatrix[MAXSTATELONG][MAXCAHRSLONG]; //状态转换矩阵17 state vStoreRegluarSting()//把字符串读入一个缓冲区中18 {19 scanf("%s",cRegluarSting);20 return ok;21 }22 state vPreProcessRegluarSting()23 //对字符串进行预处理,去掉字符串里面的对分析不产生影响24 {25 int i=0;26 while(cRegluarSting[i]!='\0')27 {28 if(cRegluarSting[i]=='*')29 {30 int j=i+1;31 while(cRegluarSting[j-1]!='\0')32 { 33 cRegluarSting[j-1]=cRegluarSting[j++]; 34 }35 }36 i++;37 }38 return ok;39 }40 void vConstructStateMatrix(char cChar,int istate)//构造状态转换矩阵41 {42 int i;43 for(i=0;cCharSet[i]!='\0';i++)44 if(cChar==cCharSet[i])45 break;46 cCharSet[i]=cChar;47 iStateMatrix[iPreState][i]=istate;48 }49 void vAanalyseRegluarSting()//对字符串进行从左到右的分析与处理50 {51 int i=0;52 for(i=0;cRegluarSting[i]!=0;i++)53 {54 if(cRegluarSting[i]=='(') //NFA出现开始分叉情况55 {56 int iTheFirstl=0;57 int iCharNumBeforl=0;58 iForkState=iCurrentState;59 while(cRegluarSting[i]!=')')60 { 61 i++;62 if(isalpha(cRegluarSting[i]))63 {64 if(cRegluarSting[i+1]==')')65 iCurrentState=iLastForkState;66 else67 iCurrentState++;68 iCharNumBeforl++; vConstructStateMatrix(cRegluarSting[i],iCurrentState);69 iPreState=iCurrentState;70 if(iCurrentState>iMaxState)71 iMaxState=iCurrentState;72 }73 if(cRegluarSting[i]=='|')74 {75 iPreState=iForkState;76 if(iTheFirstl==0)77 {78 iLastForkState=iCurrentState; 79 iTheFirstl++;80 }81 if(iCharNumBeforl==1&&cRegluarSting[i+2]=='|')82 iCurrentState=iForkState;83 iCharNumBeforl=0;84 }85 if(cRegluarSting[i]==')')86 {87 iPreState=iForkState=iLastForkState;88 iCurrentState=iMaxState;89 }90 }91 }92 else93 { 94 if(isalpha(cRegluarSting[i]))95 {96 iCurrentState++; vConstructStateMatrix(cRegluarSting[i],iCurrentState);97 iPreState=iCurrentState;98 if(iCurrentState>iMaxState)99 iMaxState=iCurrentState;
100 }
101 }
102 }
103 }
104 void vPrintfStateProjectFunction()
105 {
106 int icCharSetPointer;
107 int iPreStatePointer;
108 for
109 (iPreStatePointer=0;iPreStatePointer<MAXSTATELONG;iPreStatePointer++)
110 for(icCharSetPointer=0;icCharSetPointer<MAXSTATELONG;icCharSetPointer++)
111 if(iStateMatrix[iPreStatePointer][icCharSetPointer]>0) printf("&(%d,%c)=%d\n",iPreStatePointer,cCharSet[icCharSetPointer],iStateMatrix[iPreStatePointer][icCharSetPointer]);
112 }
113 void vPrintfNfa()//输出NFA
114 {
115 int iStateNumble;
116 int i=0;
117 printf("NFA的形式为:(S,$,&,S0,F)\n\n以下为NFA的具体集合内容:\n\n");
118 printf("字符集$为:{");
119 while(cCharSet[i]!=0)
120 if(cCharSet[i+1]==0)
121 printf("%c",cCharSet[i++]);
122 else
123 printf("%c,",cCharSet[i++]);
124 printf("}\n");
125 printf("\n状态集S为:{");
126 for (i=0;i<=iMaxState;i++) {
127 if(i==iMaxState)
128 printf("%d",i);
129 else
130 printf("%d,",i);
131 }
132 printf("}\n\n");
133 vPrintfStateProjectFunction();
134 printf("\n初态集S0为:{0}\n\n");
135 printf("终态集F为:{%d}",iMaxState);
136 }
137 void main()
138 {
139 vStoreRegluarSting();
140 vPreProcessRegluarSting();
141 vAanalyseRegluarSting();
142 vPrintfNfa();
143 }
转载于:https://www.cnblogs.com/RSTART/p/5017474.html

