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

📄 recuranalyser.c

📁 1.1 引言 1.1.1 设计目的 本次课程设计是在完成一个学期的编译原理课程之后
💻 C
📖 第 1 页 / 共 2 页
字号:
void recurPARL(){
	if(WORD.index==30)				//"("
		getWord();
	
	if(WORD.index==17){			//variable
		enterVTable(0);			//填变量表
		getWord();
	}
	else{
		error_handle(11);		//error:非法变量名
		skip(3);				//jump to var or procedure or begin
	}

	while(WORD.index==32){				//","
		if(WORD.index==32)				
			getWord();
		if(WORD.index==17){			//variable
			enterVTable(0);			//填变量表
			getWord();
		}
		else{
			error_handle(11);		//error
			skip(3);				//jump to var or procedure or begin
		}
	}
	
	if(WORD.index==31){				//")"
		getWord();
		ProcTable.table[ProcTable.pointer].paranum=counter-1;//填该过程的参数个数
	}
	else{
		error_handle(7);			//error:缺少)
		skip(3);					//jump to var or procedure or begin
	}
}

//////////////////////////////////////////////////////////////////////////////////////////////
//IDP(变量说明)的递归下降分析子程序
void recurIDP(){
	if(WORD.index==2)			//"var"
		getWord();

	if(WORD.index==17){			//variable
		enterVTable(0);			//填变量表
		getWord();
	}
	else{
		error_handle(11);		//error:非法变量名
		skip(2);				//jump to procedure or begin
	}
	
	while(WORD.index==32){				//","
		if(WORD.index==32)				
			getWord();
		if(WORD.index==17){			//variable
			enterVTable(0);			//填变量表
			getWord();
		}
		else{
			error_handle(11);		//error:非法变量名
			skip(2);				//jump to procedure or begin
		}
	}
	
	if(WORD.index==33){					//";"
		getWord();
		ProcTable.table[ProcTable.pointer].variablenum=counter-1;
	}
	else{
		error_handle(5);		//error:缺少;
		skip(2);				//jump to procedure or begin
	}
}

//////////////////////////////////////////////////////////////////////////////////////////////
//PP(过程)的递归下降分析子程序
void recurPP(){
	int i;
	Operand op1;
	Operand op2;
	Operand op3;
	if(WORD.index==2)				//"var"
		recurIDP();
	if(WORD.index!=3 && WORD.index!=4){
		error_handle(3);			//error:缺少var
		skip(2);					//jump to procedure or begin
	}

	while(WORD.index==3)			//"procedure"
		recurPRP();
	if(WORD.index!=4){
		error_handle(4);			//error:缺少procedure
		skip(1);					//jump to begin
	}

	if(WORD.index==4){				//"begin"
		ProcTable.table[ProcTable.pointer].variablenum=counter-1;
		i=ProcStack.top->index;		//生成开辟数据区的四元式
		op1.type=-1;
		op2.type=-1;
		op3.type=1;
		op3.offset=ProcTable.table[i].variablenum;
		GEN(8,op1,op2,op3);
		ProcTable.table[i].quaterposition=PC-1;	//填当前过程第一条四元式的位置
		getWord();
	}
	else
		error_handle(1);			//error:缺少begin
	
	LRAnalyser();		//执行语句处理
	
	if(WORD.index==5){				//"end"
		op1.type=-1;				//生成返回四元式
		op2.type=-1;
		op3.type=-1;
		GEN(7,op1,op2,op3);
		getWord();
		level--;					//嵌套深度减1
		pop();						//一过程结束,栈顶弹出

	}
	else{
		error_handle(2);			//error:缺少end
		skip(2);
	}
}


//////////////////////////////////////////////////////////////////////////////////////////////
//PRP(子程序)的递归下降分析子程序
void recurPRP(){
	if(WORD.index==3){				//"procedure"
		getWord();
		level++;
		counter=1;
	}

	if(WORD.index==17){				//variable
		enterPTable();				//填过程名表
		push();
		getWord();
	}
	else{
		if(WORD.index==30 || WORD.index==33){
			error_handle(18);		//error:缺少过程名
			skip(3);
		}
		else{
			error_handle(12);		//error:非法过程名
			skip(3);
		}
	}

	if(WORD.index==30)				//"("
		recurPARL();
	if(WORD.index!=33){
		error_handle(6);			//error:缺少(
		skip(3);
	}

	if(WORD.index==33)				//";"
		getWord();
	else{
		error_handle(5);			//error:缺少;
		skip(3);					//jump to var or procedure or begin
	}

	recurPP();
	
	if(WORD.index==33)				//";"
		getWord();
	else{
		error_handle(3);			//error:缺少;
		skip(2);					//jump to procedure or begin
	}
}

//////////////////////////////////////////////////////////////////////////////////////////////
//PROG(程序)的递归下降分析子程序
void recurPROG(){
	Operand op1;
	Operand op2;
	Operand op3;
	if(WORD.index==1)				//"program"
		getWord();
	else{
		error_handle(0);			//error:缺少program
		errflag_prog=true;
		skip(3);					//jump to var or procedure or begin
	}
	
	if(WORD.index==17){				//variable
		enterPTable();				//填过程名表
		getWord();
	}
	else{
		if(errflag_prog==false){
			error_handle(10);		//error:非法主程序名
			errflag_prog=true;
			skip(3);				//jump to var or procedure or begin
		}
	}

	if(WORD.index==33)				//";"
		getWord();
	else{
		if(errflag_prog==false){
			error_handle(5);		//error:缺少;
			errflag_prog=true;
			skip(3);				//jump to var or procedure or begin
		}
	}

	recurPP();						//过程
	
	if(WORD.index==34){				//"."
		op1.type=-1;				//生成停机四元式
		op2.type=-1;
		op3.type=-1;
		GEN(9,op1,op2,op3);	
		op1.type=-1;				//生成停机四元式
		op2.type=-1;
		op3.type=1;
		op3.offset=ProcTable.table[0].quaterposition;
		GEN(22,op1,op2,op3);
		getWord();
		if(WORD.index!=0){
			error_handle(16);		//error:程序结束,无效语句
			while(WORD.index!=0)	//释放剩余二元式链表空间
				getWord();
		}
	}
	else{
		if(WORD.index==0)
			error_handle(9);		//error:缺少.
		else{
			error_handle(16);		//error:程序结束,无效语句
			while(WORD.index !=0)	//释放剩余二元式链表空间
				getWord();
		}
	}
}

//////////////////////////////////////////////////////////////////////////////////////////////
//显示变量名表函数
void printVTable(){
	int i;
	printf("变量名表内容:\n");
	printf("vname\tplevel\trelposition\n");
	for(i=0;i<VariableTable.first;i++){
		printf("%s\t",VariableTable.table[i].vname);
		printf("%d\t",VariableTable.table[i].plevel);
		printf("%d\n",VariableTable.table[i].relposition);
	}
}

//////////////////////////////////////////////////////////////////////////////////////////////
//显示过程名表函数
void printPTable(){
	int i;
	printf("过程名表内容:\n");
	printf("pname\tparanum\tvsum\tfirinvt\tplevel\toutp\tfirinqu\n");
	for(i=0;i<=ProcTable.pointer;i++){
		printf("%s\t",ProcTable.table[i].pname);
		printf("%d\t",ProcTable.table[i].paranum);
		printf("%d\t",ProcTable.table[i].variablenum);
		printf("%d\t",ProcTable.table[i].firstinvtable);
		printf("%d\t",ProcTable.table[i].plevel);
		printf("%d\t",ProcTable.table[i].outposition);
		printf("%d\n",ProcTable.table[i].quaterposition);

	}
}

⌨️ 快捷键说明

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