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

📄 yufa.cpp

📁 本程序是实现C-的一个小型编译器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				SyntaxTree sibling2=(SyntaxTree)malloc(sizeof(CTreeNode));
				j=j-(length+1);
				NextToken();
				Tree->Leftchild=var();
				LeftTree=Tree->Leftchild;
				LeftTree->father=Tree;
				if((strcmp(curToken.name,"=")==0))
				{	
					LeftTree->Rightsibling=sibling1;
					sibling1->father=Tree;
					sibling1->Leftchild=NULL;
				    sibling1->FID=23;
					sibling1->Node_Number=k++;
					sibling1->TOKEN.LineofPro=curToken.LineofPro;
					sibling1->TOKEN.code=curToken.code;
					strcpy(sibling1->TOKEN.name,curToken.name);
					expression_in(curToken.name);//将'='入栈
					NextToken();
					sibling1->Rightsibling=expression();
					sibling2=sibling1->Rightsibling;
					sibling2->father=Tree;
					sibling2->Rightsibling=NULL;
				}
			}
			else
			{
				SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
				j=j-(length+1);
				NextToken();
				Tree->Leftchild=simple_expression();  
				LeftTree=Tree->Leftchild;
				LeftTree->father=Tree;
				LeftTree->Rightsibling=NULL;
			}
		}
		else error(1,curToken.LineofPro);//缺少"ID"
	return Tree;
}

//24.var->ID var1
CTreeNode* var()
{
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=24;
	Tree->Node_Number=k++;
	Tree->TOKEN.LineofPro=0;	
	Tree->TOKEN.code=0;
	strcpy(Tree->TOKEN.name,"\0");	
	if(curToken.code==26)//ID
	{
		SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
		SyntaxTree sibling=(SyntaxTree)malloc(sizeof(CTreeNode));
		Tree->Leftchild=LeftTree;
		LeftTree->Leftchild=NULL;
		LeftTree->father=Tree;
		LeftTree->FID=24;
		LeftTree->Node_Number=k++;
		LeftTree->TOKEN.LineofPro=curToken.LineofPro;
		LeftTree->TOKEN.code=curToken.code;
		strcpy(LeftTree->TOKEN.name,curToken.name);	
		st_lookup(curToken.name);
		if((st_lookup(curToken.name)==1)&&(strcmp(CurToken[j].name,",")!=0)&&(strcmp(CurToken[j].name,")")!=0))	
			expression_in(curToken.name);//将ID入栈
		NextToken();
		if((Top_stack==4)&&(strcmp(curToken.name,";")==0))
		{
			strcpy(ARG1,expression_stack[--Top_stack]);
			strcpy(OP,expression_stack[--Top_stack]);
			RESULT=lookup(expression_stack[--Top_stack]);
			EquPush(OP,ARG1,"\0",RESULT);
			strcpy(ARG1,"\0");
			strcpy(ARG2,"\0");
			strcpy(OP,"\0");
			RESULT=0;
		}
		else
			if(strcmp(curToken.name,";")==0)
			{
				strcpy(ARG1,expression_stack[--Top_stack]);
				EquPush(OP,ARG1,"\0",0);
			}
		LeftTree->Rightsibling=var1();   
		sibling=LeftTree->Rightsibling;
		sibling->father=Tree;
		sibling->Rightsibling=NULL;
	}
	else error(1,curToken.LineofPro);//缺少ID
	return Tree;
}

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

//26.simple_expression->additive_expression simple_expression1
CTreeNode* simple_expression()
{
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
	SyntaxTree sibling=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=26;
	Tree->Node_Number=k++;
	Tree->TOKEN.LineofPro=0;
	Tree->TOKEN.code=0;
	strcpy(Tree->TOKEN.name,"\0");
	Tree->Leftchild=additive_expression(); 
	LeftTree=Tree->Leftchild;
	LeftTree->father=Tree;
	LeftTree->Rightsibling=simple_expression1();
	sibling=LeftTree->Rightsibling;
	sibling->father=Tree;
	sibling->Rightsibling=NULL;
	return Tree;  
}

//27.simple_expression1->空字符|relop additive_expression
CTreeNode* simple_expression1()
{
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=27;
	Tree->Node_Number=k++;
	Tree->TOKEN.LineofPro=0;
	Tree->TOKEN.code=0;
	strcpy(Tree->TOKEN.name,"\0");	
	if((curToken.code<17)&&(curToken.code>10))
	{
		SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
		SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
		Tree->Leftchild=relop();
		LeftTree=Tree->Leftchild;
		LeftTree->father=Tree;
		LeftTree->Rightsibling=additive_expression();
		sibling1=LeftTree->Rightsibling;
		sibling1->father=Tree;
		sibling1->Rightsibling=NULL;
	}
	else
		Tree->Leftchild=NULL;//空字符处理
	return Tree;
}

//28.relop-><=|<|>|>=|==|!=
CTreeNode* relop()
{
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=28;
	Tree->Node_Number=k++;
	Tree->TOKEN.LineofPro=0;
	Tree->TOKEN.code=0;
	strcpy(Tree->TOKEN.name,"\0");
	if((curToken.code==11)||(curToken.code==12)||(curToken.code==13)\
	  ||(curToken.code==14)||(curToken.code==15)||(curToken.code==16))
	{	
		SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
		Tree->Leftchild=LeftTree;
		LeftTree->Leftchild=NULL;
		LeftTree->Rightsibling=NULL;
		LeftTree->father=Tree;
		LeftTree->FID=28;
		LeftTree->Node_Number=k++;
		LeftTree->TOKEN.LineofPro=curToken.LineofPro;
		LeftTree->TOKEN.code=curToken.code;
		strcpy(LeftTree->TOKEN.name,curToken.name);
		expression_in(curToken.name);
		NextToken();
	}
	else error(18,curToken.LineofPro);//缺少比较运算符
	return Tree;
}

//29.additive_expression->term additive_expression1
CTreeNode* additive_expression()
{	
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
	SyntaxTree sibling=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=29;
	Tree->Node_Number=k++;
	Tree->TOKEN.LineofPro=0;
	Tree->TOKEN.code=0;
	strcpy(Tree->TOKEN.name,"\0");
	Tree->Leftchild=term();  
	LeftTree=Tree->Leftchild;
	LeftTree->father=Tree;
	LeftTree->Rightsibling=additive_expression1();
	sibling=LeftTree->Rightsibling;
	sibling->father=Tree;
	sibling->Rightsibling=NULL;
	return Tree;  
}

//30.additive_expressionn1->addop term additive_expression1 |空字符
CTreeNode* additive_expression1()
{
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=30;
	Tree->Node_Number=k++;
	Tree->TOKEN.LineofPro=0;
	Tree->TOKEN.code=0;
	strcpy(Tree->TOKEN.name,"\0");
	if(((strcmp(curToken.name,"+"))==0)||((strcmp(curToken.name,"-"))==0))
	{
		SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
		SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
		SyntaxTree sibling2=(SyntaxTree)malloc(sizeof(CTreeNode));
		Tree->Leftchild=addop();
		LeftTree=Tree->Leftchild;
		LeftTree->father=Tree;
		LeftTree->Rightsibling=term();
		sibling1=LeftTree->Rightsibling;
		sibling1->father=Tree;
		sibling1->Rightsibling=additive_expression1();
		sibling2=sibling1->Rightsibling;
		sibling2->father=Tree;
		sibling2->Rightsibling=NULL;
	}
	else
		Tree->Leftchild=NULL;//空字符处理
	return Tree;
}

//31.addop->+|-
CTreeNode* addop()
{
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=31;
	Tree->Node_Number=k++;
	Tree->TOKEN.LineofPro=0;
	Tree->TOKEN.code=0;
	strcpy(Tree->TOKEN.name,"\0");
	if(((strcmp(curToken.name,"+"))==0)||((strcmp(curToken.name,"-")==0)))
	{
		SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
		Tree->Leftchild=LeftTree;
		LeftTree->Leftchild=NULL;
		LeftTree->father=Tree;
		LeftTree->Rightsibling=NULL;
		LeftTree->FID=31;
		LeftTree->Node_Number=k++;
		LeftTree->TOKEN.LineofPro=curToken.LineofPro;
		LeftTree->TOKEN.code=curToken.code;
		strcpy(LeftTree->TOKEN.name,curToken.name);
		strcpy(OP,curToken.name);
		NextToken();
	}
	else error(14,curToken.LineofPro);//缺少"+"或"-"	
	return Tree;
}

//32.term->factor term1
CTreeNode* term()
{
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
	SyntaxTree sibling=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=32;
	Tree->Node_Number=k++;
	Tree->TOKEN.LineofPro=0;
	Tree->TOKEN.code=0;
	strcpy(Tree->TOKEN.name,"\0");	
	Tree->Leftchild=factor();   
	LeftTree=Tree->Leftchild;
	LeftTree->father=Tree;
	LeftTree->Rightsibling=term1();
	sibling=LeftTree->Rightsibling;
	sibling->father=Tree;
	sibling->Rightsibling=NULL;
	return Tree;  
}

//33.term1->mulop factor term1|空字符
CTreeNode* term1()
{	
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=33;
	Tree->Node_Number=k++;
	Tree->TOKEN.LineofPro=0;
	Tree->TOKEN.code=0;
	strcpy(Tree->TOKEN.name,"\0");
	if(((strcmp(curToken.name,"*"))==0)||((strcmp(curToken.name,"/")==0)))
	{
		SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
		SyntaxTree sibling1=(SyntaxTree)malloc(sizeof(CTreeNode));
		SyntaxTree sibling2=(SyntaxTree)malloc(sizeof(CTreeNode));
		Tree->Leftchild=mulop();
		LeftTree=Tree->Leftchild;
		LeftTree->father=Tree;
		LeftTree->Rightsibling=factor();
		sibling1=LeftTree->Rightsibling;
		sibling1->father=Tree;
		sibling1->Rightsibling=term1();
		sibling2=sibling1->Rightsibling;
		sibling2->father=Tree;
		sibling2->Rightsibling=NULL;
	}
	else 
		Tree->Leftchild=NULL;//空字符处理
	return Tree;
}
	
//34.mulop->*|/
CTreeNode* mulop()
{	
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=34;
	Tree->Node_Number=k++;
	Tree->TOKEN.LineofPro=0;
	Tree->TOKEN.code=0;
	strcpy(Tree->TOKEN.name,"\0");
	 if(((strcmp(curToken.name,"*"))==0)||((strcmp(curToken.name,"/")==0)))
	{
		SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
		Tree->Leftchild=LeftTree;
		LeftTree->Leftchild=NULL;
		LeftTree->father=Tree;
		LeftTree->Rightsibling=NULL;
		LeftTree->FID=34;
		LeftTree->Node_Number=k++;
		LeftTree->TOKEN.LineofPro=curToken.LineofPro;
		LeftTree->TOKEN.code=curToken.code;
		strcpy(Tree->TOKEN.name,curToken.name);
    	strcpy(OP,curToken.name);
		NextToken();
	}
	else error(15,curToken.LineofPro);//缺少"*"或"/"	
	return Tree;
}

//35.factor->(expression)|var|call|NUM
CTreeNode* factor()
{
	int length=0,i=0;
	char T[10];
	SyntaxTree Tree=(SyntaxTree)malloc(sizeof(CTreeNode));
	Tree->FID=35;
	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->Leftchild=NULL;
		LeftTree->father=Tree;
		LeftTree->FID=35;
		LeftTree->Node_Number=k++;
		LeftTree->TOKEN.LineofPro=curToken.LineofPro;	
		LeftTree->TOKEN.code=curToken.code;
		strcpy(LeftTree->TOKEN.name,curToken.name);
		NextToken();
		LeftTree->Rightsibling=expression();
		sibling1=LeftTree->Rightsibling;
		sibling1->father=Tree;
		if((strcmp(curToken.name,")"))==0)
		{
			sibling1->Rightsibling=sibling2;
			sibling2->Leftchild=NULL;
			sibling2->father=Tree;
			sibling2->Rightsibling=NULL;
			LeftTree->FID=35;
			LeftTree->Node_Number=k++;
			LeftTree->TOKEN.LineofPro=curToken.LineofPro;	
			LeftTree->TOKEN.code=curToken.code;
			strcpy(Tree->TOKEN.name,curToken.name);
			NextToken();
		}
		else error(5,curToken.LineofPro);//缺少")"
	}
	else 
		if(curToken.code==27)//NUM
		{				
			SyntaxTree LeftTree=(SyntaxTree)malloc(sizeof(CTreeNode));
			Tree->Leftchild=LeftTree;
			LeftTree->Leftchild=NULL;
			LeftTree->father=Tree;
			LeftTree->Rightsibling=NULL;
			LeftTree->FID=35;
			LeftTree->Node_Number=k++;
			LeftTree->TOKEN.LineofPro=curToken.LineofPro;	
			LeftTree->TOKEN.code=curToken.code;
			strcpy(LeftTree->TOKEN.name,curToken.name);
			if((Top_stack==4)&&(strcmp(CurToken[j].name,";")==0))
			{
				strcpy(ARG2,curToken.name);
				EquPush(OP,ARG1,ARG2,atoi(T));	
			}
			else
				strcpy(ARG1,curToken.name);
			NextToken();
			if((Top_stack==3)&&(strcmp(curToken.name,")")==0))//处理关系运算

⌨️ 快捷键说明

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