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

📄 cifadlg.cpp

📁 simple语言的词法和语法分析
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		return false;
	}


	tn++;

	if (!chengxuti())  //分析程序体
		return false;

	switch (m_cifa[tn].kind)
	{
	case 11:			//end
		break;
	default:
		m_nErrNo=10;	//缺少保留字“ end ”!
		m_nErrAddr=tn;
		return false;
	}

	tn++;

	switch (m_cifa[tn].kind)
	{
	case 47:			//. (程序的最后一个符号)
		break;
	default:
		m_nErrNo=6;		//缺少程序结束符“ . ”符号!
		m_nErrAddr=tn;
		return false;
	}


	tn++;
	switch (m_cifa[tn].kind)
	{
	case -1:	//end of cifa
		break;
	default:
		m_nErrNo=96;	//源程序结束符 end. 后还有多余内容!
		m_nErrAddr=tn;
		return false;
	}


	m_nErrNo=0;		//语法分析成功
	m_nErrAddr=tn;
	return true;

}

bool CCIFADlg::chengxuti()
{
	switch (m_cifa[tn].kind)
	{
	case 21:		//procedure
	case 4:			//bool
	case 24:		//real
	case 7:			//char
	case 16:		//integer

		if (!ShengMingChuan())   //声明串(用;隔开的多个变量或过程声明)
			return false;

		switch (m_cifa[tn].kind)
		{
		case 52:	//;
			break;

		default:
			m_nErrNo=5;	//缺少“ ; ”符号!"
			m_nErrAddr=tn;
			return false;
		}
		tn++;
		break;

	case 3:		//begin
		break;

	default:
		m_nErrNo=7;		//缺少《程序体》,应为 begin,integer,real,procedure"
		m_nErrAddr=tn;
		return false;
	}

	switch (m_cifa[tn].kind)
	{
	case 3:		//begin
		break;
	default:
		m_nErrNo=8;		//缺少保留字“ begin ”!
		m_nErrAddr=tn;
		return false;
	}

	tn++;

	if (!YuJuChuan())  //语句串
		return false;

	switch (m_cifa[tn].kind)
	{
	case 11:			//end
		break;
	default:
		m_nErrNo=10;	//缺少保留字“ end ”!
		m_nErrAddr=tn;
		return false;
	}

	tn++;

	switch (m_cifa[tn].kind)
	{
	case 52:			//;
		break;
	default:
		m_nErrNo=5;		//缺少“ ; ”符号!
		m_nErrAddr=tn;
		return false;
	}


	tn++;

	return true;
}



bool CCIFADlg::ShengMingChuan()
{
	if (!ShengMing()) 		
		return false;

	while (m_cifa[tn].kind==52&& m_cifa[tn+1].kind!=3)	//是; 不是begin
	{
		tn++;
		if (!ShengMing()) //递归调用
			return false;
	}
	return true;
}


bool CCIFADlg::ShengMing()
{
	switch (m_cifa[tn].kind)
	{
	case 4:			//booleger
	case 24:		//real
	case 7:			//char
	case 16:		//integer
		if (!BianliangShengMing())	//变量声明
			return false;
		break;

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

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


bool CCIFADlg::BianliangShengMing()
{
	switch (m_cifa[tn].kind)
	{
	case 4:			//booleger
	case 24:		//real
	case 7:			//char
	case 16:		//integer
		break;

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

	tn++;

	switch (m_cifa[tn].kind)
	{
	case 34:		//id
		break;

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

	tn++;

	while (m_cifa[tn].kind==44)  //32 , 分析用逗号隔开的连续声明的几个变量
	{
		tn++;

		switch (m_cifa[tn].kind)
		{
		case 34:		//id
			break;

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

	return true;
}


bool CCIFADlg::GuoChengShengMing()
{
	switch (m_cifa[tn].kind)
	{
	case 21:		//procedure
		break;

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

	tn++;

	switch (m_cifa[tn].kind)
	{
	case 34:			//id
		break;

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

	tn++;

	switch (m_cifa[tn].kind)
	{
	case 39:	//(
		if (!XingCanBuFeng())  //形参
			return false;
		break;
	}

	return true;
}


bool CCIFADlg::XingCanBuFeng()
{
	switch (m_cifa[tn].kind)
	{
	case 39:	//(
		break;
	default:
		m_nErrNo=16;		//缺少 “ ( ”符号!"
		m_nErrAddr=tn;
		return false;
	}

	tn++;

	if (!XingCan())
		return false;

	while (m_cifa[tn].kind==52)	//;
	{
		tn++;
		if (!XingCan()) 
			return false;
	}
	switch (m_cifa[tn].kind)
	{
	case 40:	//)
		break;
	default:
		m_nErrNo=17;   //缺少 “ ) ”符号!
		m_nErrAddr=tn;
		return false;
	}
	tn++;
	return true;
}


bool CCIFADlg::XingCan()
{
	if (m_cifa[tn].kind==31)	//var
		tn++;

	switch (m_cifa[tn].kind)
	{
	case 34:		//id
		break;

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

	tn++;

	while (m_cifa[tn].kind==44)	//, 用于分析多个形参的情况
	{
		tn++;

		switch (m_cifa[tn].kind)
		{
		case 34:	//id
			break;

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

	switch (m_cifa[tn].kind)
	{
	case 50:	//:
		break;
	default:
		m_nErrNo=19;	//缺少 “ : ”符号!
		m_nErrAddr=tn;
		return false;
	}

	tn++;

	switch (m_cifa[tn].kind)
	{
	case 16:	//booleger
	case 24:	//real
		break;
	default:
		m_nErrNo=12; //缺少保留字 integer 或 real!
		m_nErrAddr=tn;
		return false;
	}
	tn++;
	return true;
}

bool CCIFADlg::YuJuChuan()
{
	if (!YuJu()) 
		return false;

	while (m_cifa[tn].kind==52)	//;
	{
		tn++;
		if (!YuJu()) 
			return false;
	}
	return true;
}

bool CCIFADlg::YuJu()
{
	switch (m_cifa[tn].kind)
	{
	case 3:				//begin
		if (!FuHeYuJu())
			return false;
		break;

	case 34:			//id
		if (!FuZhiYuJu()) 
			return false;
		break;

	case 14:			//if
		if (!TiaoJianYuJu())
			return false;
		break;

	case 32:			//while
		if (!XunHuanYuJu()) 
			return false;
		break;

/*	case 5:				//call
		if (!GuoChengYuJu()) return false;
		break;
*/
	default:
		m_nErrNo=9;   //缺少《语句》,应为 begin,ID,if,while,call
		m_nErrAddr=tn;
		return false;
	}
	return true;
}

bool CCIFADlg::FuHeYuJu() 
{
	switch (m_cifa[tn].kind)
	{
	case 3:		//begin
		break;
	default:
		m_nErrNo=8;	//缺少保留字“ begin ”!
		m_nErrAddr=tn;
		return false;
	}

	tn++;

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

	switch (m_cifa[tn].kind)
	{
	case 11:		//end
		break;
	default:
		m_nErrNo=10;	//"缺少保留字“ end ”!
		m_nErrAddr=tn;
		return false;
	}
	tn++;

	return true;
}

bool CCIFADlg::FuZhiYuJu()
{
	switch (m_cifa[tn].kind)
	{
	case 34:		//id
		break;
	default:
		m_nErrNo=20; //缺少标识符!
		m_nErrAddr=tn;
		return false;
	}

	tn++;

	switch (m_cifa[tn].kind)
	{
	case 51:	//:=
		break;
	default:
		m_nErrNo=21;  //缺少赋值符号“ := ”!
		m_nErrAddr=tn;
		return false;
	}


	tn++;

	if (!Xiang()) 
		return false;

	return true;
}


bool CCIFADlg::TiaoJianYuJu()
{
	switch (m_cifa[tn].kind)
	{
	case 14:	//if
		break;
	default:
		m_nErrNo=22;  //缺少保留字“ if ”!
		m_nErrAddr=tn;
		return false;
	}

	tn++;

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


	switch (m_cifa[tn].kind)
	{
	case 27:		//then
		break;
	default:
		m_nErrNo=23;  //缺少保留字“ then ”!
		m_nErrAddr=tn;
		return false;
	}
	tn++;

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

	switch (m_cifa[tn].kind)
	{
	case 10:	//else
		break;
	default:
		return true;
	}
	tn++;

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

	return true;
}


bool CCIFADlg::XunHuanYuJu()
{
	switch (m_cifa[tn].kind)
	{
	case 32:	//while
		break;
	default:
		m_nErrNo=24;
		m_nErrAddr=tn;
		return false;
	}
	tn++;

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

	switch (m_cifa[tn].kind)
	{
	case 9:	//do
		break;

	default:
		m_nErrNo=25;   //缺少保留字“ do ”!
		m_nErrAddr=tn;
		return false;
	}
	tn++;

	if (!YuJu()) 
		return false;

	return true;
}



bool CCIFADlg::Xiang()
{
	switch (m_cifa[tn].kind)
	{
	case 39:		//(
		tn++;
		if (!Xiang())  //递归调用
			return false;

		switch (m_cifa[tn].kind)
		{
		case 40:	//)
			break;
		default:
			m_nErrNo=17;  //缺少 “ ) ”符号!
			m_nErrAddr=tn;
			return false;
		}
		tn++;
		break;

	case 34:			//id
	case 35:			//num
		tn++;
		break;

	default:
		m_nErrNo=29;		//"缺少《布尔表达式》,应为(ID,NUMBER)"
		m_nErrAddr=tn;
		return false;
	}

	switch (m_cifa[tn].kind)
	{
	//关系
	case 41:	//*
	case 43:	//+
	case 45:	//-
	case 48:	///
		tn++;
		if (!Xiang())	//表达式
			return false;		
		break;
	}

	return true;
}


bool CCIFADlg::CanLiang()
{
	switch (m_cifa[tn].kind)
	{
	case 39:		//(
		if (!CanLiang())  //递归调用
			return false;

		switch (m_cifa[tn].kind)
		{
		case 40:	//)
			break;
		default:
			m_nErrNo=17;  //缺少 “ ) ”符号!
			m_nErrAddr=tn;
			return false;
		}
		tn++;
		break;

	case 34:		//id
	case 35:		//num

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

		//关系
		switch (m_cifa[tn].kind)
		{
		case 53:	//<
		case 54:	//<=
		case 55:	//<>
		case 56:	//=
		case 57:	//>
		case 58:	//>=
			break;

		default:
			m_nErrNo=30;	//缺少关系(<,<=,>,>=,=,<>)!
			m_nErrAddr=tn;
			return false;
		}
		tn++;

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

		break;

	default:
		m_nErrNo=29;		//"缺少《布尔表达式》,应为(ID,NUMBER)"
		m_nErrAddr=tn;
		return false;
	}

	return true;
}



void CCIFADlg::OnAbout() 
{
	// TODO: Add your control notification handler code here
	CAboutDlg AboutDlg;
	AboutDlg.DoModal();
}

⌨️ 快捷键说明

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