如何解决侦听器返回一个数组列表/字符串
通过遍历解析树的 antlr 侦听器,我已经能够构建我需要的信息的 Arraylist。但我正在努力从听众之外提取这些信息。
期望的例子是:
...
ParseTreeWalker.DEFAULT.walk(Listener,tree);
ParseTree tree = myParser.statements();
//I want to use my Arraylist here
...
既然监听器没有返回值,有什么办法吗?
解决方法
当你定义你的 Listener 类(子类化 (*BaseListener
类)时,你可以在你的监听器上拥有任何你想要的额外数据。在你的情况下,你可以在你的监听器的构造函数中创建一个 ArrayList 并提供一旦您的 ParseTreeWalker
遍历树进行侦听器回调,就可以访问它。
或者,您可以在调用代码中创建 ArrayList,并将其作为参数传递给您的 Listener 构造函数,使其在您的 Listener 代码中可用。
顺便说一句,你的陈述是倒退的。您首先需要从解析器获取您的 ParseTree
,然后您可以在从解析器返回的树上调用 ParseTreeWalker::walk
方法。
类似于:
List<YourInfo> yourList = new ArrayList<YourInfo>();
YourListener listener = new YourListener(yourList);
ParseTree tree = myParser.statements();
ParseTreeWalker.DEFAULT.walk(listener,tree);
// read contents of yourList here
,
你可以在你的监听器中定义你的 ArrayList。
代码示例
听众
class MyListener {
List<Info> myList = new ArrayList<>();
@Override
public void exitProgram(YourContext ctx) {
// wrap your info and add it into list here
}
public List<Info> getMyList() {
return myList;
}
}
外部程序
MyListener listener = new MyListener();
ParseTree tree = parser.program();
ParseTreeWalker walker = new ParseTreeWalker();
walker.walk(listener,tree);
List<Info> infoList = listener.getMyList();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。