1

我正在使用 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))

但是,当我BINOP在 expr 解析器规则中实现时:

expr : 'id'
     | expr 'and'<assoc=left> expr
     | expr 'or'<assoc=left> expr
     ;

一切正常,我得到了所需的解析树:
(id and id) or (id and id)

我用谷歌搜索了很多关于这个问题的信息,但我找不到任何东西。

如果有人能告诉我问题出在哪里,我将非常高兴,以及如何
通过单独的规则来获得正确的关联性和优先级BINOP

谢谢你的时间。

4

1 回答 1

0

assoc=left 是默认的,所以这里什么都不做。此外,优先级适用于替代级别,并且您已将两个运算符置于同一级别:

expr BINOP expr

于 2013-10-17T20:12:22.893 回答