在复数表达式中乘法之前强制除法的antlr语法

时间:2016-05-03 18:16:58

标签: antlr4

我对antlr有点新意。我编写了下面的语法来执行一些算术表达式,如2 + 3 * 3/2 * 2。但是,我得到4.25而不是11。当然,这证实了表达式是从右到左进行评估的。任何人都可以帮助我下面的语法,这样我至少可以得到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());
    }

2 个答案:

答案 0 :(得分:1)

乘法之前的除法可能会这样:

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

答案 1 :(得分:0)

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

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