Я пишу рекурсивный анализатор спуска для конфигурационных файлов. Они в основном похожи на ini-файлы. Вот это язык, на каком-то EBNF-подобной форме:Отчет об ошибках в парсере рекурсивного спуска
document ::= { category }
category ::= title {entry}
title ::= "[" <name> "]"
entry ::= <key> ":" <value>
Вот пример файла, который должен дать ошибку синтаксического анализа в конце:
[Category1]
key1:val1
key2 :val2
key3 : val3
[Category2]
key4: val4
this line right here should produce an error
Все примеры, которые я мог бы поиск в Интернете будет анализировать ввод до тех пор, пока не будет достигнут недопустимый символ, а затем прекратите работу без печати полезного сообщения об ошибке. У меня есть рабочий синтаксический анализатор, который следует этому поведению, но я не уверен, как реализовать полезную отчетность об ошибках.
Например, document
состоит из 0 или более категорий. Что мне делать, когда первые две категории анализируются без ошибок, а третья содержит синтаксическую ошибку? Что делать, если вход заканчивается после второй категории, и я не могу разобрать третью категорию, потому что нет токенов слева (это не должно вызывать сообщение об ошибке)? Как я могу различать эти ситуации? Недействительная строка может быть сделана двумя способами: стать записью или стать заголовком. Это меня смущает.
Я хотел бы, чтобы моя программа печатала что-то вроде line 9: expected entry or title
, когда она достигает последней строки вышеуказанного ввода. Как обычно люди выполняют сообщения об ошибках в парсерах рекурсивного спуска?
Обычно я делаю что-то вроде: «Линия ошибки анализа 42: найденная«% », ожидаемая '&'." – rossum
Создание недопустимой строки является очень сложной задачей. Сначала сделайте простой отчет об ошибках. –