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

📄 zcompile.cpp

📁 扩充PL0语言的编译器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					getsym();
				}
				else
					adderr("",ERR_NEEDNUM);
			}
			else
				adderr("",ERR_NEEDEQL);
		}
		else
			adderr("",ERR_NEEDSYM);
		if(sym.type==TYPE_ENDWORD)
		{
			if(sym.id==EW_COMMA) goto _nextconst;
			if(sym.id==EW_SEM)
				getsym();
			else
				adderr("",ERR_NEEDEND);
		}
		else
			adderr("",ERR_NEEDEND);
	}
	if(sym.type==TYPE_KEYWORD&&sym.id==KW_VAR)
	{
_nextvar:
		getsym();
		if(sym.type==TYPE_SYMBOL)
		{
_nextvar1:
			formpush(sym.name,FORM_VAR,0);
			getsym();
		}
		else
			adderr("",ERR_NEEDSYM);
		if(sym.type==TYPE_ENDWORD)
		{
			if(sym.id==EW_COMMA) goto _nextvar;
			if(sym.id==5) 
			{
				getsym();
				if((sym.id==13&&sym.type==TYPE_KEYWORD)||(sym.id==14&&sym.type==TYPE_KEYWORD)||(sym.id==15&&sym.type==TYPE_KEYWORD))
					getsym();
				else
					adderr("",ERR_NEEDEND);
			}
			else
				adderr("",ERR_NEEDEND);
			if(sym.id==EW_SEM)
				getsym();
			else
				adderr("",ERR_NEEDEND);
		}
		else
			adderr("",ERR_NEEDEND);
		if(sym.type==TYPE_SYMBOL) goto _nextvar1;
	}
	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);
	}
	while(sym.type==TYPE_KEYWORD&&sym.id==KW_FUNCTION)
	{
		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()
{
	FORM1 fm={0};
	int t,s;
	if(sym.type==TYPE_SYMBOL)
	{
		if(formget(sym.name,&fm)>=0)
			if(fm.type!=FORM_VAR)
				adderr(sym.name,ERR_NOTVAR);
			else;
		else
			adderr(sym.name,ERR_NODEFSYM);
		getsym();
		if(sym.type==TYPE_OPWORD&&sym.id==OW_DEF)
		{
			getsym();
			syn_expression();
			addasm(OP_STO,formlvl-fm.lvl,fm.adr);
		}
		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_IF)
	{
		getsym();
		syn_condition();
		if(sym.type!=TYPE_KEYWORD||sym.id!=KW_THEN)
			adderr("",ERR_NOTTHEN);
		else
			getsym();
		
		t=asmnum;
		addasm(OP_JPC,0,0);
		syn_statement();
		asms[t].adr=asmnum;
		if(sym.type==TYPE_KEYWORD&&sym.id==KW_ELSE)
		{
			getsym;
			syn_statement();
		}
	}
/*	if(sym.id==KW_REPEAT)
	{
		getsym();
		t=asmnum;
		syn_statement();
		s=asmnum;
		addasm(OP_JPC,0,0);
		if(sym.type!=TYPE_KEYWORD||sym.id!=KW_UNTIL)
			adderr("",ERR_NOTDO);
		else
			getsym();
		syn_condition();		
		addasm(OP_JMP,0,t);
		asms[s].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_FOR)
	{
		getsym();
			if(sym.type==TYPE_SYMBOL)
			{
				if(formget(sym.name,&fm)>=0)
					if(fm.type!=FORM_VAR)
						adderr(sym.name,ERR_NOTVAR);
					else;
				else
					adderr(sym.name,ERR_NODEFSYM);
				getsym();
				if(sym.type==TYPE_OPWORD&&sym.id==OW_DEF)
				{
					getsym();
					syn_expression();
					addasm(OP_STO,formlvl-fm.lvl,fm.adr);
				}
			else
				adderr(sym.name,ERR_NOTDEFOP);
			}
		t=asmnum;
		s=asmnum;
		addasm(OP_JPC,0,0);
		if(sym.type==TYPE_KEYWORD&&(sym.id==KW_TO||sym.id==KW_DOWNTO))
			getsym();
		else
			adderr("",ERR_NOTDO);
		syn_condition();
		if(sym.type==TYPE_KEYWORD&&sym.id==KW_DO)
			getsym();
		else
			adderr("",ERR_NOTDO);
		syn_statement();
		addasm(OP_JMP,0,t);
		asms[s].adr=asmnum;
	}
	if(sym.id==KW_READ)
	{
		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)
					{
						addasm(OP_OPR,0,OPR_RED);
						addasm(OP_STO,formlvl-fm.lvl,fm.adr);
					}
					else
						adderr(sym.name,ERR_NOTVAR);
				else
					adderr(sym.name,ERR_NODEFSYM);
				getsym();
			}
			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();
	}
}
///////////////////////////////////////////////////////////////
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_SB))        
			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;
		case OW_SB: addasm(OP_OPR,0,OPR_SB); 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()
{
	FORM1 fm={0};
	if(sym.type==TYPE_SYMBOL)
	{
		if(formget(sym.name,&fm)>=0)
			if(fm.type==FORM_VAR)
				addasm(OP_LOD,formlvl-fm.lvl,fm.adr);
			else
				if(fm.type==FORM_CONST)
					addasm(OP_LIT,0,fm.adr);
				else
					adderr(sym.name,ERR_NOPROC);
		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 + -