?? 說明.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;
}
/*================================================================
* 函數(shù)名: 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;
}
/*================================================================
* 函數(shù)名: 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; //"缺少形參標(biāo)識符 !"
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; //"缺少形參標(biāo)識符 !"
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;
}
/*================================================================
* 函數(shù)名: 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;
}
/*================================================================
* 函數(shù)名: 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; //缺少《語句》,應(yīng)為 begin,ID,if,while,call
m_nErrAddr=m_nCur;
return false;
}
return true;
}
/*================================================================
* 函數(shù)名: y_FuHeYuJu
* 功能描述: 復(fù)合語句 (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()) //遞歸調(diào)用
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;
}
/*================================================================
* 函數(shù)名: y_FuZhiYuJu
* 功能描述: 賦值語句 (protected)
* 返回值: void
* 示例: y:=219;
================================================================*/
bool CFenXi::y_FuZhiYuJu()
{
switch (m_cifa[m_nCur]->nType)
{
case 1: //id
break;
default:
m_nErrNo=20; //缺少標(biāo)識符!
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;
}
/*================================================================
* 函數(shù)名: 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;
}
/*================================================================
* 函數(shù)名: y_XunHuanYuJu
* 功能描述: 循環(huán)語句 (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;
}
/*================================================================
* 函數(shù)名: 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; //缺少被調(diào)過程名標(biāo)識符!
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;
}
/*================================================================
* 函數(shù)名: 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;
}
/*================================================================
* 函數(shù)名: 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;
}
/*================================================================
* 函數(shù)名: 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;
}
/*================================================================
* 函數(shù)名: 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()) //遞歸調(diào)用
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; //缺少《因子》,應(yīng)為 (,ID,NUMBER"
m_nErrAddr=m_nCur;
return false;
}
return true;
}
/*================================================================
* 函數(shù)名: 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; //"缺少《布爾表達式》,應(yīng)為 ~,(,ID,NUMBER"
m_nErrAddr=m_nCur;
return false;
}
return true;
}
/*================================================================
* 函數(shù)名: y_GuanXiBiaoDaShi
* 功能描述: 關(guān)系表達式 (protected)
* 返回值: void
================================================================*/
bool CFenXi::y_GuanXiBiaoDaShi()
{
if (!y_BiaoDaShi()) //表達式
return false;
if (!y_GuanXi()) //關(guān)系
return false;
if (!y_BiaoDaShi()) //表達式
return false;
return true;
}
/*================================================================
* 函數(shù)名: y_GuanXi
* 功能描述: 關(guān)系 (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; //缺少關(guān)系(<,<=,>,>=,=,<>)!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
return true;
}
/*================================================================
* 函數(shù)名: init
* 功能描述: 用于初始化關(guān)鍵字表和錯誤信息表 (protected)
* 返回值: void
================================================================*/
void CFenXi::init()
{
strcpy(m_szKW[0],"");
strcpy(m_szKW[1],"");//標(biāo)識符
strcpy(m_szKW[2],"");//正整數(shù)
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],"數(shù)字位數(shù)過長!");
strcpy(m_szErrMsg[2],"非法字符!");
strcpy(m_szErrMsg[3],"缺少關(guān)鍵字“ program ”!");
strcpy(m_szErrMsg[4],"program 后缺少標(biāo)識符!");
strcpy(m_szErrMsg[5],"缺少“ ; ”符號!");
strcpy(m_szErrMsg[6],"缺少程序結(jié)束符“ . ”符號!");
strcpy(m_szErrMsg[7],"缺少《程序體》,應(yīng)為 begin,integer,real,procedure");
strcpy(m_szErrMsg[8],"缺少保留字“ begin ”!");
strcpy(m_szErrMsg[9],"缺少《語句》,應(yīng)為 begin,ID,if,while,call");
strcpy(m_szErrMsg[10],"缺少保留字“ end ”!");
strcpy(m_szErrMsg[11],"缺少《聲明》,應(yīng)為 integer,real,procedure");
strcpy(m_szErrMsg[12],"缺少保留字 integer 或 real!");
strcpy(m_szErrMsg[13],"procedure 后缺少標(biāo)識符!");
strcpy(m_szErrMsg[14],"變量聲明后缺少標(biāo)識符!");
strcpy(m_szErrMsg[15],"缺少保留字“ procedure ”!");
strcpy(m_szErrMsg[16],"缺少 “ ( ”符號!");
strcpy(m_szErrMsg[17],"缺少 “ ) ”符號!");
strcpy(m_szErrMsg[18],"缺少形參標(biāo)識符 !");
strcpy(m_szErrMsg[19],"缺少 “ : ”符號!");
strcpy(m_szErrMsg[20],"缺少標(biāo)識符!");
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],"缺少被調(diào)過程名標(biāo)識符!");
strcpy(m_szErrMsg[28],"缺少《因子》,應(yīng)為 (,ID,NUMBER");
strcpy(m_szErrMsg[29],"缺少《布爾表達式》,應(yīng)為 ~,(,ID,NUMBER");
strcpy(m_szErrMsg[30],"缺少《關(guān)系》!");
strcpy(m_szErrMsg[31],"變量名不能和過程名相同!");
strcpy(m_szErrMsg[32],"標(biāo)識符重復(fù)聲明!");
strcpy(m_szErrMsg[33],"未聲明標(biāo)識符!");
strcpy(m_szErrMsg[34],"不能直接引用過程名!");
strcpy(m_szErrMsg[35],"不能從real轉(zhuǎn)換為integer類型!");
strcpy(m_szErrMsg[36],"不能用常數(shù)作實參!");
strcpy(m_szErrMsg[37],"變參應(yīng)為變量!");
strcpy(m_szErrMsg[38],"實參個數(shù)不足!");
strcpy(m_szErrMsg[39],"只有integer和integer才能比較!");
strcpy(m_szErrMsg[40],"不能這樣調(diào)用過程!");
strcpy(m_szErrMsg[41],"");
strcpy(m_szErrMsg[42],"");
strcpy(m_szErrMsg[43],"");
strcpy(m_szErrMsg[96],"源程序結(jié)束符 end. 后還有多余內(nèi)容!");
strcpy(m_szErrMsg[97],"語法錯誤太多,終止語法分析!");
strcpy(m_szErrMsg[98],"源程序不正常結(jié)束!");
strcpy(m_szErrMsg[99],"內(nèi)存不足!詞法分析終止!");
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -