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

📄 parser.cpp

📁 完整的编译器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}
	fclose(SymbleFin);
	}
	return;
}
/*******************赋值句分析******************/
int S_Let(int a)
{	int addr,flag,rtn;
	flag=0;
	rtn=0;
	InitStack();
	if(code==34)
	{	addr=address;
		if(a) let_count=addr;
		var_count++;
		GetNext();
		if(code==51)
		{	flag=E_Analize();
			if(flag!=0)  rtn=EquPush(1,flag,0,addr);
		}
	}
	else
		Error(4);
	return rtn;
}
/***********************算术表达式分析********************/
int E_Analize()
{	int ans;
	ans=0;
	now_addr=0;
	E_Init();
	ans=E_AddSub();
	if(expr[now_addr].addr!=0)      //表达式没识别完
		Error(7);
	return ans;
}

void E_Init()
{	int flag=1,i;
	pos=0;
	E_rtn=0;
	E_Contrl=1;
	for(i=0;i<EXP_LEN;i++)
	{	expr[i].addr=0;
		expr[i].cod=0;
	}
	while(flag)
	{	GetNext();
		switch(code){
		case 34: Push(code,address);break;   //变量
		case 35: Push(code,address);break;   //整数
		case 36: Push(code,address);break;    // 实数
		case 39: Push(code,address);break;	 //"("
		case 40: Push(code,address);break;	  //")"
		case 41: Push(code,address);break;    //"*"
		case 43: Push(code,address);break;    //"+"
		case 45: Push(code,address);break;    //"-"
		case 48: Push(code,address);break;    //"/"
		default: flag=0;break;
		}
	}
	return;
}


int NewTemp()
{   int a;
	temp_count--;
	a=temp_count;
	return a;
}

int E_AddSub()
{	int t1;
	int rtn=T_MulDiv();
	t1=rtn;
	rtn=E1_AddSub(t1);
	return rtn;
}

int E1_AddSub(int a)
{	int rtn,t1;
	rtn=a;
	if(expr[now_addr].cod==43 || expr[now_addr].cod==45)
	{	int op=expr[now_addr++].cod;
		int opr2=T_MulDiv();
		t1=NewTemp();
		if(op==43)
		{	if(E_Contrl)
			{	E_Contrl=0;
				E_rtn=EquPush(2,rtn,opr2,t1);
			}
			else
			{	E_rtn=EquPush(2,rtn,opr2,t1);
			}
			rtn=t1;
		}
		else
		{	if(E_Contrl)
			{	E_Contrl=0;
				E_rtn=EquPush(3,rtn,opr2,t1);
			}	
			else
			{	E_rtn=EquPush(3,rtn,opr2,t1);
			}
			rtn=t1;
		}
		if(expr[now_addr].cod==43 || expr[now_addr].cod==45)  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 t1,rtn;
	rtn=a;
	if(expr[now_addr].cod==41 || expr[now_addr].cod==48)
	{	int op=expr[now_addr++].cod;
		int opr2=F_Number();
		t1=NewTemp();
		if(op==41)
		{	if(E_Contrl)
			{	E_Contrl=0;
				E_rtn=EquPush(4,rtn,opr2,t1);
			}	
			else
			{	E_rtn=EquPush(4,rtn,opr2,t1);
			}
			rtn=t1;
		}
		else
		{	if(E_Contrl)
			{	E_Contrl=0;
				E_rtn=EquPush(5,rtn,opr2,t1);
			}	
			else
			{	E_rtn=EquPush(5,rtn,opr2,t1);
			}
			rtn=t1;
		}
		if(expr[now_addr].cod==41 || expr[now_addr].cod==48)  rtn=T1_MulDiv(t1);
	}
	return rtn;
}

int F_Number()
{	int rtn=0;
	if(expr[now_addr].cod==39)   //如果是"("
	{	now_addr++;
		rtn=E_AddSub();
		now_addr++;			
	}
	else
	{	switch(expr[now_addr].cod) {
		case 34: rtn=expr[now_addr].addr;break;
		case 35: rtn=expr[now_addr].addr;break;
		case 36: rtn=expr[now_addr].addr;break;
		case 37: 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]=0;
	}
}
/***********************复合语句分析*****************/
int S_Begin()
{	int rtn=0;
	if(code==52)	{GetNext();LineOfPro++;}
	if(code==3)
	{	LineOfPro++;
		GetNext();
		rtn=L_Analize();
		if(code!=11)
		{	Error(5);
			LineOfPro++;
			return 0;
		}
		else
		{	LineOfPro++;GetNext();
		}
	}
	return rtn;
}
/**********************语句序列分析*********************************/
int  L_Analize()
{	int rtn=0;
	switch(code){
	case 34: S_Let(0);rtn=E_rtn;break;
	case 14:rtn=S_If();break;
	case 32:rtn=S_While();break;
	default:Error(6);return 0;
	}
	if(code==52)
	{	LineOfPro++;
		GetNext();
		switch(code){
		case 34: L_Analize();return rtn;
		case 32: L_Analize();return rtn;
		case 25: L_Analize();return rtn;
		case 13: L_Analize();return rtn;
		case 14: 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==14)                            //code==14是if语句
	{	temp=LineOfEqu+1;
		B_Init();                           //读入if后面的表达式放入expr[]中
		b_addr=B_Analize();                  //b_addr=bool表达式四元式首址
		True_address=EquPush(11,b_addr,ZERO,1);
		False_address=EquPush(6,0,0,0);
		if(code==27)                       //code==27是then语句
		{	GetNext();
			switch(code){
			case 34: rtn=S_Let(0);break;
			case 14: rtn=S_If();break;
			case 32: rtn=S_While();break;
			case 3:  rtn=S_Begin();break;
			default: Error(6);break;
			}
	     BackPatch(True_address,rtn+1);
		 tt=LineOfEqu+1;
		 as=EquPush(6,0,0,tt);
		 if(code==10)
		 {  GetNext();
		    switch(code)
			{
			case 34: tt=S_Let(0);break;
			case 14: tt=S_If();break;
			case 32: tt=S_While();break;
			case 3:  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 lineback=LineOfEqu;    //新加的
	int rtn=0;
    int temp=0;
	int b_addr=0;
	if(code==52){GetNext();LineOfPro++;}
	if(code==32)
	{
		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==9)
		{GetNext();
		switch(code){
			case 34: rtn=S_Let(0);break;
			case 14: rtn=S_If();break;
			case 32: rtn=S_While();break;
			case 3:  rtn=S_Begin();break;
			default: Error(6);return 0;
		}
		GetNext();
		BackPatch(True_address,rtn);
		}
		else{Error(WHILE);return 0;}
	}
	EquPush(6,0,0,lineback+1);
	BackPatch(False_address,LineOfEqu+1);
	return temp;
}

/*******************布尔表达式分析**************************/
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 34: Push(code,address);break;
		case 35: Push(code,address);break;
		case 17: Push(code,address);break;
		case 1: Push(code,address);break;
		case 53: Push(code,address);break;
		case 54: Push(code,address);break;
		case 55: Push(code,address);break;
		case 56: Push(code,address);break;
		case 57: Push(code,address);break;
		case 58: Push(code,address);break;
		case 19: Push(code,address);break;
		case 29: Push(code,address);break;
		case 12: 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==24)
	{	int op=2;
		int op2=L_AND();
		t1=NewTemp();
		EquPush(op,rtn,op2,t1);
		rtn=t1;
		if(expr[now_addr].cod==24)  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==19)
	{	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 34: temp=NewTemp();
			 a=K_CMP();
			 if(a)  
			 {
				 rtn=a; break;			 
			 }
			 else  
			 {	
				 EquPush(1,expr[now_addr-1].addr,0,temp);
				rtn=temp;break;
			 }
	case 35:  temp=NewTemp();
		      a=K_CMP();
		      if(a) {	return rtn=a;break;}
		      else
			 {
				EquPush(1,expr[now_addr-1].addr,0,temp);
				rtn=temp;break;
			 }
	case 39: rtn=B_Analize();
			 if(expr[now_addr].cod!=50)
			 {
				Error(B_EXP);
				rtn=ZERO;
			}
			break;
	case 12: rtn=ZERO;break;
	case 29: 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>52) && (expr[now_addr].cod<59))
	{
		EquPush(3,expr[now_addr-1].addr,expr[now_addr+1].addr,t1);
		switch(expr[now_addr].cod)
		{
		case 53:EquPush(9,t1,ZERO,LineOfEqu+4);break;  //   <
		case 54:EquPush(8,t1,ZERO,LineOfEqu+4);break;  //   <=
		case 55:EquPush(8,t1,ZERO,LineOfEqu+4);break; //   <>
		case 56:EquPush(11,t1,ZERO,LineOfEqu+4);break;  //   =
		case 57:EquPush(10,t1,ZERO,LineOfEqu+4);break;  //   >
		case 58: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;
}

int main()
{
	parser();
	return 0;
}

		

	



⌨️ 快捷键说明

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