如何消除NAND中的上下文免费语法中的歧义

时间:2014-03-03 14:48:10

标签: parsing compiler-construction context-free-grammar

我正在尝试为布尔运算符NAND构造CFG .. 这就是我到目前为止所做的:

boolexp --> boolexp NAND boolexp
boolexp --> (boolexp)
boolexp --> True | False

问题是当输入类似于“虚假NAND虚假NAND(True NAND True)”时

这显然是模棱两可的,因为根据推导,可以有2个不同的解析树。

如何消除这种歧义并重新设计我的CFG?

我希望NAND运算符是左关联的.. 也就是说,如果输入是A n和B n和C,我希望它是(A n和B)n和C

1 个答案:

答案 0 :(得分:2)

您可以执行以下操作

boolexp --> boolexp NAND boolterm
boolexp --> boolterm
boolterm --> (boolexp)
boolterm --> True | False

如果是a NAND b NAND c,您将获得唯一的推导

boolexp(a NAND b) NAND boolterm(c)