// Контекстно-свободная грамматика шаблонизатора // Подразумевается, что лексический анализатор зависим от работы синтаксического, // знает о его состоянии и соответственно выдаёт либо лексемы "внутри" блоков кода, // либо литералы "вне" оных // {{ двойные скобки }} нужно исключительно чтобы маркеры начала и конца подстановки // были уникальны в грамматике. Вместо них обычно используются { одинарные }, а // выбор корректной лексемы - скобки или маркера - делает лексический анализатор. // Но зато вместо { фигурных скобок } можно выбрать себе любые другие маркеры! // Олдстайл BEGIN .. END ликвидирован // Возможно, нужно сделать foreach ... as key => value %token literal %token name %left ".." %left "||" "OR" "XOR" %left "&&" "AND" %nonassoc "==" "!=" "<" ">" "<=" ">=" %left "+" "-" %left "&" %left "*" "/" "%" %% chunks: | chunks chunk chunk: literal | "" | "{{" exp "}}" | error code_chunk: c_if | c_set | c_fn | c_for | exp c_if: "IF" exp "-->" chunks "" chunks "" chunks "" chunks c_elseifs chunks "" chunks c_elseifs chunks "" chunks "" | c_elseifs chunks "" c_set: "SET" varref "=" exp | "SET" varref "-->" chunks "" chunks "" chunks "