ANTLR 4: избегайте ошибок печати на консоль

С ANTLR я разбираю грамматику. Ошибки ANTLR указываются в пользовательском редакторе грамматики. Однако я хотел бы отключить печать сообщений об ошибках на консоль Java.

я реализовал свой собственный BaseErrorListener и удалил значение по умолчанию, как описано в книге ANTLR:

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

все еще я получаю печатные выходы на свою консоль Java (подключенную к выходу Java и потоку ошибок).

Как отключить печать на консоль в ANTLR?

3 ответов


по умолчанию 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);)


вы можете проверить, какие слушатели у вас есть

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

искать ConsoleErrorListener.


Я, наконец, нашел решение. У меня есть фильтр перед грамматикой:

Filter filter = new Filter(tokens)

где прослушиватель фильтра (класс предварительного парсера) также должен быть удален:

filter.removeErrorListeners();