www.pudn.com > bianyi(LL1).rar > LL1.cpp


#include"iostream.h" 
#include"string.h" 
#include "iomanip.h" 
#include "stdlib.h" 
 
struct stack 
{ 
	int top; 
	char s[10]; 
}*sign; 
 
 
char *M[5][6]={ 
{"TP","$","$","TP","$","$"}, 
{"$","+TP","$","$","e","e"}, 
{"FQ","$","$","FQ","$","$"}, 
{"$","e","*FQ","$","e","e"}, 
{"i","$","$","(E)","$","$"}}; 
 
 
 
int index(char m) 
{ 
	int ID; 
         if((m=='E')||(m=='i')) ID=0; 
	else if((m=='P')||(m=='+')) ID=1; 
	else if((m=='T')||(m=='*')) ID=2; 
	else if((m=='Q')||(m=='(')) ID=3; 
	else if((m=='F')||(m==')')) ID=4; 
	else if(m=='#')             ID=5; 
	else                        ID=6; 
	return ID; 
} 
 
void main() 
{ 
	char instr[15],x,a,*current,left,*right;int i=0,iA,ia,len,top; 
	bool flag=true; 
	cout<<"参照文法为:\n"<<"E→TE'\n"<<"E'→+TE'|ε\n"<<"T→FT'\n"<<"T'→*FT'|ε\n"<<"F→(E)|i\n"; 
	cout<<"为编成方便作改写:E'以P、T'以Q  代替."<>instr[i++]; 
	} 
	while(instr[i-1]!='#'); 
	instr[i]='\0'; 
	sign=new stack; 
	sign->s[0]='#'; 
	sign->s[1]='E'; 
	sign->s[2]='\0'; 
	sign->top=1; 
	current=instr; 
	a=*current;                                        //a为ip所指向的符号; 
	cout<<"步骤"<s<s[sign->top];                    //让X等于栈顶符号 
		if(x=='#')                                  //if X 是终结符号或# then 
		{ 
			if(x==a)                                //If X=a then  把X从栈顶弹出并使ip指向下一个输入符号 
				flag=false; 
			else  
			{ 
				cout<<"此句子不符合该文法!"; 
				break; 
			} 
		} 
		else if((x=='i')||(x=='+')||(x=='*')||(x=='(')||(x==')')) //else   X 是终结符号 
		{ 
			if(x==a) 
			{ 
				sign->s[sign->top]='\0'; 
				sign->top--;                                         //从栈中弹出X 
				a=*(++current);                                        
				cout<s<s[sign->top]='\0'; 
				sign->top-=1;                                   //从栈中弹出X 
				right="ε";    
			} 
			else if((len==1)&&(M[iA][ia][0]=='$')) 
			{ 
				cout<<"此句子不符合该文法!"; 
				break; 
			} 
			else  
			{ 
				top=sign->top; 
				for(int j=len-1;j>=0;j--) 
					sign->s[top++]=M[iA][ia][j];                //压入栈 
				sign->s[top]='\0';               
				sign->top=top-1;  
			} 
			cout.setf(ios::left); 
			cout<s<