antlr 语法,在复杂表达式中强制先除后乘

antlr grammar that enforces division before multiplication in a complex expression

我是 antlr 的新手。我已经编写了下面的语法来执行一些算术表达式,例如 2+3*3/2*2。但是,我得到的不是 11,而是 4.25。当然,这证实了表达式是从右到左求值的。任何人都可以帮助我使用下面的语法,这样我至少可以得到 11 作为我的答案。换句话说,我想强制执行基本的 BODMAS 操作,即乘法前的除法。提前致谢。

My Grammar:

compute:   expr ; 
expr:   expr op=('*'|'/') expr          #mulDiv  
    |   expr op=('+'|'-') expr          #addSub 
    | INT                               #int
    ; 


My Visitor:
@Override public Double visitMulDiv(ExpressionParser.MulDivContext ctx) { 
        double left = visit(ctx.expr(0));  // get value of left expression  
        double right = visit(ctx.expr(1)); // get value of right expression
        if ( ctx.op.getText().equals("*")){
            return left * right;
        }else{
            return left / right; 
        }   
    }
@Override public Double visitAddSub(ExpressionParser.AddSubContext ctx) { 
        double left = visit(ctx.expr(0));  // get value of left expression  
        double right = visit(ctx.expr(1)); // get value of right expression
        if ( ctx.op.getText().equals("+")){
            return left + right;
        }else{
            return left - right; 
        }   
    }
@Override public Double visitInt(ExpressionParser.IntContext ctx) { 
        return Double.valueOf(ctx.INT().getText());
    }

乘法前的除法可能是这样的:

expr : expr '/' expr             #div
     | expr '*' expr             #mul  
     | expr op=('+'|'-') expr    #addSub 
     | INT                       #int
     ; 

我已经能够解决问题了。这是满足我需要的语法。

expr: expr '/' expr                                 #div
| expr '*' expr                                     #mul 
| expr '-' expr                                     #sub
| expr '+' expr                                     #add