gpt4 book ai didi

java - ANTLR计算器操作优先级

转载 作者:行者123 更新时间:2023-12-02 03:25:39 32 4
gpt4 key购买 nike

你好,我会使用 ANTLR 制作一个简单的计算器示例但操作(/、*、-、+)优先级有问题我的代码给他们相同的优先级,我需要优先考虑用于乘法和除法

这是语法:

grammar Calc;       

start : expr EOF;

expr: expr op expr # binaryOp
| Num # num
;

op : '+'
| '-'
| '/'
| '*'
;

Num : [0-9]+;
<小时/>

这是java代码:

import org.antlr.v4.runtime.*;

import org.antlr.v4.runtime.tree.*;


public class Calc{
public static void main(String args[])throws Exception{

ANTLRFileStream str = new ANTLRFileStream(args[0]);

CalcLexer lex = new CalcLexer(str);

CommonTokenStream tok = new CommonTokenStream(lex);

CalcParser parser = new CalcParser(tok);

ParseTree tree = parser.start();

System.out.println(new MyVisitor().visit(tree));
}
}

class MyVisitor extends CalcBaseVisitor<Integer>{

@Override
public Integer visitStart(CalcParser.StartContext ctx) {
return visit(ctx.expr());
}

@Override
public Integer visitBinaryOp(CalcParser.BinaryOpContext ctx) {
int lhs = visit(ctx.expr(0));
int rhs = visit(ctx.expr(1));

String op = ctx.op().getText();
int res = 0;

if (op.equals("+")){
res = lhs + rhs;
}else if (op.equals("-")){
res = lhs - rhs;
}else if (op.equals("/")){
res = lhs / rhs;
}else if (op.equals("*")){
res = lhs * rhs;
}

return res;
}

@Override
public Integer visitNum(CalcParser.NumContext ctx) {
return Integer.parseInt(ctx.Num().getText());

}


}
<小时/>

希望能帮到我谢谢

最佳答案

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

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

mul_op
: '/'
| '*'
;

add_op
: '+'
| '-'
;

关于java - ANTLR计算器操作优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38946308/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com