Месяц назад я задал полусвязанный вопрос: в несколько проходов, общих для грамматик PEG? Я пытался выяснить, является ли хорошей идеей написать несколько грамматик, чтобы постепенно анализировать ввод некоторого текста в проходах. Для моего любимого проекта, синтаксического анализатора языка программирования музыки (MPL), я написал 3 отдельные грамматики:
Возьмите все содержимое исходного файла и удалите комментарии.
Возьмите исходный файл (комментарии удалены) и разделите его по инструментам. Это приводит к парам имени/определения инструмента и «музыкального кода», который должен «играть» указанный инструмент.
На самом деле анализировать музыкальный код (одна строка текста на инструмент) и возвращать дерево разбора музыкальных «событий» для каждого инструмента.
Один человек, который ответил на мой предыдущий вопрос, указал, что это разумный подход и что разумно иметь проход для удаления комментариев, если ваш инструмент генератора синтаксического анализатора не имеет способа сделать это автоматически/просто. Единственная потенциальная причина, по которой он мог бы унифицировать грамматики, заключалась бы в требовании производительности, но в моем случае его нет.
Однако, размышляя об этом больше, я задаюсь вопросом о последствиях обработки исключений. В идеале, когда мой синтаксический анализатор генерирует исключение, я хотел бы, чтобы он определял правильный номер строки в исходном исходном файле и отображал сообщение об ошибке, указывающее на ошибку синтаксического анализа. Мой предпочтительный инструмент для создания парсеров, Instaparse, имеет удобные сообщения об ошибках, которые определяют номера строк и столбцов, например :
Parse error at line 1, column 1:
bbaaaab
^
Expected:
"ab"
Проблема в том, что эти ошибки выдаются на основе каждого прохода. Если у меня есть начальная грамматика, которую я использую для удаления комментариев из исходного файла, то исходные номера строк не сохраняются, переходя к следующему проходу. Я очень надеюсь, что это не так, но мне кажется, что единственный способ сохранить правильные номера строк — это объединить все в единую очень сложную грамматику. Есть ли способ обойти это? Есть ли какой-то шаблон для написания нескольких последовательных грамматик с сохранением номеров строк из исходного ввода?