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

📄 sematics.c

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

#include"Global.h"

void AnaProgram()
{
	char id[20];
	if(strcmp(Symbol[1],"const") == 0)    // 常量定义
	{
		while(strcmp(Symbol[1],"const") == 0)
		{
			NextSym(temp);
			strcpy(id,Symbol[2]);
			NextSym(temp);  // =
			NextSym(temp);
			if(CheckId(id,head1,level) != NULL)
				Error(27);
			Enter(CONST,INT,id,parseInt(Symbol[2]),level);
			genMCode(code[Const],id,Symbol[2],code[nil]);
			NextSym(temp);  // ,
			while(strcmp(Symbol[1],"COLOM") == 0)
			{
				NextSym(temp);
				strcpy(id,Symbol[2]);
				NextSym(temp);  // =
				NextSym(temp);
				if(CheckId(id,head1,level) != NULL)
					Error(27);
				Enter(CONST,INT,id,parseInt(Symbol[2]),level);
				genMCode(code[Const],id,Symbol[2],code[nil]);
				NextSym(temp);  // ,
			}
			NextSym(temp);   // ;
		}
	}
	// 定义int型的变量 或者 函数
	if(strcmp(Symbol[1],"int") == 0)
	{
		while(strcmp(Symbol[1],"int") == 0)
		{
			NextSym(temp);
			strcpy(id,Symbol[2]);
			NextSym(temp);
			if(strcmp(Symbol[1],"LParen") == 0)
			{	
				/*if(CheckId(id,head1,0) == NULL)
				{
					Enter(FUNC,INT,id,0,level);
					level++;                    // 进入函数定义,层数加一
				}
				else 
				{
					Error(24);	
					Enter(FUNC,INT,id,0);
					level++;				// 进入函数定义,层数加一
				}*/
				if(CheckId(id,head1,0) != NULL)
					Error(24);
				Enter(FUNC,INT,id,0,level);
				genMCode(code[Func],id,code[Int],code[nil]);
				level++;		// 进入函数定义,层数加一
				AnaParameter();
				//level++;   // 进入复合语句定义,层数加一
				AnaCompStmt();
				genMCode("end",id,code[nil],code[nil]);
				level--;	// 从复合语句中出来,层数减一							
			}
			else
			{
				//VariDec();
				if(CheckId(id,head1,level) != NULL)
					Error(24);
				Enter(VAR,INT,id,0,level);
				genMCode(code[Var],id,"0",code[nil]);
				//NextSym(temp);
				while(strcmp(Symbol[1],"COLOM") == 0)
				{
					NextSym(temp);
					strcpy(id,Symbol[2]);
					if(CheckId(id,head1,level) != NULL)
						Error(24);
					Enter(VAR,INT,id,0,level);
					genMCode(code[Var],id,"0",code[nil]);
					NextSym(temp);
				}
				NextSym(temp);      // 最后还读入一个符号 
			}
		}
	}
	// 定义int型or void型的函数
	if(strcmp(Symbol[1],"int") == 0 || strcmp(Symbol[1],"void") == 0)
	{
		while(strcmp(Symbol[1],"int") == 0 || strcmp(Symbol[1],"void") == 0)
		{
			if(strcmp(Symbol[1],"int") == 0)
			{
				NextSym(temp);
				strcpy(id,Symbol[2]);
				if(CheckId(id,head1,level) != NULL)
					Error(24);
				Enter(FUNC,INT,id,0,level);
				genMCode(code[Func],id,code[Int],code[nil]);
				NextSym(temp);

				level++;		// 进入函数定义,层数加一
				AnaParameter();
				//level++;   // 进入复合语句定义,层数加一
				AnaCompStmt();
				genMCode("end",id,code[nil],code[nil]);
				level--;	// 从复合语句中出来,层数减一	
			}
			else
			{
				NextSym(temp);
				if(strcmp(Symbol[1],"main") == 0)
				{
					NextSym(temp);
					NextSym(temp);
					NextSym(temp);
					AnaMainFunc();  // 这里还要检查,缺少一点代码。
					genMCode("end","main",code[nil],code[nil]);
					flag = 1;
					return;
				}
				else
				{
					//voidFunc();
					if(CheckId(Symbol[2],head1,level) != NULL)
						Error(24);
					Enter(FUNC,VOID,Symbol[2],0,level);
					genMCode(code[Func],Symbol[2],code[Void],code[nil]);
					NextSym(temp);
					AnaParameter();
					AnaCompStmt();
					genMCode("end",id,code[nil],code[nil]);
				}
			}
		}
	}
}


void AnaParameter()  // 有BUG 
{
	vx = 0;
	NextSym(temp);  // 
	if(strcmp(Symbol[1],"RParen") != 0)
	{
		vx++;
		NextSym(temp);
		if(CheckId(Symbol[2],head2,level) != NULL)
				Error(28);
		Enter(VV,INT,Symbol[2],0,level);
		genMCode(code[Vp],Symbol[2],code[Int],code[nil]);
		NextSym(temp);
		while(strcmp(Symbol[1],"RParen") != 0)
		{
			vx++;
			NextSym(temp);
			NextSym(temp);
			if(CheckId(Symbol[2],head2,level) != NULL)
				Error(28);
			Enter(VV,INT,Symbol[2],0,level);
			genMCode(code[Vp],Symbol[2],code[Int],code[nil]);
			NextSym(temp);
		}
	}
	NextSym(temp);
	head2->value = vx;
}


void AnaCompStmt()
{
	char id[20];
	NextSym(temp); // {
	if(strcmp(Symbol[1],"const") == 0)
	{
		while(strcmp(Symbol[1],"const") == 0)
		{
			NextSym(temp);
			strcpy(id,Symbol[2]);
			NextSym(temp);
			NextSym(temp);
			if(CheckId(id,head1,level) != NULL)
				Error(27);
			Enter(CONST,INT,id,parseInt(Symbol[2]),level);
			genMCode(code[Const],id,Symbol[2],code[nil]);
			NextSym(temp); // ,
			while(strcmp(Symbol[1],"COLOM") == 0)
			{
				NextSym(temp);
				strcpy(id,Symbol[2]);
				NextSym(temp);
				NextSym(temp);
				if(CheckId(id,head2,level) != NULL && CheckId(id,head1,0) != NULL)
					Error(27);
				Enter(CONST,INT,id,parseInt(Symbol[2]),level);
				genMCode(code[Const],id,Symbol[2],code[nil]);
				NextSym(temp);
			}
			NextSym(temp);
		}
	}

	if(strcmp(Symbol[1],"int") == 0)
	{
		while(strcmp(Symbol[1],"int") == 0)
		{
			NextSym(temp);
			strcpy(id,Symbol[2]);
			if(CheckId(id,head2,level) != NULL || CheckId(id,head1,0) != NULL)
				Error(24);
			Enter(VAR,INT,id,0,level);
			genMCode(code[Var],id,"0",code[nil]);
			NextSym(temp);
			while(strcmp(Symbol[1],"COLOM") == 0)
			{
				NextSym(temp);
				strcpy(id,Symbol[2]);
				if(CheckId(id,head2,level) != NULL)
					Error(24);
				Enter(VAR,INT,id,0,level);
				genMCode(code[Var],id,"0",code[nil]);
				NextSym(temp);
			}
			NextSym(temp);
		}
	}

	AnaStmtList();
	
	if(head2->type == INT && rtn == 0)
	{
		Error(31);
	}
		rtn = 0;

	NextSym(temp);

}

void AnaStmtList()
{
	AnaStmt();
	while(strcmp(Symbol[1],"RBrace") != 0)
	{
		AnaStmt();
	}
}

void AnaStmt()
{
	Table *t;
	char id[20];
	char arg[20];
	//char labell[5];
	
//	if(sw == 2)
//	{
//		genMCode(code[nil],code[nil],code[nil],code[nil]);
	//	strcpy(tc->label,label1);
	//	sw = 0;
//	}
//	else if(sw == 1)
//	{
//		genMCode(code[nil],code[nil],code[nil],code[nil]);
//		strcpy(tc->label,label1);
//	}
//	else if(sw == 3)
//	{
//		strcpy(label3,NextLabel());
//		genMCode(code[Goto],label3,code[nil],code[nil]);
	//	genMCode(code[nil],code[nil],code[nil],code[nil]);
//	//	strcpy(tc->label,label2);
	//	sw = 0;
//	}



	if(strcmp(Symbol[1],"if") == 0)			// 条件语句
	{
		AnaCondStmt();
	}

	else if(strcmp(Symbol[1],"while") == 0)  //循环语句
	{
		AnaLoopStmt();

	}


	else if(strcmp(Symbol[1],"LBrace") == 0)
	{
		NextSym(temp);
		AnaStmtList();
		NextSym(temp);   // 分号
	}

	else if(strcmp(Symbol[1],"ID") == 0) // 子函数调用语句和变量赋值语句
	{
		/*t = CheckId(Symbol[2],head1,0);  // 查找全局变量或者函数
		if(t == NULL)  // 应该是是变量的赋值语句
		{
			t = CheckId(Symbol[2],head2,level);
			if(t == NULL)             // 如果没有查到,就是没有定义
			{
				Error(25);
			}
			else
			{
				strcpy(id,Symbol[2]);
				NextSym(temp); // =
				NextSym(temp);
				if(t->kind == CONST)
				{
					Error(32);
				}
				else
					genMCode(code[Assign],id,AnaExpress(),code[nil]);
			}
		}
		else  // 是子函数调用语句 或者 全局变量
		{
			if(t->kind == FUNC)   // 子函数调用语句
			{
				vx = 0;
				strcpy(id,Symbol[2]);
				NextSym(temp);  // (
				NextSym(temp);
				while(strcmp(Symbol[1],"RParen") != 0)
				{
					genMCode(code[8],AnaExpress(),code[nil],code[nil]);
					vx++;
				}
				if(vx > t->value)
					Error(29);
				else if(vx < t->value)
					Error(26);
				genMCode(code[Call],id,code[nil],code[nil]);
				NextSym(temp);
			}
			else   // 全局变量或者常量
			{
				strcpy(id,Symbol[2]);
				NextSym(temp);  // =
				NextSym(temp);
				if(t->kind == CONST)
				{
					Error(32);
				}
				//else
				genMCode(code[Assign],id,AnaExpress(),code[nil]);
			}
		}

		NextSym(temp);  // 分号
	//	NextSym(temp);   // 多读一个*/

		t = CheckId(Symbol[2],head2,level);
		if(t != NULL) // 必定是变量
		{
			strcpy(id,Symbol[2]);
			if(t->kind == CONST)
				Error(32);
			NextSym(temp); // =
			NextSym(temp);
			genMCode(code[Assign],id,AnaExpress(),code[nil]);
		}
		else  // 全局变量/常量 函数调用
		{

⌨️ 快捷键说明

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