Мне нужен парсер для экзотического языка программирования. Я написал для нее грамматику и использовал генератор парсера (PEGjs) для генерации парсера. Это прекрасно работает ... за исключением одной вещи: макросы (которые заменяют заполнитель предопределенным текстом). Я не знаю, как интегрировать это в грамматику. Позвольте мне проиллюстрировать проблему:
Пример программы для анализа обычно выглядит так:
instructionA parameter1, parameter2
instructionB parameter1
instructionC parameter1, parameter2, parameter3
Пока проблем нет. Но язык также поддерживает макросы:
Define MacroX { foo, bar }
instructionD parameter1, MacroX, parameter4
Define MacroY(macroParameter1, macroParameter2) {
instructionE parameter1, macroParameter1
instructionF macroParameter2, MacroX
}
instructionG parameter1, MacroX
MacroY
Конечно, я мог бы определить грамматику для идентификации макросов и ссылки на макросы. Но в этом случае я не знаю, как бы я анализировал содержимое макроса, потому что не ясно, что содержит макрос. Это может быть только один параметр (это проще всего), но это также может быть несколько параметров в одном макросе (например, MacroX в моем примере, который представляет два параметра) или целый блок инструкций (например, MacroY). И макросы могут даже содержать другие макросы. Как мне поместить это в грамматику, если неясно, что макрос является семантически?
Кажется, самый простой подход - сначала запустить препроцессор, чтобы заменить все макросы, и только потом запускать анализатор. Но в этом случае номера строк перепутались. Я хочу, чтобы анализатор генерировал сообщения об ошибках, содержащие номер строки, если есть ошибка синтаксического анализа. И если я предварительно обработаю ввод, номера строк больше не будут соответствовать.
Помощь очень ценится.