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

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

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

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

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

Править: Обновленный, чтобы разъяснить, что мне интересно способами упростить мой язык, не только подсказки обработки ошибок ANTLR в целом. (Хотя, спасибо за тех!)

6
задан 3 revs 8 October 2010 в 19:33
поделиться

4 ответа

Можно задать объект запроса, если он ajax, просто request.is_ajax . Таким образом вы можете обнаружить, будь то первый запрос на публикацию или дальнейшие вопросы о следующих страницах.

-121--2257074-

Используя Windows API, GetForegroundWindow () получит дескриптор самого верхнего окна независимо от того, из какого приложения оно находится, а GetActiveWindow () получит дескриптор ваши приложения активного окна. Инструкции Declare , которые вам понадобятся:

Declare Function GetForegroundWindow Lib "user32.dll" () As Long
Declare Function GetActiveWindow Lib "user32.dll" () As Long 

Вызов любой функции вернет дескриптор окна, как описано выше.

-121--4112746-

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

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

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

Остальные 10% - это место, где проблемы.

Обычно я начинаю с предоставления значимого имени моим лексическим и грамматическим маркерам с помощью ключевого слова parafrase .

т.е.

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 страницы).

1
ответ дан 17 December 2019 в 04:46
поделиться

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

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

не может быть помечен как:

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

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

0
ответ дан 17 December 2019 в 04:46
поделиться

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

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

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

0
ответ дан 17 December 2019 в 04:46
поделиться

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

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

4
ответ дан 17 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: