我正在使用antlr v4(消除直接左递归)。
我的语法的非终端是:and
、or
、id
。
and
的优先级高于or
,并且两者都是关联的。
根据 Antlr4 参考,如果我把and
放在or
之前,它将具有更高的优先级。
所以我写了这个简单的语法:
expr : 'id'
| expr BINOP expr
;
BINOP: 'and'<assoc=left> //higher precedence
| 'or'<assoc=left> //lower precedence
;
但是当它解析字符串id and id or id and id
关联性是可以的,但是
优先级不行:((id and id) or id) and id
.
如果我BINOP
变成解析器规则:
binop: 'and'<assoc=left>
| 'or'<assoc=left>
;
关联性和优先级都无法正常工作:
id and (id or (id and id))
但是,当我在expr解析器规则中实现BINOP
时:
expr : 'id'
| expr 'and'<assoc=left> expr
| expr 'or'<assoc=left> expr
;
一切正常,我得到了所需的解析树:
(id and id) or (id and id)
我在谷歌上搜索了很多关于这个问题的信息,但我找不到任何东西。
如果有人能告诉我问题出在哪里以及如何
我可以通过为BINOP
制定单独的规则来获得正确的关联性和优先级吗?
谢谢你的时间。
assoc=left 是默认的,所以这里什么都不做。此外,优先级适用于替代级别,并且您已将两个运算符置于同一级别:
expr BINOP expr
之三