当然可以,只是贴上不同的标签。毕竟,替代
'(' expr ')'方法不是#opExpr:
expr : left=expr op=('*'|'/') right=expr #opExpr | left=expr op=('+'|'-') right=expr #opExpr | '(' expr ')'#parenExpr | atom=INT #atomExpr ;在访问者中,您将执行以下操作:
public class evalVisitor extends expressionsbaseVisitor<Integer> { @Override public Integer visitOpExpr(@NotNull expressionsParser.OpExprContext ctx) { int left = visit(ctx.left); int right = visit(ctx.right); String op = ctx.op.getText(); switch (op.charAt(0)) { case '*': return left * right; case '/': return left / right; case '+': return left + right; case '-': return left - right; default: throw new IllegalArgumentException("Unknown operator " + op); } } @Override public Integer visitStart(@NotNull expressionsParser.StartContext ctx) { return this.visit(ctx.expr()); } @Override public Integer visitAtomExpr(@NotNull expressionsParser.AtomExprContext ctx) { return Integer.valueOf(ctx.getText()); } @Override public Integer visitParenExpr(@NotNull expressionsParser.ParenExprContext ctx) { return this.visit(ctx.expr()); } public static void main(String[] args) { String expression = "2 * (3 + 4)"; expressionsLexer lexer = new expressionsLexer(new ANTLRInputStream(expression)); expressionsParser parser = new expressionsParser(new CommonTokenStream(lexer)); ParseTree tree = parser.start(); Integer answer = new evalVisitor().visit(tree); System.out.printf("%s = %sn", expression, answer); }}如果运行上面的类,您将看到以下输出:
2 *(3 + 4)= 14



