正则表达式转化为NFA的部份算法

feihu303 feihu303 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
static int linepos=0;


int IsAlphabet(char a)
{
if(('0'<=a&&a<='9')|| ('a'<=a&&a<='z')||('A'<=a&&a<='Z'))
return 1;
else return 0;
}

char GetNextCh(int size)
{
if(linepos<size)

return string[linepos++];
else return NULL;
}



void RegularToNFA()
{
int k=0,T=0,ST0=0,q=0;int ST1;
char a;char sym; Stack sk;
Arc s,arc;

int size;
size=strlen(string);
a=GetNextCh(size);
while(a!='#')
{
if(IsAlphabet(a))
{
sym=GetNextCh(size);
if (sym=='*')
{
cout<<"from:"<<T<<"-->"<<k+1<<"∈"<<endl;
cout<<"from:"<<k+1<<"-->"<<k+1<<a<<endl;
cout<<"from:"<<k+1<<"-->"<<k+2<<"∈"<<endl;

k+=2; T=k;
a=GetNextCh(size);
}
else
{
cout<<"from:"<<T<<"-->"<<k+1<<a<<endl;

k=k+1;T=k;
a=sym;
}
}
switch(a)
{
case '|':
{
if(q==0)
{
ST1=T;T=ST0;q=1;
}
else
{
cout<<"from:"<<T<<"-->"<<ST1<<"∈"<<endl;

T=ST0;

}
a=GetNextCh(size);
break;
}//case
case'(':
{
arc.ST0=ST0;arc.ST1=ST1;arc.q=q;sk.Push(arc);
cout<<"from:"<<T<<"-->"<<k+1<<"∈"<<endl;

k=k+1;T=k;
ST0=k;q=0;
a=GetNextCh(size);
break;
}//

case ')':
{
if(q=1){
cout<<"from:"<<T<<"-->"<<ST1<<"∈"<<endl;

T=ST1;
}
sym=GetNextCh(size);
if(sym!='*')a=sym;
else
{
cout<<"from:"<<T<<"-->"<<ST0<<"∈"<<endl;
cout<<"from:"<<ST0<<"-->"<<k+1<<"∈"<<endl;

k=k+1;T=k;
a=GetNextCh(size);
}
s=sk.Pop();
ST0=s.ST0; ST1=s.ST1;q=s.q;
}//case
}//switch
}//while

if(q=1)
{
cout<<"from:"<<T<<"-->"<<ST1<<"∈"<<endl;

T=ST1;
}
}//end

...全文

相关推荐

评论 2
收藏 已收藏
分享
返回顶部
feihu303
数据结构与算法 33,027 成员 35,334 内容