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