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

📄 grammer.cpp

📁 snl语言的语法分析 (递归下降法)词法分析
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include"Grammer.h"

Grammer::Grammer(Token * Token_t):token(Token_t)
{
	i_IsDecR=0;

	i_IsVarR=0;

	i_IsProcR=0;

	i_IsBodyR=0;
}



Grammer::~Grammer()
{


	Grammer_delete(Gra_root);

}

NameNode * Grammer::Add_name(string name)
{
	NameNode * name0=new NameNode;


	name0->str_name=name;
	name0->NN_next=NULL;

	return name0;
}


int Grammer::Grammer_Parse()     
{
	if(token==NULL)
	{
		cout<<"Token序列未传至语法分析中"<<endl;
		return 0;
	}
	else
	{
		Token_curr=token;

		Gra_root=new GrammerNode();
		
		Gra_root->child0=NULL;
		Gra_root->child1=NULL;
		Gra_root->child2=NULL;
		Gra_root->Sibling=NULL;
		Gra_root->name=NULL;
		
		Gra_root->NK_Nodekind=ProK;
		Gra_root->child0=Grammer_ProgramHead();
		if(Gra_root->child0==NULL)
			return 0;
		Gra_root->child1=Grammer_DeclarePart();
		if(i_IsDecR<0||i_IsVarR<0||i_IsProcR<0)
			return 0;
		Gra_root->child2=Grammer_ProgramBody();
		if(i_IsBodyR<0)
			return 0;
		
		if(Grammer_match()==0)
			return 0;

	}
	return 1;
}


GrammerNode * Grammer::Grammer_ProgramHead()
{
	if(Token_curr->str_wom!="program")
	{
		cout<<"第"<<Token_curr->i_row<<"文件头错误!"<<endl;
		return NULL;
	}
	Token_curr=Token_curr->T_next;
	if(Token_curr->str_wom!="ID")
	{
		cout<<"第"<<Token_curr->i_row<<"文件名错误!"<<endl;
		return NULL;
	}
	GrammerNode * Node_ProgramHead_temp;
	Node_ProgramHead_temp=new GrammerNode;
	
		Node_ProgramHead_temp->child0=NULL;
		Node_ProgramHead_temp->child1=NULL;
		Node_ProgramHead_temp->child2=NULL;
		Node_ProgramHead_temp->Sibling=NULL;
		Node_ProgramHead_temp->name=NULL;

	Node_ProgramHead_temp->NK_Nodekind=PheadK;
	Node_ProgramHead_temp->name=Add_name(Token_curr->str_grm);
	Node_ProgramHead_temp->i_Lineno=Token_curr->i_row;

	Token_curr=Token_curr->T_next;
	return Node_ProgramHead_temp;
}


GrammerNode * Grammer::Grammer_DeclarePart()
{
	GrammerNode * Node_DeclarePart_Type=new GrammerNode;
	



		Node_DeclarePart_Type->child0=NULL;
		Node_DeclarePart_Type->child1=NULL;
		Node_DeclarePart_Type->child2=NULL;
		Node_DeclarePart_Type->Sibling=NULL;
		Node_DeclarePart_Type->name=NULL;

	GrammerNode * Node_DeclarePart_Var=new GrammerNode;
	


		Node_DeclarePart_Var->child0=NULL;
		Node_DeclarePart_Var->child1=NULL;
		Node_DeclarePart_Var->child2=NULL;
		Node_DeclarePart_Var->Sibling=NULL;
		Node_DeclarePart_Var->name=NULL;

	




	Node_DeclarePart_Type->Sibling=Node_DeclarePart_Var;
	
	if(Token_curr->str_wom=="type")
	{
		Node_DeclarePart_Type->NK_Nodekind=TypeK;
		Node_DeclarePart_Type->child0=Grammer_TypeDec();
		if(i_IsDecR<0)
			return NULL;
	}
	



	if(Token_curr->str_wom=="var")
	{
		Node_DeclarePart_Var->NK_Nodekind=VarK;
		Node_DeclarePart_Var->child0=Grammer_VarDec();
		if(i_IsVarR<0)
			return NULL;
	}
	if(Token_curr->str_wom=="procedure")
	{
	



		Node_DeclarePart_Var->Sibling=Grammer_ProcDec();
		if(i_IsProcR<0)
			return NULL;
	}
	
	
	return Node_DeclarePart_Type;
}





GrammerNode * Grammer::Grammer_TypeDec()
{	
	if(Token_curr->str_wom=="type")
	{
		Token_curr=Token_curr->T_next;
		if(Token_curr->str_wom=="ID")
			return Grammer_TypeDecList();
	}
	


		return NULL;	
}

GrammerNode * Grammer::Grammer_TypeDecList()
{
	GrammerNode * Node_Declare_TypePart=new GrammerNode;



		Node_Declare_TypePart->child0=NULL;
		Node_Declare_TypePart->child1=NULL;
		Node_Declare_TypePart->child2=NULL;
		Node_Declare_TypePart->Sibling=NULL;
		Node_Declare_TypePart->name=NULL;
	
	NameNode * NN_Temp;	
	Node_Declare_TypePart->i_idnum=0;
	Node_Declare_TypePart->name=Add_name(Token_curr->str_grm);
	Node_Declare_TypePart->i_idnum++;
	NN_Temp=Node_Declare_TypePart->name;
	Node_Declare_TypePart->i_Lineno=Token_curr->i_row;
	Node_Declare_TypePart->NK_Nodekind=DecK;

	Token_curr=Token_curr->T_next;
	if(Token_curr->str_wom!="=")
	{
		i_IsDecR--;
		cout<<"第"<<Token_curr->i_row<<"类型申明出错"<<endl;
		return NULL;
	}
	Token_curr=Token_curr->T_next;
	Grammer_TypeDef(Node_Declare_TypePart);



	if(Token_curr->str_wom!=";")
	{
		cout<<"第"<<Token_curr->i_row<<"行缺少;TypeDecList"<<endl;
		i_IsDecR--;
	}


	Token_curr=Token_curr->T_next;
	Node_Declare_TypePart->Sibling=Grammer_TypeDecMore();
	


	return Node_Declare_TypePart;
}

GrammerNode * Grammer::Grammer_TypeDecMore()
{
	if(Token_curr->str_wom=="ID")
		return Grammer_TypeDecList();
	return NULL;
}

void Grammer::Grammer_TypeDef(GrammerNode * node_temp)
{
	if(Token_curr->str_wom=="integer"||Token_curr->str_wom=="char")
		Grammer_BaseType(node_temp);
	else if(Token_curr->str_wom=="array"||Token_curr->str_wom=="record")
		Grammer_StructType(node_temp);
	else if(Token_curr->str_wom=="ID")
	{
		node_temp->K_kind.dec=IdK;
		node_temp->str_type_name=Token_curr->str_grm;
	}
	Token_curr=Token_curr->T_next;
}

void Grammer::Grammer_BaseType(GrammerNode * node_temp)
{
	if(Token_curr->str_wom=="integer")
	{
		node_temp->K_kind.dec=IntegerK;
		




	}
	else if(Token_curr->str_wom=="char")
	{
		node_temp->K_kind.dec=CharK;
		



	}
	



}



void Grammer::Grammer_StructType(GrammerNode * node_temp)
{
	if(Token_curr->str_wom=="array")
		Grammer_ArrayType(node_temp);
	else if(Token_curr->str_wom=="record")
	{
		node_temp->K_kind.dec=RecordK;
		Grammer_RecordType(node_temp);
	}
}






void Grammer::Grammer_ArrayType(GrammerNode * node_temp)
{
	Token_curr=Token_curr->T_next;
	if(Token_curr->str_wom!="[")
	{
		i_IsDecR--;
		cout<<"第"<<Token_curr->i_row<<"行缺少["<<endl;
		return;
	}
	Token_curr=Token_curr->T_next;
	if(Token_curr->str_wom!="integer")
	{
		i_IsDecR--;
		cout<<"第"<<Token_curr->i_row<<"行数组申明错误"<<endl;
		return;
	}
	node_temp->at_attr.Array.i_low=TurnToInt(Token_curr->str_wom);
	Token_curr=Token_curr->T_next;
	if(Token_curr->str_wom!="..")
	{
		i_IsDecR--;
		cout<<"第"<<Token_curr->i_row<<"行缺少.."<<endl;
		return;
	}
	Token_curr=Token_curr->T_next;
	if(Token_curr->str_wom!="integer")
	{
		i_IsDecR--;
		cout<<"第"<<Token_curr->i_row<<"行数组申明错误"<<endl;
		return;
	}
	node_temp->at_attr.Array.i_up=TurnToInt(Token_curr->str_wom);
	Token_curr=Token_curr->T_next;
	if(Token_curr->str_wom!="]")
	{
		i_IsDecR--;
		cout<<"第"<<Token_curr->i_row<<"行缺少]"<<endl;
		return;
	}
	Token_curr=Token_curr->T_next;
	if(Token_curr->str_wom!="of")
	{
		i_IsDecR--;
		cout<<"第"<<Token_curr->i_row<<"行数组申明错误"<<endl;
		return;
	}
	Token_curr=Token_curr->T_next;
	node_temp->K_kind.dec=ArrayK;
	if(Token_curr->str_wom=="integer")
		node_temp->at_attr.Array.childType=IntegerK;
	else if(Token_curr->str_wom=="char")
		node_temp->at_attr.Array.childType=CharK;
	


}


int Grammer::TurnToInt(string str)
{
	char b[32];
	strcpy(b,str.c_str());
	int c;
	c=atoi(b);
	return c;
}





void Grammer::Grammer_RecordType(GrammerNode * node_temp)
{
	node_temp->K_kind.dec=RecordK;

	GrammerNode * node_temp0=new GrammerNode;
	


		node_temp0->child0=NULL;
		node_temp0->child1=NULL;
		node_temp0->child2=NULL;
		node_temp0->Sibling=NULL;
		node_temp0->name=NULL;
	node_temp->child0=node_temp0;

	Token_curr=Token_curr->T_next;
	Grammer_FieldDecList(node_temp0);
}



void Grammer::Grammer_FieldDecList(GrammerNode * node_temp)
{
	
	if(Token_curr->str_wom=="integer"||Token_curr->str_wom=="char")
	{
		Grammer_BaseType(node_temp);
		Token_curr=Token_curr->T_next;
		node_temp->name=Add_name(Token_curr->str_grm);
		Token_curr=Token_curr->T_next;	
		



		if(Token_curr->str_wom!=";")
		{
			cout<<"第"<<Token_curr->i_row<<"行缺少;FieldDecList"<<endl;
			i_IsDecR--;
		}

		Grammer_FieldDecMore(node_temp);
	}
	else if(Token_curr->str_wom=="array")
	{
		Grammer_ArrayType(node_temp);
		Grammer_FieldDecMore(node_temp);
	}
	else if(Token_curr->str_wom=="ID")
	{
		Grammer_IdList(node_temp);	
		Grammer_FieldDecMore(node_temp);
	}
}

void Grammer::Grammer_IdList(GrammerNode * node_temp)
{
	node_temp->K_kind.dec=IdK;
	node_temp->str_type_name=Token_curr->str_grm;
	Token_curr=Token_curr->T_next;
	if(Token_curr->str_wom!="ID")
	{
		cout<<"第"<<Token_curr->i_row<<"行申明错误"<<endl;
		i_IsDecR--;
		return;
	}
	node_temp->name=Add_name(Token_curr->str_grm);
	Token_curr=Token_curr->T_next;
	if(Token_curr->str_wom!=";")
	{
		cout<<"第"<<Token_curr->i_row<<"行缺少;"<<endl;
		i_IsDecR--;
		return;
	}
}

void Grammer::Grammer_FieldDecMore(GrammerNode * node_temp)
{
	Token_curr=Token_curr->T_next;
	if(Token_curr->str_wom=="integer"||Token_curr->str_wom=="char"||Token_curr->str_wom=="array"||Token_curr->str_wom=="ID")
	{
		GrammerNode * node_temp1=new GrammerNode;
		
		node_temp1->child0=NULL;
		node_temp1->child1=NULL;
		node_temp1->child2=NULL;
		node_temp1->Sibling=NULL;
		node_temp1->name=NULL;

		node_temp1->Sibling=node_temp;
		Grammer_FieldDecList(node_temp1);
		return;
	}
	else if(Token_curr->str_wom=="end")
	{
		
		return ;
	}
	cout<<"第"<<Token_curr->i_row<<"行出现错误"<<endl;
	i_IsDecR--;
}

GrammerNode * Grammer::Grammer_VarDec()
{	
		Token_curr=Token_curr->T_next;
		
		if(Token_curr->str_wom=="integer"||Token_curr->str_wom=="char"||Token_curr->str_wom=="array"||Token_curr->str_wom=="record"||Token_curr->str_wom=="ID")
			return Grammer_VarDecList();
		else
		{
			i_IsVarR--;
			cout<<"第"<<Token_curr->i_row<<"行出错;VarDec"<<endl;
			return NULL;
		}
}

GrammerNode * Grammer::Grammer_VarDecList()
{
	GrammerNode * Node_Declare_VarPart=new GrammerNode;

⌨️ 快捷键说明

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