Как мне найти позиции персонажей в ANTLR 2? - PullRequest
1 голос
/ 07 октября 2008

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

Ответы [ 2 ]

2 голосов
/ 07 октября 2008

Вам следует прочитать главу 10 («Отчеты об ошибках и восстановление») из книги Терренса Парра «Полное руководство по ANTLR».

Не зная, какой целевой язык вы используете, вам будет сложно точно сказать, что вам делать. Но я предполагаю, что вы используете цель Java, и вы можете исправить меня, если я ошибаюсь.

Когда распознаватель ANTLR не соответствует входной строке, он генерирует очень специфическое исключение, основанное на контексте сбоя. (Существует девять различных типов исключений, RecognitionException является корневым типом, и у него есть восемь собственных подклассов: MismatchedTokenException, MismatchedTreeNodeException, NoViableAltException, EarlyExitException, FailedPredicateException, MismatchedRangeException, MismatchedSetException, Mismatched *etException, Mismatched *et5.

Корневой тип исключения (RecognitionException) имеет несколько удобных открытых полей, на которые вы, возможно, захотите взглянуть (в частности: «index», «line» и «charPositionInLine»). Поле index указывает точную позицию символа, в которой была обнаружена ошибка. Поля "line" и "charPositionInLine" довольно понятны. Вот JavaDoc:

http://www.antlr.org/api/Java/classorg_1_1antlr_1_1runtime_1_1_recognition_exception.html

2 голосов
/ 07 октября 2008

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

...