什么是运算符优先级解析?
运算符优先级解析也是一种自底向上解析,可用于一类称为运算符文法的语法。
如果文法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 | .> | .> | .> | |
+ | <. | .> | <. | .> |
* | <. | .> | .> | .> |
$ | <. | <. | <. |
运算符优先级解析的优点
- 易于执行。
运算符优先级解析的缺点
像减号这样的运算符可以是单目运算符或双目运算符。因此,此运算符在不同的语句中可以具有不同的优先级。
运算符优先级解析仅适用于一小类文法。
广告