Можно ли использовать несколько парсеров и сохранить номера строк?

Месяц назад я задал полусвязанный вопрос: в несколько проходов, общих для грамматик PEG? Я пытался выяснить, является ли хорошей идеей написать несколько грамматик, чтобы постепенно анализировать ввод некоторого текста в проходах. Для моего любимого проекта, синтаксического анализатора языка программирования музыки (MPL), я написал 3 отдельные грамматики:

  1. Возьмите все содержимое исходного файла и удалите комментарии.

  2. Возьмите исходный файл (комментарии удалены) и разделите его по инструментам. Это приводит к парам имени/определения инструмента и «музыкального кода», который должен «играть» указанный инструмент.

  3. На самом деле анализировать музыкальный код (одна строка текста на инструмент) и возвращать дерево разбора музыкальных «событий» для каждого инструмента.

Один человек, который ответил на мой предыдущий вопрос, указал, что это разумный подход и что разумно иметь проход для удаления комментариев, если ваш инструмент генератора синтаксического анализатора не имеет способа сделать это автоматически/просто. Единственная потенциальная причина, по которой он мог бы унифицировать грамматики, заключалась бы в требовании производительности, но в моем случае его нет.

Однако, размышляя об этом больше, я задаюсь вопросом о последствиях обработки исключений. В идеале, когда мой синтаксический анализатор генерирует исключение, я хотел бы, чтобы он определял правильный номер строки в исходном исходном файле и отображал сообщение об ошибке, указывающее на ошибку синтаксического анализа. Мой предпочтительный инструмент для создания парсеров, Instaparse, имеет удобные сообщения об ошибках, которые определяют номера строк и столбцов, например :

Parse error at line 1, column 1:
bbaaaab
^
Expected:
"ab"

Проблема в том, что эти ошибки выдаются на основе каждого прохода. Если у меня есть начальная грамматика, которую я использую для удаления комментариев из исходного файла, то исходные номера строк не сохраняются, переходя к следующему проходу. Я очень надеюсь, что это не так, но мне кажется, что единственный способ сохранить правильные номера строк — это объединить все в единую очень сложную грамматику. Есть ли способ обойти это? Есть ли какой-то шаблон для написания нескольких последовательных грамматик с сохранением номеров строк из исходного ввода?


person Dave Yarwood    schedule 11.08.2014    source источник
comment
Предложение по хаку: как насчет того, чтобы на шаге 1 вместо удаления байтов, составляющих комментарии, вы заменили эти байты пробелами того же размера. Это должно сохранить номера строк и позиции неизменными.   -  person 500 - Internal Server Error    schedule 12.08.2014
comment
Это интересная идея... Однако я не уверен, как сохранить новые строки. Мое определение длинного комментария должно иметь какой-то способ подсчета строк, а затем быть заменено правильным количеством новых строк, чтобы сохранить количество строк. Но это может сработать, если нет другой альтернативы...   -  person Dave Yarwood    schedule 12.08.2014
comment
Какой смысл удалять комментарии? Просто игнорируйте их как пробелы.   -  person SK-logic    schedule 25.08.2014
comment
Ого... Не могу поверить, что мне это никогда не приходило в голову. Кажется, я даже читал это в какой-то момент, когда учился писать CFG. Если вы можете уточнить это как ответ, я приму это.   -  person Dave Yarwood    schedule 25.08.2014