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

feihu303 2003-03-26 01:38:51
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

...全文
78 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
feihu303 2003-03-27
  • 打赏
  • 举报
回复
更正: if(q=1)应该为if(q==1)
zhoukun666 2003-03-26
  • 打赏
  • 举报
回复
thanku

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧