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

ANTLR4中的动态运算符优先级和关联性?,antlr4,Antlr4,我一直在研究antlr4语法的Z表示法(ISO UTF版本),该规范要求一个lex阶段,然后是一个“2阶段”解析。 您首先将其lex成一组名称(或DECORWORD)标记,然后根据规范解析器语法中的运算符模板规则解析生成的标记,替换适当的标记,最后解析新修改的标记流以获得AST 我已经完成了上面的工作,但是我不知道如何动态地设置解析器规则的优先级和关联性,所以解析树是错误的 运算符语法如下所示(数字优先): 我没有看到任何api来设置规则的关联性,所以我尝试使用语义谓词,比如: expressi

我一直在研究antlr4语法的Z表示法(ISO UTF版本),该规范要求一个lex阶段,然后是一个“2阶段”解析。 您首先将其lex成一组名称(或DECORWORD)标记,然后根据规范解析器语法中的运算符模板规则解析生成的标记,替换适当的标记,最后解析新修改的标记流以获得AST

我已经完成了上面的工作,但是我不知道如何动态地设置解析器规则的优先级和关联性,所以解析树是错误的

运算符语法如下所示(数字优先):

我没有看到任何api来设置规则的关联性,所以我尝试使用语义谓词,比如:

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

表达式:
:{ZSupport.isleftasociative()}?表达式i表达式
|{ZSupport.isRightAssociative()}?表达式I表达式
;
但我得到“以下规则集是相互左递归的[表达式]”


这可以做到吗?

我可以通过移动语义谓词来实现这一点:

expression:
: expression {ZSupport.isLeftAssociative()}? I expression
| <assoc=right> expression I expression
;
表达式:
:表达式{ZSupport.isleftasociative()}?我的表情
|


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

有关如何在ANTLR中指定关联性的讨论,请参见TDAR的第70页。
expression:
: {ZSupport.isLeftAssociative()}? expression i expression
| <assoc=right> {ZSupport.isRightAssociative()}? expression I expression
;
expression:
: expression {ZSupport.isLeftAssociative()}? I expression
| <assoc=right> expression I expression
;