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

📄 stmt.c

📁 北京航空航天大学计算机系要求的编译器大作业。大概6000行代码。
💻 C
字号:
/***************************************
By BHU 35060122 Peng Hui;
2008.02
description:
A small compiler to translate a C program to 80X80 Assembly Code
***************************************/

#include"Global.h"

void CompStmt() 	// <复合语句>
{
	if(strcmp(Symbol[1],"LBrace") == 0)
	{
		NextSym(temp);
		if(strcmp(Symbol[1],"const") == 0)
		{
			while(strcmp(Symbol[1],"const") == 0)
			{
				ConstDec();
			}
		}
		if(strcmp(Symbol[1],"int") == 0)
		{
			while(strcmp(Symbol[1],"int") == 0)
			{
				VariDec();
			}
		}

		StmtList();
		if(strcmp(Symbol[1],"RBrace") != 0)
			Error(6);
		else
			NextSym(temp);
	}
	else
	{
		Error(6);
		NextSym(temp);
	}
}


void Stmt()		// <语句>
{
	if(strcmp(Symbol[1],"if") == 0)
	{
		CondStmt();
	}
	else if(strcmp(Symbol[1],"while") == 0)
	{
		LoopStmt();
	}
	else if(strcmp(Symbol[1],"LBrace") == 0)
	{
		NextSym(temp);
		StmtList();
		if(strcmp(Symbol[1],"RBrace") != 0)
			Error(14);
		else
			NextSym(temp);
	}
	else if(strcmp(Symbol[1],"ID") == 0)
	{
		NextSym(temp);
		if(strcmp(Symbol[1],"LParen") == 0)
		{
			NextSym(temp);
			if(strcmp(Symbol[1],"RParen") != 0)
				VParamList();
			if(strcmp(Symbol[1],"RParen") != 0)
				Error(14);
			else
			{
				/*NextSym(temp);
				Stmt();
				if(strcmp(Symbol[1],"LBarce") == 0)   // 子函数调用
				{
					NextSym(temp);
					if(strcmp(Symbol[1],"else") == 0)
					{
						while(strcmp(Symbol[1],"else") == 0)
						{
							NextSym(temp);
							Stmt();
						}
					}
					else
						Error(15);
				}
				else
					return;*/
				NextSym(temp);
				if(strcmp(Symbol[1],"SEMIC") != 0)
				{
					Error(23);
				}
				else
					NextSym(temp);
			}
			
		}
		else if(strcmp(Symbol[1],"ASSIGN") == 0)   // 否则是赋值语句
		{
			NextSym(temp);
				/*
				if(strcmp(Symbol[1],"ID") != 0)
					Error(13);
				else
					NextSym(temp);

				*/
			Express();
			if(strcmp(Symbol[1],"SEMIC") != 0)
			{
				Error(23);
			}
			else
				NextSym(temp);
		}
		else
			Error(22);
	}
	else if(strcmp(Symbol[1],"return") == 0)
	{
		RtnStmt();
		if(strcmp(Symbol[1],"SEMIC") != 0)
			Error(22);
		else
			NextSym(temp);
	}
	else if(strcmp(Symbol[1],"scanf") == 0)
	{
		ReadStmt();
		if(strcmp(Symbol[1],"SEMIC") != 0)
			Error(23);
		else
			NextSym(temp);
	}
	else if(strcmp(Symbol[1],"printf") == 0)
	{
		WriteStmt();
		
		if(strcmp(Symbol[1],"SEMIC") != 0)
			Error(23);
		else
			NextSym(temp);
	}
	else if(strcmp(Symbol[1],"SEMIC") == 0)
			NextSym(temp);
	else
	{
		Error(22);
	}
}

void AssStmt()		// <赋值语句>
{
	if(strcmp(Symbol[1],"ID") == 0)
	{
		NextSym(temp);
		if(strcmp(Symbol[1],"ASSIGN") == 0)
		{
			NextSym(temp);
			Express();
		}
		else
			Error(13);
	}
	Error(13);
}

void CondStmt()	// <条件语句>
{
	if(strcmp(Symbol[1],"if") == 0)
	{
		NextSym(temp);
		if(strcmp(Symbol[1],"LParen") == 0)
		{
			NextSym(temp);
			Condition();
			if(strcmp(Symbol[1],"RParen") == 0)
			{
				NextSym(temp);
				Stmt();
					/*
					if(strcmp(Symbol[1],"LBrace") == 0)
					{
						NextSym(temp);
						if(strcmp(Symbol[1],"else") == 0)
						{
							Stmt();
							if(strcmp(Symbol[1],"RBrace") == 0)
								NextSym(temp);
							else
								Error(14);
						}
						else
							Error(15);
					}
					else
						Error(15);
						*/
				if(strcmp(Symbol[1],"else") == 0)
				{
					while(strcmp(Symbol[1],"else") == 0)
					{
						NextSym(temp);
						Stmt();
					}
				}
			}
			else
				Error(15);
		}
		else
		{
			Error(15);
		}
	}
	else
	{
		Error(15);
	}
}

void Condition()	// <条件>
{
	Express();
	if(strcmp(Symbol[1],"ROP") == 0)
	{
		NextSym(temp);
		Express();
	}
	/*else
	{
		return;
	}
	*/
}

void LoopStmt()	// <循环语句>
{
	if(strcmp(Symbol[1],"while") == 0)
	{
		NextSym(temp);
		if(strcmp(Symbol[1],"LParen") == 0)
		{
			NextSym(temp);
			Condition();
			if(strcmp(Symbol[1],"RParen") != 0)
				Error(14);
			else
				NextSym(temp);
			Stmt();
		}
		else
			Error(16);
	}
	else
		Error(16);
}

void CallFunc()	// <子函数调用语句>
{
if(strcmp(Symbol[1],"ID") == 0)
	{
		NextSym(temp);
		if(strcmp(Symbol[1],"LParen") == 0)
		{
			VParamList();
			if(strcmp(Symbol[1],"RParen") != 0)
				Error(14);
			else
				NextSym(temp);
		}
		else
			Error(17);
	}
	else
		Error(17);
}

void StmtList()	// <语句序列>
{
	Stmt();
	//	NextSym(temp);
	while(strcmp(Symbol[1],"RBrace") != 0)
	{
		Stmt();
	}
}

void ReadStmt()	// <读语句>
{
	if(strcmp(Symbol[1],"scanf") == 0)
	{
		NextSym(temp);
		if(strcmp(Symbol[1],"LParen") == 0)
		{
			NextSym(temp);
			if(strcmp(Symbol[1],"ID") == 0)
			{
				NextSym(temp);
				if(strcmp(Symbol[1],"RParen") != 0)
					Error(14);
				else
					NextSym(temp);
			}
			else
				Error(19);
		}
		else
			Error(19);
	}
	else
		Error(19);
}
void WriteStmt()	// <写语句>
{
	if(strcmp(Symbol[1],"printf") == 0)
	{
		NextSym(temp);
		if(strcmp(Symbol[1],"LParen") == 0)
		{
			NextSym(temp);
			if(strcmp(Symbol[1],"STRING") == 0)
			{
				NextSym(temp);
				if(strcmp(Symbol[1],"COLOM") == 0)
				{
					NextSym(temp);
					if(strcmp(Symbol[1],"ID") == 0)
					{
						Express();
						if(strcmp(Symbol[1],"RParen") != 0 )
							Error(14);
						else
							NextSym(temp);
						
					}
					else
						Error(20);
				}
				else 
				{
					if(strcmp(Symbol[1],"RParen") != 0)
					{
						Error(14);
					}
					else
					{
						NextSym(temp);
					}
					/*
					if(strcmp(Symbol[1],"SEMIC") != 0)
						Error(23);
					else
						NextSym(temp);*/
				}
			}
			else if(strcmp(Symbol[1],"ID") == 0 || strcmp(Symbol[1],"INTEGER") == 0)        // 错了。i
			{
				//NextSym(temp);
				//if(strcmp(Symbol[1],"RParen") != 0)
				//{
				//	Error(20);
				//}
				//else
				//{
				//	NextSym(temp);
					/*
					if(strcmp(Symbol[1],"SEMIC") != 0)
						Error(23);
					else
						NextSym(temp);*/
				//}
				Express();
				NextSym(temp);
			}
		}
		else
			Error(20);
	}
}

void RtnStmt()		// <返回语句>
{
	if(strcmp(Symbol[1],"return") == 0)
	{
		NextSym(temp);
		if(strcmp(Symbol[1],"SEMIC") == 0)
		{
			return ;
		}
		else if(strcmp(Symbol[1],"LParen") == 0)
		{
			NextSym(temp);
				/*
				if(strcmp(Symbol[1],"ID") == 0)
				{
					NextSym(temp);
					if(strcmp(Symbol[1],"RParen") != 0)
						Error(21);
					else
						NextSym(temp);
				}
				else
				{
					Error(21);
				}*/
			Express();
			if(strcmp(Symbol[1],"RParen") != 0)
				Error(21);
			else
				NextSym(temp);
		}
		else
			Error(21);
	}
	else
		Error(21);
}

⌨️ 快捷键说明

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