Улучшение сообщений об ошибках синтаксического анализа ANTLR DSL

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

Я использую ANTLR для генерации парсера; он предоставляет изящный механизм обработки исключений RecognitionExceptions для улучшения обработки ошибок. Но мне довольно сложно разработать хороший код обработки ошибок для моего DSL.

На данный момент я рассматриваю способы упростить язык, чтобы мне было проще предоставлять пользователям высококачественные сообщения об ошибках, но я не совсем уверен, как это сделать. Я думаю, что хочу как-то уменьшить двусмысленность ошибок, но я не уверен, как реализовать эту идею в грамматике.

Как я могу упростить свой язык, чтобы улучшить сообщения об ошибках синтаксического анализа для моих пользователей?

РЕДАКТИРОВАТЬ: Обновлено, чтобы уточнить, что меня интересуют способы упростить свой язык, а не только советы по обработке ошибок ANTLR в целом. (Хотя, спасибо за это!)


person Community    schedule 14.02.2010    source источник
comment
Не могли бы вы дать нам больше информации о грамматике в ее нынешнем виде? Для чего нужен ваш DSL и на что он способен?   -  person Thomas Schaub    schedule 24.02.2010
comment
choiceofgames.com/blog/choicescript-intro Я сразу укажу на летучая мышь, что это ни капельки не зависит от контекста ...   -  person Dan Fabulich    schedule 25.02.2010
comment
Если ваши пользователи допускают типичные ошибки, вы можете создать правило токенов грамматики, которое соответствует общей ошибке, а затем заставить эти правила выводить сообщение об ошибке.   -  person Ian Ringrose    schedule 25.02.2010


Ответы (4)


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

http://tech.puredanger.com/2007/02/01/recovering-line-and-column-numbers-in-your-antlr-ast/

person Alex Miller    schedule 15.02.2010
comment
Спасибо. Я обновил вопрос, чтобы уточнить, что я специально ищу способы упростить свой язык, а не только советы по обработке ошибок ANTLR в целом. - person Dan Fabulich; 20.02.2010

Вероятно, вы попали в самую сложную часть использования генератора синтаксического анализатора по сравнению с грамматикой, скрученной вручную.

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

Это должно решить 90% проблем для пользователей, то есть отсутствие запятых или точек с запятыми в конце строки.

Проблема в остальных 10%.

Обычно я начинаю с присвоения значимого имени своим лексическим и грамматическим токенам, используя ключевое слово paraphrase.

ie

SEMI
options {paraphrase="end of line terminator";}
: ';'
;

ifExpr
options {paraphrase="boolean expression";}
   : expr 
;

Antlr будет использовать эти фразы во всех создаваемых сообщениях об ошибках.

Взгляните на эту страницу: http://www.antlr2.org/doc/err.html, чтобы узнать, как специалисты рекомендуют это сделать с помощью Antlr 2, а затем просмотреть эту страницу: http://www.antlr.org/blog/antlr3/error.handling.tml, чтобы увидеть изменения, внесенные Antlr 3. (Страница Antlr2, вероятно, лучшее место для начала).

person chollida    schedule 15.02.2010

Хорошо, я до сих пор никогда не использовал ANTLR, только JavaCC. Но поскольку вы собираетесь реализовать DSL и заботитесь об удобстве использования, вам следует взглянуть на xtext . Это структура, которая

  • позволяет указать текстовую грамматику для вашего DSL в нотации EBNF
  • генерирует парсер для вас
  • генерирует редактор с подсветкой синтаксиса и немедленной обратной связью о синтаксических ошибках в качестве подключаемого модуля Eclipse
  • дает вам доступ к базовому AST для преобразования текстового представления, созданного вашими пользователями, во что угодно

В прошлом году я посетил презентацию itemis, немецкой компании, специализирующейся на DSL. Я был очень впечатлен тем, насколько легко все это настроить и начать работать. Я использовал его для создания редактора для небольшой игры, который использует текстовое описание игрового поля, которое затем анализируется и преобразуется в объектную модель игры.

person Robert Petermeier    schedule 15.02.2010

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

Ошибка: нет метода bar для NilClass: foo

можно пометить как:

Ошибка: попытка вызвать bar для foo, но foo не имеет значения.

Идея фактически пришла из статьи 2003 года: Создание Сообщения об ошибках синтаксиса LR из примеров. Это также обсуждалось на research! Rsc блог.

person perimosocordiae    schedule 14.02.2010
comment
случайно ли это research.swtch.com/2010/01 /generating-good-syntax-errors.html, который недавно появился на Reddit? - person a_m0d; 17.03.2010