Я использую ANTLR для синтаксического анализа логических выражений в написанном мной инструменте Java, и у меня возникают проблемы из-за передачи недопустимых входных строк в сгенерированный лексер и парсер ANTLR не вызывает исключений. Вместо того, чтобы генерировать исключение RecognitionException, как я ожидал, сгенерированные файлы просто выводят сообщение об ошибке на консоль и возвращаются, как если бы ошибок не было, в результате моя программа вылетала из строя, когда позже она сталкивалась с пустыми данными.
Я использовал ANTLRWorks версии 1.4.3, чтобы сгенерировать файлы, и кажется, что должна быть какая-то опция, чтобы он действительно выдавал ошибки, а не печатал на консоли, но я ничего не нашел. Кто-нибудь знает, как заставить ANTLR действительно выдавать сообщения об ошибках? Я видел, что та же проблема в C # была решена с помощью более старой версии ANTLR, это то, что мне нужно сделать?
РЕДАКТИРОВАТЬ: После того, как Барт указал мне в том направлении, которое я искал, я нашел эту страницу
https://theantlrguy.atlassian.net/wiki/display/ANTLR3/Migrating+from+ANTLR+2+to+ANTLR+3
, чей раздел «Обработка ошибок» содержал код, более точно делающий то, что я хочу. Чтобы изменить способ, которым ANTLR перехватывает исключения, вы можете указать это в файле грамматики:
@rulecatch {
catch (RecognitionException e) {
throw e;
}
}
Это заставляет ANTLR генерировать исключение вместо того, чтобы обрабатывать его и восстанавливать. В этом разделе также есть кое-что о переопределении функций несоответствия и восстановления, чтобы убедиться, что выбрасываются все возможные исключения.