什么是运算符优先级解析?


运算符优先级解析也是一种自底向上解析,可用于一类称为运算符文法的语法。

如果文法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+ 次浏览

启动你的职业生涯

通过完成课程获得认证

开始学习
广告