编译原理:文法及其二义性(判定及消除)
(請先看置頂博文)https://blog.csdn.net/GenuineMonster/article/details/104495419
學編譯原理時,會學到文法,老師在介紹完文法的相關定義后又介紹了文法的二義性,但是沒說到底是如何避免文法的二義性的。
這篇博文就是我的學習結果
文法的二義性:如果文法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、第二種方法就是重寫文法
文中的文法例子來源于:https://blog.csdn.net/chunjiekid/article/details/82319161,這個博客是我在尋找方法的時候學習的,但是他寫的沒我的詳細,哈哈!
總結
以上是生活随笔為你收集整理的编译原理:文法及其二义性(判定及消除)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Maven 系列 5:Maven 项目管
- 下一篇: 福瑞达和华熙生物是一家吗