正则表达式转化为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