學編譯原理時,會學到文法,老師在介紹完文法的相關定義後又介紹了文法的二義性,但是沒說到底是如何避免文法的二義性的。
這篇博文就是我的學習結果
文法的二義性:如果文法g中的某個句子存在不只一棵語法樹,則稱該句子是二義性的。如果文法含有二義性的句子,則稱該文法是二義性的。
我舉個例子,來說明文法的二義性及其避免方法:
有下面這個文法:
其推導過程如下:都用最左推導
a、s -> not s
-> not s and s
-> not p and s
-> not p and q
b、s -> s and s
-> not s and s
-> not p and s
-> not p and q
顯然這兩個推導過程不同,說明與兩個過程相對應的語法樹也不同,所以,此文法具有二義性。
那麼怎麼修改呢?
這就到了消除二義性的方法了:
1、人為規定其中的「not」,「and」,「or」的優先順序
依照此法,可將上述文法修改為:
s -> s or t | t
t -> t and f | f
f -> not f | (e) | p | q
2、第二種方法就是重寫文法
文中的文法例子**於:這個部落格是我在尋找方法的時候學習的,但是他寫的沒我的詳細,哈哈!
c 多繼承及其二義性
上面繼承關係中,b1類與b2類同時繼承自b類,c類繼承自b1類與b2類。所以當呼叫b類時,c 編譯器不知道b類成員變數等到底是 於b1還是b2類,會導致二義性,引起失敗。includeusing namespace std class b class b1 public b class b2 pub...
2 5 3 文法二義性的消除
1 不改變文法中原有的語法規則,僅加進一些語法的非形式規定。例如,對於上例文法 g e 不改變已有的 4 條規則,僅加進運算子的優先順序和結合規則,即 優先於 服從左結合。這樣,對於文法 g e 中的句子 i i i 只有唯一的一棵語法樹 見圖 2.6 從而避免了文法的二義性.2 構造乙個等價的無二...
編譯原理與編譯構造 二義文法的處理 語義
本文依舊來自記筆記相當勤快的七公尺八同學。向他表示真誠的感謝!在前面的內容中,我們已經知道,想要解決二義文法的問題,必須新增附加條件。例 e e e e e e i 注意一下下圖中的i0 第一行式子是e e,那個撇不一定能看得清 具體推導過程如圖 此時可以推得構造表,但是此時是會有衝突的。我們只能強...