📄 说明.txt
字号:
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())
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;
}
/*================================================================
* 函数名: y_TiaoJianYuJu
* 功能描述: 条件语句 (protected)
* 返回值: void
* 示例: If m>n then n:=m else t:=m;
================================================================*/
bool CFenXi::y_TiaoJianYuJu()
{
switch (m_cifa[m_nCur]->nType)
{
case 8: //if
break;
default:
m_nErrNo=22; //缺少保留字“ if ”!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if (!y_BuErBiaoDaShi()) //表达式
return false;
switch (m_cifa[m_nCur]->nType)
{
case 9: //then
break;
default:
m_nErrNo=23; //缺少保留字“ then ”!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if (!y_YuJu()) //语句
return false;
switch (m_cifa[m_nCur]->nType)
{
case 10: //else
break;
default:
return true;
}
m_nCur++;
if (!y_YuJu()) //语句
return false;
return true;
}
/*================================================================
* 函数名: y_XunHuanYuJu
* 功能描述: 循环语句 (protected)
* 返回值: void
* 示例:
While nbool CFenXi::y_XunHuanYuJu()
{
switch (m_cifa[m_nCur]->nType)
{
case 11: //while
break;
default:
m_nErrNo=24;
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if (!y_BuErBiaoDaShi()) //表达式
return false;
switch (m_cifa[m_nCur]->nType)
{
case 12: //do
break;
default:
m_nErrNo=25; //缺少保留字“ do ”!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if (!y_YuJu())
return false;
return true;
}
/*================================================================
* 函数名: y_GuoChengYuJu
* 功能描述: 过程语句 (protected)
* 返回值: void
* 示例: Call ab(x,y,z);
================================================================*/
bool CFenXi::y_GuoChengYuJu()
{
switch (m_cifa[m_nCur]->nType)
{
case 13: //call
break;
default:
m_nErrNo=26; //缺少保留字“ call ”!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
switch (m_cifa[m_nCur]->nType)
{
case 1: //id
break;
default:
m_nErrNo=27; //缺少被调过程名标识符!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
switch (m_cifa[m_nCur]->nType)
{
case 33: //(
break;
default:
return true;
}
if (!y_ShiCanBiao()) //表达式
return false;
return true;
}
/*================================================================
* 函数名: y_ShiCanBiao
* 功能描述: 实参表 (protected)
* 返回值: void
*示例: Call ab(x,y,z);
================================================================*/
bool CFenXi::y_ShiCanBiao()
{
switch (m_cifa[m_nCur]->nType)
{
case 33: //(
break;
default:
m_nErrNo=16; //缺少 “ ( ”符号!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if (!y_BiaoDaShi()) //表达式
return false;
while (m_cifa[m_nCur]->nType==32) //,
{
m_nCur++;
if (!y_BiaoDaShi())
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_BiaoDaShi
* 功能描述: 表达式 (protected)
* 返回值: void
* 示例: z:=4+z+(1+2+6+x)*3*y*5+7;
================================================================*/
bool CFenXi::y_BiaoDaShi()
{
if (!y_Xiang())
return false;
while (m_cifa[m_nCur]->nType==16) //+
{
m_nCur++;
if (!y_Xiang())
return false;
}
return true;
}
/*================================================================
* 函数名: y_Xiang
* 功能描述: 项 (protected)
* 返回值: void
================================================================*/
bool CFenXi::y_Xiang()
{
if (!y_YinZi())
return false;
while (m_cifa[m_nCur]->nType==18)//*
{
m_nCur++;
if (!y_YinZi())
return false;
}
return true;
}
/*================================================================
* 函数名: y_YinZi
* 功能描述: 因子 (protected)
* 返回值: void
================================================================*/
bool CFenXi::y_YinZi()
{
switch (m_cifa[m_nCur]->nType)
{
case 1: //id
m_nCur++;
break;
case 2: //num
m_nCur++;
break;
case 33: //(
m_nCur++;
if (!y_BiaoDaShi()) //递归调用
return false;
switch (m_cifa[m_nCur]->nType)
{
case 34: //)
break;
default:
m_nErrNo=17; //缺少 “ ) ”符号!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
break;
default:
m_nErrNo=28; //缺少《因子》,应为 (,ID,NUMBER"
m_nErrAddr=m_nCur;
return false;
}
return true;
}
/*================================================================
* 函数名: y_BuErBiaoDaShi
* 功能描述: 布尔表达式 (protected)
* 返回值: void
================================================================*/
bool CFenXi::y_BuErBiaoDaShi()
{
switch (m_cifa[m_nCur]->nType)
{
case 20: //~
m_nCur++;
if (!y_BuErBiaoDaShi())
return false;
break;
case 33: //(
case 1: //id
case 2: //num
if (!y_GuanXiBiaoDaShi())
return false;
while (m_cifa[m_nCur]->nType==21 || m_cifa[m_nCur]->nType==22) // & |
{
m_nCur++;
if (!y_BuErBiaoDaShi())
return false;
}
break;
default:
m_nErrNo=29; //"缺少《布尔表达式》,应为 ~,(,ID,NUMBER"
m_nErrAddr=m_nCur;
return false;
}
return true;
}
/*================================================================
* 函数名: y_GuanXiBiaoDaShi
* 功能描述: 关系表达式 (protected)
* 返回值: void
================================================================*/
bool CFenXi::y_GuanXiBiaoDaShi()
{
if (!y_BiaoDaShi()) //表达式
return false;
if (!y_GuanXi()) //关系
return false;
if (!y_BiaoDaShi()) //表达式
return false;
return true;
}
/*================================================================
* 函数名: y_GuanXi
* 功能描述: 关系 (protected)
* 返回值: void
================================================================*/
bool CFenXi::y_GuanXi()
{
switch (m_cifa[m_nCur]->nType)
{
case 23: //<
case 24: //<=
case 25: //>
case 26: //>=
case 27: //=
case 28: //<>
break;
default:
m_nErrNo=30; //缺少关系(<,<=,>,>=,=,<>)!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
return true;
}
/*================================================================
* 函数名: init
* 功能描述: 用于初始化关键字表和错误信息表 (protected)
* 返回值: void
================================================================*/
void CFenXi::init()
{
strcpy(m_szKW[0],"");
strcpy(m_szKW[1],"");//标识符
strcpy(m_szKW[2],"");//正整数
strcpy(m_szKW[3],"program");
strcpy(m_szKW[4],"var");
strcpy(m_szKW[5],"procedure");
strcpy(m_szKW[6],"begin");
strcpy(m_szKW[7],"end");
strcpy(m_szKW[8],"if");
strcpy(m_szKW[9],"then");
strcpy(m_szKW[10],"else");
strcpy(m_szKW[11],"while");
strcpy(m_szKW[12],"do");
strcpy(m_szKW[13],"call");
strcpy(m_szKW[14],"integer");
strcpy(m_szKW[15],"real");
strcpy(m_szKW[16],"+");
strcpy(m_szKW[17],"-");
strcpy(m_szKW[18],"*");
strcpy(m_szKW[19],"/");
strcpy(m_szKW[20],"~");
strcpy(m_szKW[21],"&");
strcpy(m_szKW[22],"|");
strcpy(m_szKW[23],"<");
strcpy(m_szKW[24],"<=");
strcpy(m_szKW[25],">");
strcpy(m_szKW[26],">=");
strcpy(m_szKW[27],"=");
strcpy(m_szKW[28],"<>");
strcpy(m_szKW[29],":=");
strcpy(m_szKW[30],";");
strcpy(m_szKW[31],".");
strcpy(m_szKW[32],",");
strcpy(m_szKW[33],"(");
strcpy(m_szKW[34],")");
strcpy(m_szKW[35],":");
strcpy(m_szKW[36],"/*");
strcpy(m_szKW[37],"*/");
strcpy(m_szKW[38],"");
strcpy(m_szKW[39],"");
strcpy(m_szKW[40],"");
strcpy(m_szKW[41],"");
strcpy(m_szKW[42],"");
strcpy(m_szKW[43],"");
strcpy(m_szKW[44],"");
strcpy(m_szKW[45],"");
strcpy(m_szKW[46],"");
strcpy(m_szKW[47],"");
strcpy(m_szKW[48],"");
strcpy(m_szKW[49],"");
strcpy(m_szErrMsg[0],"正确!");
strcpy(m_szErrMsg[1],"数字位数过长!");
strcpy(m_szErrMsg[2],"非法字符!");
strcpy(m_szErrMsg[3],"缺少关键字“ program ”!");
strcpy(m_szErrMsg[4],"program 后缺少标识符!");
strcpy(m_szErrMsg[5],"缺少“ ; ”符号!");
strcpy(m_szErrMsg[6],"缺少程序结束符“ . ”符号!");
strcpy(m_szErrMsg[7],"缺少《程序体》,应为 begin,integer,real,procedure");
strcpy(m_szErrMsg[8],"缺少保留字“ begin ”!");
strcpy(m_szErrMsg[9],"缺少《语句》,应为 begin,ID,if,while,call");
strcpy(m_szErrMsg[10],"缺少保留字“ end ”!");
strcpy(m_szErrMsg[11],"缺少《声明》,应为 integer,real,procedure");
strcpy(m_szErrMsg[12],"缺少保留字 integer 或 real!");
strcpy(m_szErrMsg[13],"procedure 后缺少标识符!");
strcpy(m_szErrMsg[14],"变量声明后缺少标识符!");
strcpy(m_szErrMsg[15],"缺少保留字“ procedure ”!");
strcpy(m_szErrMsg[16],"缺少 “ ( ”符号!");
strcpy(m_szErrMsg[17],"缺少 “ ) ”符号!");
strcpy(m_szErrMsg[18],"缺少形参标识符 !");
strcpy(m_szErrMsg[19],"缺少 “ : ”符号!");
strcpy(m_szErrMsg[20],"缺少标识符!");
strcpy(m_szErrMsg[21],"缺少赋值符号“ := ”!");
strcpy(m_szErrMsg[22],"缺少保留字“ if ”!");
strcpy(m_szErrMsg[23],"缺少保留字“ then ”!");
strcpy(m_szErrMsg[24],"缺少保留字“ while ”!");
strcpy(m_szErrMsg[25],"缺少保留字“ do ”!");
strcpy(m_szErrMsg[26],"缺少保留字“ call ”!");
strcpy(m_szErrMsg[27],"缺少被调过程名标识符!");
strcpy(m_szErrMsg[28],"缺少《因子》,应为 (,ID,NUMBER");
strcpy(m_szErrMsg[29],"缺少《布尔表达式》,应为 ~,(,ID,NUMBER");
strcpy(m_szErrMsg[30],"缺少《关系》!");
strcpy(m_szErrMsg[31],"变量名不能和过程名相同!");
strcpy(m_szErrMsg[32],"标识符重复声明!");
strcpy(m_szErrMsg[33],"未声明标识符!");
strcpy(m_szErrMsg[34],"不能直接引用过程名!");
strcpy(m_szErrMsg[35],"不能从real转换为integer类型!");
strcpy(m_szErrMsg[36],"不能用常数作实参!");
strcpy(m_szErrMsg[37],"变参应为变量!");
strcpy(m_szErrMsg[38],"实参个数不足!");
strcpy(m_szErrMsg[39],"只有integer和integer才能比较!");
strcpy(m_szErrMsg[40],"不能这样调用过程!");
strcpy(m_szErrMsg[41],"");
strcpy(m_szErrMsg[42],"");
strcpy(m_szErrMsg[43],"");
strcpy(m_szErrMsg[96],"源程序结束符 end. 后还有多余内容!");
strcpy(m_szErrMsg[97],"语法错误太多,终止语法分析!");
strcpy(m_szErrMsg[98],"源程序不正常结束!");
strcpy(m_szErrMsg[99],"内存不足!词法分析终止!");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -