(請先看置頂博文)本博打開方式,請詳讀_liO_Oil的博客-CSDN博客_怎么把androidstudio卸載干凈
學編譯原理時,會學到文法,老師在介紹完文法的相關定義后又介紹了文法的二義性,但是沒說到底是如何避免文法的二義性的。
這篇博文就是我的學習結果
文法的二義性:如果文法G中的某個句子存在不只一棵語法樹,則稱該句子是二義性的。如果文法含有二義性的句子,則稱該文法是二義性的。
我舉個例子,來說明文法的二義性及其避免方法:
有下面這個文法:
S - >S and S | S or S | not S | p | q | (S)
那么要是得到 not p and q:
其推導過程如下:都用最左推導
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、第二種方法就是重寫文法
文中的文法例子來源于:如何消除文法的二義性_dianaaaaa的博客-CSDN博客_消除二義性,這個博客是我在尋找方法的時候學習的,但是他寫的沒我的詳細,哈哈!