У меня простая грамматика, и я создал пару классов C#, используя antlr 2.7.7. Когда парсер обнаруживает ошибку с токеном, он генерирует исключение; Я хочу узнать, сколько символов в анализируемом потоке пришло токен. Как мне это сделать?Как найти позиции символов в ANTLR 2?
ответ
Это было давно, так как я играл с ANTLR, но если я хорошо помню, чтобы делать то, что вы хотите, мне пришлось подклассифицировать парсер, чтобы сохранить счетчик символов, который увеличивался каждый раз, когда был найден новый токен (с курсовой длиной, конечно).
Вы должны прочитать главу 10 («Отчеты об ошибках и восстановление») из книги Терренса Парра «Определяющая ссылка ANTLR».
Не зная, какой целевой язык вы используете, вам будет трудно точно сказать, что делать. Но я предполагаю, что вы используете цель Java, и вы можете исправить меня, если я ошибаюсь.
Когда распознаватель ANTLR не соответствует строке ввода, он генерирует очень специфическое исключение на основе контекста отказа. (Существует девять различных видов исключений, RecognitionException - это корневой тип, и он имеет восемь подклассов: MismatchedTokenException, MismatchedTreeNodeException, NoViableAltException, EarlyExitException, FailedPredicateException, MismatchedRangeException, MismatchedSetException, MismatchedNotSetException).
У корневого типа исключений (RecognitionException) есть несколько полезных общедоступных полей, которые вы можете посмотреть (в частности: «индекс», «строка» и «charPositionInLine»). Поле «index» указывает точное положение символа, в котором была обнаружена ошибка. Поля «line» и «charPositionInLine» довольно понятны. Вот JavaDoc:
http://www.antlr.org/api/Java/classorg_1_1antlr_1_1runtime_1_1_recognition_exception.html
Я нацеливание C# - класс RecognitionException имеет «линию» и «столбец», но не «индекс», и оба они всегда, кажется, значение -1. Документация выше с сайта ANTLR 3 - применяется ли она до ANTLR 2? – Simon 2008-10-07 14:53:33