对于具有 let 和 addition 的表达式语言,什么是与以下歧义语法等效的歧义语法?
E⇒让id = E中的E
E⇒E + E
E⇒数字
应该解决歧义,以便:
使用花括号显示子表达式的分组,以下内容说明了如何解释表达式:
num + num + num
=> { num + num } + num
let id = num in num + num
=> let id = num in { num + num }
num + let id = num in num
=> num + { let id = num in num }
答案 0 :(得分:2)
考虑表达式
ggplot(mydata) + stat_density(geom="line",size=0.8,
position = "identity", aes(x=value, color=from)) +
scale_colour_manual(name="Type", values=colo) +
theme_bw()
E1 + E2
的格式不能为E1
,因为必须将let ID = E3
解析为let ID = E3 + E2
。此限制是递归的:它也不能具有let ID = (E3 + E2)
的形式。
E4 + let ID = E3
可以采用E2
的形式,但是不能采用let ID = E3
的形式(因为E3 + E4
必须解析为E1 + E3 + E4
)。只有(E1 + E3) + E4
的格式为E1
。
将这些限制转换为BNF是直截了当(但重复)的:
E3 + E4
要使模式更清晰,我们可以添加Expr ⇒ Sum
Sum ⇒ SumNoLet '+' Atom
| Atom
SumNoLet ⇒ SumNoLet '+' AtomNoLet
| AtomNoLet
AtomNoLet ⇒ num
| id
| '(' Expr ')'
Atom ⇒ AtomNoLet
| 'let' id '=' Expr
运算符:
*
可以使用优先级声明在bison(或其他类似的解析器生成器)中实现此功能。但是,优先级解决方案很难推理,并且可能难以融入更复杂的语法中。