#exception #parsing #antlr
Вопрос:
У меня простая грамматика, и я создал пару классов c#, используя antlr 2.7.7. Когда анализатор обнаруживает ошибку с маркером, он выдает исключение; Я хочу узнать, сколько символов попало в проанализированный поток токена. Как мне это сделать?
Ответ №1:
Прошло много времени с тех пор, как я играл с ANTLR, но, если я хорошо помню, чтобы делать то, что вы хотите, мне пришлось подклассировать синтаксический анализатор, чтобы сохранить счетчик символов, который увеличивался каждый раз, когда был найден новый токен (с длиной токена, конечно).
Ответ №2:
Вам следует прочитать главу 10 («Отчеты об ошибках и восстановление») из книги Терренса Парра «Окончательная ссылка на ANTLR».
Не зная, какой целевой язык вы используете, будет трудно точно сказать вам, что делать. Но я предполагаю, что вы используете цель Java, и вы можете поправить меня, если я ошибаюсь.
Когда распознавателю ANTLR не удается сопоставить входную строку, он выдает очень специфическое исключение, основанное на контексте сбоя. (Существует девять различных видов исключений, исключение RecognitionException является корневым типом и имеет восемь собственных подклассов: исключение MismatchedTokenException, исключение MismatchedTreeNodeException, исключение NoViableAltException, исключение EarlyExitException, исключение FailedPredicateException, исключение MismatchedRangeException, исключение MismatchedSetException, исключение MismatchedNotSetException).
Тип корневого исключения (RecognitionException) содержит несколько удобных общедоступных полей, на которые вы, возможно, захотите взглянуть (в частности: «индекс», «строка» и «charPositionInLine»). Поле «индекс» указывает точную позицию символа, в которой была обнаружена ошибка. Поля «линия» и «Линия расположения» довольно понятны. Вот джавадок:
http://www.antlr.org/api/Java/classorg_1_1antlr_1_1runtime_1_1_recognition_exception.html
Комментарии:
1. Я ориентируюсь на c# — класс RecognitionException содержит «строку» и «столбец», но не «индекс», и оба они всегда имеют значение -1. Приведенная выше документация взята с сайта ANTLR 3 — распространяется ли она по-прежнему на ANTLR 2?
2. Хммммммм. К сожалению, тогда я не думаю, что смогу вам чем-то помочь. Извините 🙁