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 文法。它的基本思想是,對文法中的每個非終結符編寫乙個函式 或子程式 每個函式 或子程式 的功能是識別由該非終結符所表示的語法成分。由於描述語言的文法常常是遞迴定義的,因此相應的這組函式 或子程式 必然以相互遞迴...