遞迴下降分析法

2021-10-23 10:25:08 字數 1813 閱讀 8575

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...