📄 yfenxi.cpp
字号:
// 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 + -