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

📄 yufa.cpp

📁 本程序是实现C-的一个小型编译器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			}
			else error(4,curToken.LineofPro);//缺少"NUM"
		}
		else 
			if((strcmp(curToken.name,"("))==0)
			{		
				SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
				SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
				SyntaxTree sibling2=(SyntaxTree)malloc(sizeof(CTreeNode));
				SyntaxTree sibling3=(SyntaxTree)malloc(sizeof(CTreeNode));
				Tree->Leftchild=LeftTree;
				LeftTree->Leftchild=NULL;
				LeftTree->father=Tree;
				LeftTree->FID=5;
				LeftTree->Node_Number=k++;
				LeftTree->TOKEN.LineofPro=curToken.LineofPro;
				LeftTree->TOKEN.code=curToken.code;
				strcpy(LeftTree->TOKEN.name,curToken.name);
				strcpy(function,variable);
				st_insert(function,status,curToken.name);
				stack[R++]='(';
				NextToken();
				LeftTree->Rightsibling=params();
				sibling1=LeftTree->Rightsibling;
				sibling1->father=Tree;
				sibling1=LeftTree->Rightsibling;
				if((strcmp(curToken.name,")"))==0)
				{	
					sibling1->Rightsibling=sibling2;
					sibling2->Leftchild=NULL;
					sibling2->father=Tree;
					sibling2->FID=5;
					sibling2->Node_Number=k++;
					sibling2->TOKEN.LineofPro=curToken.LineofPro;
					sibling2->TOKEN.code=curToken.code;
					strcpy(sibling2->TOKEN.name,curToken.name);
					stack[--R]='\0';
					param_number=0;//形参个数置为零
					NextToken();
					sibling2->Rightsibling=compound_stmt();
					sibling3=sibling2->Rightsibling;
					sibling3->father=Tree;
					sibling3->Rightsibling=NULL;
				}
				else error(5,curToken.LineofPro);//缺少")"
			}
			else error(6,curToken.LineofPro);//缺少"("
	return Tree;
}

//6.type_specifier->int|void
CTreeNode* type_specifier()
{
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=6;
	Tree->Node_Number=k++;
	Tree->TOKEN.LineofPro=0;
	Tree->TOKEN.code=0;
	strcpy(Tree->TOKEN.name,"\0");
	if(((strcmp(curToken.name,"int"))==0)||(strcmp(curToken.name,"void")==0))
	{
		SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
		Tree->Leftchild=LeftTree;
		LeftTree->Leftchild=NULL;
		LeftTree->Rightsibling=NULL;
		LeftTree->father=Tree;
		LeftTree->FID=6;
		LeftTree->Node_Number=k++;
		LeftTree->TOKEN.LineofPro=curToken.LineofPro;
		LeftTree->TOKEN.code=curToken.code;
		strcpy(LeftTree->TOKEN.name,curToken.name);
		strcpy(status,curToken.name);
		NextToken();
	}
	else error(7,curToken.LineofPro);//数据类型丢失
	return Tree;
}

//7.params->param_list|void
CTreeNode* params()
{
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=7;
	Tree->Node_Number=k++;
	Tree->TOKEN.LineofPro=0;
	Tree->TOKEN.code=0;
	strcpy(Tree->TOKEN.name,"\0");
	if((strcmp(curToken.name,"void"))==0)
	{
		SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
		Tree->Leftchild=LeftTree;
		LeftTree->Leftchild=NULL;
		LeftTree->Rightsibling=NULL;
		LeftTree->father=Tree;
		LeftTree->FID=7;
		LeftTree->Node_Number=k++;
		LeftTree->TOKEN.LineofPro=curToken.LineofPro;
		LeftTree->TOKEN.code=curToken.code;
		strcpy(LeftTree->TOKEN.name,curToken.name);
		NextToken();
	}
	else 
	{
		SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
		Tree->Leftchild=param_list();
		LeftTree=Tree->Leftchild;
		LeftTree->father=Tree;
		LeftTree->Rightsibling=NULL;
	}
	return Tree;
}

//8.param_list->param param_list1
CTreeNode* param_list()
{
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
	SyntaxTree sibling=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=8;
	Tree->Node_Number=k++;
	Tree->Leftchild=param();
	Tree->TOKEN.LineofPro=0;
	Tree->TOKEN.code=0;
	strcpy(Tree->TOKEN.name,"\0");
	LeftTree=Tree->Leftchild; //处理左孩子的父结点
	LeftTree->father=Tree;
	LeftTree->Rightsibling=param_list1();
	sibling=LeftTree->Rightsibling;
	sibling->father=Tree;
	sibling->Rightsibling=NULL;
	return Tree;
}

//9.param_list1->,param param_list1|空字
CTreeNode* param_list1()
{
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=9;
	Tree->Node_Number=k++;
	Tree->TOKEN.LineofPro=0;	
	Tree->TOKEN.code=0;
	strcpy(Tree->TOKEN.name,"\0");
	if((strcmp(curToken.name,","))==0)
	{
		SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
		SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
		SyntaxTree sibling2=(SyntaxTree)malloc(sizeof(CTreeNode));
		Tree->Leftchild=LeftTree;
		LeftTree->father=Tree;
		LeftTree->Leftchild=NULL;
		LeftTree->FID=9;
		LeftTree->Node_Number=k++;
		LeftTree->TOKEN.LineofPro=curToken.LineofPro;
		LeftTree->TOKEN.code=curToken.code;
		strcpy(LeftTree->TOKEN.name,curToken.name);
	//	st_insert(variable,status,curToken.name);	
		NextToken();
		LeftTree->Rightsibling=param();
		sibling1=LeftTree->Rightsibling;
		sibling1->father=Tree;
		sibling1->Rightsibling=param_list1();
		sibling2=sibling1->Rightsibling;
		sibling2->father=Tree;
		sibling2->Rightsibling=NULL;
	}
	else 
		Tree->Leftchild=NULL;
	return Tree;
}

//10.param->int ID param1
CTreeNode* param()
{
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=10;
	Tree->Node_Number=k++;
	Tree->TOKEN.LineofPro=0;	
	Tree->TOKEN.code=0;
	strcpy(Tree->TOKEN.name,"\0");
	if((strcmp(curToken.name,"int"))==0)
	{	
		SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
		SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
		SyntaxTree sibling2=(SyntaxTree)malloc(sizeof(CTreeNode));
		Tree->Leftchild=LeftTree;
		LeftTree->Leftchild=NULL;
		LeftTree->father=Tree;
		LeftTree->FID=10;
		LeftTree->Node_Number=k++;
		LeftTree->TOKEN.LineofPro=curToken.LineofPro;
		LeftTree->TOKEN.code=curToken.code;
		strcpy(LeftTree->TOKEN.name,curToken.name);
		strcpy(status,curToken.name);
		NextToken();
		if(curToken.code==26)//ID
		{
			LeftTree->Rightsibling=sibling1;
			sibling1->Leftchild=NULL;
			sibling1->father=Tree;
			sibling1->FID=10;
			sibling1->Node_Number=k++;
			sibling1->TOKEN.LineofPro=curToken.LineofPro;
			sibling1->TOKEN.code=curToken.code;
			strcpy(sibling1->TOKEN.name,curToken.name);
			strcpy(variable,curToken.name);
			param_number++;//形参个数加1
			NextToken();
			st_insert(variable,status,curToken.name);
			sibling1->Rightsibling=param1();
			sibling2=sibling1->Rightsibling;
			sibling2->father=Tree;
			sibling2->Rightsibling=NULL;
		}
		else error(1,curToken.LineofPro);//没有ID
	}
	else error(7,curToken.LineofPro);//数据类型丢失
	return Tree;
}

//11.param1->[]|空字
CTreeNode* param1()
{
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=11;
	Tree->Node_Number=k++;
	Tree->TOKEN.LineofPro=0;	
	Tree->TOKEN.code=0;
	strcpy(Tree->TOKEN.name,"\0");
	if((strcmp(curToken.name,"["))==0)
	{	
		SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
		SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
		Tree->Leftchild=LeftTree;
		LeftTree->Leftchild=NULL;
		LeftTree->father=Tree;
		LeftTree->FID=11;
		LeftTree->Node_Number=k++;
		LeftTree->TOKEN.LineofPro=curToken.LineofPro;
		LeftTree->TOKEN.code=curToken.code;
		strcpy(LeftTree->TOKEN.name,curToken.name);
		NextToken();
		if((strcmp(curToken.name,"]"))==0)
		{
			LeftTree->Rightsibling=sibling1;
			sibling1->Leftchild=NULL;
			sibling1->father=Tree;
			sibling1->Rightsibling=NULL;
			LeftTree->FID=11;
			LeftTree->Node_Number=k++;
			LeftTree->TOKEN.LineofPro=curToken.LineofPro;
			LeftTree->TOKEN.code=curToken.code;
			strcpy(LeftTree->TOKEN.name,curToken.name);
			NextToken();
		}
		else error(3,curToken.LineofPro);//缺少"]"
	}
	else 
		Tree->Leftchild=NULL;
	return Tree;//空字符处理
}

//12.compound_stmt->{local_declarations statement_list}
CTreeNode* compound_stmt()
{
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=12;
	Tree->Node_Number=k++;
	Tree->TOKEN.LineofPro=0;	
	Tree->TOKEN.code=0;
	strcpy(Tree->TOKEN.name,"\0");
	if((strcmp(curToken.name,"{"))==0)
	{	
		SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
		SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
		SyntaxTree sibling2=(SyntaxTree)malloc(sizeof(CTreeNode));
		SyntaxTree sibling3=(SyntaxTree)malloc(sizeof(CTreeNode));
		Tree->Leftchild=LeftTree;
		LeftTree->Leftchild=NULL;
		LeftTree->father=Tree;
		LeftTree->FID=12;
		LeftTree->Node_Number=k++;
		LeftTree->TOKEN.LineofPro=curToken.LineofPro;
		LeftTree->TOKEN.code=curToken.code;
		strcpy(LeftTree->TOKEN.name,curToken.name);
		stack[R++]='{';
		r++;
		if((stack[R]=='{')&&(stack[R-1]=='{'))
			Par_number--;
		NextToken();
		LeftTree->Rightsibling=local_declarations();
		sibling1=LeftTree->Rightsibling;
		sibling1->father=Tree;
		sibling1->Rightsibling=statement_list();
		sibling2=sibling1->Rightsibling;
		sibling2->father=Tree;
		if((strcmp(curToken.name,"}"))==0)
		{
			sibling2->Rightsibling=sibling3;
			sibling3->Leftchild=NULL;
			sibling3->Rightsibling=NULL;
			sibling3->father=Tree;
			sibling3->FID=12;
			sibling3->Node_Number=k++;
			sibling3->TOKEN.LineofPro=curToken.LineofPro;
			sibling3->TOKEN.code=curToken.code;
			strcpy(sibling3->TOKEN.name,curToken.name);
			Par_number++;
			stack[R++]='}';
			r--;
			local_number=0;
			NextToken();
		}
		else error(8,curToken.LineofPro);//缺少"}"
	}
	else error(9,curToken.LineofPro);//缺少"{"
	return Tree;
}

//13.local_declarations->type_specifier ID local_declarations1|空字
CTreeNode* local_declarations()
{
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=13;
	Tree->Node_Number=k++;
	Tree->TOKEN.LineofPro=0;
	Tree->TOKEN.code=0;
	strcpy(Tree->TOKEN.name,"\0");
	if(((strcmp(curToken.name,"int"))==0)||(strcmp(curToken.name,"void")==0))
	{
		SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
		SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
		SyntaxTree sibling2=(SyntaxTree)malloc(sizeof(CTreeNode));
		Tree->Leftchild=type_specifier();
		LeftTree=Tree->Leftchild;
		LeftTree->father=Tree;
		if(curToken.code==26)//ID
		{
			LeftTree->Rightsibling=sibling1;
			sibling1->Leftchild=NULL;
			sibling1->father=Tree;
			sibling1->FID=13;
			sibling1->Node_Number=k++;
			sibling1->TOKEN.LineofPro=curToken.LineofPro;
			sibling1->TOKEN.code=curToken.code;
			strcpy(sibling1->TOKEN.name,curToken.name);
			strcpy(variable,curToken.name);	
			NextToken();
			sibling1->Rightsibling=local_declarations1();;
			sibling2=sibling1->Rightsibling;
			sibling2->father=Tree;
			sibling2->Rightsibling=NULL;
		}
		else error(1,curToken.LineofPro);//语法错误,没有ID
	}
	else 
		Tree->Leftchild=NULL;//空字符处理
	return Tree;
}
	
//14.local_declarations1->; local_declarations|[NUM];local_declarations
CTreeNode* local_declarations1()
{
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=14;
	Tree->Node_Number=k++;
	Tree->TOKEN.LineofPro=0;	
	Tree->TOKEN.code=0;
	strcpy(Tree->TOKEN.name,"\0");
	if((strcmp(curToken.name,";"))==0)
	{
		SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
		SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
		Tree->Leftchild=LeftTree;
		LeftTree->father=Tree;
		LeftTree->Leftchild=NULL;
		LeftTree->FID=14;
		LeftTree->Node_Number=k++;
		LeftTree->TOKEN.LineofPro=curToken.LineofPro;
		LeftTree->TOKEN.code=curToken.code;
		strcpy(LeftTree->TOKEN.name,curToken.name);
    	local_number++;	
		st_insert(variable,status,curToken.name);
		NextToken();
		LeftTree->Rightsibling=local_declarations();
		sibling1=LeftTree->Rightsibling;
		sibling1->father=Tree;
		sibling1->Rightsibling=NULL;
	}
	else
		if((strcmp(curToken.name,"["))==0)
		{
			SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
			SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
			SyntaxTree sibling2=(SyntaxTree)malloc(sizeof(CTreeNode));
			SyntaxTree sibling3=(SyntaxTree)malloc(sizeof(CTreeNode));
			SyntaxTree sibling4=(SyntaxTree)malloc(sizeof(CTreeNode));
			Tree->Leftchild=LeftTree;	
			LeftTree->Leftchild=NULL;
			LeftTree->father=Tree;
			LeftTree->FID=14;
			LeftTree->Node_Number=k++;
			LeftTree->TOKEN.LineofPro=curToken.LineofPro;
			LeftTree->TOKEN.code=curToken.code;
			strcpy(LeftTree->TOKEN.name,curToken.name);
			NextToken();
			if(curToken.code==27)//NUM
			{
				LeftTree->Rightsibling=sibling1;
				sibling1->Leftchild=NULL;
				sibling1->father=Tree;
				sibling1->FID=14;
				sibling1->Node_Number=k++;
				sibling1->TOKEN.LineofPro=curToken.LineofPro;
				sibling1->TOKEN.code=curToken.code;
				strcpy(sibling1->TOKEN.name,curToken.name);
				NextToken();
				if((strcmp(curToken.name,"]"))==0)
				{
					sibling1->Rightsibling=sibling2;
					sibling2->Leftchild=NULL;
					sibling2->father=Tree;
					sibling2->FID=14;
					sibling2->Node_Number=k++;
					sibling2->TOKEN.LineofPro=curToken.LineofPro;
					sibling2->TOKEN.code=curToken.code;
					strcpy(sibling2->TOKEN.name,curToken.name);
					NextToken();
					if((strcmp(curToken.name,";"))==0)
					{
						sibling2->Rightsibling=sibling3;
						sibling3->Leftchild=NULL;
						sibling3->father=Tree;
						sibling3->FID=14;
						sibling3->Node_Number=k++;
						sibling3->TOKEN.LineofPro=curToken.LineofPro;

⌨️ 快捷键说明

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