www.pudn.com > LR0.rar > LR(0).CPP


#include 
#include 
#include 
#include 
struct stack{          
	int  top; 
	int  st[15];     //״̬ջ 
	char sn[15];     //·ûºÅÕ» 
}*sign; 
struct analysis{   //¶¯×÷±í½á¹¹ 
	char act; 
	int  status; 
}action[][6]={ 
	{'s',5,'$',0,'$',0, 's',4,'$',0, '$',0}, 
	{'$',0,'s',6,'$',0, '$',0,'$',0, 'A',0}, 
	{'$',0,'r',2,'s',7, '$',0,'r',2, 'r',2}, 
	{'$',0,'r',4,'r',4, '$',0,'r',4, 'r',4}, 
	{'s',5,'$',0,'$',0, 's',4,'$',0, '$',0}, 
	{'$',0,'r',6,'r',6, '$',0,'r',6, 'r',6}, 
	{'s',5,'$',0,'$',0, 's',4,'$',0, '$',0}, 
	{'s',5,'$',0,'$',0, 's',4,'$',0, '$',0}, 
	{'$',0,'s',6,'$',0, '$',0,'s',11,'$',0}, 
	{'$',0,'r',1,'s',7, '$',0,'r',1, 'r',1}, 
	{'$',0,'r',3,'r',3, '$',0,'r',3, 'r',3}, 
	{'$',0,'r',5,'r',5, '$',0,'r',5, 'r',5}}; 
analysis G[]={{'E',3},{'E',1},{'T',3},{'T',1},{'F',3},{'F',1}}; 
int go[][3]={1,2,3,99,99,99,99,99,99,99,99,99,8,2,3,99,99,99,99,9,3,99,99,10,99,99,99,99,99,99,99,99,99,99,99,99}; 
/***********************************************************************************************/ 
int index(char m) 
{ 
	int id; 
	if((m=='i') || (m=='E'))        
	{ 
		id=0; 
	} 
	else if((m=='+') || (m=='T'))   
	{ 
		id=1; 
	} 
	else if((m=='*') || (m=='F'))   
	{ 
		id=2; 
	} 
	else if(m=='(')               
	{ 
		id=3; 
	} 
	else if(m==')')               
	{ 
		id=4; 
	} 
	else if(m=='#')               
	{ 
		id=5; 
	} 
	else                          
	{ 
		id=99; 
	} 
	return id; 
} 
/************************************************************************************************/ 
int main() 
{ 
	char instr[20],*current,a; 
	int i=0,step=0,ix1,ia,ix2,ig,iG,back; 
	bool flag=true; 
	sign=new stack; 
	cout<<"input(#):"; 
    do 
	{ 
		cin>>instr[i]; 
		i++; 
	} 
	while(instr[i-1]!='#'); 
    instr[i]='\0'; 
	current=instr; 
	sign->st[0]=0; 
	sign->sn[0]='#'; 
	sign->sn[1]='\0'; 
	sign->top=0; 
	cout<<"״̬"<<"\t\t"<<"·ûºÅ"<<"\t\t"<<"ÊäÈë´®"<st[0]<<"\t\t"<sn<<"\t\t"<st[sign->top]; 
        if(ia==99)  
		{ 
			cout<<"error"<top+=1; 
			sign->sn[sign->top]=a; 
			sign->sn[(sign->top)+1]='\0'; 
            sign->st[sign->top]=action[ix1][ia].status ; 
			current++; 
		} 
		else if(action[ix1][ia].act=='r') 
		{ 
            iG=action[ix1][ia].status-1;  //ÁãÏÂ±í¿ªÊ¼ 
			back=G[iG].status; 
			sign->top-=back; 
			ix2=sign->st[sign->top]; 
			ig=index(G[iG].act); 
			if(go[ix2][ig]!=99) 
			{ 
				sign->top+=1; 
				sign->st[sign->top]=go[ix2][ig]; 
				sign->sn[sign->top]=G[iG].act; 
                sign->sn[(sign->top)+1]='\0'; 
			} 
			else 
			{ 
				cout<<"error"<top ;i++) 
		{ 
			cout<st[i]<<" "; 
		} 
		cout<top))<sn<sn))<