www.pudn.com > ToNfa.rar > toNFA.cpp


#include "iostream.h" 
#include "string.h" 
 
class Relation 
{ 
public: 
 int CurrentState; 
 int NextState; 
 char TransitionElement; 
}; 
 
class TokenState 
{ 
public: 
 int BeginState; 
 int EndState; 
 int preposition; 
}; 
 
int IsTransitionElement(char s) 
{ 
 if (s=='0'||s=='1'||s=='$'||s=='('||s==')'||s=='*') 
	 return 1; 
 else return 0; 
} 
 
void NFADiagram(Relation *Rstring,int position,int CurrentState, 
				int NextState,char TransitionElement) 
{ 
 Rstring[position].CurrentState=CurrentState; 
 Rstring[position].NextState=NextState; 
 Rstring[position].TransitionElement=TransitionElement; 
} 
 
int TokenDealing(char *string,int position,TokenState *token,int *Rtoken)//双目运算 
{ 
  
  
 if (IsTransitionElement(string[position]) 
	 &&IsTransitionElement(string[position-1])) 
	 return 0; 
 else  if (IsTransitionElement(string[position]) 
	       &&!IsTransitionElement(string[position-1])) 
	 return 1; 
 else  
 { 
	 int firsttoken=token[Rtoken[position]].preposition; 
	 if(IsTransitionElement(string[firsttoken-1])) 
		 return 2; 
	 else return 3; 
 } 
} 
 
void ToNFA(char *string) 
{ 
 Relation relation[25];  
 TokenState token[20]; 
 int Rtoken[20]; 
 int tokeni=1,relationi=0; 
 int secondtoken; 
 bool start=false; 
 token[0].BeginState=0; 
 token[0].EndState=0; 
 for (unsigned i=0;imax) 
	  max=relation[j].NextState; 
 } 
 for (j=0;j=0) 
	   { 
        top--; 
    	while((stack[top]=='+' || stack[top]=='*') && top>=0) 
		{ 
         ReversePolishString[RPSi]=stack[top]; 
         top--; 
         RPSi++; 
		} 
	    top++; 
		stack[top]='+'; 
		top++; 
	   } 
	   ReversePolishString[RPSi]=statement[Si]; 
	   RPSi++; 
	   Si++; 
   } 
   else if (statement[Si]=='(') 
   { 
	   if ((statement[Si-1]=='0' || statement[Si-1]==')'  
		  || statement[Si-1]=='1'||statement[Si-1]=='$' 
		  || statement[Si-1] =='*') && Si-1>=0) 
	   { 
        top--; 
    	while((stack[top]=='+' || stack[top]=='*') && top>=0) 
		{ 
         ReversePolishString[RPSi]=stack[top]; 
         top--; 
         RPSi++; 
		} 
	    top++; 
		stack[top]='+'; 
		top++; 
	   } 
	   stack[top]=statement[Si]; 
       top++; 
	   Si++; 
   } 
   else if (statement[Si]==')') 
   { 
    top--; 
	while (stack[top]!='(') 
	{ 
      ReversePolishString[RPSi]=stack[top]; 
      top--; 
      RPSi++; 
	} 
	Si++; 
   } 
   else if (statement[Si]=='*') 
   {     
	top--; 
	while(stack[top]=='*' && top>=0) 
	{ 
      ReversePolishString[RPSi]=stack[top]; 
      top--; 
      RPSi++; 
	} 
	top++; 
	stack[top]=statement[Si]; 
	Si++; 
	top++; 
   } 
   else if (statement[Si]=='|') 
   { 
    top--; 
	while((stack[top]=='*' || stack[top]== '+' || stack[top]== '|') && top>=0) 
	{ 
      ReversePolishString[RPSi]=stack[top]; 
      top--; 
      RPSi++; 
	} 
	top++; 
	stack[top]=statement[Si]; 
	Si++; 
	top++; 
   } 
  } 
  top--; 
  while(top>=0) 
  { 
   ReversePolishString[RPSi]=stack[top]; 
   top--; 
   RPSi++; 
  } 
  ReversePolishString[RPSi]='\0'; 
} 
 
 
 
void main() 
{ 
 char s[25], R[25]; 
 
 cout<<"请输入正则表达式 : (可以输入的符号:0,1,(,),|,*,$)"<>s; 
 
 
 ToReversePolish(s,R); 
 ToNFA(R); 
}