Имам нужда от парсер за екзотичен език за програмиране. Написах граматика за него и използвах генератор на анализатор (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). И макросите могат дори да съдържат други макроси. Как да поставя това в граматика, ако не е ясно какво е семантично макросът?
Най-лесният подход изглежда е първо да стартирате препроцесор, който да замени всички макроси и едва след това да стартирате анализатора. Но в този случай номерата на редовете се объркват. Искам анализаторът да генерира съобщения за грешка, съдържащи номера на реда, ако има грешка при анализ. И ако предварително обработя входа, номерата на редовете вече не съответстват.
Помощта е много ценена.
#line N
и да добавите правило към вашия анализатор, което#line N
променя текущия номер на ред наN
. (Ето как GCC и повечето C препроцесори се справят с#include
директиви.) - person Chris Lutz   schedule 12.09.2011