2014-03-03 44 views
2

我试图构造一个CFG的布尔运算符NAND .. 这是我到目前为止有:如何删除歧义上下文无关文法的NAND

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

问题是当输入为例如“假NAND假虚拟NAND(真正的NAND真)”

这显然是不明确的,因为根据派生可能有2个不同的分析树。

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

我想是左关联的非运算.. 也就是说,如果输入的是NAND乙NAND C,我希望它是(A非B)NANDç

回答

2

你可以做以下

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

a NAND b NAND c情况下,你唯一能推导

boolexp(a NAND b) NAND boolterm(c) 
+0

的第一线,我还需要,, boolexp - > boolexp NAND boolterm | boolterm? – user2436815

+0

语法已经有了。交替'|'只是两个作品的简写,就像答案中一样。 – ibid

+0

@ibid:我忘了它,并在评论后添加为编辑。 – hivert