文法的左遞迴性和回溯的消除

2021-10-23 10:01:45 字數 2169 閱讀 3803

1. 文法左遞迴的消除

當乙個文法是左遞迴文法時,採用自上而下分析法會使分析過程進入無窮迴圈之中。文法左遞迴是指文法中的某個非終結符 a 存在推導 a ⇒+ aα ,而自上而下分析法是施行最左推導,即每次替換都是當前句型中的最左非終結符,當試圖用非終結符 a 去匹配輸入串時,結果使當前句型的最左非終結符仍然為 a ,也就是說,在沒有讀進任何輸入符號的情況下,又重新要求 a 去進行新的匹配,於是造成無窮迴圈。所以採用自上而下分析法進行語法分析需要消除文法的左遞迴性。

對含直接左遞迴的規則進行等價變換,消除左遞迴。

(1 )引進乙個新的非終結符,把含左遞迴的規則改寫成右遞迴。

設關於非終結符 a 的直接左遞迴的規則為

a → aα | β

其中 α ,β 是任意的符號串,且 β 不以 a開頭,對 a 的規則可改寫成如下右遞迴形式:

a → β a'

a' → αa' | ε

改寫以後的形式和原來形式是等價的。也就是說,從 a 推出的符號串的集合是相同的。

一般情況下,設文法中關於 a 的規則為

a → aα 1 | aα 2 | … | aα m | β 1 | β 2 | … | β n
其中每個 α 都不等於 ε ,而每個 β 都不以 a 開頭,消除直接左遞迴後改寫為

a → β 1 a' | β 2 a' | … | β n a'

a' → α 1 a' | α 2 a' | … | α m a' | ε

【例 4.2 】設有文法 g [ e ]:

e → e + t | e - t | t

t → t * f | t / f | f

f → ( e ) | id

消去非終結符 e , t 的直接左遞迴後,文法 g [ e ]改寫為

e → te'

e' →+ te' |- te' | ε

t → ft'

t' → * ft' | / ft' | ε

f → ( e ) | id

【例 4.3 】設有文法 g [ a ]:

a → ac | aad | bd | e
消去直接左遞迴後文法 g [ a ]改寫為

a → bda' | ea'

a' → ca' | ada' | ε

(2 )採用擴充 bnf 表示法改寫含直接左遞迴的規則。

在擴充的 bnf 表示中,有如下約定:

① 使用花括號表示符號串 α 的出現可 0 次或多次,即表示 α* 。

例如,定義識別符號的文法《識別符號》 → l | 《識別符號》 l | 《識別符號》d ,使用擴充 bnf 表示可改寫成《識別符號》 → l 形式。

② 使用方括號[ α ]表示 α 的出現可有可無,它用來表示可供選擇的符號串。例如,定義 c 語

言中條件語句的文法是

《條件語句》 →if 《布林表示式》《語句》 |if 《布林表示式》《語句》; else 《語句》

用擴充 bnf 表示可改寫成如下形式:

《條件語句》 →if 《布林表示式》《語句》[; else 《語句》]

③ 使用圓括號可在規則中提取因子。例如

a → xα 1 | xα 2 | … | xα m 可寫為 a → x ( α 1 | α 2 | … | αm )

【例 4.4 】對例 4.2 中文法用擴充 bnf 表示法對其進行改寫。

分析 規則 e → e + t | e - t | t 和 t → t * f | t / f | f 表示了 e 所生成的符號串由 t 開頭且後跟 0 個或多個 + t 或 - t ; t 所生成的符號串由 f 開頭且後面跟 0 個或多個 * f或/ f ,所以原文法可改寫成如下形式:

e → t 

t → f

f → ( e ) | id

【例 4.5 】對例 4.3 中文法用擴充 bnf 表示法對其進行改寫。

分析 規則 a → ac | aad | bd | e 表示了 a 所生成的符號串是以 bd 或 e 開頭,後面跟 0個或多個 c 或 ad ,所以原文法可以改寫成如下形式:

a → ( bd | e )

消除文法左遞迴的演算法

1 typedef struct pp 6 typedef struct gg 文法g由多條產生式組成,出現在產生式左部的非終結符,會指向乙個p文法陣列,每乙個陣列元素對應乙個程式的右部,這樣的結構顯然是對文法進行了壓縮的 1 掃瞄文法,先將間接做遞迴轉換成直接左遞迴 2 借助如下公式,消除直接左遞...

2 3 5 遞迴規則與文法的遞迴性

1.遞迴規則 所謂遞迴規則,是指在規則的左部和右部具有相同非終結符的規則。如果文法中有規則 a a 稱為規則左遞迴。如果文法中有規則 a a 稱為規則右遞迴。如果文法中有規則 a a 稱為規則遞迴。2.文法的遞迴性 文法的遞迴性是指對文法中任一非終結符,若能建立乙個推導過程,在推導所得的符號串 中又...

編譯原理 三 消除文法的左遞迴

對於任意上下文無關的文法消除左遞迴形如p p 可以通過直接消除轉化為 p p p p 有時候雖然形式上產生式沒有遞迴,但是因為形成了環,所以導致進行閉包運算後出現左遞迴,如下 s qc c q rb br sa a 雖不具有左遞迴,但s q r都是左遞迴的,因為經過若干次推導有 消除左遞迴演算法 f...