使上下文无关语法不含糊

时间:2016-06-27 07:03:14

标签: grammar context-free-grammar

本周我有一个测试。布尔语句有以下语法:

B -> B and B | not B | (B) | id 

B是非终端,终端为:andnot()id

这个语法含糊不清。我需要重新编写它并创建一个没有模糊且没有左递归的等效语法,这样not具有高优先级,'和'与左边相关联。

我试图自己做:我的开头是:

B -> not B' | ( B' | id B' 

但我认为这是错误的,而且我真的被困了很长时间。

2 个答案:

答案 0 :(得分:2)

使用更多的非终端允许在所有运营商上设置优先级(我希望我得到你正确使用的符号)。

这是为了得到从右到左的关联性:id和id和id被解析为id和[id and id]

B -> NotExpr | NotExpr and B
NotExpr -> PrimaryExpr | not NotExpr
PrimaryExpr -> id | (B)

这是为了得到从左到右的关联性:和id和id和id被解析为[id和id]和id

B -> NotExpr | B and NotExpr
NotExpr -> PrimaryExpr | not NotExpr
PrimaryExpr -> id | (B)

答案 1 :(得分:0)

另一种方法可能如下(编辑后,感谢@Peter):

B  -> not B | B'
B' -> ( B ) | B' and B | id