antlr - 从 Antlr 监听器获取返回值?

标签 antlr return-value void antlr4

我有一个 Antlr 生成的监听器,我调用我的 tree walker 从另一个类中的解析函数遍历树。看起来像这样:

public double calculate(){

     ANTLRInputStream input = new ANTLRInputStream("5+2");
     Lexer lexer = new Lexer(input);
     CommonTokenStream tokens = new CommonTokenStream(lexer);
     Parser parser = new Parser(tokens);
     ParseTree tree = parser.calculate();
     ParseTreeWalker walker = new ParseTreeWalker();
     walker.walk(new Listener(), tree);
     return 0;
}    

因此,监听器与 enter() 和 quit() 函数完美配合,并最终打印出正确的值:
public void exitParser(ParserContext ctx) {
    result = stack.peek();
    System.out.println(result);
}    

但我想在我的 calculate() 函数中接收最终值以在那里返回它。由于 exitParser(...) 是无效的,我不知道如何处理它。

对于访客,我可以这样做:
public double calculate(){
    // ...
    String value = new WRBVisitor().visit(tree);
    return Double.parseDouble(value);
}    

希望有人了解我的问题并知道解决方案。

最好的祝福

最佳答案

正如评论中提到的:在您的情况下,访问者可能是更好的选择。访问者的方法将始终返回一个值,这似乎是您所追求的。那可能是 Double如果您的表达式总是计算为一个数值,或者某种自产的 Value可以代表 Double , Boolean , 等等。

在 GitHub 上查看我的演示表达式评估器(使用访问者):https://github.com/bkiers/Mu

关于antlr - 从 Antlr 监听器获取返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26562307/

相关文章:

java - 我们如何对antler walker及其相关的java代码进行软件工程?

parsing - ANTLR语法: parser- and lexer literals

c++ - 将复制返回的值分配给引用

c# - 从同一方法返回自定义数量的 bmp 图像

c++ - 右值从哪里来?

c++ - void 函数返回的编写方式的差异

c - 获取 const void 的内容

d3.js - 未捕获的类型错误 : (void 0) is not a function using d3 with angular 7

eclipse - XText 没有提供哪些 ANTLR 功能?

java - 如何为 ANTLR 指定目标包?