资源简介
代码相对简单;
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++;
}
- 上一篇:简易C语言词法分析程序
- 下一篇:Linux 用C语言实现shell
评论
共有 条评论