?? yfenxi.cpp
字號(hào):
// YFenXi.cpp: implementation of the YFenXi class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Lojo.h"
#include "YFenXi.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
YFenXi::YFenXi(){}
YFenXi::~YFenXi(){}
/*================================================================
* 函數(shù)名: YuFaFenXi
* 功能描述: 語(yǔ)法分析 (public)
* 返回值: void
================================================================*/
void YFenXi::YuFaFenXi()
{
if (m_n==0)
return; //未進(jìn)行詞法分析
m_nCur=0; //m_nCur用語(yǔ)指示詞法分析結(jié)果表中單詞的位置
y_ChengXu(); //從 程序 開(kāi)始
return;
}
/*================================================================
* 函數(shù)名: y_ChengXu
* 功能描述: 分析整個(gè)程序 (protected)
* 返回值: bool
* 示例:
Program abc;
這里是程序體
.
================================================================*/
bool YFenXi::y_ChengXu() //程序
{
switch (m_cifa[m_nCur]->nType)
{
case 11: //從program開(kāi)始
break;
default:
m_nErrNo=3; //缺少關(guān)鍵字“ program ”!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++; //分析下一個(gè)單詞
switch (m_cifa[m_nCur]->nType)
{
case 1: //標(biāo)志符
break;
default:
m_nErrNo=4; //program 后缺少標(biāo)識(shí)符!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
switch (m_cifa[m_nCur]->nType)
{
case 41: //;
break;
default:
m_nErrNo=5; //缺少“ ; ”符號(hào)!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if (!y_ChengXuTi()) //分析程序體
return false;
switch (m_cifa[m_nCur]->nType)
{
case 43: //. (程序的最后一個(gè)符號(hào))
break;
default:
m_nErrNo=6; //缺少程序結(jié)束符“ . ”符號(hào)!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
switch (m_cifa[m_nCur]->nType)
{
case -1: //end of cifa
break;
default:
m_nErrNo=96; //源程序結(jié)束符 end. 后還有多余內(nèi)容!
m_nErrAddr=m_nCur;
return false;
}
m_nErrNo=0; //語(yǔ)法分析成功
m_nErrAddr=m_nCur;
return true;
}
/*================================================================
* 函數(shù)名: y_ChengXuTi
* 功能描述: 分析程序體 (protected)
* 返回值: bool
* 示例:
Integer x,y,z;
Real a,b; //變量聲明
const www=10;
function ab(Var m,n:Integer; t:Real); //過(guò)程聲明
Begin
t:=n+m;
If m>n then n:=m else t:=m;
While n<m do
Begin
n:=n+1
End
End;
Begin
這里是語(yǔ)句串
End
================================================================*/
bool YFenXi::y_ChengXuTi()
{
switch (m_cifa[m_nCur]->nType)
{
case 12: //function
case 9: //bool
case 8: //real
case 7: //integer
case 6: //const
case 10: //array
if (!y_ShengMingChuan()) //聲明串(用;隔開(kāi)的多個(gè)變量或過(guò)程聲明)
return false;
switch (m_cifa[m_nCur]->nType)
{
case 41: //;
break;
default:
m_nErrNo=5; //缺少“ ; ”符號(hào)!"
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
break;
case 14: //begin
break;
default:
m_nErrNo=7; //缺少《程序體》,應(yīng)為 begin,integer,real,procedure"
m_nErrAddr=m_nCur;
return false;
}
switch (m_cifa[m_nCur]->nType)
{
case 14: //begin
break;
default:
m_nErrNo=8; //缺少保留字“ begin ”!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if (!y_YuJuChuan()) //語(yǔ)句串
return false;
switch (m_cifa[m_nCur]->nType)
{
case 15: //end
break;
default:
m_nErrNo=10; //缺少保留字“ end ”!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
return true;
}
/*================================================================
* 函數(shù)名: y_ShengMingChuan
* 功能描述: 聲明串 用;隔開(kāi)的多個(gè)聲明(protected)
* 返回值: void
================================================================*/
bool YFenXi::y_ShengMingChuan()
{
if (!y_ShengMing())
return false;
while (m_cifa[m_nCur]->nType==41 && m_cifa[m_nCur+1]->nType!=14) //是; 不是begin
{
m_nCur++;
if (!y_ShengMing()) //遞歸調(diào)用
return false;
}
return true;
}
/*================================================================
* 函數(shù)名: y_ShengMing
* 功能描述: 聲明 (protected)
* 返回值: void
================================================================*/
bool YFenXi::y_ShengMing()
{
switch (m_cifa[m_nCur]->nType)
{
case 9: //bool
case 8: //real
case 7: //integer
case 10: //array
if (!y_BianLiangShengMing()) //變量聲明
return false;
break;
case 6: //const
if(!y_ChangLiangShengMing())
return false;
break;
case 12: //function
if (!y_HanShuShengMing()) //過(guò)程聲明
return false;
break;
default:
m_nErrNo=11; //缺少聲明(integer,real,procedure)
m_nErrAddr=m_nCur;
return false;
}
return true;
}
/*================================================================
* 函數(shù)名: y_BianliangShengMing
* 功能描述: 變量聲明 (protected)
* 返回值: void
* 示例: Integer x,y,z; array x[10,2], y[5,6];
================================================================*/
bool YFenXi::y_BianLiangShengMing()
{
if(m_cifa[m_nCur]->nType<7||m_cifa[m_nCur]->nType>10){
m_nErrNo=12; m_nErrAddr=m_nCur; return false;
}
if(m_cifa[m_nCur]->nType==10){//array
do{
m_nCur++; //id
if(m_cifa[m_nCur]->nType!=1){m_nErrNo=14; m_nErrAddr=m_nCur; return false;}
m_nCur++; //[
if(m_cifa[m_nCur]->nType!=47){m_nErrNo=47; m_nErrAddr=m_nCur; return false;}
do{//1,2,3
m_nCur++;
if(m_cifa[m_nCur]->nType!=2){m_nErrNo=49;m_nErrAddr=m_nCur;return false;}
m_nCur++;
}while(m_cifa[m_nCur]->nType==44);//]
if(m_cifa[m_nCur]->nType!=48){m_nErrNo=48; m_nErrAddr=m_nCur; return false;}
m_nCur++; //
}while(m_cifa[m_nCur]->nType==44); //,
}else{//integer,boolean,real
do{
m_nCur++;
if(m_cifa[m_nCur]->nType!=1){m_nErrNo=14; m_nErrAddr=m_nCur; return false;}
m_nCur++;
}while(m_cifa[m_nCur]->nType==44); //,
}
return true;
}
/*================================================================
* 函數(shù)名: y_ChangliangShengMing
* 功能描述: 變量聲明 (protected)
* 返回值: void
* 示例: const x=10,y=true,z=3.2;
================================================================*/
bool YFenXi::y_ChangLiangShengMing()
{
if(m_cifa[m_nCur]->nType!=6) { m_nErrNo=50; m_nErrAddr=m_nCur; return false;}
m_nCur++;
if(m_cifa[m_nCur]->nType==1){ //id
m_nCur++;
if(m_cifa[m_nCur]->nType==35){//=
m_nCur++;
if(m_cifa[m_nCur]->nType>=2&&m_cifa[m_nCur]->nType<=5){//值
}else{ m_nErrNo=43; m_nErrAddr=m_nCur; return false; }
}else{ m_nErrNo=42; m_nErrAddr=m_nCur; return false; }
}else{m_nErrNo=41; m_nErrAddr=m_nCur; return false; }
m_nCur++;
while (m_cifa[m_nCur]->nType==44) //44 , 分析用逗號(hào)隔開(kāi)的連續(xù)聲明的幾個(gè)變量
{
m_nCur++;
if(m_cifa[m_nCur]->nType==1){ //id
m_nCur++;
if(m_cifa[m_nCur]->nType==35){//=
m_nCur++;
if(m_cifa[m_nCur]->nType>=2&&m_cifa[m_nCur]->nType<=5){//值
}else{ m_nErrNo=43; m_nErrAddr=m_nCur; return false; }
}else{ m_nErrNo=42; m_nErrAddr=m_nCur; return false; }
}else{m_nErrNo=41; m_nErrAddr=m_nCur; return false; }
m_nCur++;
}
return true;
}
/*================================================================
* 函數(shù)名: y_HanShuShengMing
* 功能描述: 過(guò)程聲明 (protected)
* 返回值: void
* 示例:
function ab(形參);
這里是程序體
RETURN 標(biāo)識(shí)符;
================================================================*/
bool YFenXi::y_HanShuShengMing()
{
switch (m_cifa[m_nCur]->nType)
{
case 12: //function
break;
default:
m_nErrNo=15; //缺少保留字“ function ”!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
switch (m_cifa[m_nCur]->nType)
{
case 1: //id
break;
default:
m_nErrNo=13; //function 后缺少標(biāo)識(shí)符!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
if(m_cifa[m_nCur]->nType==45){//(
m_nCur++;
if(!y_BianLiangShengMing()) return false;
while(m_cifa[m_nCur]->nType==41){
m_nCur++;
if(!y_BianLiangShengMing()) return false;
}
}else{return false;}
if(m_cifa[m_nCur]->nType==46){//)
}else{return false;}
m_nCur++;
if (!y_ChengXuTi()) //程序體
return false;
//m_nCur++;
if(m_cifa[m_nCur]->nType==13){// return
m_nCur++;
if(m_cifa[m_nCur]->nType==1){// id
m_nCur++;
}else{m_nErrNo=45; m_nErrAddr=m_nCur; return false;}
}else{m_nErrNo=44; m_nErrAddr=m_nCur; return false;}
return true;
}
/*================================================================
* 函數(shù)名: y_YuJuChuan
* 功能描述: 語(yǔ)句串,用分號(hào)隔開(kāi)的多個(gè)語(yǔ)句 (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 YFenXi::y_YuJuChuan()
{
if (!y_YuJu())
return false;
while (m_cifa[m_nCur]->nType==41) //;
{
m_nCur++;
if (!y_YuJu())
return false;
}
return true;
}
/*================================================================
* 函數(shù)名: y_YuJu
* 功能描述: 語(yǔ)句 (protected)
* 返回值: void
================================================================*/
bool YFenXi::y_YuJu()
{
switch (m_cifa[m_nCur]->nType)
{
case 14: //begin 符合語(yǔ)句
if (!y_FuHeYuJu())
return false;
break;
case 1: //id 賦值, 函數(shù)語(yǔ)句
if(m_cifa[m_nCur+1]->nType==45){//(
if(!y_HanShuYuJu()) return false;
}else{
if (!y_FuZhiYuJu()) return false;
}
break;
case 16: //if
if (!y_IfYuJu())
return false;
break;
case 19: //while
if (!y_WhileYuJu())
return false;
break;
case 21: //for
if (!y_ForYuJu())
return false;
break;
case 23://repeat
if (!y_RepeatYuJu())
return false;
break;
case 25: //read
if (!y_ReadYuJu())
return false;
break;
case 26: //write
if (!y_WriteYuJu())
return false;
break;
default:
m_nErrNo=9; //缺少《語(yǔ)句》,應(yīng)為 begin,ID,if,while,call
m_nErrAddr=m_nCur;
return false;
}
return true;
}
/*================================================================
* 函數(shù)名: y_FuHeYuJu
* 功能描述: 復(fù)合語(yǔ)句 (protected)
* 返回值: void
================================================================*/
bool YFenXi::y_FuHeYuJu()
{
switch (m_cifa[m_nCur]->nType)
{
case 14: //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 15: //end
break;
default:
m_nErrNo=10; //"缺少保留字“ end ”!
m_nErrAddr=m_nCur;
return false;
}
m_nCur++;
return true;
}
/*================================================================
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -