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

📄 sentnc.c

📁 自己开发的c0文法编译器
💻 C
字号:
#include "world.h"
void sentenceread();
void sentence(); //语句

void if_sentence();


void write_sentence();
void sentcsloop();
void return_sentence();

int pflag = 0;  //标记临时变量

void sentence_list();//语句列



char *flagnew()//产生跳转标记
{
	char * temp =(char *)malloc(BSIZE);
	sprintf(temp,"L%d",pflag++);
	return temp;
}





void return_sentence()
{
	char temp[BSIZE];
	if(seehead==RETURN)
	{
		//printf("return ");
		tokenget(0);
		if(seehead==LK)
		{
			tokenget(0);
			strcpy(temp,expr());
	

			nodeadd(nodegenerate("Return",temp,"",""));

			if(seehead==RK)
			{
				tokenget(0);
			}
			else
			{
				existerror("return statement formation existerror",lineno);
			}
		}
		returntag =true;
	}
	else
	{
		existerror("return statement existerror",lineno);
	}
}






char * situation()  //产生判断
{
	int temp;
	char tempstr1[BSIZE],tempstr2[BSIZE];
	char *con = (char *)malloc(BSIZE);
	strcpy(tempstr1,expr());//表达式
	if(15<=seehead&&seehead<=20)
	{
		temp = seehead;
		tokenget(0);
		strcpy(tempstr2,expr());
		strcpy(con,newtemp());

		nodeadd(nodegenerate(op(temp),tempstr1,tempstr2,con));
	}
	else
	{
		strcpy(con,tempstr1);
	}
//	printf("%s\n",con);

	return con;

}




void sentcsloop()
{
	char loopbegin[BSIZE],truego[BSIZE],falsego[BSIZE];
	char tempres[BSIZE];
	if(seehead==WHILE)
	{
		tokenget(0);
		if(seehead==LK)
		{
			tokenget(0);
		}
		else
		{
			existerror("while statement formation existerror!",lineno);
		tokenget(0);
		}
		strcpy(loopbegin,flagnew());
	

		nodeadd(nodegenerate("Flag",loopbegin,"",""));
		
		strcpy(tempres,situation());
		strcpy(truego,flagnew());
		strcpy(falsego,flagnew());


	

		nodeadd(nodegenerate("Falsego",tempres,"",falsego));

		if(seehead==RK)
		{
			tokenget(0);
		}
		else
		{
			existerror("while statement formation existerror!",lineno);
		tokenget(0);
		}
		//printf("%s:\n",truego);
//		nodeadd(nodegenerate(truego,"","",""));
		
		sentence();
		
	

		nodeadd(nodegenerate("Goto",loopbegin,"",""));
		
	

		nodeadd(nodegenerate("Flag",falsego,"",""));
	}
	else
	{
		existerror("WHILE statement existerror",lineno);
	}
}





void sentenceread()
{
	if(seehead==SCANF)
	{
		tokenget(0);
		if(seehead==LK)
		{
			tokenget(0);
		}
		else
		{
			existerror("scanf statement existerror",lineno);
		tokenget(0);
		}
	

		nodeadd(nodegenerate("Read",buffer,"",""));
		
		if(seehead==ID)
		{
			tokenget(0);
		}
		else
		{
			if(seehead==RK)
			{
				existerror("scanf should have some parameters",lineno);
			}
			else
			{
				existerror("scanf statement existerror",lineno);
				while(seehead!=RK)
				{
					tokenget(0);
				}
				

			}
		}
		tokenget(0);
	}
	else
	{
		existerror("scanf existerror!",lineno);
	}
}



void getsentc()
{
	int b=0;
	int ch = getchar();
	while(ch!='"')
	{
		buffer[b++]=ch;
		ch = getchar();
	}
	buffer[b++] = '\0';
}


void sentence()
{

	int tempnum,i;
	if(seehead==IF)
	{
		
		if_sentence();

	}
	else if(seehead==WHILE)
	{

		sentcsloop();
	}
	else if(seehead==LB) //左大括号
	{

		tokenget(0);
		sentence_list();

		if(seehead==RB)
		{
			tokenget(0);
		}
		else
		{
			existerror("probably missing '}'",lineno);
		tokenget(0);
		}
	}


	else if (seehead==fenghao) //处理空分号
	{
		tokenget(0);
	}


	else if(seehead==SCANF)
	{
	
		sentenceread();
		if(seehead==fenghao)
		{
			tokenget(0);
		}
		else
		{
			existerror("probably missing';'",lineno);
		tokenget(0);
		}
	
	}
	else if(seehead==PRINTF)
	{
		write_sentence();
		if(seehead==fenghao)
		{
			tokenget(0);
		}
		else
		{
			existerror("probably missing';'",lineno);
		tokenget(0);
		}
	}
	else if(seehead==RETURN)
	{
		return_sentence();
		if(seehead==fenghao)
		{
			tokenget(0);
		}
		else
		{
			existerror("probably missing';'",lineno);
		tokenget(0);
		}
	}
	else if(seehead==ID)
	{
		strcpy(temp,buffer);
		tokenget(0);//检验函数是否存在定义
		if(seehead==EQ)
		{
			tokenget(1);
			if(seehead==plus)
			tokenget(0);
			else if(seehead==minus)
			{
				sign=-1;
				tokenget(0);
			}
			strcpy(tempres,expr());//表达式


			nodeadd(nodegenerate("=",tempres,"",temp));
			sign=1;
			if(seehead==fenghao)
			{
				tokenget(0);
			}
			else
			{
				existerror("probably missing';'",lineno);
			tokenget(0);
			}
		}
		else if(seehead==LK)
		{
			tokenget(0);
			if((tempnum=lookup_function(temp))!=-1)
			{
				i = 0;
				if(seehead!=RK)
				{	
					strcpy(tempstr,expr());


					nodeadd(nodegenerate("value=",tempstr,"",funTable[tempnum].paraname[i++]));

					while(seehead!=RK)
					{
						tokenget(0);
						strcpy(tempstr,expr());
						if(i < funTable[tempnum].paranum)
						{
					

							nodeadd(nodegenerate("value=",tempstr,"",funTable[tempnum].paraname[i++]));

						}
						else
						{
							i++;
						}
					}
				}
				if(seehead==RK)
				{
					tokenget(0);
					if(i==funTable[tempnum].paranum)
					{
					

							nodeadd(nodegenerate("Call",temp,"",""));
					}
					else
					{
						existerror("calling funcRegist existerror",lineno);
					}
				}
				else
				{
					existerror("calling funcRegist existerror",lineno);
				}
			}
			else
			{
				while(seehead!=fenghao)
				{
					tokenget(0);
				}
				existerror("funcRegist undefined!",lineno);
			}
			if(seehead==fenghao)
			{
				tokenget(0);
			}
			else
			{
				existerror("probably missing';'",lineno);
			}
		}
		else
		{
			existerror("existerror!",lineno);
		}
	}	
}



void sentence_list()
{
	while(seehead!=RB)
	{
		sentence();
	}
}









void if_sentence()
{
	char tempstr[BSIZE];
	char truego[BSIZE],falsego[BSIZE];
	if(seehead==IF)
	{
		tokenget(0);
		if(seehead==LK)
		{
			tokenget(0);
		}
		else
		{
		existerror("if statement formation existerror!",lineno);
		tokenget(0);
		}
		strcpy(tempstr,situation());
		strcpy(truego,flagnew());
		strcpy(falsego,flagnew());
	
	
		

		
		nodeadd(nodegenerate("GotoFalse",tempstr,"",falsego));

		if(seehead==RK)
		{
			tokenget(0);
		}
		else
		{
			existerror("if statement formation existerror!",lineno);
		tokenget(0);
		}

		sentence();
	
		nodeadd(nodegenerate("Goto",truego,"",""));

	
		nodeadd(nodegenerate("Flag",falsego,"",""));

		if(seehead==ELSE)
		{
			//printf("else 语句");
			tokenget(0);
			sentence();
		}
		nodeadd(nodegenerate("Flag",truego,"",""));

	}
	else
	{
		existerror("IF statement existerror",lineno);
	}
}







void write_sentence()
{
	char temp[128];
	if(seehead==PRINTF)
	{
		tokenget(0);
		if(seehead==LK)
		{
			tokenget(0);
		}
		else
		{
			existerror("printf statement existerror",lineno);
		tokenget(0);
		}
		if(seehead==maohao)
		{
			getsentc();//获取字符串
			nodeadd(nodegenerate("Writestring",buffer,"",""));
			strcpy(print_buf[print_num],buffer);
			print_num++;
		
			tokenget(0);
		}
		else
		{
			strcpy(temp,expr());
		
			nodeadd(nodegenerate("Writenumber",temp,"",""));
			
		}
		if(seehead==douhao)
		{
			tokenget(0);
			strcpy(temp,expr());
		
			nodeadd(nodegenerate("Writenumber",temp,"",""));
		}
		if(seehead==RK)
		{
			tokenget(0);
		}
		else
		{
			existerror("printf statement existerror",lineno);
		tokenget(0);
		}
	}
	else
	{
		existerror("printf existerror",lineno);
	}
}



⌨️ 快捷键说明

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