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

📄 grammer.c

📁 自己开发的c0文法编译器
💻 C
字号:

#include "world.h"

void valdeclear();

char * situation();//条件
void program();
void const_declare();//常量说明
void parameter();//参数表
void function_entry();
void function_def();





int funNum = 0;

struct funcRegist funTable[MAXFUN];
int tableTop[MAXFUN];





void val_declear();
void const_def();//常量定义
void main_function();
void tokenget();




void init() //初始化符号表
{
	memset(tableTop,0,sizeof(tableTop));
}


void spar()
{
	int i,j;
	char filename[100];
	init();
	printf("输入源文件名:\n");
	scanf("%s",filename);
	if(freopen(filename,"r",stdin)==NULL)
	{
		printf("无法打开!\n\n\n");
		exit(0);
	}
	program();  //分析程序

	for( i=1;i<=funNum;i++)
	{
		
	
	

	for(j=0;j<funTable[i].paranum;j++)
		{
		
		}
	
		for(j=0;j<tableTop[i];j++)
		{
		
		}
	
	}

}




void function_entry()  //进入函数体
{
	if(seehead==LB)
	{
		tokenget(0);
		const_declare();
		val_declear();
		sentence_list();//语句序列
	}
	else
	{
		existerror("sentence existerror!",lineno);
		while(seehead!=RB)
		{
			tokenget(0);
		}
	}

//	printf("%d",seehead);

	if(seehead==RB)
	{
		tokenget(0);
	}
	else
	{
		existerror("syntex existerror!",lineno);

	}
	
}



 int lookup_function(char *fname)  //向前找
{
	int i;
	for(i=1;i<=funNum;i++)
	{
		if(strcmp(strlwr(funTable[i].fname),strlwr(fname))==0)
			return i;
	}
	return -1;
}





void program()//分析程序
{
	char temp[BSIZE];
	int tag=1;
	seehead = Word();  //读入一个词
	const_declare();
	if(seehead==INT)
	{
		tokenget(0);
		strcpy(temp,buffer);
		if(seehead==ID)
		{
			tokenget(0);
		}
		else
		{
			existerror("Token existerror!",lineno);
		}
		if(seehead==LK)
		{
	
			funNum++;
			funTable[funNum].returnKind = INT;
			strcpy(funTable[funNum].fname,temp);
			nodeadd(nodegenerate("Begin",funTable[funNum].fname,"",""));  //函数开始
			tokenget(0);
			parameter(); //参数表
			if(seehead==RK)
			{
				tokenget(0);
			}
			else
			{
				existerror("funcRegist define existerror!",lineno);
			tokenget(0);
			}
			function_entry();
			nodeadd(nodegenerate("End",funTable[funNum].fname,"",""));
		}
	
		else if(seehead==douhao)
		{
			if(lookforward(temp,funNum) == -1)
			{
				writetable(temp,VAR,0,funNum);  //变量定义
			
				nodeadd(nodegenerate("VarDefine",temp,"",""));
			}
			else
			{
				existerror("variable define existerror!",lineno);
			}
			while(seehead==douhao)
			{
				tokenget(0);
				strcpy(temp,buffer);
				if(seehead==ID)
				{
					if(lookforward(temp,funNum)==-1)
					{
						writetable(temp,VAR,0,funNum);

				

						nodeadd(nodegenerate("VarDefine",temp,"",""));
					}
					else
					{
						existerror("variable define existerror!",lineno);
					}
					tokenget(0);
				}
				else
				{
					existerror("variable define existerror!",lineno);
				}
			}
			if(seehead==fenghao)
			{
				tokenget(0);
			}
			else
			{
				existerror("variable declaration existerror!",lineno);
			}
		}
		else if(seehead==fenghao)
		{
			if(lookforward(temp,funNum) == -1)
			{
				writetable(temp,VAR,0,funNum);

				nodeadd(nodegenerate("VarDefine",temp,"",""));
		
			}
			else
			{
				existerror("variable define existerror!",lineno);
			}
			tokenget(0);
		}
		else 
		{
			existerror("variable declaration existerror!",lineno);
		}
	}
	while((seehead==INT||seehead==VOID)||tag!=0)
	{
		funNum++;
		tag = funcRegist();

	}

	if(seehead==OVER)
	{
		tokenget(0);
	}
	else
	{
		tokenget(0);
		existerror("existerror at the end the file!",lineno);
	}
	
}

int funcRegist()  //函数定义,检查reture
{
	int tag=1;  //函数定义标记
	char temp[BSIZE];
	returntag = false;
	if(seehead==VOID)
	{
		funTable[funNum].returnKind = VOID;
		tokenget(0);
		strcpy(temp,buffer);
		if(strcmp(temp,"main")==0)
		{
			tokenget(MAIN);
			tag = 0;
		}
		else
		{
			if(seehead==ID)
			{
				tokenget(0);
			}
			else
			{
				existerror("funcRegist name existerror!",lineno);

			}
			
		}
	}
	else
	{
		funTable[funNum].returnKind = INT;
		tokenget(0);
		strcpy(temp,buffer);
	
		if(seehead==ID)
		{
			tokenget(0);
		}
		else
		{
			existerror("funcRegist name existerror!",lineno);
		}
	}
	strcpy(funTable[funNum].fname,temp);


	nodeadd(nodegenerate("Begin",temp,"",""));
	if(seehead==LK)
	{
		tokenget(0);
	}
	else
	{
		existerror("funcRegist define existerror!",lineno);
	}
	parameter(); //参数表
	if(seehead==RK)
	{
		tokenget(0);
	}
	else
	{
		existerror("funcRegist define existerror!",lineno);
	tokenget(0);
	}
	function_entry();
	if((funTable[funNum].returnKind == INT&&returntag==false))
	{
		existerror("funcRegist existerror value wrong!",lineno);
	}

	nodeadd(nodegenerate("End",temp,"",""));
	return tag;

}

⌨️ 快捷键说明

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