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

📄 pl0.cpp

📁 是一个很好的编译器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	printf(" IN ALL %d CODES.\n",to-from);
} /* listcode*/

/*////////////////////////////////////////////////////////////////////*/
void bfactor(symset fsys)
{// 布尔型因子,处理布尔因子
	void expression(symset);
	int relop,addop;
	symset set;
	getsym(); 
	if(sym==SYM_EXPL1) explanation();//处理pl0的注释
	if(sym==SYM_NOT) 
	{
		addop=SYM_NOT;
		getsym();
		if(sym==SYM_EXPL1) explanation();//处理pl0的注释
	}
	else 
	{
		set=uniteset(relset,fsys);
		expression(set);
		destroyset(set);
		if(!inset(sym,relset))
		{
			error(20);
		}
		else
		{
			relop=sym;
			getsym(); 
			if(sym==SYM_EXPL1) explanation();//处理pl0的注释
			expression(fsys);
			switch(relop)
			{
			case SYM_EQU:
				gen(OPR, 0, OPR_EQU);
				break;
			case SYM_NEQ:
				gen(OPR, 0, OPR_NEQ);
				break;
			case SYM_LES:
				gen(OPR, 0, OPR_LES);
				break;
			case SYM_GEQ:
				gen(OPR, 0, OPR_GEQ);
				break;
			case SYM_GTR:
				gen(OPR, 0, OPR_GTR);
				break;
			case SYM_LEQ:
				gen(OPR, 0, OPR_LEQ);
				break;
			}//switch
		}//else
	}
		if(addop==SYM_NOT)
		{
			gen(OPR,0,OPR_NOT);
		}
}//bfactor

void bterm(symset fsys)
{ // 布尔型项
	symset set;
	set=uniteset(fsys,createset(SYM_AND,SYM_NULL));
	bfactor(set);
	while(sym==SYM_AND)
	{
		
		getsym(); 
		if(sym==SYM_EXPL1) explanation();
		bfactor(set);
		gen(OPR,0,OPR_AND);
	}
	destroyset(set);
} //bterm

void bexpression(symset fsys)
{//布尔表达式
	symset set;
	set=uniteset(fsys,createset(SYM_OR,SYM_NULL));
	bterm(set);
	while(sym==SYM_OR)
	{
		gen(OPR,0,OPR_OR);
	}
	destroyset(set);
}//bexpression

void bcondition(symset fsys)
{//布尔条件
	int mulop ;
	symset set;
	mulop=sym;
	if(sym==SYM_NOT)
	{
		getsym(); 
		if(sym==SYM_EXPL1) explanation();//处理pl0的注释
	}
	set=uniteset(relset,fsys);
	bexpression(set);
	destroyset(set);
	if(mulop==SYM_NOT)
	{
		gen(OPR,0,OPR_NOT);
	}
}//bcondition

void factor(symset fsys)/*因子的识别*/
{
	void expression(symset);
	int i;
	symset set;

	test(facbegsys, fsys, 24); /* The symbol can not be as the beginning of an expression.*/

	while (inset(sym, facbegsys))
	{
		if (sym == SYM_IDENTIFIER)
		{
			if ((i = position(id)) == 0)
			{
				error(11); /* Undeclared identifier.*/
			}
			else
			{
				switch (table[i].kind)
				{
					mask* mk;
				case ID_CONSTANT:
					gen(LIT, 0, table[i].value);
					break;
				case ID_VARIABLE:
					mk = (mask*) &table[i];
					gen(LOD, level - mk->level, mk->address);
					break;
				case ID_PROCEDURE:
					error(21); /* Procedure identifier can not be in an expression.*/
					break;
				} /* switch */
			}
			getsym(); if(sym==SYM_EXPL1) explanation();
		}
		else if (sym == SYM_NUMBER)
		{
			if (num > MAXADDRESS)
			{
				error(25); /* The number is too great.*/
				num = 0;
			}
			gen(LIT, 0, num);
			getsym(); if(sym==SYM_EXPL1) explanation();//处理pl0的注释
		}
		else if (sym == SYM_LPAREN)
		{
			getsym();
			if(sym==SYM_EXPL1) explanation();//处理pl0的注释
			set = uniteset(createset(SYM_RPAREN, SYM_NULL), fsys);
			expression(set);
			destroyset(set);
			if (sym == SYM_RPAREN)
			{
				getsym(); if(sym==SYM_EXPL1) explanation();
			}
			else
			{
				error(22); /* Missing ')'.*/
			}
		}
		test(fsys, createset(SYM_LPAREN, SYM_NULL), 23);
	} /* while*/
} /* factor*/

/*/////////////////////////////////////////////////////////////////////*/
void term(symset fsys)/*项的识别*/
{
	int mulop;
	symset set;

	set = uniteset(fsys, createset(SYM_TIMES, SYM_SLASH, SYM_NULL));
	factor(set);
	while (sym == SYM_TIMES || sym == SYM_SLASH)
	{
		mulop = sym;
		getsym(); if(sym==SYM_EXPL1) explanation();
		factor(set);
		if (mulop == SYM_TIMES)
		{
			gen(OPR, 0, OPR_MUL);
		}
		else
		{
			gen(OPR, 0, OPR_DIV);
		}
	} /* while*/
	destroyset(set);
} /* term*/

/*/////////////////////////////////////////////////////////////////////*/
void expression(symset fsys)/*表达式的识别*/
{
	int addop;
	symset set;

	set = uniteset(fsys, createset(SYM_PLUS, SYM_MINUS, SYM_NULL));
	if (sym == SYM_PLUS || sym == SYM_MINUS)
	{
		addop = sym;
		getsym(); 
		if(sym==SYM_EXPL1) explanation();//处理pl0的注释
		term(set);
		if (addop == SYM_MINUS)
		{
			gen(OPR, 0, OPR_NEG);
		}
	}
	else
	{
		term(set);
	}

	while (sym == SYM_PLUS || sym == SYM_MINUS)
	{
		addop = sym;
		getsym(); 
		if(sym==SYM_EXPL1) explanation();//处理pl0的注释
		term(set);
		if (addop == SYM_PLUS)
		{
			gen(OPR, 0, OPR_ADD);
		}
		else
		{
			gen(OPR, 0, OPR_MIN);
		}
	} /* while*/

	destroyset(set);
} /* expression*/

/*////////////////////////////////////////////////////////////////////*/
void condition(symset fsys)   
{                             /*条件的识别*/
	int relop;
	symset set;

	if (sym == SYM_ODD)
	{
		getsym();
		if(sym==SYM_EXPL1) explanation();//处理pl0的注释
		expression(fsys);
		gen(OPR, 0, 6);
	}
	else
	{
		set = uniteset(relset, fsys);
		expression(set);
		destroyset(set);
		if (! inset(sym, relset))
		{
			error(20);
		}
		else
		{
			relop = sym;
			getsym(); 
			if(sym==SYM_EXPL1) explanation();//处理pl0的注释
			expression(fsys);
			switch (relop)
			{
			case SYM_EQU:
				gen(OPR, 0, OPR_EQU);
				break;
			case SYM_NEQ:
				gen(OPR, 0, OPR_NEQ);
				break;
			case SYM_LES:
				gen(OPR, 0, OPR_LES);
				break;
			case SYM_GEQ:
				gen(OPR, 0, OPR_GEQ);
				break;
			case SYM_GTR:
				gen(OPR, 0, OPR_GTR);
				break;
			case SYM_LEQ:
				gen(OPR, 0, OPR_LEQ);
				break;
			} /* switch*/
		} /* else*/
	} /* else*/
} /* condition*/

/*////////////////////////////////////////////////////////////////////*/
void statement(symset fsys) 
{                               /*语句的声明*/
	int i, cx1, cx2;
	char id1[MAXIDLEN+1];
	symset set1, set2,set;
    if (sym == SYM_IDENTIFIER)
	{ /* variable assignment*/
		mask* mk;
		i=position(id);
		if(i==0)
		{
			error(11); /* Undeclared identifier.*/
		}
		else if(table[i].kind != ID_VARIABLE)
		{
			error(12); /* Illegal assignment.*/
			i = 0;
		}
		getsym(); 
		if(sym==SYM_EXPL1) explanation();//处理pl0的注释
		if (sym == SYM_BECOMES)
		{
			getsym(); 
			if(sym==SYM_EXPL1) explanation();//处理pl0的注释
		}
		else
		{
			error(13); /* ':=' expected.*/
		}
		if(sym==SYM_ARRAY) {}
		else expression(fsys);
		mk = (mask*) &table[i];
		if (i)
		{
			gen(STO, level - mk->level, mk->address);
		}
        if(sym==SYM_EXPL1) explanation();//处理pl0的注释
	}
    else if(sym==SYM_ARRAY)
	{
		mask *mk;
		if(!(i=position(id)))
		{
			error(11);
		}
		else if(table[i].kind!=ID_VARIABLE)
		{
			error(12);
			i=0;
		}
		getsym(); 
		if(sym==SYM_EXPL1) explanation();//处理pl0的注释
		if(sym==SYM_NUMBER) 
		{
			j=num;
			getsym(); 
			if(sym==SYM_EXPL1) explanation();//处理pl0的注释
		}
		else error(12);
		if(sym==SYM_RP) 
		{
			getsym(); 
			if(sym==SYM_EXPL1) explanation();//处理pl0的注释
		}
		else error(18);
		if(sym==SYM_BECOMES)
		{
			getsym();
			if(sym==SYM_EXPL1) explanation();//处理pl0的注释
		}
		else error(13);
		if(sym==SYM_ARRAY) {}
		expression(fsys);
		mk=(mask*)&table[i+j-m];
		if(i) gen(STO,level-mk->level,mk->address);
	}

	else if (sym == SYM_CALL)
	{ /* procedure call*/
		getsym(); 
		if(sym==SYM_EXPL1) explanation();//处理pl0的注释
		if (sym != SYM_IDENTIFIER)
		{
			error(14); /* There must be an identifier to follow the 'call'.*/
		}
		else
		{
			i = position(id);
			if(i==0)
			{
				error(11); /*Undeclared identifier.*/
			}
			else if (table[i].kind == ID_PROCEDURE)
			{
				mask* mk;
				mk = (mask*) &table[i];
				gen(CAL, level - mk->level, mk->address);
			}
			getsym();
  		        
//>>>>>>>>>>>>>>>>>>处理pl0的函数的参数<<<<<<<<<<<<<<<<<<<//
			if(sym==SYM_LPAREN)
					
			{
				getsym();  
				if(sym==SYM_EXPL1) explanation();  //处理pl0的注释
			   	if(sym==SYM_IDENTIFIER||sym==SYM_NUMBER)
				{
				    if(sym==SYM_IDENTIFIER) enter(ID_VARIABLE);
				    else enter(ID_CONSTANT);
				    getsym(); 
				   if(sym==SYM_EXPL1) explanation();//处理pl0的注释
				}//if
				else error(31);
				while(sym==SYM_COMMA)
				{
				    getsym();
					if(sym==SYM_EXPL1) explanation();//处理pl0的注释
				    if(sym==SYM_IDENTIFIER||sym==SYM_NUMBER)
					{
				       if(sym==SYM_IDENTIFIER) enter(ID_VARIABLE);
				       else enter(ID_CONSTANT);
				       getsym(); 
					   if(sym==SYM_EXPL1) explanation();//处理pl0的注释
					}//if 
				}//while
				if(sym==SYM_RPAREN) 
				{
					getsym();
			        if(sym==SYM_EXPL1) explanation();//处理pl0的注释
				}
				else error(22);  
			}//if
	
//>>>>>>>>>>>>>>>>>>>>>处理完毕<<<<<<<<<<<<<<<<<<<<<<<<//
		
		}
		jpx=cx;

	}
	else if (sym == SYM_IF)   /*if语句的处理*/
	{ /* if statement*/
		getsym(); 
		if(sym==SYM_EXPL1) explanation();//处理pl0的注释
		set1 = createset(SYM_THEN,SYM_ELSE, SYM_DO, SYM_NULL);
		set = uniteset(set1, fsys);
		condition(set);
		destroyset(set1);
		destroyset(set);
		if (sym == SYM_THEN)
		{
			getsym();
			if(sym==SYM_EXPL1) explanation();//处理pl0的注释
		}
		else
		{
			error(16); /* 'then' expected.*/
		}
		cx1 = cx;
		gen(JPC, 0, 0);
		statement(fsys);
		code[cx1].a = cx;
//>>>>>>>>>>>>>>>>>填加的else语句<<<<<<<<<<<<<<<<<<//
		if(sym==SYM_SEMICOLON||sym==SYM_ELSE)   
		{
			 if(sym==SYM_SEMICOLON)
			 {
		       getsym();
			   if(sym==SYM_EXPL1) explanation();//处理pl0的注释
			 }
			 if(sym==SYM_ELSE)
			 {
				 getsym();
				 if(sym==SYM_EXPL1) explanation(); //处理pl0的注释
			   statement(fsys);
			   while(sym==SYM_SEMICOLON)
			   {
				   getsym(); 
				   if(sym==SYM_EXPL1) explanation();//处理pl0的注释
				   statement(fsys);
			   }
			 }
		}
//>>>>>>>>>>>>>>>>>>>>>else语句结束*/<<<<<<<<<<<<<<<<<<<<<<//
	  
	}
	else if (sym == SYM_BEGIN)   /*begin……end 语句的处理*/
	{ /* block*/
		getsym();
		if(sym==SYM_EXPL1) explanation();//处理pl0的注释
		set1 = createset(SYM_SEMICOLON, SYM_END, SYM_NULL);
		set = uniteset(set1, fsys);
		statement(set);
		while (sym == SYM_SEMICOLON || inset(sym, statbegsys))
		{
			if (sym == SYM_SEMICOLON)
			{
				getsym();
				if(sym==SYM_EXPL1) explanation();//处理pl0的注释
			}
			else
			{
				
			}
			statement(set);
		} /* while*/
		destroyset(set1);
		destroyset(set);
		if (sym == SYM_END)
		{
			getsym();
			if(sym==SYM_EXPL1) explanation();//处理pl0的注释
		}
		else
		{
			error(17); /* ';' or 'end' expected.*/
		}

	    
	}
	
	//>>>>>>>>>>>>>>>>>>>>>>>填加的for语句<<<<<<<<<<<<<<<<<<<<<<<<//
	else if (sym == SYM_FOR)   
	{ /*for statement */
		cx1=cx;
		getsym(); 
		if(sym==SYM_EXPL1) explanation();//处理pl0的注释
		if(sym==SYM_LPAREN)
		{
			getsym();
			if(sym==SYM_EXPL1) explanation();//处理pl0的注释
		}
		else error(29);
		while(sym!=SYM_SEMICOLON) getsym();
		if(sym==SYM_EXPL1) explanation();//处理pl0的注释
		getsym();
		if(sym==SYM_EXPL1) explanation();//处理pl0的注释
		set1=createset(SYM_BEGIN,SYM_END,SYM_NULL);
		set=uniteset(set1,fsys);
		condition(set);
		destroyset(set1);
		destroyset(set);
		cx2=cx;
		gen(JPC,0,0);
		if(sym==SYM_SEMICOLON) 
		{
			getsym();
			if(sym==SYM_EXPL1) explanation(); //处理pl0的注释
			id1[0]=id[0];
		}
		else 
		{
			error(29);
		}
		while(sym!=SYM_RPAREN)  getsym();
		if(sym==SYM_EXPL1) explanation();//处理pl0的注释

⌨️ 快捷键说明

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