我对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());
}
答案 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