Java ANTLR计算器操作优先级

Java ANTLR计算器操作优先级,java,antlr,Java,Antlr,您好,我将使用ANTLR制作一个简单的计算器示例 但在操作(/,*,-,+)优先级方面存在问题 我的代码给他们同样的优先级,我需要做一个最高优先级 乘法和除法 这是语法: 这是java代码: import org.antlr.v4.runtime.*; 导入org.antlr.v4.runtime.tree.*; 公共类计算{ 公共静态void main(字符串args[])引发异常{ ANTLRFileStream str=新的ANTLRFileStream(args[0]); CalcLe

您好,我将使用ANTLR制作一个简单的计算器示例 但在操作(/,*,-,+)优先级方面存在问题 我的代码给他们同样的优先级,我需要做一个最高优先级 乘法和除法

这是语法:
这是java代码:
import org.antlr.v4.runtime.*;
导入org.antlr.v4.runtime.tree.*;
公共类计算{
公共静态void main(字符串args[])引发异常{
ANTLRFileStream str=新的ANTLRFileStream(args[0]);
CalcLexer-lex=新的CalcLexer(str);
CommonTokenStream tok=新的CommonTokenStream(lex);
CalcParser parser=新的CalcParser(tok);
ParseTree=parser.start();
System.out.println(新的MyVisitor().visit(树));
}
}
类MyVisitor扩展了CalcBaseVisitor{
@凌驾
公共整数访问开始(CalcParser.StartContext ctx){
回访(ctx.expr());
}
@凌驾
公共整数visitBinaryOp(CalcParser.BinaryOpContext ctx){
int lhs=访问(ctx.expr(0));
int rhs=访问(ctx.expr(1));
字符串op=ctx.op().getText();
int res=0;
if(op.equals(“+”)){
res=左侧+右侧;
}else if(op.equals(“-”)){
res=左侧-右侧;
}else if(op.equals(“/”){
res=左侧/右侧;
}else if(op.equals(“*”)){
res=左侧*右侧;
}
返回res;
}
@凌驾
公共整数visitNum(CalcParser.NumContext ctx){
返回Integer.parseInt(ctx.Num().getText());
}
}

我希望能帮助我
谢谢

将乘除运算符放在其他两个运算符之前:

expr
 : expr mul_op expr   # mulExpr
 | expr add_op expr   # addExpr
 | Num                # num
 ;

mul_op
 : '/'
 | '*'
 ;

add_op
 : '+'
 | '-'
 ;

将乘除运算符置于其他两个运算符之前:

expr
 : expr mul_op expr   # mulExpr
 | expr add_op expr   # addExpr
 | Num                # num
 ;

mul_op
 : '/'
 | '*'
 ;

add_op
 : '+'
 | '-'
 ;

@MrAbdullah,不,你需要改变grammar@MrAbdullah,不,你需要修改语法
expr
 : expr mul_op expr   # mulExpr
 | expr add_op expr   # addExpr
 | Num                # num
 ;

mul_op
 : '/'
 | '*'
 ;

add_op
 : '+'
 | '-'
 ;