正则表达式转化为NFA的部份算法
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
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
...全文
相关推荐
IIS6架设网站需要的工具.rar
IIS6架设网站需要的工具
Lex和Yacc使用教程(九).Windows下使用Lex和Yacc
Lex和Yacc应用方法(九).Windows下使用Lex和Yacc草木瓜 20070904一、序 不想Lex和Yacc系列的最后一篇文章竟如此“难产”,已时隔三个月之久。不由慨叹自由可支配时间是如此之少,如此岂不谓新时代的“奴隶”~ 罢罢罢,闲话少叙,回归正题,本文主要介绍在Windows下如何去使用Lex和Yacc,以作为本系列文章的终结。 二、方法介绍
ftp服务器工具
很好的服务器工具,IIS、WEB,··········
ASP 3.0与IIS 4/5网站架设彻底研究(PDG).rar
软件介绍 从ASP技术的角度出发,详细探讨IIS网站架设和相关的ASP程序技术,近百个范例程序,讲解IIS和ASP,让使用者真正精通ASP相关技术和IIS网站的架设
iis6.rar iis6安装包
iis6.rar


