遞迴下降子程式法

2021-06-05 12:31:15 字數 1835 閱讀 1492

1) 編寫文法、消除二義性

2) 消除左遞迴和提取左因子

改寫文法

3) 求非終結符的 first 集和 follow 集

4) 檢查是不是 ll(1) 文法

若不是 ll(1),說明文法的複雜性超過自頂向下方法的分析能力

5) 將 ll(1) 文法改寫為 ebnf, 並化簡

e → t e'        

e'→ + t e'|ε  

t → f t'        

t'→ * f t'|ε  

f → ( e )|id   

文法改為 ebnf

e → t e'

e' →

t → f t'

t' →

f → ( e )|id

化簡為e → t

t → f

f → ( e )|id

6) 按照 ebnf 編制語法圖,並化簡

(評:本步感覺並不需要,根據ebnf編寫子程式更直觀)

7) 按照語法圖,編寫程式演算法(

第6步不需要,根據ebnf編寫子程式更直觀)

為每個非終結符設定乙個子程式,按照語法圖編寫控制結構:

按照 first 集識別,如果後面非終結符可匯出為空,加上該非終結符的follow集

procedure exp;

begin

term; t的過程呼叫

while lookhead='+' do

begin 當前符號等於+時

match(『+』); 處理終結符+

term t的過程呼叫

endend; lookhead:當前符號

procedure term;

begin

factor; f的過程呼叫

while lookhead='*' then

begin 當前符號等於*時

match('*'); 處理終結符*

factor f的遞迴呼叫

endend;

procedure factor;

begin

if lookhead='(' then

begin 當前符號等於(

match('('); 處理終結符(

exp; e的遞迴呼叫

match(')'); 處理終結符)

endelse if lookhead=id then

match(id) 處理終結符id

else error 出錯處理

end主程式begin

lookhead:=nexttoken; 調詞法分析程式

exp e的過程呼叫

end

procedure match( t:token );

begin

if lookhead=t then

lookhead := nexttoken

else error; 出錯處理程式

end;

遞迴下降子程式

遞迴下降子程式 1 實驗目的 實現遞迴下降子程式的功能。2 語言描述 利用函式相互遞迴實現遞迴下降子程式的基礎功能。3 具體實現 include include include include include using namespace std char str 50 輸入要判斷的字串 int ...

編譯原理實驗(三) 遞迴下降子程式

對文法中的每個非終結符 語法成分 編寫乙個子程式,而子程式的 結構由相應非終結符的產生式右部所決定 文法 g e e e t t t t f f f e i 消除左遞迴 g e e te e te t ft t ft f e i 可以通過g e 文法構造遞迴下降分析器 文法g e 無左遞迴,e t ...

遞迴下降分析法

4 遞迴下降分析法 遞迴下降分析法是確定的自上而下分析法,這種分析法要求文法是 ll 1 文法。它的基本思想是,對文法中的每個非終結符編寫乙個函式 或子程式 每個函式 或子程式 的功能是識別由該非終結符所表示的語法成分。由於描述語言的文法常常是遞迴定義的,因此相應的這組函式 或子程式 必然以相互遞迴...