引言:語法分析–自上而下分析部分內容顧名思義,自上而下就是從文法的開始符號出發,向下推導,推出句子。
其中,自上而下分析方法不允許文法含有任何左遞迴。 為構造不帶回溯的自上而下分析演算法,首先要消除文法的坐遞迴性,並找出克服回溯的充分必要條件。下面討論消除左遞迴和克服回溯。
左遞迴的消除
直接消除產生式中的左遞迴是比較容易的。假定關於非終結符p的規則為
p→pα | β
其中,β不以p開頭。那麼,我們可以把p的規則改寫為如下的非直接左遞迴形式:
p→βp′
p′→αp′ | ε (ε為空字)(4.2)
這種形式和原來的形式等價的,也就是說,從p推出的符號串是相同的。
舉個例子:
例4.2有文法:
e→e+t | t
t→t * f | f
f→(e ) | i
經消去直接左遞迴後變成:
e→t e′
e′→+ t e′ | ε
t→f t′
t′→* f t′ | ε
f→(e ) | i
消除回溯、提左因子
構造有效的自上而下分析器,必須消除回溯。為了消除回溯就必須保證:對文法的任何非終結符,當它要去匹配輸入串時,能夠根據它所面臨的輸入符號準確地指派它的乙個候選去執行任務,並且此候選的工作結果應是確信無疑的。也就是說,若此候選獲得成功匹配,那麼,這種匹配絕不會是虛假的;若此候選無法完成匹配任務,則任何其它候選也肯定無法完成。
如何把乙個文法改造成任何非終結符的所有候選首符集亮亮不相交呢?其辦法是提取公共左因子。
例如,假定關於a的規則是
a → δβ₁ | δβ₂ | …|δβn | ε | γ₁ | γ₂ | … γm (其中,每個γ不以δ開頭)
那麼,可以把這些規則寫成
a → δ( β₁ | β₂ | …| βn | ε) | γ₁ | γ₂ | … γm
a → δa′ | γ₁ | γ₂ | … γm
a′ → β₁ | β₂ | βn | ε(4.3)
經過反覆提取左因子,就能夠把每個非終結符的所有候選首符集變成為兩兩不相交。
例題
有下列文法:
a → ad
a → aac
a → bd
b → ac
b → d
消除左遞迴(間接左遞迴)、消除回溯。
解: ①合併
a → ad | aac | bd
b → ac | d
②消除左遞迴
a → acd|dd………………….參照4.2: cd為α dd為β
a → dda′
a′ → cda′ | ε ……………………………………解題須得出的結果1
③消除回溯
a → ad| aac|dda′…………………….參照4.3: d為β₁ ac 為β₂ dda′為γ₁
a →a(d | aac) | dda′
a → af | dda′ …………………………………解題須得出的結果2
f → d | ac ……………………………………..解題須得出的結果3
其他章節:
編譯原理 消除左遞迴
乙個文法含有下列形式的產生式之一時 1 a a a vn,v 2 a b b a a b vn,v 則稱該文法是左遞迴的。乙個文法g 若存在 p經過一次或多次推導得到 pa 即能推導出以 p開頭的式子 則稱 g是左遞迴的。然而,乙個文法是左遞迴時,不能採取自頂向下分析法。左遞迴分為直接左遞迴和間接左...
編譯原理 消除左遞迴
乙個文法含有下列形式的產生式之一時 1 a a a vn,v 2 a b b a a b vn,v 則稱該文法是左遞迴的。然而,乙個文法是左遞迴時,不能採取自頂向下分析法。消除左遞迴方法有 a 把直接左遞迴改寫為右遞迴 設有文法產生式 a a 其中 非空,不以a打頭。可寫為 a a a a 一般情況...
語法分析之左遞迴消除一
一 什麼是左遞迴 在電腦科學裡面,左遞迴是一種遞迴的特殊狀況。在上下文無關文法內裡的說法,若乙個非終端符號 non terminal r有任何直接的文法規則或者通過多個文法規則,推導出的句型 sentential form 其中最左邊的符號又會出現r,則我們說這個非終端符號r是左遞迴的。即形如 r ...