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

📄 语法分析程序.cpp

📁 c++6.0上实现的s语言的语法分析程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		t1=NewTemp();
		if(op==35){
			if(E_Contrl){
				E_Contrl=0;
				E_rtn=EquPush(2,rtn,opr2,t1);
			}
			else{EquPush(2,rtn,opr2,t1);}
			rtn=t1;
		}
		else{
			if(E_Contrl){
				E_Contrl=0;
				E_rtn=EquPush(3,rtn,opr2,t1);
			}
			else{EquPush(3,rtn,opr2,t1);}
			rtn=t1;
		}
		if(expr[now_addr].cod==35||expr[now_addr].cod==36) 
			rtn=E1_AddSub(t1);
	}
	return rtn;
}

int T_MulDiv(){
	int t1;
	int rtn=F_Number();
	t1=rtn;
	rtn=T1_MulDiv(t1);
	return rtn;
}
int T1_MulDiv(int a){
	int rtn,t1;
	rtn=a;
	if(expr[now_addr].cod==34||expr[now_addr].cod==39){
		int op=expr[now_addr++].cod;
		int opr2=F_Number();
		t1=NewTemp();
		if(op==34){
			if(E_Contrl){
				E_Contrl=0;
				E_rtn=EquPush(4,rtn,opr2,t1);
			}
			else{EquPush(4,rtn,opr2,t1);}
			rtn=t1;
		}
		else{
			if(E_Contrl){
				E_Contrl=0;
				E_rtn=EquPush(5,rtn,opr2,t1);
			}
			else{EquPush(5,rtn,opr2,t1);}
			rtn=t1;
		}
		if(expr[now_addr].cod==34||expr[now_addr].cod==39) 
			rtn=T1_MulDiv(t1);
	}
	return rtn;
}

int F_Number(){
	int rtn=0;
	if(expr[now_addr].cod==32){
		now_addr++;
		rtn=E_AddSub();
		if(expr[now_addr++].cod!=40) Error(7);
	}
	else{
		switch(expr[now_addr].cod){
		    case 27:rtn=expr[now_addr].addr;break;
			case 28:rtn=expr[now_addr].addr;break;
			case 29:rtn=expr[now_addr].addr;break;
			case 30:rtn=expr[now_addr].addr;break;
			default: Error(7);break;
		}
		var_count++;
		now_addr++;
	}
	return rtn;
}

void Push(int cod,int addr){
	int j;
	expr[pos].addr=addr;
	expr[pos].cod=cod;
	for(j=0;j<20;j++) expr[pos].name[j]=ID[j];
	pos++;
	return;
}

void InitStack(){
	int i,j;
	pos=0;
	now_addr=0;
	for(i=0;i<EXP_LEN;i++){
		expr[i].addr=0;
		expr[i].cod=0;
		for(j=0;j<20;j++)expr[i].name[j];
	}
}

/***********复合语句分析***********/
int S_Begin(){
	int rtn=0;
	if(code==42){GetNext();LineOfPro++;}
	if(code==2){
		LineOfPro++;
		GetNext();
		rtn=L_Analize();
		if(code!=10){
			Error(5);LineOfPro++;return 0;
		}
		else{LineOfPro++;GetNext();}
	}
	return rtn;
}
/************语句序列分析****************/
int L_Analize(){
	int rtn=0;
	switch(code){
	    case 27:S_Let(0);rtn=E_rtn;break;
		case 13:rtn=S_If();break;
		case 26:rtn=S_While();break;
		case 20:rtn=S_Repeat();break;
		case 12:rtn=S_For();break;
		default: Error(6);return 0;
	}
	if(code==42){
		LineOfPro++;
		GetNext();
		switch(code){
	        case 27:L_Analize();return rtn;
			case 26:L_Analize();return rtn;
			case 20:L_Analize();return rtn;
			case 12:L_Analize();return rtn;
			case 13:L_Analize();return rtn;
			default: return rtn;
		}
	}
	return rtn;
}
/**********if语句分析*********/
int S_If(){
	int rtn=0;
	int temp=0;
	int as;
	int b_addr=0,tt=0;
	if(code==13){
		temp=LineOfEqu+1;
		B_Init();
		b_addr=B_Analize();
		True_address=EquPush(11,b_addr,ZERO,1);
		False_address=EquPush(6,0,0,0);
		if(code==21){
			GetNext();
			switch(code){
				case 27:rtn=S_Let(0);break;
		        case 13:rtn=S_If();break;
		        case 26:rtn=S_While();break;
		        case 20:rtn=S_Repeat();break;
		        case 12:rtn=S_For();break;
				case 2:rtn=S_Begin();break;
		        default: Error(6);return 0;
			}
			BackPatch(True_address,rtn+1);
			tt=LineOfEqu+1;
			as=EquPush(6,0,0,tt);
			if(code==9){
				GetNext();
			    switch(code){
				    case 27:tt=S_Let(0);break;
		            case 13:tt=S_If();break;
		            case 26:tt=S_While();break;
		            case 20:tt=S_Repeat();break;
		            case 12:tt=S_For();break;
				    case 2:tt=S_Begin();break;
		            default: Error(6);return 0;
				}
			}
			BackPatch(False_address,tt+1);
			BackPatch(as,LineOfEqu+1);
		}
		else{Error(IF);return 0;}
	}
	return temp;
}
/*************while语句分析*************/
int S_While(){
	int rtn=0;
	int temp=0;
	int b_addr=0;
	if(code==42){GetNext();LineOfPro++;}
	if(code==26){
		temp=LineOfEqu+1;
		B_Init();
		b_addr=B_Analize();
		True_address=EquPush(11,b_addr,ZERO,1);
		False_address=EquPush(6,0,0,0);
		if(code==8){
			GetNext();
			switch(code){
				case 27:rtn=S_Let(0);break;
		        case 13:rtn=S_If();break;
		        case 26:rtn=S_While();break;
		        case 20:rtn=S_Repeat();break;
		        case 12:rtn=S_For();break;
				case 2:rtn=S_Begin();break;
		        default: Error(6);return 0;
			}
			GetNext();
			BackPatch(True_address,rtn);
		}
		else{Error(WHILE);return 0;}
	}
	BackPatch(False_address,LineOfEqu+1);
	return temp;
}
/***************for语句分析***************/
int S_For(){
	int rtn=0,jmp_addr;
	int addr2;
	if(code==42){GetNext();LineOfPro++;}
	if(code==12){
		GetNext();
		rtn=S_Let(1);
		if(code==22){
			GetNext();
			if((code==27)||(code==28)){
				addr2=address;
				GetNext();
				if(code==8){
					GetNext();
					switch(code){
				        case 27:jmp_addr=S_Let(0);break;
		                case 13:jmp_addr=S_If();break;
		                case 26:jmp_addr=S_While();break;
		                case 20:jmp_addr=S_Repeat();break;
		                case 12:jmp_addr=S_For();break;
				        case 2:jmp_addr=S_Begin();break;
		                default: Error(6);return 0;
					}
					EquPush(2,let_count,ONE,let_count);
					EquPush(7,let_count,addr2,jmp_addr);
				}
				else{Error(FOR);return 0;}
			}
			else{Error(FOR);return 0;}
		}
		else{Error(FOR);return 0;}
	}
	return rtn;
}
/**************repreat语句分析************/
int S_Repeat(){
	int rtn=0;
	int b_addr=0;
	if(code==42){GetNext();LineOfPro++;}
	if(code==20){
		GetNext();
		switch(code){
			case 27:rtn=S_Let(0);break;
		    case 13:rtn=S_If();break;
		    case 26:rtn=S_While();break;
		    case 20:rtn=S_Repeat();break;
		    case 12:rtn=S_For();break;
		    case 2:rtn=S_Begin();break;
		    default: Error(6);return 0;
		}
		if(code==42){LineOfPro++;GetNext();}
		else{Error(51);return 0;}
		if(code==24){
			B_Init();
			b_addr=B_Analize();
			EquPush(11,b_addr,ZERO,rtn);
		}
		else{Error(REPEAT);return 0;}
	}
	return rtn;
}
/**************布尔表达式分析****************/
int B_Analize(){
	int rtn=0;
	rtn=B_OR();
	if(expr[now_addr].cod!=0)Error(12);
	return rtn;
}

void B_Init(){
	int flag=1;
	InitStack();
	while(flag){
		GetNext();
		switch(code){
			case 27:Push(code,address);break;
			case 28:Push(code,address);break;
			case 15:Push(code,address);break;
			case 1:Push(code,address);break;
			case 43:Push(code,address);break;
			case 44:Push(code,address);break;
			case 45:Push(code,address);break;
			case 46:Push(code,address);break;
			case 47:Push(code,address);break;
			case 48:Push(code,address);break;
			case 17:Push(code,address);break;
			case 23:Push(code,address);break;
			case 11:Push(code,address);break;
			default:flag=0;break;
		}
	}
}
int B_OR(){
	int rtn=0;
	int t1;
	rtn=L_AND();
	t1=rtn;
	rtn=B1_OR(t1);
	return rtn;
}

int B1_OR(int a){
	int t1,rtn;
	rtn=a;
	if(expr[now_addr++].cod==19){
		int op=2;
		int op2=L_AND();
		t1=NewTemp();
		EquPush(op,rtn,op2,t1);
		rtn=t1;
		if(expr[now_addr].cod==19)rtn=B1_OR(t1);
	}
	return rtn;
}

int L_AND(){
	int rtn=0;
	int t1;
	rtn=M_NOT();
	t1=rtn;
	rtn=L1_AND(t1);
	return rtn;
}
int L1_AND(int a){
	int t1,rtn;
	rtn=a;
	if(expr[now_addr++].cod==1){
		int op=4;
		int op2=M_NOT();
		t1=NewTemp();
		EquPush(op,rtn,op2,t1);
		rtn=t1;
		if(expr[now_addr].cod==1)rtn=L1_AND(t1);
	}
	return rtn;
}

int M_NOT(){
	int rtn=0;
	int temp=0;
	int op2=0;
	if(expr[now_addr].cod=17){
		int op=3;
		now_addr++;
		op2=K_END();
		temp=NewTemp();
		EquPush(op,ONE,op2,temp);
	}
	else{rtn=K_END();temp=rtn;}
	return temp;
}
int K_END(){
	int rtn=0;
	int temp,a;
	temp=0;
	switch(expr[now_addr++].cod){
	    case 27:temp=NewTemp();
			    a=K_CMP();
				if(a){rtn=a;break;}
				else{
					EquPush(1,expr[now_addr-1].addr,0,temp);
					rtn=temp;break;
				}
		case 28:temp=NewTemp();
			    a=K_CMP();
				if(a){rtn=a;break;}
				else{
					EquPush(1,expr[now_addr-1].addr,0,temp);
					rtn=temp;break;
				}
		case 32:rtn=B_Analize();
			    if(expr[now_addr].cod!=40){
					Error(B_EXP);
					rtn=ZERO;}
				break;
		case 11:rtn=ZERO;break;
		case 23:rtn=ONE;break;
		default:break;
	}
	return rtn;
}
int K_CMP(){
	int rtn=0;
	int t1,t2;
	t1=NewTemp();
	t2=NewTemp();
	if((expr[now_addr].cod>42)&&(expr[now_addr].cod<49)){
		EquPush(3,expr[now_addr-1].addr,expr[now_addr+1].addr,t1);
		switch(expr[now_addr].cod){
		    case 43:EquPush(9,t1,ZERO,LineOfEqu+4);break;
			case 44:EquPush(8,t1,ZERO,LineOfEqu+4);break;
			case 45:EquPush(11,t1,ZERO,LineOfEqu+2);break;
			case 46:EquPush(11,t1,ZERO,LineOfEqu+4);break;
			case 47:EquPush(10,t1,ZERO,LineOfEqu+4);break;
			case 48:EquPush(7,t1,ZERO,LineOfEqu+4);break;
		}
		EquPush(1,ONE,0,t2);
		EquPush(6,0,0,LineOfEqu+3);
		EquPush(1,ZERO,0,t2);
		rtn=t2;
		now_addr++;
	}
	return rtn;
}
/***************出口回填函数****************/
void BackPatch(int addr,int addr2){
	Equ[addr].result=addr2;
	return;
}
int EquPush(int op,int a,int b,int r){
	int i=LineOfEqu;
	Equ[LineOfEqu].op=op;
	Equ[LineOfEqu].op1=a;
	Equ[LineOfEqu].op2=b;
	Equ[LineOfEqu].result=r;
	LineOfEqu++;
	return i;
}








	

  









 










⌨️ 快捷键说明

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