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

📄 anaexpress.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"

char *AnaExpress()
{
	static char arg1[20];
	char arg2[20],arg3[20];
	char mm[20];
	int sw;
	if(strcmp(Symbol[1],"ADD_OP") == 0  || strcmp(Symbol[1],"SUB_OP") == 0)
	{
		if(strcmp(Symbol[1],"SUB_OP") == 0)
		{
			strcpy(mm,NextTemp());
			genMCode(code[Neg],AnaItem(),code[nil],mm);
		}
		else
		{
			NextSym(temp);
			strcpy(mm,AnaItem());
			while(strcmp(Symbol[1],"ADD_OP") == 0  || strcmp(Symbol[1],"SUB_OP") == 0)
			{
				if(strcmp(Symbol[1],"ADD_OP") == 0)
					sw = 1;
				else
					sw = 0;
				NextSym(temp);
				strcpy(arg2,AnaItem());
				strcpy(arg3,NextTemp());
				if(sw == 1)
					genMCode(code[Add],mm,arg2,arg3);
				else
					genMCode(code[Sub],mm,arg2,arg3);
				strcpy(mm,arg3);
			}
		}
	}
	else
	{
		strcpy(mm,AnaItem());
		while(strcmp(Symbol[1],"ADD_OP") == 0  || strcmp(Symbol[1],"SUB_OP") == 0)
		{
			if(strcmp(Symbol[1],"ADD_OP") == 0)
				sw = 1;
			else
				sw = 0;
			NextSym(temp);
			strcpy(arg2,AnaItem());
			strcpy(arg3,NextTemp());
			if(sw == 1)
				genMCode(code[Add],mm,arg2,arg3);
			else
				genMCode(code[Sub],mm,arg2,arg3);
			strcpy(mm,arg3);
		}
	}

	strcpy(arg1,mm);
	return arg1;
}

char *AnaItem()
{
	static char arg1[20];
	char arg2[20],arg3[20];
	char mm[20];
	int sw;

	strcpy(mm,AnaFactor());
	while(strcmp(Symbol[1],"MUL_OP") == 0 || strcmp(Symbol[1],"DIV_OP") == 0)
	{
		if(strcmp(Symbol[1],"MUL_OP") == 0)
			sw = 1;
		else
			sw = 0;


		NextSym(temp);
		strcpy(arg2,AnaFactor());
		strcpy(arg3,NextTemp());
		if(sw == 1)
			genMCode(code[Mul],mm,arg2,arg3);
		else
			genMCode(code[Div],mm,arg2,arg3);
		strcpy(mm,arg3);
	}

	strcpy(arg1,mm);
	return arg1;
}

char *AnaFactor()
{
	Table *t;
	static char id[20];
	char mm[20];


	/*
	*  这里还有问题
	*/
	if(strcmp(Symbol[1],"ID") == 0)
	{
		strcpy(id,Symbol[2]);
		t = CheckId(id,head2,level);
	//	if(t != NULL) // 在当前的函数范围里面查找
	//	{
			// r如果能找到,则必定是变量或者是常量。

	//	}
		if(t == NULL)  // 如果当前函数里面没有,去全局范围里找
		{
			t = CheckId(id,head1,0);
			if( t == NULL)
				Error(25);
			else
			{
				if(t->kind == FUNC)
				{
					vx = 0;
					strcpy(mm,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);
					strcpy(id,mm);
					genMCode(code[Call],id,code[nil],code[nil]); // 这里还可以添加信息,如果需要的话
					strcpy(mm,NextTemp());
					genMCode(code[Assign],mm,id,code[nil]);
					strcpy(id,mm);
					//NextSym(temp);
					//return mm;
				}
			}
		}
		/*
		t = CheckId(id,head1,0);
		if(t == NULL)   // 既不是全局变量,也不是函数调用
		{
			t = CheckId(id,head2,level);  // 看能不能查到符号
			if(t == NULL)
				Error(24);
		//	return id;
		}
		else // 有可能是全局变量或者常量或者函数调用
		{
			if(t->kind == FUNC)  // 函数调用返回 一个什么样的形式????,就返回这个函数的名字
			{
				vx = 0;
				strcpy(mm,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);
				strcpy(id,mm);
				genMCode(code[Call],id,code[nil],code[nil]); // 这里还可以添加信息,如果需要的话
				//NextSym(temp);  // 右括号
			//	return id;
			}
		//	else
			//	return id;
		}*/
	}
	else if(strcmp(Symbol[1],"INTEGER") == 0)  // 整数
	{
		strcpy(id,Symbol[2]);
	//	NextSym(temp);
	//	return id;
	}
	else   //表达式
	{
		NextSym(temp);  
		strcpy(id,AnaExpress());
		//NextSym(temp);
	//	NextSym(temp);
	//	return id;
	}

	NextSym(temp);
	return id;
}

⌨️ 快捷键说明

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