📄 fenxi.cpp
字号:
if (!XingCan())
return false;
}
if( m_cifa[m_nCur]->nType !=34) //)
{
m_nErrNo=17; //缺少 “ ) ”符号!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if(m_cifa[m_nCur]->nType != 30) //;
{
m_nErrNo=5; //缺少;!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if (!ProgramTi()) //程序体
return false;
return true;
}
/*================================================================
* 函数名: XingCan
* 功能描述: 分析形参 (protected)
* 返回值: void
* 示例: Var m,n:Integer; t:Real
================================================================*/
bool CFenXi::XingCan()
{
if (m_cifa[m_nCur]->nType==4) //var
m_nCur++;
if( m_cifa[m_nCur]->nType !=1) //id
{
m_nErrNo=18; //"缺少形参标识符 !"
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
while (m_cifa[m_nCur]->nType==32) //, 用于分析多个形参的情况
{
m_nCur++;
if(m_cifa[m_nCur]->nType !=1) //id
{
m_nErrNo=18; //"缺少形参标识符 !"
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
}
if( m_cifa[m_nCur]->nType !=35) //:
{
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;
}
/*================================================================
* 函数名: SentenceChuan
* 功能描述: 语句串,用分号隔开的多个语句 (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::SentenceChuan()
{
if (!Sentence())
return false;
while (m_cifa[m_nCur]->nType==30) //;
{
m_nCur++;
if (!Sentence())
return false;
}
return true;
}
/*================================================================
* 函数名: Sentence
* 功能描述: 语句 (protected)
* 返回值: void
================================================================*/
bool CFenXi::Sentence()
{
switch (m_cifa[m_nCur]->nType)
{
case 6: //begin
if (!C_Sentence())
return false;
break;
case 1: //id
if (!F_Sentence())
return false;
break;
case 8: //if
if (!Condition_Sentence())
return false;
break;
case 11: //while
if (!Cycle_Sentence())
return false;
break;
case 13: //call
if (!GuoChengSentence()) return false;
break;
default:
m_nErrNo=9; //缺少《语句》,应为 begin,ID,if,while,call
m_nErrAddr=m_nCur;
return false;
}
return true;
}
/*================================================================
* 函数名: C_Sentence
* 功能描述: 复合语句 (protected)
* 返回值: void
================================================================*/
bool CFenXi::C_Sentence()
{
if( m_cifa[m_nCur]->nType !=6) //begin
{
m_nErrNo=8; //缺少保留字“ begin ”!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if (!SentenceChuan()) //递归调用
return false;
if( m_cifa[m_nCur]->nType !=7) //end
{
m_nErrNo=10; //"缺少保留字“ end ”!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
return true;
}
/*================================================================
* 函数名: F_Sentence
* 功能描述: 赋值语句 (protected)
* 返回值: void
* 示例: y:=219;
================================================================*/
bool CFenXi::F_Sentence()
{
if( m_cifa[m_nCur]->nType !=1) //id
{
m_nErrNo=20; //缺少标识符!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if( m_cifa[m_nCur]->nType !=29 ) //:=
{
m_nErrNo=21; //缺少赋值符号“ := ”!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if (!BiaoDaShi())
return false;
return true;
}
/*================================================================
* 函数名: Condition_Sentence
* 功能描述: 条件语句 (protected)
* 返回值: void
* 示例: If m>n then n:=m else t:=m;
================================================================*/
bool CFenXi::Condition_Sentence()
{
if(m_cifa[m_nCur]->nType !=8 ) //if
{
m_nErrNo=22; //缺少保留字“ if ”!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if (!BooL_Express()) //表达式
return false;
if(m_cifa[m_nCur]->nType != 9 ) //then
{
m_nErrNo=23; //缺少保留字“ then ”!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if (!Sentence()) //语句
return false;
if(m_cifa[m_nCur]->nType != 10 ) //else
return true;
m_nCur++;
if (!Sentence()) //语句
return false;
return true;
}
/*================================================================
* 函数名: Cycle_Sentence
* 功能描述: 循环语句 (protected)
* 返回值: void
* 示例:
While n<m do
Begin
n:=n+1
End
================================================================*/
bool CFenXi::Cycle_Sentence()
{
if(m_cifa[m_nCur]->nType != 11 ) //while
{
m_nErrNo=24;
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if (!BooL_Express()) //表达式
return false;
if(m_cifa[m_nCur]->nType != 12 ) //do
{
m_nErrNo=25; //缺少保留字“ do ”!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if (!Sentence())
return false;
return true;
}
/*================================================================
* 函数名: GuoChengSentence
* 功能描述: 过程语句 (protected)
* 返回值: void
* 示例: Call ab(x,y,z);
================================================================*/
bool CFenXi::GuoChengSentence()
{
if(m_cifa[m_nCur]->nType != 13) //call
{
m_nErrNo=26; //缺少保留字“ call ”!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if(m_cifa[m_nCur]->nType != 1)
{
m_nErrNo=27; //缺少被调过程名标识符!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if(m_cifa[m_nCur]->nType != 33 )
return true;
if (!ShiCan()) //表达式
return false;
return true;
}
/*================================================================
* 函数名: ShiCan
* 功能描述: 实参表 (protected)
* 返回值: void
*示例: Call ab(x,y,z);
================================================================*/
bool CFenXi::ShiCan()
{
if(m_cifa[m_nCur]->nType != 33 ) //(
{
m_nErrNo=16; //缺少 “ ( ”符号!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if (!BiaoDaShi()) //表达式
return false;
while (m_cifa[m_nCur]->nType==32) //,
{
m_nCur++;
if (!BiaoDaShi())
return false;
}
if(m_cifa[m_nCur]->nType !=34 )//)
{
m_nErrNo=17; //缺少 “ ) ”符号
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
return true;
}
/*================================================================
* 函数名: BiaoDaShi
* 功能描述: 表达式 (protected)
* 返回值: void
* 示例: z:=4+z+(1+2+6+x)*3*y*5+7;
================================================================*/
bool CFenXi::BiaoDaShi()
{
if (!Item())
return false;
while (m_cifa[m_nCur]->nType==16) //+
{
m_nCur++;
if (!Item())
return false;
}
return true;
}
/*================================================================
* 函数名: Item
* 功能描述: 项 (protected)
* 返回值: void
================================================================*/
bool CFenXi::Item()
{
if (!Factor())
return false;
while (m_cifa[m_nCur]->nType==18)//*
{
m_nCur++;
if (!Factor())
return false;
}
return true;
}
/*================================================================
* 函数名: Factor
* 功能描述: 因子 (protected)
* 返回值: void
================================================================*/
bool CFenXi::Factor()
{
switch (m_cifa[m_nCur]->nType)
{
case 1: //id
m_nCur++;
break;
case 2: //num
m_nCur++;
break;
case 33: //(
m_nCur++;
if (!BiaoDaShi()) //递归调用
return false;
if(m_cifa[m_nCur]->nType != 34) //)
{
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;
}
/*================================================================
* 函数名: BooL_Express
* 功能描述: 布尔表达式 (protected)
* 返回值: void
================================================================*/
bool CFenXi::BooL_Express()
{
switch (m_cifa[m_nCur]->nType)
{
case 20: //~
m_nCur++;
if (!BooL_Express())
return false;
break;
case 33: //(
case 1: //id
case 2: //num
if (!Relation_Exp())
return false;
while (m_cifa[m_nCur]->nType==21 || m_cifa[m_nCur]->nType==22) // & |
{
m_nCur++;
if (!BooL_Express())
return false;
}
break;
default:
m_nErrNo=29; //"缺少《布尔表达式》,应为 ~,(,ID,NUMBER"
m_nErrAddr=m_nCur;
return false;
}
return true;
}
/*================================================================
* 函数名: Relation_Exp
* 功能描述: 关系表达式 (protected)
* 返回值: void
================================================================*/
bool CFenXi::Relation_Exp()
{
if (!BiaoDaShi()) //表达式
return false;
if (!Relation()) //关系
return false;
if (!BiaoDaShi()) //表达式
return false;
return true;
}
/*================================================================
* 函数名: Relation
* 功能描述: 关系 (protected)
* 返回值: void
================================================================*/
bool CFenXi::Relation()
{
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_kw[0],"");
strcpy(m_kw[1],"");//标识符
strcpy(m_kw[2],"");//正整数
strcpy(m_kw[3],"program");
strcpy(m_kw[4],"var");
strcpy(m_kw[5],"procedure");
strcpy(m_kw[6],"begin");
strcpy(m_kw[7],"end");
strcpy(m_kw[8],"if");
strcpy(m_kw[9],"then");
strcpy(m_kw[10],"else");
strcpy(m_kw[11],"while");
strcpy(m_kw[12],"do");
strcpy(m_kw[13],"call");
strcpy(m_kw[14],"integer");
strcpy(m_kw[15],"real");
strcpy(m_kw[16],"+");
strcpy(m_kw[17],"-");
strcpy(m_kw[18],"*");
strcpy(m_kw[19],"/");
strcpy(m_kw[20],"~");
strcpy(m_kw[21],"&");
strcpy(m_kw[22],"|");
strcpy(m_kw[23],"<");
strcpy(m_kw[24],"<=");
strcpy(m_kw[25],">");
strcpy(m_kw[26],">=");
strcpy(m_kw[27],"=");
strcpy(m_kw[28],"<>");
strcpy(m_kw[29],":=");
strcpy(m_kw[30],";");
strcpy(m_kw[31],".");
strcpy(m_kw[32],",");
strcpy(m_kw[33],"(");
strcpy(m_kw[34],")");
strcpy(m_kw[35],":");
strcpy(m_kw[36],"/*");
strcpy(m_kw[37],"*/");
strcpy(m_kw[38],"");
strcpy(m_kw[39],"");
strcpy(m_kw[40],"");
strcpy(m_kw[41],"");
strcpy(m_kw[42],"");
strcpy(m_kw[43],"");
strcpy(m_kw[44],"");
strcpy(m_kw[45],"");
strcpy(m_kw[46],"");
strcpy(m_kw[47],"");
strcpy(m_kw[48],"");
strcpy(m_kw[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],"缺少程序体");
strcpy(m_szErrMsg[8],"缺少关键字 begin !");
strcpy(m_szErrMsg[9],"缺少语句");
strcpy(m_szErrMsg[10],"缺少关键字 end !");
strcpy(m_szErrMsg[11],"缺少声明");
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],"缺少因子");
strcpy(m_szErrMsg[29],"缺少布尔表达式");
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],"源程序结束符. 后还有多余内容!");
strcpy(m_szErrMsg[97],"语法错误太多,终止语法分析!");
strcpy(m_szErrMsg[98],"源程序不正常结束!");
strcpy(m_szErrMsg[99],"内存不足!词法分析终止!");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -