資源簡介
用擴(kuò)充的BNF表示如下:
(1)::=beginend
(2)::={;}
(3)::=
(4)::=ID:=
(5)::={+|-}
(6)::={*|/}
(7)::=ID| NUM|()

代碼片段和文件信息
#include
#include
#include
using?namespace?std;
char?prog[80];//緩沖區(qū)
int?p=0;//緩沖區(qū)prog的指針
char?token[8];//單詞
int?m=0;//單詞token的指針
char?ch;//需要分析的字符
int?syn=0;//單詞的種別碼
int?sum=0;//計(jì)算整數(shù)
int?n=0;//計(jì)數(shù)器
int?kk=0;
char?*rwtab[6]={“begin““if““then““while““do““end“};//關(guān)鍵字
void?scaner();//掃描函數(shù)
void?factor();//因子
void?term();//項(xiàng)
void?expression();//表達(dá)式
void?statement();//語句
void?yucu();//語句串
void?lrparser();//語法分析
//掃描函數(shù)
void?scaner()
{
for(n=0;n<8;n++)?token[n]=NULL;
????ch=prog[p++];
????while(ch==‘?‘)
????????ch=prog[p++];
if?((ch>=‘A‘&&ch<=‘Z‘)||(ch>=‘a(chǎn)‘&&ch<=‘z‘))
{
m=0;
while?((ch>=‘A‘&&ch<=‘Z‘)||(ch>=‘a(chǎn)‘&&ch<=‘z‘)||(ch>=‘0‘&&ch<=‘9‘))
{
token[m++]=ch;//將當(dāng)前字符存入單詞
ch=prog[p++];//取下一個(gè)
}
token[m++]=‘\0‘;//結(jié)束符
p--;//指針歸位
syn=10;//假定是變量
for?(n=0;n<6;n++)
{
if?(strcmp(tokenrwtab[n])==0)
{
syn=n+1;//關(guān)鍵字!
break;
}
}
}
else
if(ch>=‘0‘&&ch<=‘9‘)
{
sum=0;
while?(ch>=‘0‘&&ch<=‘9‘)
{
sum=sum*10+ch-‘0‘;//計(jì)算數(shù)字
ch=prog[p++];
}
p--;//指針歸位
syn=11;//是數(shù)字!
}
else
switch?(ch)
{
case‘>‘?:
m=0;
token[m++]=ch;
ch=prog[p++];
if?(ch==‘=‘)
{
syn=24;//是“>=”
token[m++]=ch;//將“=”存入單詞
}
else
{
syn=23;//是“>”
p--;//指針歸位
}
break;
case‘<‘:
m=0;
token[m++]=ch;
ch=prog[p++];
if?(ch==‘>‘)
{
syn=21;//是“<>”
token[m++]=ch;//將“>”存入單詞
}
else
{
if?(ch==‘=‘)
{
syn=22;//是“<=”
token[m++]=ch;//將“=”存入單詞
}
else
{
syn=20;//是“<”
p--;//指針歸位
}
}
break;
case‘:‘:
m=0;
token[m++]=ch;
ch=prog[p++];
if?(ch==‘=‘)
{
syn=18;
token[m++]=ch;
}?
else
{
syn=17;
p--;
}
break;
case‘-‘:
syn=13;
token[0]=ch;
break;
case‘+‘:
syn=14;
token[0]=ch;
break;
case‘*‘:
syn=15;
token[0]=ch;
break;
case‘/‘:
syn=16;
token[0]=ch;
break;
case‘;‘:
syn=26;
token[0]=ch;
break;
case‘(‘:
syn=28;
token[0]=ch;
break;
case‘)‘:
syn=27;
token[0]=ch;
break;
case‘#‘:
syn=0;
token[0]=ch;
break;
default:syn=-1;
}
}
//因子
void?factor()
{?if(syn==10||syn==11)
????????scaner();?//為標(biāo)識符或整常數(shù)時(shí),讀下一個(gè)單詞符號
????else?if(syn==27)
????{
????????scaner();
????????expression();
????????if(syn==28)
????????????scaner();
????????else
????????{
????????????printf(“?‘)‘?錯(cuò)誤\n“);
????????????kk=1;
????????}
????}
????else
????{
????????printf(“表達(dá)式錯(cuò)誤\n“);
????????kk=1;
????}
?
//問題1---補(bǔ)充程序代碼
return;
}
//項(xiàng)
void?term()
{?
factor();
while(syn==15||syn==16)
{
scaner();
factor();
}
return;
}
//表達(dá)式
void?expression()
{?
??term();
????while
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件?????117248??2014-04-23?19:18??編譯原理?遞歸\實(shí)驗(yàn)2-1?語法分析-遞歸下降分析法.doc
?????文件???????4308??2014-04-23?09:22??編譯原理?遞歸\遞歸.cpp
?????目錄??????????0??2014-04-23?20:07??編譯原理?遞歸
-----------?---------??----------?-----??----
???????????????121556????????????????????3
評論
共有 條評論