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