區分模糊語法和非模糊語法
在瞭解模糊語法和非模糊語法的區別之前,讓我們先學習一下這些概念。
模糊語法
如果對於給定的輸入字串存在多個最左推導或多個最右推導或多個語法樹,則稱該語法為模糊語法。
如果語法不是模糊的,我們就稱之為非模糊語法。
如果語法存在歧義,則它對編譯器構造有利。
沒有方法可以自動檢測和消除歧義,但我們可以透過重寫整個語法來消除歧義。
示例
讓我們考慮一個具有如下產生式規則的語法:
E=I E=E+E E=E*E E=(E) E= ε|0|1|2|3……9
非模糊語法
如果語法不包含歧義,也就是說,對於給定的輸入字串,它不包含多個最左推導或多個最右推導或多個語法樹,則該語法可以是非模糊的。
示例
S -> AB A -> Aa / a B -> b
區別
模糊語法和非模糊語法的主要區別如下:
| 模糊語法 | 非模糊語法 |
|---|---|
| 它生成多於一顆語法樹(語法樹或推導樹)。 | 它恰好生成一顆語法樹(推導樹或語法樹)。 |
| 在這種型別的語法中,最左推導和最右推導表示不同的語法樹。 | 在這種型別的語法中,最左推導和最右推導表示相同的語法樹。 |
| 這種語法包含較少的非終結符。 | 這種語法包含較多的非終結符。 |
| 語法樹的長度較短。 | 語法樹的長度較長。 |
| 示例: S → S + S / S x S / id (模糊語法) | 示例: S → S + E / E E → E x F / F F → id (非模糊語法) |
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP