我有一个Antlr生成的侦听器,我调用我的树步行器从另一个类的解析函数遍历树。看起来像这样:
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);
}
希望有人了解我的问题并知道解决方案。
祝你好运
答案 0 :(得分:1)
正如评论中所提到的:访客可能是您案例中更好的选择。访问者的方法将始终返回一个值,这是您似乎追求的。如果您的表达式始终评估为数值,或者某种自行开发的 Double
可能代表Value
,{{Double
,那么这可能是Boolean
1}}等等。
在GitHub上查看我的演示表达式评估程序(使用访问者):https://github.com/bkiers/Mu