📄 yfenxi.cpp
字号:
* 函数名: y_FuZhiYuJu
* 功能描述: 赋值语句 (protected)
* 返回值: void
* 示例: y:=219;
================================================================*/
bool YFenXi::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 40: //:=
break;
default:
m_nErrNo=21; //缺少赋值符号“ := ”!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if(m_cifa[m_nCur]->nType==4||m_cifa[m_nCur]->nType==5){
m_nCur++;
return true;
}
if (!y_BiaoDaShi())
return false;
return true;
}
/*================================================================
* 函数名: y_TiaoJianYuJu
* 功能描述: 条件语句 (protected)
* 返回值: void
* 示例: If m>n then n:=m else t:=m;
================================================================*/
bool YFenXi::y_IfYuJu()
{
switch (m_cifa[m_nCur]->nType)
{
case 16: //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 17: //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 18: //else
break;
default:
return true;
}
m_nCur++;
if (!y_YuJu()) //语句
return false;
return true;
}
/*================================================================
* 函数名: y_XunHuanYuJu
* 功能描述: 循环语句 (protected)
* 返回值: void
* 示例:
While n<m do
Begin
n:=n+1
End
================================================================*/
bool YFenXi::y_WhileYuJu()
{
switch (m_cifa[m_nCur]->nType)
{
case 19: //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 20: //do
break;
default:
m_nErrNo=25; //缺少保留字“ do ”!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if (!y_YuJu())
return false;
return true;
}
/*================================================================
* 函数名: y_HanShuYuJu
* 功能描述: 过程语句 (protected)
* 返回值: void
* 示例: ab(x,y,z);
================================================================*/
bool YFenXi::y_HanShuYuJu()
{
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 45: //(
break;
default:
return true;
}
if (!y_ShiCanBiao()) //表达式
return false;
return true;
}
/*================================================================
* 函数名: y_ShiCanBiao
* 功能描述: 实参表 (protected)
* 返回值: void
*示例: Call ab(x,y,z);
================================================================*/
bool YFenXi::y_ShiCanBiao()
{
switch (m_cifa[m_nCur]->nType)
{
case 45: //(
break;
default:
m_nErrNo=16; //缺少 “ ( ”符号!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if (!y_BiaoDaShi()) //表达式
return false;
while (m_cifa[m_nCur]->nType==44) //,
{
m_nCur++;
if (!y_BiaoDaShi())
return false;
}
switch (m_cifa[m_nCur]->nType)
{
case 46: //)
break;
default:
m_nErrNo=17; //缺少 “ ) ”符号
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
return true;
}
/*================================================================
* 函数名: y_BiaoDaShi
* 功能描述: 表达式 (protected)
* 返回值: void
* 示例: 4+z+(1+2+6-x)*3*y*5+7-ab(3,5);
================================================================*/
bool YFenXi::y_BiaoDaShi()
{
if (!y_Xiang())
return false;
bool cyc=true;
while(cyc){
switch(m_cifa[m_nCur]->nType){//*,/,+,-
case 27:// *
case 28:// /
case 29:// +
case 30:// -
m_nCur++;
if (!y_Xiang())
return false;
break;
default: cyc=false;
}
}
return true;
}
/*================================================================
* 函数名: y_Xiang
* 功能描述: 项 (protected)
* 返回值: void
* example: 4,z,(1+2+6-x),3,y,5,7,ab(3,5)
================================================================*/
bool YFenXi::y_Xiang()
{
switch (m_cifa[m_nCur]->nType)
{
case 1: //id
if(m_cifa[m_nCur+1]->nType==45){ //han shu
if(!y_HanShuYuJu()) return false;
else break;
}
m_nCur++;
break;
case 2: //integer
case 3: //real
m_nCur++;
break;
case 45: //(
m_nCur++;
if (!y_BiaoDaShi()) //递归调用
return false;
if(m_cifa[m_nCur]->nType!=46) {
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 YFenXi::y_BuErBiaoDaShi()
{
switch (m_cifa[m_nCur]->nType)
{
case 37: //~
m_nCur++;
if (!y_BuErBiaoDaShi())
return false;
break;
case 45: //(
case 1: //id
case 2: //num
if (!y_GuanXiBiaoDaShi())
return false;
while (m_cifa[m_nCur]->nType==38 || m_cifa[m_nCur]->nType==39) // & |
{
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 YFenXi::y_GuanXiBiaoDaShi()
{
if (!y_BiaoDaShi()) //表达式
return false;
if (!y_GuanXi()) //关系
return false;
if (!y_BiaoDaShi()) //表达式
return false;
return true;
}
/*================================================================
* 函数名: y_GuanXi
* 功能描述: 关系 (protected)
* 返回值: void
================================================================*/
bool YFenXi::y_GuanXi()
{
switch (m_cifa[m_nCur]->nType)
{
case 31: //<
case 32: //<=
case 33: //>
case 34: //>=
case 35: //=
case 36: //<>
break;
default:
m_nErrNo=30; //缺少关系(<,<=,>,>=,=,<>)!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
return true;
}
/***************************
* for语句
***************************/
bool YFenXi::y_ForYuJu(){
if(m_cifa[m_nCur]->nType!=21) return false; // for
m_nCur++; //
if(m_cifa[m_nCur]->nType!=1) return false; //id
m_nCur++;
if(m_cifa[m_nCur]->nType!=40) return false;//:=
m_nCur++; //表达式
if(!y_BiaoDaShi()) return false;
if(m_cifa[m_nCur]->nType!=22) return false;//to
m_nCur++;
if(!y_BiaoDaShi()) return false;//表达式
if(m_cifa[m_nCur]->nType!=20) return false;//do
m_nCur++;//YuJu
if(!y_YuJu()) return false;
return true;
}
bool YFenXi::y_RepeatYuJu(){
if(m_cifa[m_nCur]->nType!=23) return false; // repeat
m_nCur++; //
if(!y_YuJuChuan()) return false; //语句串
if(m_cifa[m_nCur]->nType!=24) return false;//until
m_nCur++; //
if(!y_BuErBiaoDaShi()) return false;//表达式
return true;
}
/***************************
* read语句
***************************/
bool YFenXi::y_ReadYuJu(){
if(m_cifa[m_nCur]->nType!=25) return false;
bool cyc=false;
m_nCur++;
if(m_cifa[m_nCur]->nType!=1) return false;//x
m_nCur++; if(m_cifa[m_nCur]->nType==44) cyc=true;
while(cyc){//x,y,z;
m_nCur++; //x
if(m_cifa[m_nCur]->nType!=1) return false;
m_nCur++;//,
if(m_cifa[m_nCur]->nType!=44) cyc=false;
}
return true;
}
/***************************
* write语句
***************************/
bool YFenXi::y_WriteYuJu(){ // 26
if(m_cifa[m_nCur]->nType!=26) return false;
m_nCur++;
if (!y_BiaoDaShi())
return false;
return true;
}
/****************************
*语意分析初始化
*****************************/
void YFenXi::init(CFenXi &cfenxi){
m_n=cfenxi.m_n;
for(int i=0;i<m_n;i++)
m_cifa[i]=cfenxi.m_cifa[i];//注意是指针引用
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,function,array,boolean");
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,function,array,boolean");
strcpy(m_szErrMsg[12],"缺少保留字 integer,boolean,real,array!");
strcpy(m_szErrMsg[13],"procedure 后缺少标识符!");
strcpy(m_szErrMsg[14],"变量声明后缺少标识符!");
strcpy(m_szErrMsg[15],"缺少保留字“ function ”!");
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[44],"没有return!");
strcpy(m_szErrMsg[45],"return后缺少标识符!");
strcpy(m_szErrMsg[46],"return 标识符后无;!");
strcpy(m_szErrMsg[47],"缺少[!");
strcpy(m_szErrMsg[48],"缺少[!");
strcpy(m_szErrMsg[49],"非整数!");
strcpy(m_szErrMsg[50],"缺少const!");
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 + -