Отчеты об ошибках и восстановление в генераторах парсеров
Я думаю, что генераторы парсеров - это очень хороший инструмент в вашем наборе инструментов программирования, поэтому, поиграв с некоторыми из них, я написал свой собственный, просто чтобы лучше понять вещи, и он оказался лучше, чем я ожидал, поэтому я застрял с ним.
Одна вещь, которая беспокоила меня в последнее время, это сообщения об ошибках и восстановление. Я не очень хорошо с этим справляюсь. Я знаю, что один из методов - это синхронизация токенов, но на этом пути, похоже, останавливаются. Помимо использования собственного анализатора с рекурсивным спуском и всевозможных эвристик, каковы общие способы обработки сообщений об ошибках и их исправления в генераторах анализаторов?
1 ответ
С PEG, который сверху вниз, вы можете реализовать функцию "вырезать", либо автоматически, либо для включения вручную, чтобы вы могли сообщать об ошибках как можно ближе к их источнику. См. Грако и ссылочную статью Кота Мидзусима. "Обрезка" делает недействительными альтернативы после того, как на входе видны определенные токены, так что анализатор может знать, как рано выйти из строя.
В целом, мне не нравится исправление ошибок, так как ошибки, о которых сообщалось после первой, как правило, являются неприятными, как однажды доказал Turbo Pascal.
Общая стратегия восстановления заключается в выполнении перезаписи, вставки или удаления входной последовательности, чтобы анализатор мог продолжить работу. Для простой стратегии восстановления, основанной исключительно на удалениях (пропуск ввода до ожидаемого токена), см. Раздел 5.9 A+D=P вирта.