編譯原理 文法及其二義性(判定及消除)

2021-09-13 14:51:34 字數 696 閱讀 5397

學編譯原理時,會學到文法,老師在介紹完文法的相關定義後又介紹了文法的二義性,但是沒說到底是如何避免文法的二義性的。

這篇博文就是我的學習結果

文法的二義性:如果文法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,那個撇不一定能看得清 具體推導過程如圖 此時可以推得構造表,但是此時是會有衝突的。我們只能強...