Я работаю над проблемно-ориентированным языком (DSL) для непрограммистов. Непрограммисты делают много ошибок грамматики: они пишут ключевые слова c орфографическими ошибками, они не закрывают круглые скобки, они не завершают блоки и т.д.
Я использую ANTLR для генерации моего синтаксического анализатора; это обеспечивает изящный механизм для обработки RecognitionExceptions для улучшения обработки ошибок. Но мне довольно трудно разработать хороший код обработки ошибок для моего DSL.
На данном этапе я рассматриваю способы упростить язык, чтобы помочь мне предоставить пользователям высококачественные сообщения об ошибках, но я не действительно уверен, как пойти об этом. Я думаю, что хочу уменьшить неоднозначность ошибок так или иначе, но я не уверен, как реализовать ту идею в грамматике.
В каких путях я могу упростить свой язык для улучшения сообщений ошибки анализа для моих пользователей?
Править: Обновленный, чтобы разъяснить, что мне интересно способами упростить мой язык, не только подсказки обработки ошибок ANTLR в целом. (Хотя, спасибо за тех!)
Можно задать объект запроса, если он ajax, просто request.is_ajax
. Таким образом вы можете обнаружить, будь то первый запрос на публикацию или дальнейшие вопросы о следующих страницах.
Используя 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 страницы).
Недавно я прочитал статью о человеке, который реализовал простой механизм обучения для его парсера. По сути, идея состоит в том, чтобы пометить ошибки синтаксического анализа, которые выдает ANTLR, с фактической причиной ошибки. Например,
Ошибка: ни один метод «bar» для NilClass: foo
не может быть помечен как:
Ошибка: Пытался вызвать «bar» для foo, но foo не имеет значения.
Идея фактически пришла из статьи 2003 года: Генерация сообщений об ошибках синтаксиса LR из примеров . Это также обсуждалось в блоге research! Rsc .
Хорошо, я никогда не использовал ANTLR до сих пор, только JavaCC. Но поскольку вы собираетесь реализовать DSL и заботиться об удобстве использования, вам следует взглянуть на xtext . Это структура, которая
В прошлом году я присутствовал на презентации itemis , немецкой компании, специализирующейся на DSL. Я был очень впечатлен тем, насколько легко это приложение настроить и приступить к работе. Я использовал его для создания редактора для небольшой игры, который использует текстовое описание игрового поля, которое затем анализируется и преобразуется в объектную модель игры.
Пару лет назад я написал статью о восстановлении номеров строк и столбцов при ошибках ANTLR, которая может оказаться полезной.
http://tech.puredanger.com/2007/02/01/recovering-line-and-column-numbers-in-your-antlr-ast/