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

📄 grammer.cpp

📁 snl语言的语法分析 (递归下降法)词法分析
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	
		Node_Declare_VarPart->child0=NULL;
		Node_Declare_VarPart->child1=NULL;
		Node_Declare_VarPart->child2=NULL;
		Node_Declare_VarPart->Sibling=NULL;
		Node_Declare_VarPart->name=NULL;
	
		
	Node_Declare_VarPart->i_idnum=0;
	
	Node_Declare_VarPart->i_Lineno=Token_curr->i_row;
	Node_Declare_VarPart->NK_Nodekind=DecK;
	
	
	Grammer_TypeDef(Node_Declare_VarPart);
	
	Grammer_VarIdList(Node_Declare_VarPart);
	
	if(Token_curr->str_wom==";")
		Node_Declare_VarPart->Sibling=Grammer_VarDecMore();
	else
	{
		i_IsVarR--;
		cout<<"第"<<Token_curr->i_row<<"行缺少;"<<endl;
		return NULL;
	}
	return Node_Declare_VarPart;
}

void Grammer::Grammer_VarIdList(GrammerNode* node_temp)
{
	if(Token_curr->str_wom!="ID")
		return;
	else
	{
		node_temp->name=Add_name(Token_curr->str_grm);
		Token_curr=Token_curr->T_next;
		Grammer_VarIDMore(node_temp);
	}
}
void Grammer::Grammer_VarIDMore(GrammerNode* node_temp)
{
	if(Token_curr->str_wom!=",")
		return ;
	Token_curr=Token_curr->T_next;
	NameNode * NN_Temp=node_temp->name;
	while(NN_Temp->NN_next!=NULL)
		NN_Temp=NN_Temp->NN_next;
	NN_Temp->NN_next=Add_name(Token_curr->str_grm);
	node_temp->i_idnum++;
	Token_curr=Token_curr->T_next;
}

GrammerNode* Grammer::Grammer_VarDecMore()
{
	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();
	return NULL;
}


GrammerNode * Grammer::Grammer_ProcDec()
{	
	if(Token_curr->str_wom=="procedure")
	{
		Token_curr=Token_curr->T_next;
		if(Token_curr->str_wom=="ID")
			return Grammer_ProcDeclaration();
	}
	
		return NULL;	
}

GrammerNode * Grammer::Grammer_ProcDeclaration()
{
	GrammerNode * Node_Declare_ProcPart=new GrammerNode;
	
		Node_Declare_ProcPart->child0=NULL;
		Node_Declare_ProcPart->child1=NULL;
		Node_Declare_ProcPart->child2=NULL;
		Node_Declare_ProcPart->Sibling=NULL;
		Node_Declare_ProcPart->name=NULL;
	
	Node_Declare_ProcPart->i_idnum=0;
	Node_Declare_ProcPart->name=Add_name(Token_curr->str_grm);
	Node_Declare_ProcPart->i_idnum++;
	Node_Declare_ProcPart->i_Lineno=Token_curr->i_row;
	Node_Declare_ProcPart->NK_Nodekind=ProcDecK;

	Token_curr=Token_curr->T_next;
	if(Token_curr->str_wom!="(")
	{
		i_IsProcR--;
		cout<<"第"<<Token_curr->i_row<<"类型申明出错,缺少左括号"<<endl;
		return NULL;
	}
	Grammer_ParamList(Node_Declare_ProcPart);
	if(i_IsBodyR<0)
		return NULL;
	Node_Declare_ProcPart->child1=Grammer_ProcDecPart();
	Node_Declare_ProcPart->child2=Grammer_procBody();

	return Node_Declare_ProcPart;
}

void Grammer::Grammer_ParamList(GrammerNode* node_temp)
{
	Token_curr=Token_curr->T_next;
	if(Token_curr->str_wom==")")
		return ;
	else if(Token_curr->str_wom=="integer"||Token_curr->str_wom=="char"||Token_curr->str_wom=="record"||Token_curr->str_wom=="ID"||Token_curr->str_wom=="var")
		node_temp->child0=Grammer_ParamDecList();

	Token_curr=Token_curr->T_next;
	Token_curr=Token_curr->T_next;
}

GrammerNode* Grammer::Grammer_ParamDecList()
{
	GrammerNode* temp=new GrammerNode();
		temp->child0=NULL;
		temp->child1=NULL;
		temp->child2=NULL;
		temp->Sibling=NULL;
		temp->name=NULL;
	
	temp->i_idnum=0;
	temp->i_Lineno=Token_curr->i_row;
	temp->NK_Nodekind=DecK;
	Grammer_Param(temp);
	temp->Sibling=Grammer_ParamMore();
	if(Token_curr->str_wom==")")
	{
	
		return temp;
	}
	i_IsProcR--;
	cout<<"第"<<Token_curr->i_row<<"行缺少( ParamDecList"<<endl;
	return NULL;
}
void Grammer::Grammer_Param(GrammerNode* node_temp)
{ 
	if(Token_curr->str_wom=="integer"||Token_curr->str_wom=="char"||Token_curr->str_wom=="record"||Token_curr->str_wom=="ID")
	{
		node_temp->at_attr.Proc.PT_param=valparamtype;
		Grammer_TypeDef(node_temp);
		Grammer_FormList(node_temp);
		return;
	}
	else if(Token_curr->str_wom=="var")
	{
		node_temp->at_attr.Proc.PT_param=varparamtype;
		
		Token_curr=Token_curr->T_next;
		Grammer_TypeDef(node_temp);
		Grammer_FormList(node_temp);
		return ;
	}
	if(Token_curr->str_wom!=")")
		Token_curr=Token_curr->T_next;
}

void Grammer::Grammer_FormList(GrammerNode* node_temp)
{
	if(Token_curr->str_wom!="ID")
	{
		i_IsProcR--;
		cout<<"第"<<Token_curr->i_row<<"行参数申明出错"<<endl;
		return;
	}
	NameNode * NN_Temp=&*(node_temp->name);
	if(NN_Temp!=NULL)
	{
		while(NN_Temp->NN_next!=NULL)
			NN_Temp=NN_Temp->NN_next;
		NN_Temp->NN_next=Add_name(Token_curr->str_grm);
	}
	else
	{
		node_temp->name=Add_name(Token_curr->str_grm);
	}
	node_temp->i_idnum++;
	Token_curr=Token_curr->T_next;
	
	if(Token_curr->str_wom==",")    
	{
		Token_curr=Token_curr->T_next;
		Grammer_FormList(node_temp);
	}
	return ;
}

GrammerNode* Grammer::Grammer_ParamMore()
{
	if(Token_curr->str_wom!=";")
		return NULL;
	Token_curr=Token_curr->T_next;
	return Grammer_ParamDecList();
}

GrammerNode* Grammer::Grammer_ProcDecPart()
{
	if(Token_curr->str_wom=="begin")
		return NULL;
	return Grammer_DeclarePart();
}


GrammerNode* Grammer::Grammer_procBody()
{
	return Grammer_ProgramBody();
}

GrammerNode* Grammer::Grammer_ProgramBody()
{
	if(Token_curr->str_wom!="begin")
		return NULL;
	GrammerNode* temp=new GrammerNode();
		temp->child0=NULL;
		temp->child1=NULL;
		temp->child2=NULL;
		temp->Sibling=NULL;
		temp->name=NULL;
	
	temp->i_idnum=0;
	temp->i_Lineno=Token_curr->i_row;
	temp->NK_Nodekind=StmLK;
	Token_curr=Token_curr->T_next;
	temp->child0=Grammer_StmList();
	if(Token_curr->str_wom!="end")
	{
		i_IsBodyR--;
		cout<<"第"<<Token_curr->i_row<<"行缺少end"<<endl;
		return NULL;
	}
	Token_curr=Token_curr->T_next;
	return temp;
}


GrammerNode* Grammer::Grammer_StmList()
{
	GrammerNode* temp=new GrammerNode();
		temp->child0=NULL;
		temp->child1=NULL;
		temp->child2=NULL;
		temp->Sibling=NULL;
		temp->name=NULL;
	
	temp->i_idnum=0;
	temp->i_Lineno=Token_curr->i_row;
	temp->NK_Nodekind=StmtK;
	Grammer_Stm(temp);
	if(i_IsBodyR<0)
		return NULL;
	temp->Sibling=Grammer_StmMore();
	return temp;
}


GrammerNode* Grammer::Grammer_StmMore()
{
	if(Token_curr->str_wom!=";")
		return NULL;
	Token_curr=Token_curr->T_next;
	return Grammer_StmList();
}

void Grammer::Grammer_Stm(GrammerNode* node_temp)
{
	if(Token_curr->str_wom=="if")
		Grammer_ConditionalStm(node_temp);
	else if(Token_curr->str_wom=="while")
		Grammer_LoopStm(node_temp);
	else if(Token_curr->str_wom=="return")
		Grammer_ReturnStm(node_temp);
	else if(Token_curr->str_wom=="read")
		Grammer_InputStm(node_temp);
	else if(Token_curr->str_wom=="write")
		Grammer_OutputStm(node_temp);
	else if(Token_curr->str_wom=="ID")
		Grammer_AssCall(node_temp);
	else
	{
		i_IsBodyR--;
		cout<<"第"<<Token_curr->i_row<<"行出现错误"<<endl;
		Token_curr=Token_curr->T_next;
		return;
	}

}

void Grammer::Grammer_AssCall(GrammerNode* node_temp)
{
	//string str_temp=Token_curr->str_grm;
	
	GrammerNode* temp=new GrammerNode();
		temp->child0=NULL;
		temp->child1=NULL;
		temp->child2=NULL;
		temp->Sibling=NULL;
		temp->name=NULL;
	
		temp->i_idnum=0;
		temp->i_Lineno=Token_curr->i_row;
		temp->NK_Nodekind=ExpK;
		Grammer_variable(temp);
		temp->K_kind.exp=IdK;

	node_temp->child0=temp;
	if(Token_curr->str_wom==":=")
	{
		node_temp->K_kind.stmt=AssignK;
		Grammer_AssignmentRest(node_temp);
	}
	else if(Token_curr->str_wom=="(")
	{
		node_temp->K_kind.stmt=CallK;
		Grammer_CallStmRest(node_temp);
	}
	else
	{
		i_IsBodyR--;
		cout<<"第"<<Token_curr->i_row<<"行出现错误"<<endl;
		Token_curr=Token_curr->T_next;
		return;
	}
}


void Grammer::Grammer_AssignmentRest(GrammerNode* node_temp)
{
	Token_curr=Token_curr->T_next;
	node_temp->child1=Grammer_Exp();
}


void Grammer::Grammer_ConditionalStm(GrammerNode* node_temp)
{
	node_temp->K_kind.stmt=IfK;
	Token_curr=Token_curr->T_next;
	node_temp->child0=Grammer_Exp();
	if(i_IsBodyR<0)
		return;
	if(Token_curr->str_wom=="then")
	{
		Token_curr=Token_curr->T_next;
		node_temp->child1=Grammer_StmList();
	}
	if(Token_curr->str_wom=="else")
	{
		Token_curr=Token_curr->T_next;
		node_temp->child2=Grammer_StmList();
	}
	if(Token_curr->str_wom!="fi")
	{
		i_IsBodyR--;
		cout<<"第"<<Token_curr->i_row<<"行缺少fi"<<endl;
		return;
	}
	Token_curr=Token_curr->T_next;
}


void Grammer::Grammer_LoopStm(GrammerNode* node_temp)
{
	node_temp->K_kind.stmt=WhileK;
	Token_curr=Token_curr->T_next;
	node_temp->child0=Grammer_Exp();
	if(i_IsBodyR<0)
		return;
	if(Token_curr->str_wom=="do")
	{
		Token_curr=Token_curr->T_next;
		node_temp->child1=Grammer_StmList();
	}
	if(Token_curr->str_wom!="endwh")
	{
		i_IsBodyR--;
		cout<<"第"<<Token_curr->i_row<<"行缺少endwh"<<endl;
		return;
	}
	Token_curr=Token_curr->T_next;
}


void Grammer::Grammer_InputStm(GrammerNode* node_temp)
{
	node_temp->K_kind.stmt=ReadK;
	Token_curr=Token_curr->T_next;
	if(Token_curr->str_wom!="(")
	{
		i_IsBodyR--;
		cout<<"第"<<Token_curr->i_row<<"行缺少("<<endl;
		return;
	}
	Token_curr=Token_curr->T_next;
	if(Token_curr->str_wom!="ID")
	{
		i_IsBodyR--;
		cout<<"第"<<Token_curr->i_row<<"行缺少标示符"<<endl;
		return;
	}
	node_temp->name=Add_name(Token_curr->str_grm);
	Token_curr=Token_curr->T_next;
	if(Token_curr->str_wom!=")")
	{
		i_IsBodyR--;
		cout<<"第"<<Token_curr->i_row<<"行缺少)"<<endl;
		return;
	}
	Token_curr=Token_curr->T_next;
}


void Grammer::Grammer_OutputStm(GrammerNode* node_temp)
{
	node_temp->K_kind.stmt=WriteK;
	Token_curr=Token_curr->T_next;
	if(Token_curr->str_wom!="(")
	{
		i_IsBodyR--;
		cout<<"第"<<Token_curr->i_row<<"行缺少("<<endl;
		return;
	}
	Token_curr=Token_curr->T_next;
	if(Token_curr->str_wom!="ID")
	{
		i_IsBodyR--;
		cout<<"第"<<Token_curr->i_row<<"行缺少标示符"<<endl;
		return;
	}
	
	node_temp->child0=Grammer_Exp();




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


void Grammer::Grammer_ReturnStm(GrammerNode* node_temp)
{
	node_temp->K_kind.stmt=ReturnK;
	Token_curr=Token_curr->T_next;
}


void Grammer::Grammer_CallStmRest(GrammerNode* node_temp)
{
	Token_curr=Token_curr->T_next;
	node_temp->child1=Grammer_ActParamList();
	if(i_IsBodyR<0)
		return;	
	if(Token_curr->str_wom!=")")
	{
		i_IsBodyR--;
		cout<<"第"<<Token_curr->i_row<<"行缺少)"<<endl;
		return;
	}
	Token_curr=Token_curr->T_next;
}


GrammerNode* Grammer::Grammer_ActParamList()
{
	if(Token_curr->str_wom==")")
		return NULL;
	GrammerNode* temp;
	if(Token_curr->str_wom=="ID"||Token_curr->str_wom=="integer")
	{
		temp=Grammer_Exp();
		temp->Sibling=Grammer_ActParamMore();
		return temp;
	}

	return NULL;

⌨️ 快捷键说明

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