日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1203正规式转换为有穷自动机

發(fā)布時(shí)間:2023/12/13 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1203正规式转换为有穷自动机 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
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; //初態(tài)以1開始10 int iPreState=0;11 int iLastForkState=0;12 int iForkState=0;13 int iMaxState=0;14 char cRegluarSting[MAXREGLUARLONG]; //輸入的正規(guī)式字符串15 char cCharSet[MAXCAHRSLONG]; //字符集16 int iStateMatrix[MAXSTATELONG][MAXCAHRSLONG]; //狀態(tài)轉(zhuǎn)換矩陣17 state vStoreRegluarSting()//把字符串讀入一個(gè)緩沖區(qū)中18 {19 scanf("%s",cRegluarSting);20 return ok;21 }22 state vPreProcessRegluarSting()23 //對字符串進(jìn)行預(yù)處理,去掉字符串里面的對分析不產(chǎn)生影響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)//構(gòu)造狀態(tài)轉(zhuǎn)換矩陣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()//對字符串進(jìn)行從左到右的分析與處理50 {51 int i=0;52 for(i=0;cRegluarSting[i]!=0;i++)53 {54 if(cRegluarSting[i]=='(') //NFA出現(xiàn)開始分叉情況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èi)容:\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狀態(tài)集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初態(tài)集S0為:{0}\n\n"); 135 printf("終態(tài)集F為:{%d}",iMaxState); 136 } 137 void main() 138 { 139 vStoreRegluarSting(); 140 vPreProcessRegluarSting(); 141 vAanalyseRegluarSting(); 142 vPrintfNfa(); 143 }

轉(zhuǎn)載于:https://www.cnblogs.com/RSTART/p/5017474.html

總結(jié)

以上是生活随笔為你收集整理的1203正规式转换为有穷自动机的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。