访客和听众一次在Antlr 4

时间:2015-02-18 13:25:36

标签: antlr4

在Antlr 4中,我们可以分别调用我们的访问者或监听器类。但是我想一次调用它,我的意思是当我使用Visitor My Listener类访问一个树时,也需要执行它。请查看MXLVisitor下面的示例代码。

ANTLRFileStream reader = new ANTLRFileStream(input.toString());
        Xml_formatLexer lexer = new Xml_formatLexer(reader);
        Xml_formatParser parser = new Xml_formatParser(new CommonTokenStream(lexer));
        ParseTree tree = parser.main_rule();
        MXLVisitor visitor = new MXLVisitor(xmlBuilder, pojo);

        Value result = visitor.visit(tree);

        ParseTreeWalker walker = new ParseTreeWalker(); // create standard walker
        MXLlistener extractor = new MXLlistener();
        walker.walk(extractor, tree);

当我运行上面的代码时,它首先显示visit(tree)方法然后根据我的编码执行walker.walk(extractor, tree)

我的问题是是否可以一次调用这两种方法?

2 个答案:

答案 0 :(得分:1)

我注意到presto项目同时使用了一个Listener和一个Visitor,完全适合您所描述的用例!

粗略的想法是:

loadOptions

这是他们的代码: https://github.com/prestodb/presto/blob/8d5d5e67e1e2276e9e2a1fc02f471e6d0a020c89/presto-parser/src/main/java/com/facebook/presto/sql/parser/SqlParser.java#L138

答案 1 :(得分:0)

  

我的问题是,是否可以同时调用这两种方法?

不,您要么使用听众,要么使用访客。不是两个在同一时间。