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

📄 analyzer.cpp

📁 这是一个词法语法分析器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		
    }
	 else
		 if(20==GetCurRS()->type)
			{
				YuErrorNo=4;//缺少标识符"#"!
				ErrorAddr=m_pCurRS;
				return false;
			}
			else
			{
				YuErrorNo=2;//有非法字符
				ErrorAddr=m_pCurRS;
				return false;
			}
	  m_pCurRS++;
	  m_pCurRS++;
  }
//以上处理包含文件


  Chengxuti();

  return true;
}


int CAnalyzer::Chengxuti()
{
    switch (GetCurRS()->type)
	{
	case 32:                //void
		m_pCurRS++;
	case 3:                 //main
        m_pCurRS++;
		break;
	default:
		YuErrorNo=2;          //非法字符
		ErrorAddr=m_pCurRS;
		return false;
	}
	if(56==GetCurRS()->type)  //(
	{
		m_pCurRS++;
		if(57!=GetCurRS()->type)
		{
			YuErrorNo=9;       //界符"("不匹配!
			ErrorAddr=m_pCurRS;
		    return false;
		}
	}
	else
	{
		YuErrorNo=8;          //main函数格式错误
		ErrorAddr=m_pCurRS;
		return false;
	}

	m_pCurRS++;		
    if(49!=GetCurRS()->type)//{
	{
		YuErrorNo=12;          //缺少main()后}
		ErrorAddr=m_pCurRS;
		return false;
	}


		m_pCurRS++;

		/////////////////////////////////////////////////////////////
		switch(GetCurRS()->type)
		{
		case 6: //char
		case 16://float
		case 21://int
			if(!BLshengming()) return false;        //将声明语句分析完毕包括分号,指针指向下一语句
			break;
		default:
			YuErrorNo=11;//缺少声明语句
			ErrorAddr=m_pCurRS;
			return false;
		}
		
			if (!YuJuChuan())  //语句串//分析所有非声明语句
				return false;  //
	
       ///////////////////////////////////////////////////////////

	
	switch (GetCurRS()->type)
	{                          //处理最后一个}
	case 50:			       //}
		break;
	default:
		YuErrorNo=12;	       //缺少保留字“}”!
		ErrorAddr=--m_pCurRS;
		return false;
	}

	return true;
}

/*                                                          */
/************************************************************/


int CAnalyzer::shengming()
{//将声明语句分析完毕包括分号,指针指向下一语句
/*	switch (GetCurRS()->type)
	{
	case 6://integer
	case 16://real
	case 21://char
		if (!BLshengming()) return FALSE;
		break;
//	case 5://子函数
		//if (!r_GChShuoMing()) return FALSE;
//		break;
	default:
		YuErrorNo=13;//
		return FALSE;
	}
*/
  return true;
}

int CAnalyzer::BLshengming()
{  //将声明语句分析完毕包括分号,指针指向下一语句
	int i=0;
	while(1)
	{   
		
		switch (GetCurRS()->type)
		{
		case 6:	   //char
		case 16:   //float
		case 21:   //int
			break;
		default:
			YuErrorNo=14;	//缺少变量类型
			ErrorAddr=m_pCurRS;
			return false;
		}

		m_pCurRS++;

		switch (GetCurRS()->type)
		{
		case 1:		//id
            ::strcpy(BianLiang[++i],GetCurRS()->text);//记录单词
			break;

		default:		
			YuErrorNo=15;	//变量声明后缺少标识符!
            ErrorAddr=m_pCurRS;
			return false;
		}

			m_pCurRS++;

		while (51==GetCurRS()->type)  
		{//51 , 分析用逗号隔开的连续声明的几个变量

			m_pCurRS++;

			switch (GetCurRS()->type)
			{
			case 1:		//id
				::strcpy(BianLiang[++i],GetCurRS()->text);//记录单词
				break;

			default:
				YuErrorNo=15;  	//变量声明后缺少标识符
			    ErrorAddr=m_pCurRS;
				return false;
			}
			m_pCurRS++;
		}
		if(52!=GetCurRS()->type)//;
		{	
			YuErrorNo=10; //缺少;
		    ErrorAddr=m_pCurRS;
			return false;
		}
		else
			m_pCurRS++;
		if(6!=GetCurRS()->type&&16!=GetCurRS()->type&&21!=GetCurRS()->type)
			break;
	}
	return true;

}



int CAnalyzer::YuJuChuan()
{
		if (!YuJu())     //分析四种语句:赋值,表达式,循环,条件语句,处理分号,指向新语句
			return false;

        if(-1==GetCurRS()->type)
			return true;

		while (-1!=GetNextRS()->type)	//no!!!!!
		{
			if (!YuJu()) 
				return false;
			if(-1==GetCurRS()->type)
				return true;
		}

	return true;

}

int CAnalyzer::YuJu()
{
   switch (GetCurRS()->type)
	{
	case 1:			//bl
		if(!FindInBL(GetCurRS()->text))
		{//变量定义否
			YuErrorNo=13;   //未定义
			ErrorAddr=m_pCurRS;
			return false;
		}
		switch(GetNextRS()->type)
		{
		case 34:            // +
		case 35:            // -
		case 36:            // *
		case 37:            // /
		case 39:            //+=
		case 40:            //-=
		case 41:            //++
		case 42:            //--
           if(!BiaoDaShi())
			   return false;
		   if(52==GetCurRS()->type)
			   m_pCurRS++;
		   else
		   {
			   YuErrorNo=10;   //未定义
		       ErrorAddr=m_pCurRS;
		       return false;
		   }
		   break;
		default:
			if (!FuZhiYuJu()) 
				return false;
			break;
		}
         break;
	case 19:			//if
		if (!TiaoJianYuJu())
			return false;
		break;

	case 33:		//while
	case 17:        //for		
	case 11:        //do
		if (!XunHuanYuJu()) 
			return false;
		break;

//	case 13:		//call
//		if (!GuoChengYuJu()) return false;
//		break;
//	case 50:   //}
//		break;
	default:
		YuErrorNo=17;   //
		ErrorAddr=m_pCurRS;
		return false;
	}
	return true;
}

int CAnalyzer::FuHeYuJu()
{
	return true;
}

int CAnalyzer::FuZhiYuJu()
{           //调用后指向新语句
/*	if(!FindInBL(GetCurRS()->text))
	{//变量定义否
		YuErrorNo=13;   //未定义
		ErrorAddr=m_pCurRS;
		return false;
	}

*/
		m_pCurRS++;  

		switch (GetCurRS()->type)
		{
		case 38:	//=
			break;
		default:
			YuErrorNo=19;  //缺少赋值符号“ = ”!
			ErrorAddr=m_pCurRS;
			return false;
		}

		m_pCurRS++;

		if (!BiaoDaShi()) 
			return false;

		if(52!=GetCurRS()->type)
		{
			YuErrorNo=10;  //缺少;
			ErrorAddr=m_pCurRS;
			return false;
		}

		 m_pCurRS++;   //指向新语句

	return true;
}

int CAnalyzer::TiaoJianYuJu()
{
	m_pCurRS++;
	if(56!=GetCurRS()->type)//(
	{
		YuErrorNo=9;
		ErrorAddr=m_pCurRS;
		return false;
	}
	else
		m_pCurRS++; 

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

    if(57!=GetCurRS()->type)//)
	{
		YuErrorNo=9;
		ErrorAddr=m_pCurRS;
		return false;
	}
	else
		m_pCurRS++;

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

	switch (GetCurRS()->type)
	{
	case 13:	//else
		break;
	default:
		return true;
	}

	m_pCurRS++;

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

    //m_pCurRS++;
	return true;
}

int CAnalyzer::XunHuanYuJu()
{
	int flag1,flag2;
	flag1=flag2=0;
	switch (GetCurRS()->type)
	{
	case 17://for
        m_pCurRS++;
		switch (GetCurRS()->type)
		{
	     case 56:  //(	
		     break;
		 default:
			 YuErrorNo=23;//for error~!//21缺少while//未
             ErrorAddr=m_pCurRS;
			 return false;
		}

		m_pCurRS++;
        if(!FuZhiYuJu())      //赋值语句
			return false;
		if(!BoolBiaoDaShi())  //表达式
			return false;

		m_pCurRS++;

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

		if(57==GetCurRS()->type)    //)
                 m_pCurRS++;
		else
		{
			YuErrorNo=23;//for error~!//21缺少while
             ErrorAddr=m_pCurRS;
			 return false;
		}
		break;
	case 11://do
		flag2=1;
        m_pCurRS++;
		if(49==GetCurRS()->type)
		{
			flag1=1;
			m_pCurRS++;
		}
		if (!YuJu()) 
			return false;
		if(1==flag1&&50==GetCurRS()->type)
			m_pCurRS++;
		else
		{	
			 YuErrorNo=12;//缺少
             ErrorAddr=m_pCurRS;
			 return false;
		}
	case 33://while
		m_pCurRS++;
		switch (GetCurRS()->type)
		{
	     case 56:  //(
			 m_pCurRS++;
		     break;
		 default:
			 YuErrorNo=23;//for error~!//21缺少while//未
             ErrorAddr=m_pCurRS;
			 return false;
		}
		
		if(!BoolBiaoDaShi())  //表达式
			return false;

		if(57==GetCurRS()->type)    //)
                 m_pCurRS++;
		else
		{
			YuErrorNo=23;//for error~!//21缺少while
            ErrorAddr=m_pCurRS;
			 return false;
		}

		if(1==flag2)
		{
			//m_pCurRS++;
			if(52==GetCurRS()->type)//;
			{
				m_pCurRS++;
				break;
			}
			else
			{
				YuErrorNo=10;//;
                ErrorAddr=m_pCurRS;
			    return false;
			}
		}
		else
		{
			//m_pCurRS++;
			if(49==GetCurRS()->type)
			{
				flag1=1;
				m_pCurRS++;
			}
			if (!YuJu()) 
				return false;
			if(1==flag1&&50==GetCurRS()->type||0==flag1)
				m_pCurRS++;
			else
			{	
				YuErrorNo=12;
				ErrorAddr=m_pCurRS;
				return false;
			}
		}
		break;
	}
		return true;
}

int CAnalyzer::BiaoDaShi()
{//指向分号
    if(4==GetNextRS()->type||40==GetNextRS()->type||42==GetNextRS()->type)
	{//++  --  break;
		m_pCurRS++;m_pCurRS++;
		return true;
	}

	if (!Xiang())
		return false;

	while (34==GetCurRS()->type||35==GetCurRS()->type
		   ||36==GetCurRS()->type||37==GetCurRS()->type)	//+ - * /
	{
		m_pCurRS++;
		if (!Xiang()) 
			return false;
	}

	return true;
}


int CAnalyzer::Xiang()
{

	if (!YinZi()) 
		return false;

	while (34==GetCurRS()->type||35==GetCurRS()->type
		   ||36==GetCurRS()->type||37==GetCurRS()->type)
	{// +,-,*,/
		m_pCurRS++;
		if (!YinZi())
			return false;
	}

	return true;
}

int CAnalyzer::YinZi()
{
	switch (GetCurRS()->type)
	{
	case 1:			//id
		m_pCurRS++;
		break;

	case 2:			//num
		m_pCurRS++;
		break;

	case 56:		//(
		m_pCurRS++;

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

		switch (GetCurRS()->type)
		{
		case 34:	//)
			break;
		default:
			YuErrorNo=17;  //缺少 “ ) ”符号!
            ErrorAddr=m_pCurRS;
			return false;
		}
		m_pCurRS++;

		break;

		default:
			YuErrorNo=28; //运算式不完全
            ErrorAddr=m_pCurRS;
			return false;
	}
	return true;

}


int CAnalyzer::BoolBiaoDaShi()
{
	switch (GetCurRS()->type)
	{
	case 20:	//~
		m_pCurRS++;
		if (!BoolBiaoDaShi())
			return false;
		break;

	case 33:	//(
	case 1:		//id
	case 2:		//num
		if (!GuanXiShi()) 
			return false;

		while (GetCurRS()->type==21 || GetCurRS()->type==22) // & |
		{
			m_pCurRS++;
			if (!BoolBiaoDaShi())
				return false;
		}
		break;

	default:
		YuErrorNo=29;		//"缺少 '布尔表达式'
        ErrorAddr=m_pCurRS;
		return false;
	}
	return true;
}


int CAnalyzer::GuanXiShi()
{
	if (!BiaoDaShi())  //表达式
		return false;

	if (!GuanXi())	//关系
		return false;

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

	return true;

}

int CAnalyzer::GuanXi()
{
	switch (GetCurRS()->type)
	{
	case 54:	//<
	case 55:	//<=
	case 44:	//>
	case 45:	//>=
	case 46:	//=
	case 47:	//<>
		break;

	default:
		YuErrorNo=30;	//缺少关系(<,<=,>,>=,=,<>)!
        ErrorAddr=m_pCurRS;
		return false;
	}
	m_pCurRS++;
	return true;

}


CifaResult * CAnalyzer::GetCurRS()
{
   return m_tCifa[m_pCurRS];
}

CifaResult * CAnalyzer::GetNextRS()
{
    return m_tCifa[m_pCurRS+1];
}

int CAnalyzer::FindInBL(char *a)
{
	for (int i=0;i<KEY_WORD_TABLE_LEN;i++)
		if (!::stricmp(BianLiang[i],a)) return i;
	return 0;

}

⌨️ 快捷键说明

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