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

📄 yfenxi.cpp

📁 本学期编译课程需要实现L语言
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// YFenXi.cpp: implementation of the YFenXi class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Lojo.h"
#include "YFenXi.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
YFenXi::YFenXi(){}
YFenXi::~YFenXi(){}
/*================================================================ 
* 函数名:    YuFaFenXi
* 功能描述:   语法分析 (public)
* 返回值:    void
================================================================*/
void YFenXi::YuFaFenXi()
{
	if (m_n==0) 
		return;		//未进行词法分析	
	m_nCur=0;		//m_nCur用语指示词法分析结果表中单词的位置
	y_ChengXu();	//从 程序 开始 
	return;
}
/*================================================================ 
* 函数名:    y_ChengXu
* 功能描述:   分析整个程序 (protected)
* 返回值:    bool
* 示例:
			Program abc;
				这里是程序体	
			.
================================================================*/
bool YFenXi::y_ChengXu()			//程序
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 11:				//从program开始
		break;
	default:
		m_nErrNo=3;		//缺少关键字“ program ”!
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nCur++;			//分析下一个单词
	switch (m_cifa[m_nCur]->nType)
	{
	case 1:				//标志符
		break;
	default:
		m_nErrNo=4;		//program 后缺少标识符!
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nCur++;
	switch (m_cifa[m_nCur]->nType)
	{
	case 41:			//;
		break;
	default:
		m_nErrNo=5;		//缺少“ ; ”符号!
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nCur++;
	if (!y_ChengXuTi())  //分析程序体
		return false;
	switch (m_cifa[m_nCur]->nType)
	{
	case 43:			//. (程序的最后一个符号)
		break;
	default:
		m_nErrNo=6;		//缺少程序结束符“ . ”符号!
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nCur++;
	switch (m_cifa[m_nCur]->nType)
	{
	case -1:	//end of cifa
		break;
	default:
		m_nErrNo=96;	//源程序结束符 end. 后还有多余内容!
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nErrNo=0;		//语法分析成功
	m_nErrAddr=m_nCur;
	return true;
}
/*================================================================ 
* 函数名:    y_ChengXuTi
* 功能描述:   分析程序体 (protected)
* 返回值:    bool
* 示例:		  
		  Integer x,y,z;   
		  Real a,b;        //变量声明
		  const www=10;	
		  function ab(Var m,n:Integer; t:Real);  //过程声明
		  Begin
			  t:=n+m;
			  If m>n then n:=m else t:=m;
			  While n<m do
				Begin
				  n:=n+1
				End
		  End;

		  Begin
			这里是语句串
		  End
================================================================*/
bool YFenXi::y_ChengXuTi()
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 12:	//function		
	case 9:		//bool
	case 8:		//real
	case 7:     //integer
	case 6:		//const
	case 10:    //array
		if (!y_ShengMingChuan())   //声明串(用;隔开的多个变量或过程声明)
			return false;
		switch (m_cifa[m_nCur]->nType)
		{
		case 41:	//;
			break;
		default:
			m_nErrNo=5;	//缺少“ ; ”符号!"
			m_nErrAddr=m_nCur;
			return false;
		}
		m_nCur++;
		break;
	case 14:		//begin
			break;
	default:
		m_nErrNo=7;		//缺少《程序体》,应为 begin,integer,real,procedure"
		m_nErrAddr=m_nCur;
		return false;
	}
	switch (m_cifa[m_nCur]->nType)
	{
	case 14:		//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 15:			//end
		break;
	default:
		m_nErrNo=10;	//缺少保留字“ end ”!
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nCur++;
	return true;
}
/*================================================================ 
* 函数名:    y_ShengMingChuan
* 功能描述:   声明串 用;隔开的多个声明(protected)
* 返回值:    void
================================================================*/
bool YFenXi::y_ShengMingChuan()
{
	if (!y_ShengMing()) 		
		return false;
	while (m_cifa[m_nCur]->nType==41 && m_cifa[m_nCur+1]->nType!=14)	//是; 不是begin
	{
		m_nCur++;
		if (!y_ShengMing()) //递归调用
			return false;
	}
	return true;
}
/*================================================================ 
* 函数名:    y_ShengMing
* 功能描述:   声明 (protected)
* 返回值:    void
================================================================*/
bool YFenXi::y_ShengMing()
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 9:		//bool
	case 8:		//real
	case 7:     //integer
	case 10:	//array
		if (!y_BianLiangShengMing())	//变量声明
			return false;
		break;
	case 6: //const
		 if(!y_ChangLiangShengMing())
			 return false;
		 break;
	case 12:			//function
		if (!y_HanShuShengMing()) //过程声明
			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; array x[10,2], y[5,6];
================================================================*/
bool YFenXi::y_BianLiangShengMing()
{
	if(m_cifa[m_nCur]->nType<7||m_cifa[m_nCur]->nType>10){
		m_nErrNo=12; m_nErrAddr=m_nCur; return false;
	}
	if(m_cifa[m_nCur]->nType==10){//array
		do{
			m_nCur++;			//id
			if(m_cifa[m_nCur]->nType!=1){m_nErrNo=14; m_nErrAddr=m_nCur; return false;}
			m_nCur++; //[
			if(m_cifa[m_nCur]->nType!=47){m_nErrNo=47; m_nErrAddr=m_nCur; return false;}			
			do{//1,2,3
				m_nCur++;
				if(m_cifa[m_nCur]->nType!=2){m_nErrNo=49;m_nErrAddr=m_nCur;return false;}
				m_nCur++;
			}while(m_cifa[m_nCur]->nType==44);//]
			if(m_cifa[m_nCur]->nType!=48){m_nErrNo=48; m_nErrAddr=m_nCur; return false;}
			m_nCur++; //
		}while(m_cifa[m_nCur]->nType==44); //,		
	}else{//integer,boolean,real		 		
		do{
			m_nCur++;			
			if(m_cifa[m_nCur]->nType!=1){m_nErrNo=14; m_nErrAddr=m_nCur; return false;}
			m_nCur++;
		}while(m_cifa[m_nCur]->nType==44); //,
	}
	return true;
}
/*================================================================ 
* 函数名:    y_ChangliangShengMing
* 功能描述:   变量声明	(protected)
* 返回值:    void
* 示例:	 const x=10,y=true,z=3.2;
================================================================*/
bool YFenXi::y_ChangLiangShengMing()
{
	if(m_cifa[m_nCur]->nType!=6) { m_nErrNo=50; m_nErrAddr=m_nCur; return false;}
	m_nCur++;
	if(m_cifa[m_nCur]->nType==1){ //id
		m_nCur++;
		if(m_cifa[m_nCur]->nType==35){//=
			m_nCur++;
			if(m_cifa[m_nCur]->nType>=2&&m_cifa[m_nCur]->nType<=5){//值
			}else{	m_nErrNo=43; m_nErrAddr=m_nCur; return false;	}
		}else{	m_nErrNo=42; m_nErrAddr=m_nCur; return false;	}	
	}else{m_nErrNo=41;	m_nErrAddr=m_nCur;	return false;	}
	m_nCur++; 	

	while (m_cifa[m_nCur]->nType==44)  //44 , 分析用逗号隔开的连续声明的几个变量
	{
		m_nCur++;
		if(m_cifa[m_nCur]->nType==1){ //id
			m_nCur++;
			if(m_cifa[m_nCur]->nType==35){//=
				m_nCur++;
				if(m_cifa[m_nCur]->nType>=2&&m_cifa[m_nCur]->nType<=5){//值
				}else{	m_nErrNo=43; m_nErrAddr=m_nCur; return false;	}
			}else{	m_nErrNo=42; m_nErrAddr=m_nCur; return false;	}	
		}else{m_nErrNo=41;	m_nErrAddr=m_nCur;	return false;	}
		m_nCur++;
	}
	return true;
}
/*================================================================ 
* 函数名:    y_HanShuShengMing
* 功能描述:   过程声明 (protected)
* 返回值:    void
* 示例:
			  function ab(形参);
					这里是程序体
			  RETURN 标识符;
			
================================================================*/
bool YFenXi::y_HanShuShengMing()
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 12:		//function
		break;
	default:
		m_nErrNo=15;		//缺少保留字“ function ”!
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nCur++;
	switch (m_cifa[m_nCur]->nType)
	{
	case 1:			//id
		break;
	default:
		m_nErrNo=13;		//function 后缺少标识符!
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nCur++;
	if(m_cifa[m_nCur]->nType==45){//(
		m_nCur++;
		if(!y_BianLiangShengMing()) return false;		
		while(m_cifa[m_nCur]->nType==41){
			m_nCur++;
			if(!y_BianLiangShengMing()) return false;
		}		
	}else{return false;}
	if(m_cifa[m_nCur]->nType==46){//)
	}else{return false;}
	m_nCur++;
	if (!y_ChengXuTi())		//程序体 
		return false;
	//m_nCur++;
	if(m_cifa[m_nCur]->nType==13){// return 
		m_nCur++;
		if(m_cifa[m_nCur]->nType==1){// id
			m_nCur++;			
		}else{m_nErrNo=45; m_nErrAddr=m_nCur; return false;}
	}else{m_nErrNo=44; m_nErrAddr=m_nCur; return false;}
	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 YFenXi::y_YuJuChuan()
{
	if (!y_YuJu()) 
		return false;

	while (m_cifa[m_nCur]->nType==41)	//;
	{
		m_nCur++;
		if (!y_YuJu()) 
			return false;
	}
	return true;
}
/*================================================================ 
* 函数名:    y_YuJu
* 功能描述:   语句 (protected)
* 返回值:    void
================================================================*/
bool YFenXi::y_YuJu()
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 14:			//begin 符合语句
		if (!y_FuHeYuJu())
			return false;
		break;
	case 1:			//id 赋值, 函数语句
		if(m_cifa[m_nCur+1]->nType==45){//(
			if(!y_HanShuYuJu()) return false;
		}else{
			if (!y_FuZhiYuJu()) return false;
		}
		break;
	case 16: //if 
		if (!y_IfYuJu())
			return false;
		break;
	case 19: //while
		if (!y_WhileYuJu()) 
			return false;
		break;
	case 21: //for
		if (!y_ForYuJu()) 
			return false;
		break;
	case 23://repeat
		if (!y_RepeatYuJu()) 
			return false;
		break;
	case 25: //read
		if (!y_ReadYuJu()) 
			return false;
		break;
	case 26: //write
		if (!y_WriteYuJu()) 
			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 YFenXi::y_FuHeYuJu() 
{
	switch (m_cifa[m_nCur]->nType)
	{
	case 14:		//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 15:		//end
		break;
	default:
		m_nErrNo=10;	//"缺少保留字“ end ”!
		m_nErrAddr=m_nCur;
		return false;
	}
	m_nCur++;
	return true;
}
/*================================================================ 

⌨️ 快捷键说明

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