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

📄 beifen.cpp

📁 编译原理课程设计
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			  If m>n then n:=m else t:=m;
			  While n<m do
				Begin
				  n:=n+1
				End
		  End;

		  Begin
			这里是语句串
		  End
================================================================*/
bool CFenXi::y_ChengXuTi()
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 5:			//procedure		
	case 14:		//booleger
	case 15:		//real
		if (!y_ShengMingChuan())   //声明串(用;隔开的多个变量或过程声明)
			
			return false;
		switch (m_cifa[m_nCur]->nType)
		{
		case 30:	//;
			break;

		default:
			m_nErrNo=5;	//缺少“ ; ”符号!"
			m_nErrAddr=m_nCur;
			return false;
		}
		m_nCur++;
		break;
        
	case 6:		//begin
		//cout<<"---";
		break;

	default:
		m_nErrNo=7;		//缺少《程序体》,应为 begin,integer,real,procedure"
		m_nErrAddr=m_nCur;
		return false;
	}
	switch (m_cifa[m_nCur]->nType)
	{
	case 6:		//begin
		break;
	default:
		m_nErrNo=8;		//缺少保留字“ begin ”!
		m_nErrAddr=m_nCur;
		return false;
	}

	m_nCur++;
	if (!y_YuJuChuan())  //语句串
		return false;

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

	m_nCur++;

	return true;
}


/*================================================================ 
* 函数名:    y_ShengMingChuan
* 功能描述:   声明串 用;隔开的多个声明(protected)
* 返回值:    void
================================================================*/
bool CFenXi::y_ShengMingChuan()
{
	if (!y_ShengMing()) 		
		return false;

	while (m_cifa[m_nCur]->nType==30 && m_cifa[m_nCur+1]->nType!=6)	//是; 不是begin
	{
		m_nCur++;
		if (!y_ShengMing()) //递归调用
			return false;
	}
	return true;
}

/*================================================================ 
* 函数名:    y_ShengMing
* 功能描述:   声明 (protected)
* 返回值:    void
================================================================*/
bool CFenXi::y_ShengMing()
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 14:		//booleger
	case 15:		//real
		if (!y_BianliangShengMing())	//变量声明
			return false;
		break;

	case 5:			//procedure
		if (!y_GuoChengShengMing()) //过程声明
			return false;
		break;

	default:
		m_nErrNo=11;		//缺少声明(integer,real,procedure)
		m_nErrAddr=m_nCur;
		return false;
	}
	return true;
}


/*================================================================ 
* 函数名:    y_BianliangShengMing
* 功能描述:   变量声明	(protected)
* 返回值:    void
* 示例:	 Integer x,y,z;
================================================================*/
bool CFenXi::y_BianliangShengMing()
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 14:	//booleger
	case 15:	//real
		break;

	default:
		m_nErrNo=12;	//缺少变量类型 integer 或 real!
		m_nErrAddr=m_nCur;
		return false;
	}

	m_nCur++;

	switch (m_cifa[m_nCur]->nType)
	{
	case 1:		//id
		break;

	default:		
		m_nErrNo=14;	//变量声明后缺少标识符!
		m_nErrAddr=m_nCur;
		return false;
	}

	m_nCur++;

	while (m_cifa[m_nCur]->nType==32)  //32 , 分析用逗号隔开的连续声明的几个变量
	{
		m_nCur++;

		switch (m_cifa[m_nCur]->nType)
		{
		case 1:		//id
			break;

		default:
			m_nErrNo=14;  	//变量声明后缺少标识符
			m_nErrAddr=m_nCur;
			return false;
		}
		m_nCur++;
	}
	return true;
}

/*================================================================ 
* 函数名:    y_GuoChengShengMing
* 功能描述:   过程声明 (protected)
* 返回值:    void
* 示例:
			  Procedure ab(形参);
					这里是程序体
			
================================================================*/
bool CFenXi::y_GuoChengShengMing()
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 5:		//procedure
		break;

	default:
		m_nErrNo=15;		//缺少保留字“ procedure ”!
		m_nErrAddr=m_nCur;
		return false;
	}

	m_nCur++;

	switch (m_cifa[m_nCur]->nType)
	{
	case 1:			//id
		break;

	default:
		m_nErrNo=13;		//procedure 后缺少标识符!
		m_nErrAddr=m_nCur;
		return false;
	}

	m_nCur++;

	switch (m_cifa[m_nCur]->nType)
	{
	case 33:	//(
		if (!y_XingCanBuFeng())  //形参
			return false;
		break;
	}

	switch (m_cifa[m_nCur]->nType)
	{
	case 30:	//;
		break;
	default:
		m_nErrNo=5;			//缺少“ ; ”符号!
		m_nErrAddr=m_nCur;
		return false;
	}

	m_nCur++;

	if (!y_ChengXuTi())		//程序体 
		return false;

	return true;
}


/*================================================================ 
* 函数名:    y_XingChan
* 功能描述:   形参部分(protected)
* 返回值:    void
* 示例:		(Var m,n:Integer; t:Real)
================================================================*/
bool CFenXi::y_XingCanBuFeng()
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 33:	//(
		break;
	default:
		m_nErrNo=16;		//缺少 “ ( ”符号!"
		m_nErrAddr=m_nCur;
		return false;
	}

	m_nCur++;

	if (!y_XingCan())
		return false;

	while (m_cifa[m_nCur]->nType==30)	//;
	{
		m_nCur++;
		if (!y_XingCan()) 
			return false;
	}
	switch (m_cifa[m_nCur]->nType)
	{
	case 34:	//)
		break;
	default:
		m_nErrNo=17;   //缺少 “ ) ”符号!
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nCur++;
	return true;
}


/*================================================================ 
* 函数名:    y_XingCan
* 功能描述:   分析形参 (protected)
* 返回值:    void
* 示例:	  Var m,n:Integer; t:Real
================================================================*/
bool CFenXi::y_XingCan()
{
	if (m_cifa[m_nCur]->nType==4)	//var
		m_nCur++;

	switch (m_cifa[m_nCur]->nType)
	{
	case 1:		//id
		break;

	default:
		m_nErrNo=18;		//"缺少形参标识符 !"
		m_nErrAddr=m_nCur;
		return false;
	}

	m_nCur++;

	while (m_cifa[m_nCur]->nType==32)	//, 用于分析多个形参的情况
	{
		m_nCur++;

		switch (m_cifa[m_nCur]->nType)
		{
		case 1:	//id
			break;

		default:
			m_nErrNo=18;	//"缺少形参标识符 !"
			m_nErrAddr=m_nCur;
			return false;
		}
		m_nCur++;
	}

	switch (m_cifa[m_nCur]->nType)
	{
	case 35:	//:
		break;
	default:
		m_nErrNo=19;	//缺少 “ : ”符号!
		m_nErrAddr=m_nCur;
		return false;
	}

	m_nCur++;

	switch (m_cifa[m_nCur]->nType)
	{
	case 14:	//booleger
	case 15:	//real
		break;
	default:
		m_nErrNo=12; //缺少保留字 integer 或 real!
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nCur++;
	return true;
}



/*================================================================ 
* 函数名:    y_YuJuChuan
* 功能描述:   语句串,用分号隔开的多个语句 (protected)
* 返回值:    void
* 示例: 
				  x:=1;y:=2;z:=3;
				  Call ab(x,y,z);
				  z:=4+z+(1+2+6+x)*3*y*5+7;
				  If ~ 3<=x & y<>4 then z:=0;
				  y:=219;  z:=37;  x:=y*z
================================================================*/
bool CFenXi::y_YuJuChuan()
{
	if (!y_YuJu()) 
		return false;
	while (m_cifa[m_nCur]->nType==30)	//;
	{
		m_nCur++;
		if (!y_YuJu()){ cout<<"------------";
			return false;}
	}
	return true;
}


/*================================================================ 
* 函数名:    y_YuJu
* 功能描述:   语句 (protected)
* 返回值:    void
================================================================*/
bool CFenXi::y_YuJu()
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 6:			//begin
		if (!y_FuHeYuJu())
			return false;
		break;

	case 1:			//id
		if (!y_FuZhiYuJu())
			return false;
		break;

	case 8:			//if
		if (!y_TiaoJianYuJu())
			return false;
		break;

	case 11:		//while
		if (!y_XunHuanYuJu()) 
			return false;
		break;

	case 13:		//call
		if (!y_GuoChengYuJu()) return false;
		break;

	default:
		m_nErrNo=9;   //缺少《语句》,应为 begin,ID,if,while,call
		m_nErrAddr=m_nCur;
		return false;
	}
	return true;
}



/*================================================================ 
* 函数名:    y_FuHeYuJu
* 功能描述:   复合语句 (protected)
* 返回值:    void
================================================================*/
bool CFenXi::y_FuHeYuJu() 
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 6:		//begin
		break;
	default:
		m_nErrNo=8;	//缺少保留字“ begin ”!
		m_nErrAddr=m_nCur;
		return false;
	}

	m_nCur++;

	if (!y_YuJuChuan()) //递归调用
		return false;

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

	return true;
}



/*================================================================ 
* 函数名:    y_FuZhiYuJu
* 功能描述:   赋值语句 (protected)
* 返回值:    void
* 示例:      y:=219;
================================================================*/
bool CFenXi::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 29:	//:=
		break;
	default:
		m_nErrNo=21;  //缺少赋值符号“ := ”!
		m_nErrAddr=m_nCur;
		return false;
	}


	m_nCur++;

	if (!y_BiaoDaShi()) 
		return false;
	return true;
}


⌨️ 快捷键说明

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