如何在ANTLR4中分离优先级和表达式

如何在ANTLR4中分离优先级和表达式,antlr4,Antlr4,我已经像这样指定了优先级和关联性: expr : LB expr RB | <assoc=right> (SUB | NOT) expr | expr op=(MULTI | DIV | MOD | AND) expr | expr op=(ADD | SUB | OR) expr | expr comparator expr | expr op=(ANDTHEN | ORELSE) expr

我已经像这样指定了优先级和关联性:

expr
    : LB expr RB
    | <assoc=right> (SUB | NOT) expr
    | expr op=(MULTI | DIV | MOD | AND) expr      
    | expr op=(ADD | SUB | OR) expr          
    | expr comparator expr    
    | expr op=(ANDTHEN | ORELSE) expr                   
    | INTLIT                                
    ;

但它也适用于1和2。我只想表示整数的表达式,即只处理+-*/或布尔AND or。我该怎么做呢?

这不是优先级问题,而是类型问题,因此应该由类型检查器处理

您可能会试图将语法分为integerExpression和booleanpression等规则,当然也可以创建一个这样拒绝1和2的语法。但是这种方法会使你的语法变得不必要的复杂,一旦你的语言变得更加强大,它就会达到极限。例如,当您引入变量时,您希望允许a和b当且仅当a和b都是布尔变量时,但仅通过查看表达式无法判断这一点。因此,在该场景和许多其他场景中,您将需要Java或您正在使用代码的任何语言来检查类型

因此,总之,您应该保持语法不变,并在类型检查器中拒绝1和2