问题 ANTLR 4:避免错误打印到控制台


使用ANTLR,我解析语法。 ANTLR错误在语法的自定义编辑器中指示。 但是,我想禁用将错误消息打印到Java控制台。

我已经实现了自己的BaseErrorListener并删除了ANTLR书中描述的默认值:

MyErrorListener errList=new MyErrorListener ();
lexer.removeErrorListeners();
lexer.addErrorListener(errList);
parser.removeErrorListeners();   
parser.addErrorListener(errList);

我仍然得到打印输出到我的Java控制台(连接到Java输出和错误流)。

如何在ANTLR中禁用打印到控制台?


9145
2017-09-23 08:14


起源

你在“MyErrorListener”中做了什么? - Alexander Pacha
在我的监听器中扩展了BaseErrorListener我收集错误提取亚麻在我的自定义编辑器中标记它们。我不打印任何标准输出。 - Marcel


答案:


默认, ConsoleListener 被激活[1]。

您可以在代码中删除它:

lexer.removeErrorListener(ConsoleErrorListener.INSTANCE);

[1] https://github.com/antlr/antlr4/blob/master/runtime/Java/src/org/antlr/v4/runtime/Recognizer.java#L56 (看到 add(ConsoleErrorListener.INSTANCE);


7
2018-02-09 07:53



它工作,它是最干净,最简单的解决方案。 - Trismegistos


您可以查看您拥有的听众

for (ANTLRErrorListener listener : parser.getErrorListeners()) {
        System.out.println(listener);
}

寻找 ConsoleErrorListener


3
2018-04-13 15:32



谢谢你的回答,我暂时没有检查过这个问题。我有一个自定义Listener,它扩展了BaseErrorListener。这个(我的听众)是我用上面的代码片段打印输出的结果。 - Marcel


我终于找到了解决方案。我在语法之前有一个过滤器:

Filter filter = new Filter(tokens)

还必须删除过滤器的侦听器(预解析器类):

filter.removeErrorListeners();

1
2017-10-06 14:29



这是错误的答案,它将删除所有侦听器,但您想要删除只打印到控制台的侦听器。请参阅@uwolfer答案。 - Trismegistos