ANTLR: восстановление после ошибок и создание отчетов

у меня проблемы с восстановлением и ошибка репоста с ANTLR v3. я перехожу по этой ссылке http://www.antlr.org/blog/antlr3/error.handling.tml, но у меня нет таких решений. я хочу сделать некоторые отчеты и восстановить, например, в исходной программе, как это: код ввода студента:

FOR(int a=0;a<10;a++){
 b=b*a;
}

и программа сообщит следующее: Программа: "Вы имеете в виду, что ключевое слово FOR предназначено для?" ответ студента: "да" после этого, восстановление системы и измененный исходный код автоматически. Как это сделать с ANTLR v3? Нельзя сделать с ANTLR? нужна помощь. Спасибо, парни!


person Berto Tuwondila    schedule 22.02.2012    source источник
comment
Допустим ли перезапуск синтаксического анализа с нуля? Это может упростить реализацию.   -  person sarnold    schedule 22.02.2012


Ответы (1)


Я думаю, вам нужно переопределить org.antlr.runtime.BaseRecognizer.recoverFromMismatchedToken внутри вашего сгенерированного класса парсера.

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

При необходимости вы можете позвонить BaseRecognizer.recoverFromMismatchedToken, чтобы выполнить восстановление. Если нет, вы можете создать исключение MismatchedTokenException.

person Lex Li    schedule 22.02.2012
comment
Можете ли вы дать мне ссылку на этот пример? Я просто запутался. но спасибо перед lex li - person Berto Tuwondila; 22.02.2012
comment
Я не могу привести пример Java, так как использую ANTLR в C#. github.com/lextm/sharpsnmplib/blob/ Это частичный класс, определенный на C#, который будет окончательно объединен с созданным ANTLR файлом SmiParser.cs из файла грамматики Smi.g. Класс SmiParser является производным от BaseRecognizer ANTLR. Здесь я переопределяю функцию RecoverFromMismatchedToken, чтобы просто все время выдавать исключение. В Java вы должны использовать аналогичный способ переопределения функции, а затем реализовать свою собственную логику. - person Lex Li; 22.02.2012
comment
спасибо lex li за это решение. в вашем случае невозможно использовать концепцию ANTLR, подобную этой stackoverflow.com/questions/9262195/ - person Berto Tuwondila; 22.02.2012
comment
@Berto: я думаю, что recoverFromMismatchedToken произойдет до создания AST. Вы должны иметь возможность использовать AST даже при таком подходе. - person sarnold; 23.02.2012