什麼是運算子優先順序解析?
運算子優先順序解析也是一種自底向上解析,可用於一類稱為運算子文法的語法。
如果文法G具有以下性質,則它是運算子文法:
產生式右邊不能包含ϵ。
產生式右邊不能有兩個相鄰的非終結符。
示例1 − 驗證以下文法是否是運算子文法。
E → E A E |(E)|id
A → +| − | ∗
解答
不,它不是運算子文法,因為它不滿足運算子文法的性質2。
因為它在產生式E → E A E的右邊包含兩個相鄰的非終結符。
我們可以透過在E → E A E中替換A的值將其轉換為運算子文法。
E → E + E |E − E |E * E |(E) | id。
運算子優先順序關係
終端對之間存在三種優先順序關係。
關係 | 含義 |
---|---|
p <. q | p的優先順序低於q。 |
p >. q | p的優先順序高於q。 |
p =. q | p的優先順序等於q。 |
根據這些優先順序關係,我們可以決定哪些操作將首先執行或解析。
結合性和優先順序規則
- 如果運算子具有不同的優先順序
由於*的優先順序高於+
示例−
在語句a + b * c中
∴ + <. *
在語句a * b + c中
∴ ∗ . > +
- 如果運算子具有相同的優先順序,則使用結合規則。
(a) 示例 減號;在語句a + b + c中,+運算子具有相同的優先順序。
由於'+'在a + b + c中是左結合的
∴ (a + b)將首先計算,然後將其新增到c。
即,(a + b) + c
+ .> +
類似地,'*'在a * b * c中是左結合的
(b) 示例 − 在語句a ↑ b ↑ c中,↑是右結合運算子
∴ 它將變成a ↑ (b ↑ c)
∴ (b ↑ c)將首先計算。
∴ ↑<. ↑
- 識別符號的優先順序高於所有運算子和符號。
∴ θ <. id $ <. id id . > θ id . > $ id . >) (<. id.
- $的優先順序低於所有其他運算子和符號。
$ <. ( id . > $ $ <. + ). > $ $ <.*
示例2 − 為文法構造優先順序關係表。
E → E + E | E ∗ E/id
解答
運算子優先順序關係
Id | + | * | $ | |
Id | .> | .> | .> | |
+ | <. | .> | <. | .> |
* | <. | .> | .> | .> |
$ | <. | <. | <. |
運算子優先順序解析的優點
- 易於執行。
運算子優先順序解析的缺點
像減號這樣的運算子可以是單目運算子或雙目運算子。因此,此運算子在不同的語句中可以具有不同的優先順序。
運算子優先順序解析僅適用於一小類文法。
廣告