ANTLR4中的动态运算符优先级和关联性?

时间:2017-03-14 21:11:51

标签: antlr4

我一直在研究Z Notation(ISO UTF版本)的antlr4语法,规范要求lex阶段,然后是“2阶段”解析。 首先将它变成一堆NAME(或DECORWORD)标记,然后根据spec的解析器语法中的operatorTemplate规则解析生成的标记,替换相应的标记,然后最终解析新修改的标记流以获取AST。

我有上述工作,但我无法弄清楚如何动态设置解析器规则的优先级和关联性,因此解析树是错误的。

运算符语法看起来像(数字是优先的):

-generic 5 rightassoc (_ → _)
-function 65 rightassoc (_ ◁ _)

我没有看到任何API在规则上设置关联性,所以我尝试使用语义谓词,例如:

expression:
: {ZSupport.isLeftAssociative()}? expression I expression
| <assoc=right> expression i expression
;

expression:
: {ZSupport.isLeftAssociative()}? expression i expression
| <assoc=right> {ZSupport.isRightAssociative()}? expression I expression
;

然后我得到“以下几套规则是相互左递归的[表达式]”

可以这样做吗?

1 个答案:

答案 0 :(得分:0)

我能够通过移动语义谓词来实现这一目标:

expression:
: expression {ZSupport.isLeftAssociative()}? I expression
| <assoc=right> expression I expression
;

我的印象是,根据这个讨论,这不会起作用: https://stackoverflow.com/a/23677069/7711235

...但它似乎在我的所有测试用例中都能正常工作......