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

时间:2018-09-08 12:29:03

标签: 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                   
    | INTLIT                                
    ;

但它也适用于( 1 and 2 )。我只想表示整数(即仅适用于+ - * /)或布尔值(AND OR)的表达式。我该怎么办?

1 个答案:

答案 0 :(得分:1)

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

您可能会想将语法分为integerExpressionbooleanExpression之类的规则,当然可以创建以这种方式拒绝1 and 2的语法。但是这种方法使您的语法不必要地复杂,一旦您的语言变得更加强大,它就会达到极限。例如,当您引入变量时,如果且仅当a and ba都是布尔变量时,您才希望允许b,但是仅通过查看并不能告诉您表达方式。因此,在这种情况下(以及许多其他情况下),您仍然需要Java(或您使用的任何一种语言)代码来检查类型。

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