4 遞迴下降分析法
遞迴下降分析法是確定的自上而下分析法,這種分析法要求文法是 ll ( 1 )文法。它的基本思想是,對文法中的每個非終結符編寫乙個函式(或子程式),每個函式(或子程式)的功能是識別由該非終結符所表示的語法成分。由於描述語言的文法常常是遞迴定義的,因此相應的這組函式(或子程式)必然以相互遞迴的方式進行呼叫,所以將此種分析法稱為遞迴下降分析法。
構造遞迴下降分析程式時,每個函式名是相應的非終結符,函式體則是根據規則右部符號串的結構編寫。
(1 )當遇到終結符 a 時,則編寫語句
if (當前讀來的輸入符號 == a )讀下乙個輸入符號
(2 )當遇到非終結符 a 時,則編寫語句呼叫 a ()。
(3 )當遇到 a → ε 規則時,則編寫語句
if (當前讀來的輸入符號 ∉follow ( a )) error ()
(4 )當某個非終結符的規則有多個候選式時,按 ll ( 1 )文法的條件能唯一地選擇乙個候選式進行推導。
【例 4.9 】設有文法 g [ s ]:
s → a |∧| ( t )
t → t , s | s
試構造乙個識別該文法句子的遞迴下降分析程式。
分析 首先消去文法左遞迴,得到文法 g』 [ s ]:
s → a |∧| ( t )
t → st'
t' → , st' | ε
無左遞迴的文法不一定是 ll (1 )文法,根據 ll ( 1 )文法的判斷條件,對非終結符 s 和 t』 有
select ( s → a ) ∩select ( s →∧ ) =first ( a ) ∩first ( ∧ )= ∩ = ø
select ( s → a ) ∩select ( s → ( t )) =first ( a ) ∩first (( t ))= ∩ = ø
select ( s →∧ ) ∩select ( s → ( t )) =first ( ∧ ) ∩first (( t ))= ∩ = ø
select ( t' → , st' ) ∩select ( t' → ε ) =first (, st' ) ∩follow ( t' )= ∩ = ø
所以文法 g』 [ s ]是 ll ( 1 )文法。
對文法 g』 [ s ]可寫出相應的遞迴下降分析程式如下。
分析程式中函式 scaner ()的功能是讀進源程式的下乙個單詞符號並將它放在全程變數sym 中;函式 error ()是出錯處理程式。
main ()
s ()
elseerror ();
}t ()
t' ()
elseif ( sym ! =' ) ' ) error ();
}
上述主函式和 3 個函式合起來是所給文法的遞迴下降分析程式,可以對文法的任意乙個句子進行語法分析。
對這個例子,若採用擴充的 bnf 表示法改寫文法,得到 g″ [ s ]:
s → a |∧| ( t )
t → s
該文法是 ll ( 1 )文法,其遞迴下降分析程式中主函式和函式 s ()同上,對函式 t ()用while 語句描述如下:
t ()
}
另外,對於無左遞迴的算術表示式文法,其確定的自上而下的分析方法可以參考習題4.2 。由這些例子可以看出,遞迴下降分析法簡單、直觀,易於構造分析程式,但它對文法要求高,必須是 ll ( 1 )文法,同時由於遞迴呼叫較多,影響分析器的效率。 軟體構造實驗三 遞迴下降分析分析法
實驗目的 1 掌握自上而下語法分析的要求與特點。2 掌握遞迴下降語法分析的基本原理和方法。3 掌握相應資料結構的設計方法。實驗內容 用遞迴下降法編寫乙個語法分析程式,使之與詞法分析器結合,能夠根據語言的上下文無關文法,識別輸入的單詞序列是否文法的句子。實驗要求 對下列文法,用遞迴下降分析法對任意輸入...
(原創)自頂向下分析法 遞迴下降分析程式構造
題目 自頂向下分析法 遞迴下降分析程式構造 開發環境 vc6.0 include include 全域性變數 char exp 30 gra 30 prod 30 chexp int expsize 0,grasize 0,step 0 函式宣告 1 e tg 2 g tg tg 3 t fs 4 ...
編譯原理 遞迴下降分析法 c程式部分的分析
實驗三 語法分析程式實驗 專業 商軟2班 姓名 黃仲浩 學號 201506110166 一 實驗目的 編制乙個部分文法分析程式。二 實驗內容和要求 輸入 源程式字串 輸出 正確或者錯誤 三 實驗方法 步驟及結果測試 源程式名 遞迴下降分析.c 可執行程式名 遞迴下降分析.c 原理分析及流程圖 inc...