在 Antlr 4 中一次访问者和听众
Visitor and Listener at a time in Antlr 4
在 Antlr 4 中,我们可以单独调用我们的访问者或监听器 class。但我想一次调用它,我的意思是当我使用访问者访问树时,我的监听器 class 也需要被执行。在 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)
方法。
我的问题是是否可以同时调用这两种方法?
My Question is Is it possible to call both the methods at a time?
不,您要么使用侦听器,要么使用访问器。不能同时。
我注意到 presto 项目同时使用了 Listener 和 Visitor,完全符合您描述的用例!
大致思路是:
MyBaseParser parser = new MyBaseParser(tokenStream);
//First setup the listener.
parser.addParseListener(new MyListener());
ParseTree tree = parser.main_rule();
//Then setup the visitor
MyVisitor visitor = new MyVisitor(...);
Value result = visitor.visit(tree);
在 Antlr 4 中,我们可以单独调用我们的访问者或监听器 class。但我想一次调用它,我的意思是当我使用访问者访问树时,我的监听器 class 也需要被执行。在 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)
方法。
我的问题是是否可以同时调用这两种方法?
My Question is Is it possible to call both the methods at a time?
不,您要么使用侦听器,要么使用访问器。不能同时。
我注意到 presto 项目同时使用了 Listener 和 Visitor,完全符合您描述的用例!
大致思路是:
MyBaseParser parser = new MyBaseParser(tokenStream);
//First setup the listener.
parser.addParseListener(new MyListener());
ParseTree tree = parser.main_rule();
//Then setup the visitor
MyVisitor visitor = new MyVisitor(...);
Value result = visitor.visit(tree);