一、實驗目的:
利用c語言編制遞迴下降分析程式,並對簡單語言進行語法分析。
編制乙個遞迴下降分析程式,實現對詞法分析程式所提供的單詞序列的語法檢查和結構分析。
二、實驗原理
每個非終結符都對應乙個子程式。
該子程式根據下乙個輸入符號(select集)來確定按照哪乙個產生式進行處理,再根據該產生式的右端:
三、實驗要求說明
輸入單詞串,以「#」結束,如果是文法正確的句子,則輸出成功資訊,列印「success」,否則輸出「error」,並指出語法錯誤的型別及位置。
例如:輸入begin a:=9;x:=2*3;b:=a+x end #
輸出success
輸入x:=a+b*c end #
輸出『end' error
四、實驗步驟
1.待分析的語言的語法(參考p90)
2.將其改為文法表示,至少包含
–語句–條件
–表示式
3. 消除其左遞迴
4. 提取公共左因子
5. select集計算
6. ll(1)文法判斷
7. 遞迴下降分析程式
#include
#include
#include
char prog="a+b*20#",token[20];
char ch;
int syn;
int p;
int m;
int n;
int sum;
char *rwtab[6]=;
void e();
void t();
void e1();
void t1();
void f();
void error();
void scaner()
if(ch>='a' && ch<='z')
syn=10;p--;
for(n=0;n<6;n++)}}
else if(ch>='0' && ch<='9')
syn=11;p--;
}else
switch(ch)
else if(ch=='=')else
break;
case'>':m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='=')else
break;
case':':m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='=')else
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=25;token[0]=ch;break;
case';':syn=26;token[0]=ch;break;
case'(':syn=27;token[0]=ch;break;
case')':syn=28;token[0]=ch;break;
case'#':syn=0;token[0]=ch;break;
default:syn=-1;token[0]=ch;}}
void e()
void e1()
else if(syn==0 || syn==28)
else
error();
} void t1()
else if(syn==0 || syn==28 || syn==13)
else
error();
}void f()
else if(syn==10 || syn==11)
else
error();
}
void error()
int main()
遞迴下降語法分析
看了這篇部落格之後,總算搞明白了以前編譯原理沒搞懂的ll文法的意義。下面用這種方法實現乙個簡單的計算機器程式 其bnf正規化如下 operator operator operator operator expression 0,1,2,3,4,9 expression operator expres...
遞迴下降語法分析
一 實驗目的 利用c語言編制遞迴下降分析程式,並對簡單語言進行語法分析。編制乙個遞迴下降分析程式,實現對詞法分析程式所提供的單詞序列的語法檢查和結構分析。二 實驗原理 每個非終結符都對應乙個子程式。該子程式根據下乙個輸入符號 select集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...
遞迴下降語法分析實驗
通過設計 開發乙個高階語言的遞迴下降語法分析程式,實現 對詞法分析程式所提供的單詞序列進行語法檢查和結構分析,加 深對相關課堂教學內容的理解,提高語法分析方法的實踐能力。1 理解語法分析在編譯程式中的作用,以及它與詞法分析程式的 關係 2 掌握遞迴下降語法分析方法的主要原理 3 理解遞迴下降分析法對...