什么是OPG?
OPG代表运算符优先级语法。具有后一种属性的语法被称为运算符优先级语法。它是一个ε-free运算符语法,其中优先级关系<., =. 和.>是不相交的,即,如果存在a . > b,则b .> a将不存在。
示例1 - 验证以下语法是否为运算符语法。
E → E A E |(E)|id
A → +| − | *
解决方案
不,它不是运算符语法,因为它不满足运算符语法的属性2。
因为它在产生式E → E A E的右侧包含两个相邻的非终结符。
我们可以通过替换A的值将其转换为运算符语法
E → E A E.
E → E + E |E − E |E ∗ E |(E) | id.
示例2 - 检查以下语法是否为OPG
E → E + E|E ∗ E|(E)|id
解决方案
将产生式E → E + E的右侧与α a A β进行比较
Α | A | A | β |
E | + | E | ε |
并且进一步,A → γ b $与E → E + E进行比较。
A → | Γ | b | $ |
E → | E | + | E |
因此,应用规则(2),我们得到a <.b,这意味着。
+ <. +……………………………………….(1)
将E → E + E与α A b β进行比较
Α | Α | b | β |
E | E | + | E |
并且进一步A → γ a $与E → E + E进行比较。
A → | Γ | a | $ |
E → | E | + | E |
因此,应用规则(3),我们得到a .> b,这意味着
+ . > +………………………………(2)
从关系(1),我们有+ <. +
从关系(2),我们有+ . > +
∴优先级关系是模棱两可的,并且不是唯一的。因此,给定的运算符语法不是OPG。
示例3 - 检查以下语法是否为OPG
E → E + T|T
T → T ∗ F|F
F → (E)|id
解决方案
将E + T与α a A β进行比较。
Α | a | A | β |
E | + | T | ε |
∴ a = +,A = T并且进一步比较A → γ b $与T → T * F
A → | γ | b | $ |
T → | T | * | F |
∴ b = *
因此,应用规则(2),我们得到a <.b,这意味着。
+ <. +……………………………………….(1)
在产生式E → E + T中替换E → T,我们得到
E → T + T
将T + T与α A b β进行比较
Α | A | b | β |
Ε | T | + | T |
∴ b = +,A = T
进一步比较A → γ a $与T → T * F。
Α → | γ | a | $ |
Ε → | T | * | F |
因此,应用规则(3),我们得到a .> b,这意味着
+ . > +………………………………(2)
从关系(1), 我们有+ <. +
从关系(2), 我们有+ . > +
因此,这两种关系都表明乘法运算符(*)的优先级高于加法运算符(+)。
因此,不存在歧义。
因此,语法是OPG。