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

📄 sematics.c

📁 北京航空航天大学计算机系要求的编译器大作业。大概6000行代码。
💻 C
📖 第 1 页 / 共 2 页
字号:
			t = CheckId(Symbol[2],head1,0);
			if(t == NULL)
				Error(25);
			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]);
				if(t->kind == CONST)
					Error(32);
				NextSym(temp); // =
				NextSym(temp);
				genMCode(code[Assign],id,AnaExpress(),code[nil]);
			}
		}
		NextSym(temp);
	} 

	// 返回语句
	else if(strcmp(Symbol[1],"return") == 0)
	{
		rtn = 1;
		NextSym(temp);
		if(strcmp(Symbol[1],"SEMIC") == 0)   // return;
		{
			if(head2->type != VOID)
				Error(30);
			else
			{
				genMCode(code[Ret],code[nil],code[nil],code[nil]);
			}
		}
		else // 否则必须是return (x);
		{
			NextSym(temp);
			genMCode(code[Ret],AnaExpress(),code[nil],code[nil]); // 
		}
		NextSym(temp);           // (
		NextSym(temp);			// 分号
	}
	

	//  读语句 
	else if(strcmp(Symbol[1],"scanf") == 0)
	{
		NextSym(temp);
		NextSym(temp);
		if(CheckId(Symbol[2],head1,0) == NULL && CheckId(Symbol[2],head2,level) == NULL)
			Error(24);
		//else
		genMCode(code[R],Symbol[2],code[nil],code[nil]);
		NextSym(temp);
		NextSym(temp);
		NextSym(temp);
	}

	// 这是比较复杂的一个了
	else if(strcmp(Symbol[1],"printf") == 0)
	{
		NextSym(temp);  // (
		NextSym(temp);
		if(strcmp(Symbol[1],"STRING") == 0)
		{
			strcpy(arg,Symbol[2]);
			NextSym(temp);
			if(strcmp(Symbol[1],"COLOM") == 0) // printf("here",x);的情况
			{
				NextSym(temp);
				genMCode(code[W],arg,"string","follow");
				genMCode(code[W],AnaExpress(),"express",code[nil]);
			//	NextSym(temp);
			}
			else // printf("Hello!");
			{
				genMCode(code[W],arg,"string",code[nil]);
	//			NextSym(temp);
			}
		}
		else   //  直接打出表达式的情况
		{
			genMCode(code[W],AnaExpress(),"express",code[nil]);
		}
		NextSym(temp);
		NextSym(temp);
	}
	else if(strcmp(Symbol[1],"SEMIC") == 0)   // 空语句
			NextSym(temp);

/*	if(sw == 1)
	{
		genMCode(code[Goto],label1,code[nil],code[nil]);
		genMCode(code[nil],code[nil],code[nil],code[nil]);
		strcpy(tc->label,label2);
		sw = 0;
	}
	else if(sw == 3)
	{
		genMCode(code[Goto],label3,code[nil],code[nil]);
		sw = 0;
	}*/
}

/************************
	if(x > 5)  if(x)
	{
		x = x + 5;
	}
*****************************/

void AnaCondStmt()
{
	char arg1[20],arg2[20];
	char op[20];
//	int save;
	char ll1[5],ll2[5],ll3[5];

	strcpy(ll1,label1);  // 保护现场
	strcpy(label1,NextLabel());
	strcpy(ll2,label2);
	strcpy(label2,NextLabel());

	NextSym(temp);  // (
	NextSym(temp);
	strcpy(arg1,Symbol[2]);
	NextSym(temp);
	if(strcmp(Symbol[1],"RParen") != 0)  // if(x > 5)的情况
	{
		strcpy(op,Symbol[2]);
		NextSym(temp);
		strcpy(arg2,AnaExpress()); 

		if(strcmp(op,"==") == 0)
		{
			strcpy(op,"jequ");
		}
		else if(strcmp(op,"<=") == 0)
		{
			strcpy(op,"jle");
		}
		else if(strcmp(op,">=") == 0)
		{
			strcpy(op,"jge");
		}
		else if(strcmp(op,"<") == 0)
		{
			strcpy(op,"jlt");
		}
		else if(strcmp(op,">=") == 0)
		{
			strcpy(op,"jgt");
		}
		else if(strcmp(op,"!=") == 0)
		{
			strcpy(op,"jne");
		}

		NextSym(temp);
		genMCode(code[Comp],arg1,arg2,code[nil]);
		genMCode(op,label1,label2,code[nil]);
	}
	else  // if(x) 的情况
	{
		NextSym(temp);
		genMCode(code[Comp],arg1,"0",code[nil]);
		genMCode("jne",label1,label2,code[nil]);
	}
//	save = sw;
//	sw = 2;
	genMCode(code[nil],code[nil],code[nil],code[nil]);
	strcpy(tc->label,label1);
	AnaStmt();

	strcpy(ll3,label3);
	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 = save;
	strcpy(label1,ll1);
	strcpy(label2,ll2);

	

	if(strcmp(Symbol[1],"else") == 0)
	{
	//	save = sw;
	//	sw = 3;
//		genMCode(code[nil],code[nil],code[nil],code[nil]);
	//	strcpy(tc->label,"st");
		
		NextSym(temp);
		AnaStmt();
		
	//	sw = save;
	//	genMCode(code[nil],code[nil],code[nil],code[nil]);
	//	strcpy(tc->label,"end");
	}
	genMCode(code[nil],code[nil],code[nil],code[nil]);  // 产生第三个标号
	strcpy(tc->label,label3); 
	strcpy(label3,ll3);
}


void AnaLoopStmt()
{
	char arg1[20],arg2[20]; 
	char ll1[20],ll2[20];
	//int save;
	char op[20];


	strcpy(ll1,label1);
	strcpy(label1,NextLabel());
	strcpy(ll2,label2);
	strcpy(label2,NextLabel());
	
	NextSym(temp);
	NextSym(temp);
	strcpy(arg1,AnaExpress());
//	strc
	if(strcmp(Symbol[1],"RParen") != 0)
	{
		strcpy(op,Symbol[2]);
		NextSym(temp);
		strcpy(arg2,AnaExpress()); 

		if(strcmp(op,"==") == 0)
		{
			strcpy(op,"jnequ");
		}
		else if(strcmp(op,"<=") == 0)
		{
			strcpy(op,"jnle");
		}
		else if(strcmp(op,">=") == 0)
		{
			strcpy(op,"jnge");
		}
		else if(strcmp(op,"<") == 0)
		{
			strcpy(op,"jnlt");
		}
		else if(strcmp(op,">=") == 0)
		{
			strcpy(op,"jngt");
		}
		else if(strcmp(op,"!=") == 0)
		{
			strcpy(op,"jnne");
		}

		genMCode(code[nil],code[nil],code[nil],code[nil]);
		strcpy(tc->label,label1);
		genMCode(code[Comp],arg1,arg2,code[nil]);
		//strcpy(tc->label,label1);
		genMCode(op,label2,code[nil],code[nil]);
	}
	else
	{
		genMCode(code[Comp],arg1,"0",code[nil]);
		strcpy(tc->label,label1);
		genMCode("jnne",label2,code[nil],code[nil]);
	}
	
	NextSym(temp);
	//save = sw
	//sw = 1;
	AnaStmt();
	genMCode(code[Goto],label1,code[nil],code[nil]);
	genMCode(code[nil],code[nil],code[nil],code[nil]);
	strcpy(tc->label,label2);
//	sw = save;
	strcpy(label1,ll1);
	strcpy(label2,ll2);
}

void AnaMainFunc()
{
	char id[20];

	//NextSym(temp);
	//NextSym(temp);

	Enter(FUNC,VOID,"main",0,0);
	genMCode(code[nil],code[nil],code[nil],code[nil]);
	strcpy(tc->label,"start");
	genMCode(code[Func],"main",code[nil],code[nil]);
//	strcpy(tc->label, "start");
	level++;
	//AnaCompStmt();

	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->kind == INT && rtn == 0)
	{
		Error(31);
	}
	else
		rtn = 0;

	//NextSym(temp);

	level--;
}

⌨️ 快捷键说明

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