什麼是運算子優先順序解析?


運算子優先順序解析也是一種自底向上解析,可用於一類稱為運算子文法的語法。

如果文法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 <. qp的優先順序低於q。
                   p >. qp的優先順序高於q。
                   p =. qp的優先順序等於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
.>.>.>
+<..><..>
*<..>.>.>
$<.<.<.

運算子優先順序解析的優點

  • 易於執行。

運算子優先順序解析的缺點

  • 像減號這樣的運算子可以是單目運算子或雙目運算子。因此,此運算子在不同的語句中可以具有不同的優先順序。

  • 運算子優先順序解析僅適用於一小類文法。

更新於:2021年10月29日

10K+ 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告