• 大小: 4KB
    文件类型: .cpp
    金币: 2
    下载: 1 次
    发布日期: 2021-07-21
  • 语言: C/C++
  • 标签: nfa  

资源简介

代码相对简单; c语言实现; 正则表达式转换为nfa;

资源截图

代码片段和文件信息

#include
#include 
#define  ok   1
#define  error 0
#define  MAXREGLUARLONG 40
#define  MAXSTATELONG  40
#define  MAXCAHRSLONG   40  
typedef  int state;
int iCurrentState=0;   //初态以1开始
int iPreState=0;
int iLastForkState=0;
int iForkState=0;
int iMaxState=0;

char cRegluarSting[MAXREGLUARLONG];       //输入的正规式字符串

char cCharSet[MAXCAHRSLONG];   //字符集

int  iStateMatrix[MAXSTATELONG][MAXCAHRSLONG];  //状态转换矩阵

state vStoreRegluarSting()//把字符串读入一个缓冲区中
{
scanf(“%s“cRegluarSting);
return ok;
}

state vPreProcessRegluarSting()//对字符串进行预处理去掉字符串里面的对分析不产生影响
{
int i=0;
while(cRegluarSting[i]!=‘\0‘)
{
if(cRegluarSting[i]==‘*‘)
{
int j=i+1;
while(cRegluarSting[j-1]!=‘\0‘)

cRegluarSting[j-1]=cRegluarSting[j++];
}
}
    i++;
}
return ok;
}
void vConstructStateMatrix(char cCharint istate)//构造状态转换矩阵
{
for(int i=0;cCharSet[i]!=‘\0‘;i++)
if(cChar==cCharSet[i])
break;
cCharSet[i]=cChar;
iStateMatrix[iPreState][i]=istate;
}
void vAanalyseRegluarSting()//对字符串进行从左到右的分析与处理
{
int i=0;
for(i=0;cRegluarSting[i]!=0;i++)
{
if(cRegluarSting[i]==‘(‘)  //NFA出现开始分叉情况
{
iForkState=iCurrentState;
int iTheFirstl=0;
int iCharNumBeforl=0;
while(cRegluarSting[i]!=‘)‘)
{
i++;
if(isalpha(cRegluarSting[i]))
{
if(cRegluarSting[i+1]==‘)‘)
iCurrentState=iLastForkState;
else
iCurrentState++;
iCharNumBeforl++;
vConstructStateMatrix(cRegluarSting[i]iCurrentState);
iPreState=iCurrentState;
if(iCurrentState>iMaxState)
iMaxState=iCurrentState;
}
if(cRegluarSting[i]==‘|‘)
{
iPreState=iForkState;
if(iTheFirstl==0)
{
iLastForkState=iCurrentState;
iTheFirstl++;
}

评论

共有 条评论