微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

侦听器返回一个数组列表/字符串

如何解决侦听器返回一个数组列表/字符串

通过遍历解析树的 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 举报,一经查实,本站将立刻删除。