www.pudn.com > LR.rar > 26.cpp


#include"status_stack.h" 
#include"symbol_instr_stack.h" 
#include"lr.h" 
//打印LR分析器的工作过程 
void print(status *status_p,symbol_instr *symbol_p,symbol_instr *instr_p) 
{ 
	int i; 
	out_stack(status_p); 
	for(i=0;i<20-status_p->top;i++) 
	printf(" "); 
	out_stack1(symbol_p); 
	for(i=0;i<20;i++) 
	printf(" "); 
	out_stack2(instr_p); 
	printf("\n"); 
} 
//状态转换函数 
int goto_char(status *status_p,symbol_instr *instr_p) 
{ 
	char x; 
	int  y,z; 
	x = get_top(instr_p); 
	y = get_top(status_p); 
	z = get_index_char(x); 
	return table[y][z]; 
} 
//移进--规约函数 
void action(status *status_p,symbol_instr *symbol_p,symbol_instr *instr_p) 
{ 
	int i,j,x; 
	char a; 
	i = goto_char(status_p,instr_p); 
	//规约出错 
	if(i == -1) 
		printf("\n===============规约出错!================\n"); 
	//规约成功 
	if(i == 12) 
		printf("\n===============规约成功!================\n"); 
	//移进动作 
	if(i>=0 && i<=11) 
	{	 
		push(status_p,i); 
		a = pop(instr_p); 
		push(symbol_p,a); 
		print(status_p,symbol_p,instr_p); 
		action(status_p,symbol_p,instr_p); 
	} 
	//规约动作 
	if(i>=21 && i<=26) 
	{ 
		x = r[i-21].y; 
		for(j=0;jtop != 0) 
	{ 
	    x = pop(symbol_p); 
		push(instr_p,x); 
	} 
	printf("\n\n"); 
	//打印框架	 
	printf("\n状态栈==============符号栈==============输入串\n"); 
	print(status_p,symbol_p,instr_p);//打印初始分析表 
	//移进,规约,并打印每一步分析过程 
	action(status_p,symbol_p,instr_p); 
	 
	return 0; 
}