为什么我不能在Antlr v4中具有优先级的运算符关联性?

时间:2013-10-17 18:03:22

标签: antlr antlr4

我正在使用antlr v4(消除了直接左递归)。

我的语法的非终端是:andorid

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设置单独的规则,我可以获得正确的关联性和优先级吗。

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

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

expr BINOP expr

泰尔