2008-10-07 3 views
1

У меня простая грамматика, и я создал пару классов C#, используя antlr 2.7.7. Когда парсер обнаруживает ошибку с токеном, он генерирует исключение; Я хочу узнать, сколько символов в анализируемом потоке пришло токен. Как мне это сделать?Как найти позиции символов в ANTLR 2?

ответ

2

Это было давно, так как я играл с ANTLR, но если я хорошо помню, чтобы делать то, что вы хотите, мне пришлось подклассифицировать парсер, чтобы сохранить счетчик символов, который увеличивался каждый раз, когда был найден новый токен (с курсовой длиной, конечно).

2

Вы должны прочитать главу 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

+0

Я нацеливание C# - класс RecognitionException имеет «линию» и «столбец», но не «индекс», и оба они всегда, кажется, значение -1. Документация выше с сайта ANTLR 3 - применяется ли она до ANTLR 2? – Simon 2008-10-07 14:53:33