栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

ANTLR4访问者模式上的简单算术示例

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ANTLR4访问者模式上的简单算术示例

当然可以,只是贴上不同的标签。毕竟,替代

'(' 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


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/494848.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号