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

📄 yfenxi.cpp

📁 本学期编译课程需要实现L语言
💻 CPP
📖 第 1 页 / 共 2 页
字号:
* 函数名:    y_FuZhiYuJu
* 功能描述:   赋值语句 (protected)
* 返回值:    void
* 示例:      y:=219;
================================================================*/
bool YFenXi::y_FuZhiYuJu()
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 1:		//id
		break;
	default:
		m_nErrNo=20; //缺少标识符!
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nCur++;
	switch (m_cifa[m_nCur]->nType)
	{
	case 40:	//:=
		break;
	default:
		m_nErrNo=21;  //缺少赋值符号“ := ”!
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nCur++;
	if(m_cifa[m_nCur]->nType==4||m_cifa[m_nCur]->nType==5){
		m_nCur++;
		return true;
	}
	if (!y_BiaoDaShi()) 
		return false;
	return true;
}
/*================================================================ 
* 函数名:    y_TiaoJianYuJu
* 功能描述:   条件语句 (protected)
* 返回值:    void
* 示例:		If m>n then n:=m else t:=m;
================================================================*/
bool YFenXi::y_IfYuJu()
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 16:	//if
		break;
	default:
		m_nErrNo=22;  //缺少保留字“ if ”!
		m_nErrAddr=m_nCur;
		return false;
	}

	m_nCur++;

	if (!y_BuErBiaoDaShi())		//表达式
		return false;


	switch (m_cifa[m_nCur]->nType)
	{
	case 17:		//then
		break;
	default:
		m_nErrNo=23;  //缺少保留字“ then ”!
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nCur++;

	if (!y_YuJu())		//语句
		return false;

	switch (m_cifa[m_nCur]->nType)
	{
	case 18:	//else
		break;
	default:
		return true;
	}
	m_nCur++;

	if (!y_YuJu())	//语句
		return false;

	return true;
}
/*================================================================ 
* 函数名:    y_XunHuanYuJu
* 功能描述:   循环语句	 (protected)
* 返回值:    void
* 示例:    
				While n<m do
						Begin
						  n:=n+1
						End
================================================================*/
bool YFenXi::y_WhileYuJu()
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 19:	//while
		break;
	default:
		m_nErrNo=24;
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nCur++;
	if (!y_BuErBiaoDaShi())  //表达式
		return false;
	switch (m_cifa[m_nCur]->nType)
	{
	case 20:	//do
		break;
	default:
		m_nErrNo=25;   //缺少保留字“ do ”!
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nCur++;
	if (!y_YuJu()) 
		return false;
	return true;
}
/*================================================================ 
* 函数名:    y_HanShuYuJu
* 功能描述:   过程语句	 (protected)
* 返回值:    void
* 示例:	ab(x,y,z); 
================================================================*/
bool YFenXi::y_HanShuYuJu()
{	
	switch (m_cifa[m_nCur]->nType)
	{
	case 1:		//id
		break;
	default:
		m_nErrNo=27;	//缺少被调过程名标识符!
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nCur++;
	switch (m_cifa[m_nCur]->nType)
	{
	case 45:	//(
		break;
	default:
		return true;
	}
	if (!y_ShiCanBiao()) //表达式
		return false;
	return true;
}
/*================================================================ 
* 函数名:    y_ShiCanBiao
* 功能描述:   实参表 (protected)
* 返回值:    void
*示例:		Call ab(x,y,z);
================================================================*/
bool YFenXi::y_ShiCanBiao()
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 45:	//(
		break;
	default:
		m_nErrNo=16;	//缺少 “ ( ”符号!
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nCur++;
	if (!y_BiaoDaShi())  //表达式
		return false;
	while (m_cifa[m_nCur]->nType==44)	//,
	{
		m_nCur++;
		if (!y_BiaoDaShi()) 
			return false;
	}
	switch (m_cifa[m_nCur]->nType)
	{
	case 46:	//)
		break;
	default:
		m_nErrNo=17;	//缺少 “ ) ”符号
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nCur++;
	return true;
}
/*================================================================ 
* 函数名:    y_BiaoDaShi
* 功能描述:   表达式 (protected)
* 返回值:    void
* 示例:    4+z+(1+2+6-x)*3*y*5+7-ab(3,5);
================================================================*/
bool YFenXi::y_BiaoDaShi()
{
	if (!y_Xiang())
		return false;
	bool cyc=true;
	while(cyc){
		switch(m_cifa[m_nCur]->nType){//*,/,+,-
		case 27:// *
		case 28:// /
		case 29:// +
		case 30:// -
			m_nCur++;
			if (!y_Xiang()) 
				return false;
			break;
		default: cyc=false;		
		}
	}
	return true;
}
/*================================================================ 
* 函数名:    y_Xiang
* 功能描述:   项 (protected)
* 返回值:    void
* example: 4,z,(1+2+6-x),3,y,5,7,ab(3,5)
================================================================*/
bool YFenXi::y_Xiang()
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 1:			//id		
		if(m_cifa[m_nCur+1]->nType==45){ //han shu
			if(!y_HanShuYuJu()) return false; 
			else break;
		} 
		m_nCur++;
		break;
	case 2:			//integer
	case 3:			//real	
		m_nCur++;
		break;
	case 45:		//(
		m_nCur++;
		if (!y_BiaoDaShi())  //递归调用
			return false;		
		if(m_cifa[m_nCur]->nType!=46) {
			m_nErrNo=17;  //缺少 “ ) ”符号!
			m_nErrAddr=m_nCur;
			return false;
		}
		m_nCur++;
		break;
	default:
		m_nErrNo=28; //缺少《因子》,应为 (,ID,NUMBER"
		m_nErrAddr=m_nCur;
		return false;
	}
	return true;
}
/*================================================================ 
* 函数名:    y_BuErBiaoDaShi
* 功能描述:   布尔表达式 (protected)
* 返回值:    void
================================================================*/
bool YFenXi::y_BuErBiaoDaShi()
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 37:	//~
		m_nCur++;
		if (!y_BuErBiaoDaShi())
			return false;
		break;
	case 45:	//(
	case 1:		//id
	case 2:		//num
		if (!y_GuanXiBiaoDaShi()) 
			return false;
		while (m_cifa[m_nCur]->nType==38 || m_cifa[m_nCur]->nType==39) // & |
		{
			m_nCur++;
			if (!y_BuErBiaoDaShi())
				return false;
		}
		break;
	default:
		m_nErrNo=29;		//"缺少《布尔表达式》,应为 ~,(,ID,NUMBER"
		m_nErrAddr=m_nCur;
		return false;
	}
	return true;
}
/*================================================================ 
* 函数名:    y_GuanXiBiaoDaShi
* 功能描述:   关系表达式 (protected)
* 返回值:    void
================================================================*/
bool YFenXi::y_GuanXiBiaoDaShi()
{
	if (!y_BiaoDaShi())  //表达式
		return false;
	if (!y_GuanXi())	//关系
		return false;
	if (!y_BiaoDaShi())	//表达式
		return false;
	return true;
}
/*================================================================ 
* 函数名:    y_GuanXi
* 功能描述:   关系   (protected)
* 返回值:    void
================================================================*/
bool YFenXi::y_GuanXi()
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 31:	//<
	case 32:	//<=
	case 33:	//>
	case 34:	//>=
	case 35:	//=
	case 36:	//<>
		break;
	default:
		m_nErrNo=30;	//缺少关系(<,<=,>,>=,=,<>)!
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nCur++;
	return true;
}
/***************************
* for语句
***************************/
bool YFenXi::y_ForYuJu(){
	if(m_cifa[m_nCur]->nType!=21) return false; // for
	m_nCur++; //
	if(m_cifa[m_nCur]->nType!=1) return false; //id
	m_nCur++;
	if(m_cifa[m_nCur]->nType!=40) return false;//:=
	m_nCur++; //表达式
	if(!y_BiaoDaShi()) return false;
	if(m_cifa[m_nCur]->nType!=22) return false;//to
	m_nCur++;
	if(!y_BiaoDaShi()) return false;//表达式
	if(m_cifa[m_nCur]->nType!=20) return false;//do
	m_nCur++;//YuJu
	if(!y_YuJu()) return false;
	return true;
}
bool YFenXi::y_RepeatYuJu(){
	if(m_cifa[m_nCur]->nType!=23) return false; // repeat
	m_nCur++; //
	if(!y_YuJuChuan()) return false; //语句串	
	if(m_cifa[m_nCur]->nType!=24) return false;//until
	m_nCur++; //	
	if(!y_BuErBiaoDaShi()) return false;//表达式	
	return true;
}
/***************************
* read语句
***************************/
bool YFenXi::y_ReadYuJu(){
	if(m_cifa[m_nCur]->nType!=25) return false;
	bool cyc=false;
	m_nCur++;
	if(m_cifa[m_nCur]->nType!=1) return false;//x
	m_nCur++; if(m_cifa[m_nCur]->nType==44) cyc=true;
	while(cyc){//x,y,z;
		m_nCur++; //x
		if(m_cifa[m_nCur]->nType!=1) return false;
		m_nCur++;//,
		if(m_cifa[m_nCur]->nType!=44) cyc=false;
	}	
	return true;
}
/***************************
* write语句
***************************/
bool YFenXi::y_WriteYuJu(){ // 26
	if(m_cifa[m_nCur]->nType!=26) return false;
	m_nCur++;
	if (!y_BiaoDaShi())
		return false;
	return true;
}
/****************************
*语意分析初始化
*****************************/
void YFenXi::init(CFenXi &cfenxi){
	m_n=cfenxi.m_n;
	for(int i=0;i<m_n;i++)
		m_cifa[i]=cfenxi.m_cifa[i];//注意是指针引用
		strcpy(m_szErrMsg[0],"正确!");
	strcpy(m_szErrMsg[1],"数字位数过长!");
	strcpy(m_szErrMsg[2],"非法字符!");
	strcpy(m_szErrMsg[3],"缺少关键字“ program ”!");
	strcpy(m_szErrMsg[4],"program 后缺少标识符!");
	strcpy(m_szErrMsg[5],"缺少“ ; ”符号!");
	strcpy(m_szErrMsg[6],"缺少程序结束符“ . ”符号!");
	strcpy(m_szErrMsg[7],"缺少《程序体》,应为begin,integer,real,function,array,boolean");
	strcpy(m_szErrMsg[8],"缺少保留字“ begin ”!");
	strcpy(m_szErrMsg[9],"缺少《语句》,应为begin,ID,if,while,call");
	strcpy(m_szErrMsg[10],"缺少保留字“ end ”!");
	strcpy(m_szErrMsg[11],"缺少《声明》,应为integer,real,function,array,boolean");
	strcpy(m_szErrMsg[12],"缺少保留字 integer,boolean,real,array!");
	strcpy(m_szErrMsg[13],"procedure 后缺少标识符!");
	strcpy(m_szErrMsg[14],"变量声明后缺少标识符!");
	strcpy(m_szErrMsg[15],"缺少保留字“ function ”!");
	strcpy(m_szErrMsg[16],"缺少 “ ( ”符号!");
	strcpy(m_szErrMsg[17],"缺少 “ ) ”符号!");
	strcpy(m_szErrMsg[18],"缺少形参标识符 !");
	strcpy(m_szErrMsg[19],"缺少 “ : ”符号!");
	strcpy(m_szErrMsg[20],"缺少标识符!");
	strcpy(m_szErrMsg[21],"缺少赋值符号“ := ”!");
	strcpy(m_szErrMsg[22],"缺少保留字“ if ”!");
	strcpy(m_szErrMsg[23],"缺少保留字“ then ”!");
	strcpy(m_szErrMsg[24],"缺少保留字“ while ”!");
	strcpy(m_szErrMsg[25],"缺少保留字“ do ”!");
	strcpy(m_szErrMsg[26],"缺少保留字“ call ”!");
	strcpy(m_szErrMsg[27],"缺少被调函数标识符!");
	strcpy(m_szErrMsg[28],"缺少《因子》,应为(,ID,NUMBER");
	strcpy(m_szErrMsg[29],"缺少《布尔表达式》,应为 ~,(,ID,NUMBER");
	strcpy(m_szErrMsg[30],"缺少《关系》!");
	strcpy(m_szErrMsg[31],"变量名不能和过程名相同!");
	strcpy(m_szErrMsg[32],"标识符重复声明!");
	strcpy(m_szErrMsg[33],"未声明标识符!");
	strcpy(m_szErrMsg[34],"不能直接引用过程名!");
	strcpy(m_szErrMsg[35],"不能从real转换为integer类型!");
	strcpy(m_szErrMsg[36],"不能用常数作实参!");
	strcpy(m_szErrMsg[37],"变参应为变量!");
	strcpy(m_szErrMsg[38],"实参个数不足!");
	strcpy(m_szErrMsg[39],"只有integer和integer才能比较!");
	strcpy(m_szErrMsg[40],"不能这样调用过程!");

	strcpy(m_szErrMsg[41],"常量声明后缺少标识符!");
	strcpy(m_szErrMsg[42],"常量声明中标识符后无=");
	strcpy(m_szErrMsg[43],"常量声明中标识符接=号后无值");
	strcpy(m_szErrMsg[44],"没有return!");
	strcpy(m_szErrMsg[45],"return后缺少标识符!");
	strcpy(m_szErrMsg[46],"return 标识符后无;!");
	strcpy(m_szErrMsg[47],"缺少[!");
	strcpy(m_szErrMsg[48],"缺少[!");
	strcpy(m_szErrMsg[49],"非整数!");
	strcpy(m_szErrMsg[50],"缺少const!");
	strcpy(m_szErrMsg[96],"源程序结束符 end. 后还有多余内容!");
	strcpy(m_szErrMsg[97],"语法错误太多,终止语法分析!");
	strcpy(m_szErrMsg[98],"源程序不正常结束!");
	strcpy(m_szErrMsg[99],"内存不足!词法分析终止!");
}

⌨️ 快捷键说明

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