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
我是 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