www.pudn.com > 69446611333.rar > compile_work2.cpp


#include "iostream.h" 
#include "string.h" 
 
////////////////////////////////////////////////////////////////////////// 
//////////////////   Begin Regular==>NFA  ////////////////////////////////  
  
struct Relation  //定义NFA中弧 
{ 
 int CurrentState;  //定义起始状态  
 int NextState;  //定义下一个状态 
 char TransitionElement;  //定义输入字符 
}; 
 
struct TokenState  //定义操作符号处理栈  
{ 
 int BeginState; //定义起始 
 int EndState;  //定义结束  
 int preposition; //定义记录(一个大的区域)状态开始时在波兰式中的位置 
}; 
 
int IsTransitionElement(char s)   //判断输入字符串是否合法  
{ 
 if (s=='0'||s=='1'||s=='$') 
	 return 1; 
 else return 0; 
} 
 
void NFADiagram(Relation *Rstring,int position,int CurrentState, 
				int NextState,char TransitionElement)  //生成NFA中弧的信息   
{ 
 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;     //如果前一区域的结尾存在* 
 } 
} 
 
int StarDealing(char *string,int position) 
{ 
 if(IsTransitionElement(string[position])) 
	 return 1; 
 else  
	 return 0; 
} 
 
Relation relation[25]; 
int relationi=0; 
 
void ToNFA(char *string) 
{ 
 //Relation relation[25];  
 TokenState token[20]; 
 int Rtoken[20];//记录字符串中操作符号在操作符号列中的位置 
 int tokeni=1; //定义操作符号在操作符号中的位置 
 //int relationi=0; 
 int secondtoken; 
 token[0].BeginState=0; 
 token[0].EndState=0; 
 for (unsigned i=0;iNFA ******"<=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) //将剩余操作符号串接到{0,1}*后边    
  { 
   ReversePolishString[RPSi]=stack[top]; 
   top--; 
   RPSi++; 
  } 
  ReversePolishString[RPSi]='\0'; 
} 
////////////////////    End Regular==>NFA	////////////////////////////// 
////////////////////////////////////////////////////////////////////////// 
 
////////////////////////////////////////////////////////////////////////// 
//////////////////   Begin NFA==>DFA  //////////////////////////////////// 
 
int c=0;//全局变量 
//temp 
void line(int s[],int n)//排序 
{ 
	for(int i=1;i0)&&(s[j] class stack 
{ 
	private: 
		int size; 
		int top; 
		Elem *listArray; 
	public: 
		stack(int sz=100) 
		{	size=sz;top=0;listArray=new Elem[sz];} 
		~stack() 
		{	delete []listArray;} 
		bool push(const Elem& item) 
		{ 
			if(top==size) return false; 
			else {listArray[top++]=item;return true;} 
		} 
		bool pop(Elem& it) 
		{ 
			if(top==0) return false; 
			else {it=listArray[--top];return true;} 
		} 
		int length() const {return top;} 
}; 
 
void closure(int s[][100],int& n,int z[],int n0,int sub[],int& subn)//数组的闭包 
{ 
	stackt; 
	int i=0; 
	for(int m=0;mt; 
	int i=0; 
	t.push(z); 
	sub[i++]=z; 
	int a,mark=0; 
	while(t.length ()) 
	{ 
		t.pop(a); 
		for(int j=0;jDFA   	////////////////////////////// 
////////////////////////////////////////////////////////////////////////// 
 
void main() 
{ 
    char statement[25], ReversePolishString[25]; 
    cout<<"请输入正则式( 注意对单个输入有*操作的时候要有$合成,比如求0*,要有($0)* ): "<>statement; 
    ToReversePolish(statement,ReversePolishString); 
    cout<DFA ******"<t; 
	t.push(dfa[0]);//初始状态的闭包入栈 
	while(t.length()) 
	{ 
		t.pop(temp); 
		for(i=0;i<2;i++) 
		{ 
			for(j=0;j0) 
        { 
		cout<<"DFA状态"<0) 
	  { 
		cout<0)  
			 cout<0) 
			 cout<