本周我有一个测试。布尔语句有以下语法:
B -> B and B | not B | (B) | id
B
是非终端,终端为:and
,not
,(
,)
,id
这个语法含糊不清。我需要重新编写它并创建一个没有模糊且没有左递归的等效语法,这样not
具有高优先级,'和'与左边相关联。
我试图自己做:我的开头是:
B -> not B' | ( B' | id B'
但我认为这是错误的,而且我真的被困了很长时间。
答案 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