⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 26.cpp

📁 编译原理的实验
💻 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;j<x;j++)
		{
			pop(status_p);
			pop(symbol_p);
		}
		push(instr_p,r[i-21].x);
		action(status_p,symbol_p,instr_p);

	}
}

int main()
{
	char x;
	//分配空间
	status *status_p;
	symbol_instr *symbol_p,*instr_p ;
	status_p = (status *)malloc(sizeof(status));
	symbol_p = (symbol_instr *)malloc(sizeof(symbol_instr));
	instr_p = (symbol_instr *)malloc(sizeof(symbol_instr));
	//初始化各栈
	init_stack(status_p);
	init_stack(symbol_p);
	init_stack(instr_p);
	//压进栈初始元素
	push(status_p,0);//
	push(symbol_p,'#');//
	//输入表达式
	printf("\n请输入要规约的输入串,各字符之间不能有空格,以'#'字符结束!\n");
	printf("===========Expression =");	
	//先将输入串压进符号栈	
	do{
		
		scanf("%c",&x);
		push(symbol_p,x);
	}while(x != '#');
	//然后由符号栈弹出,压进输入栈
	while( symbol_p->top != 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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -