Получение осмысленных синтаксических ошибок из парсера antlr

Я создал Script-Interpreter для .Net, используя Antlr. Он работает довольно хорошо, но синтаксические ошибки, которые он генерирует, ужасны. Библиотеку на ранней стадии разработки можно найти здесь, а используемая грамматика на основе этой грамматики ecma-Script.

Теперь большая проблема заключается в том, что когда у меня есть большой файл сценария и у меня есть определение объекта, которое говорит

obj = { var1 = "hello"
        var2 = "world};

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

Есть ли способ получить одну ошибку, вызванную отсутствующей запятой? также было бы совершенно нормально, если бы он жаловался на неожиданный токен var2.


person Matt W    schedule 31.03.2017    source источник


Ответы (1)


Ну, вы можете использовать 2 подхода для этого:

  • Вы проверяете, распознаете ли вы ошибку, которая, скорее всего, вызовет массу следующих «ошибок», и затем отключите отображение всех ошибок. Поэтому вам нужно сначала исправить эту ошибку, прежде чем вы получите больше ошибок. Однако это не изменит загадочных сообщений, которые генерирует ANTLR...
  • Вы добавляете некоторые альтернативы распространенным ошибкам непосредственно в свою грамматику и уведомляете прослушиватель ошибок, когда они вызываются. При этом вы можете указать сообщение об ошибке самостоятельно. Для получения дополнительной информации по этой теме вы можете либо обратиться к Definitive ANTLR 4 reference, в котором есть глава об этом, либо вы можете взглянуть на моя грамматика, использующая этот подход для несбалансированных скобок.

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

person Raven    schedule 05.04.2017
comment
Танк вам очень. Я уже пытался использовать первый подход. Проблема в том, что невозможно получить первоначальную ошибку, которая вызвала все остальные просто так. В любом случае, ваш второй подход работает отлично, и я смог осмысленно предупредить о наиболее распространенных синтаксических ошибках с помощью метода, который вы описываете в своей грамматике. - person Matt W; 06.04.2017