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

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

如果语法 G 具有以下属性,则它是运算符语法 -

  • 生产不应在其右侧包含 ϵ。

  • 生产的右侧不应有两个相邻的非终端。

Example1 - 验证以下语法是否是运算符语法。

E → EAE |(E)|id

A → +| - | *

解决方案

不,它不是运算符 Grammar,因为它不满足运算符 Grammar 的属性 2。

因为它在生产 E → EA E 的RHS 上包含两个相邻的非终结符。

我们可以通过将 A 的值代入 E → EA E 将其转换为算子语法。

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 的语句中,↑ 是右结合运算符

∴ 会变成 ↑ (b ↑ c)

∴ (b ↑ c) 将首先计算。

∴ ↑<. ↑

  • 标识符的优先级高于所有运算符和符号。

∴ θ <. id           $ <. id
id . > θ            id . > $
id . >)
(<. id.

  • $的优先级低于所有其他运算符和符号。

$ <.           ( id . > $
$ <. +         ). > $
$ <.*

Example2 - 构建语法的优先关系表。

E → E + E | E ∗ E/id

解决方案

运算符优先关系


ID+*$
ID
.>.>.>
+<。.><。.>
*<。.>.>.>
$<。<.<。

运算符优先级解析的优点

  • 可以访问执行。

运算符优先级解析的缺点

  • 像减号一样的运算符可以是一元或二元的。所以,这个运算符在不同的语句中可以有不同的优先级。

  • 运算符优先级解析仅适用于一小部分语法。