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

📄 zcompile.cpp

📁 pl0的编译器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			{                                                   //
				tid=sym.id;                                 //
				getsym();                                   //
				if(sym.type==TYPE_ENDWORD&&sym.id==EW_RMP)   //
				{                                           //
					formpush(t,FORM_VAR,tid);           //
                    getsym();                                               //
					goto _nextarr;                      //
				}                                           //
				else adderr("",ERR_NEEDEND);                //
			}                                                   //
			else adderr("",ERR_NEEDEND);                        //
			//
		}                                                           //       
		else if(sym.id==EW_SEM)                                     //
		{                                                           //
			formpush(t,FORM_VAR,0);                             //
			getsym();                                           //
		}                                                           //
		else adderr("",ERR_NEEDEND);                                //
		//
	}                                                                   //
	else                                                                //
		adderr("",ERR_NEEDEND);                                     //
	} 
	//////////////////////////////////////////////////////////////////////                                                                  
	while(sym.type==TYPE_KEYWORD&&sym.id==KW_PROCEDURE)
	{
		getsym();
		if(sym.type==TYPE_SYMBOL)
		{
			s=formnum;
			formpush(sym.name,FORM_PROC,0);
			getsym();
		}
		else
			adderr("",ERR_NEEDSYM);
		if(sym.type==TYPE_ENDWORD&&sym.id==EW_SEM)
		{
			getsym();
			form[s].adr=syn_block();
			addasm(OP_OPR,0,OPR_RET);
			formpop();
			if(sym.type==TYPE_ENDWORD&&sym.id==EW_SEM)
				getsym();
			else
				adderr("",ERR_NEEDEND);
		}
		else
			adderr("",ERR_NEEDEND);
	}
	s=asmnum;
	addasm(OP_INT,0,formadr[formlvl]);
	syn_statement();
	return s;
}
///////////////////////////////////////////////////////////////
void zCompile::syn_statement()
{
	FORM fm={0};
	int t=0,t1=0,t2,s;
////修改代码//////////////////////////////////////////////////////////
	if(sym.type==TYPE_SYMBOL)
	{
		t=0;
		if(formget(sym.name,&fm)>=0)
			if(fm.type!=FORM_VAR)
				adderr(sym.name,ERR_NOTVAR);
			else
			{
				t1=getarrnum(sym.name);
			}
			else
				adderr(sym.name,ERR_NODEFSYM);
			getsym();						
			if(sym.type==TYPE_ENDWORD&&sym.id==EW_LMP)
			{
				getsym();
				if(sym.type==TYPE_NUMBER)
				{
					t=sym.id;
					if(t>=t1)
						adderr(sym.name,ERR_ARROW);
					t1=0;
					getsym();
					if(sym.type!=TYPE_ENDWORD||sym.id!=EW_RMP)
						adderr(sym.name,ERR_NODEFSYM);
					else 
						getsym();
				}
				else adderr(sym.name,ERR_NODEFSYM);
			}
			/////////////////////////////////////////
			if(sym.type==TYPE_OPWORD&&sym.id==OW_DEF)
			{
				getsym();
				syn_expression();
				addasm(OP_STO,formlvl-fm.lvl,fm.adr+t);
			}
			
			else
				adderr(sym.name,ERR_NOTDEFOP);
	}
	if(sym.type!=TYPE_KEYWORD) return;
	if(sym.id==KW_CALL)
	{
		getsym();
		if(sym.type==TYPE_SYMBOL)
		{
			if(formget(sym.name,&fm)>=0&&fm.adr)
				if(fm.type==FORM_PROC)
					addasm(OP_CAL,formlvl-fm.lvl,fm.adr);
				else
					adderr(sym.name,ERR_NOTPROC);
				else
					adderr(sym.name,ERR_NODEFSYM);    
				getsym();
		}
		else
			adderr(sym.name,ERR_NOTSYM);
	}
	if(sym.id==KW_BEGIN)
	{
_nextstate:
	do{
		if(!getsym()) return;
		syn_statement();
	}while(sym.type==TYPE_ENDWORD&&sym.id==EW_SEM);
	if(sym.type!=TYPE_KEYWORD||sym.id!=KW_END)
	{
		adderr("",ERR_NOTSEM);
		goto _nextstate;
	}
	getsym();
	}
	if(sym.id==KW_READ)
	{
		t=0;
		getsym();
		if(sym.type!=TYPE_ENDWORD||sym.id!=EW_LP)
			adderr("",ERR_NOTPAREN);
		do{
			getsym();
			if(sym.type==TYPE_SYMBOL)
			{//修改代码/////////////////////////////////////////////////////////////////////////////////
				if(formget(sym.name,&fm)>=0)
					if(fm.type==FORM_VAR)
					{
						t1=getarrnum(sym.name);
						getsym();
						if(sym.type!=TYPE_ENDWORD||sym.id!=EW_LMP)
						{
							addasm(OP_OPR,0,OPR_RED);
							addasm(OP_STO,formlvl-fm.lvl,fm.adr);
						}
						else if(sym.type==TYPE_ENDWORD&&sym.id==EW_LMP)
						{
							getsym();
				                        if(sym.type==TYPE_NUMBER)              
										{                                      
											t=sym.id; 
											if(t>=t1)
												adderr(sym.name,ERR_ARROW);
											getsym();                              
											if(sym.type==TYPE_ENDWORD&&sym.id==EW_RMP)
											{
												addasm(OP_OPR,0,OPR_RED);
												addasm(OP_STO,formlvl-fm.lvl,fm.adr+t);
												getsym(); 
											}     
											else 
												adderr(sym.name,ERR_NODEFSYM);                                  
											
										}                                      
										else adderr(sym.name,ERR_NODEFSYM);    
						}
						else adderr(sym.name,ERR_NOTVAR);
						
					}
					else
						adderr(sym.name,ERR_NOTVAR);
					else
						adderr(sym.name,ERR_NODEFSYM);
			}
			else
				adderr("",ERR_NEEDVAR);
		}while(sym.type==TYPE_ENDWORD&&sym.id==EW_COMMA);
		if(sym.type!=TYPE_ENDWORD||sym.id!=EW_RP)
			adderr("",ERR_NOTPAREN);
		else
			getsym();
	}
	if(sym.id==KW_WRITE)
	{
		getsym();
		if(sym.type!=TYPE_ENDWORD||sym.id!=EW_LP)
			adderr("",ERR_NOTPAREN);
		do{
			getsym();
			syn_expression();
			addasm(OP_OPR,0,OPR_WRT);
			addasm(OP_OPR,0,OPR_WRN);
		}while(sym.type==TYPE_ENDWORD&&sym.id==EW_COMMA);
		if(sym.type!=TYPE_ENDWORD||sym.id!=EW_RP)
			adderr("",ERR_NOTPAREN);
		else
			getsym();
	}//////////////修改代码/////////////////////////
	if(sym.id==KW_IF)
	{
		getsym();
		syn_condition();
		if(sym.type!=TYPE_KEYWORD||sym.id!=KW_THEN)
			adderr("",ERR_NOTTHEN);
		else
			getsym();
		t1=asmnum;
		addasm(OP_JPC,0,0);
		syn_statement();
		//asms[t].adr=asmnum;
		getsym();
		if(sym.type==TYPE_KEYWORD||sym.id==KW_ELSE)
		{
			getsym();
			t2=asmnum;
			addasm(OP_JMP,0,0);
			syn_statement();
			asms[t1].adr=t2+1;
			asms[t2].adr=asmnum;
			getsym();
		}
		else
			asms[t1].adr=asmnum;
		
	}
	if(sym.id==KW_WHILE)
	{
		getsym();
		t=asmnum;
		syn_condition();
		s=asmnum;
		addasm(OP_JPC,0,0);
		if(sym.type!=TYPE_KEYWORD||sym.id!=KW_DO)
			adderr("",ERR_NOTDO);
		else
			getsym();
		syn_statement();
		addasm(OP_JMP,0,t);
		asms[s].adr=asmnum;
	}
	
	if(sym.id==KW_REPEAT)
	{
		getsym();
		t=asmnum;
repeat:
		syn_statement();
		getsym();
		if(sym.type==TYPE_KEYWORD&&sym.id!=KW_UNTIL)
			goto repeat;
		if(sym.id!=KW_UNTIL)
			adderr("",ERR_NOUNTIL);
		else
		{
			getsym();
			syn_condition();
			addasm(OP_JPC,0,t);
		}
	}
	
	
}
///////////////////////////////////////////////////////////////
void zCompile::syn_condition()
{
	int r=-1;
	if(sym.type==TYPE_KEYWORD&&sym.id==KW_ODD)
	{
		getsym();
		syn_expression();
		addasm(OP_OPR,0,OPR_ODD);
	}
	else
	{
		syn_expression();
		if(sym.type==TYPE_OPWORD&&sym.id>=OW_LT&&sym.id<=OW_LGE)
			r=sym.id;
		else
			adderr(sym.name,ERR_NOTRLOP);
		getsym();
		syn_expression();
		switch(r)
		{
		case OW_EQL:addasm(OP_OPR,0,OPR_EQL);break;
		case OW_NE: addasm(OP_OPR,0,OPR_NE); break;
		case OW_LT: addasm(OP_OPR,0,OPR_LT); break;
		case OW_LGE:addasm(OP_OPR,0,OPR_LGE);break;
		case OW_LG: addasm(OP_OPR,0,OPR_LG); break;
		case OW_LTE:addasm(OP_OPR,0,OPR_LTE);break;
		}
	}
}
///////////////////////////////////////////////////////////////
void zCompile::syn_expression()
{
	int c=0;
	if(sym.type==TYPE_OPWORD)
	{
		c=sym.id;
		if(c==OW_PLUS||c==OW_MINUS)
			getsym();
		else
			adderr(sym.name,ERR_WRONGOP);
	}
	syn_term();
	if(c==OW_MINUS) addasm(OP_OPR,0,OPR_NEG);
	while(sym.type==TYPE_OPWORD&&(sym.id==OW_PLUS||sym.id==OW_MINUS))
	{
		c=sym.id;
		getsym();
		syn_term();
		if(c==OW_PLUS)
			addasm(OP_OPR,0,OPR_ADD);
		else
			addasm(OP_OPR,0,OPR_SUB);
	}
}
///////////////////////////////////////////////////////////////
void zCompile::syn_term()
{
	int c;
	syn_factor();
	while(sym.type==TYPE_OPWORD&&(sym.id==OW_TIMES||sym.id==OW_SLASH))
	{
		c=sym.id;
		getsym();
		syn_factor();
		if(c==OW_TIMES)
			addasm(OP_OPR,0,OPR_MUL);
		else
			addasm(OP_OPR,0,OPR_DIV);
	}
}
///////////////////////////////////////////////////////////////
void zCompile::syn_factor()
{
	FORM fm={0};
	int t=0,t1=0;
	////添加代码×××××××××××××××××××××××

	if(sym.type==TYPE_SYMBOL)
	{
		if(formget(sym.name,&fm)>=0)
		{
			if(fm.type==FORM_VAR)
			{
				t1=getarrnum(sym.name);
				getsym();
				if(sym.type!=TYPE_ENDWORD||sym.id!=EW_LMP)
					addasm(OP_LOD,formlvl-fm.lvl,fm.adr);
				else if(sym.type==TYPE_ENDWORD||sym.id==EW_LMP)
				{
					getsym();
					if(sym.type==TYPE_NUMBER)              
					{                                      
						t=sym.id; 
						if(t>=t1)
							adderr(sym.name,ERR_ARROW);
						t1=0;
						getsym();                              
						if(sym.type==TYPE_ENDWORD&&sym.id==EW_RMP)
						{
							addasm(OP_LOD,formlvl-fm.lvl,fm.adr+t);
							getsym(); 
						}     
						else 
							adderr(sym.name,ERR_NODEFSYM);                                  
						
					}                                      
					else adderr(sym.name,ERR_NODEFSYM);    
				}
				/*
				addasm(OP_LOD,formlvl-fm.lvl,fm.adr);
				getsym();
				*/
			}
			
			else if(fm.type==FORM_CONST)
			{  
				addasm(OP_LIT,0,fm.adr);
				getsym();
			}
			
			else
			{
				adderr(sym.name,ERR_NOPROC);
				getsym();
			}
		}
		else
		{
			adderr(sym.name,ERR_NODEFSYM);
			getsym();
		}
	}
	else if(sym.type==TYPE_NUMBER)
	{
		addasm(OP_LIT,0,sym.id);
		getsym();
	}
	else if(sym.type==TYPE_ENDWORD&&sym.id==EW_LP)
	{
		getsym();
		syn_expression();
		if(sym.type==TYPE_ENDWORD&&sym.id==EW_RP)
			getsym();
		else
			adderr("",ERR_NOTRP);
	}
	else
		adderr("",ERR_NOSYM);
}
///////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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