{template id="header"}
<div class="header">
{template id="header_data"}
{call id="general_block"}
{param id="foo"}bar{/param}
{param id="data"}<div class="data">Smth.</div>{/param}
{/call}
{/template}
</div>
{/template}
Зачем это надо - оставим за скобками. Есть такой синтаксис, есть код, который разбивает это на токены (в плоский массив), что-то типа:
array(
array('name' => 'template', 'type' => 'open', 'id' => 'header'),
array('type' => 'string', 'value' => '<div class="header">'),
array('name' => 'template', 'type' => 'open', 'id' => 'header_data'),
array('name' => 'call', 'type' => 'open', 'id' => 'general_block'),
…
array('name' => 'call', 'type' => 'close'),
array('name' => 'template', 'type' => 'close')
…
)
Хочется из такого плоского массива построить дерево. Типа такого:
array(
'name' => 'template', 'id' => 'header', 'content' => array(
array('type' => 'string', 'value' => '<div>…</div>'),
array('name' => 'template', 'id' => 'header_data', 'content' => array(
array('name' => 'call', 'id' => 'general_block', 'content' => array(
…
Как это сделать тупым способом - примерно ясно. А как сделать умным, чтоб по науке? Подскажите алгоритм/паттерн, и чтоб поменьше матана. Статью "Синтаксический анализ" в википедии читал, по ссылкам ходил - сплошной матан, ничего не понял =)
В качестве усложнения: например, конструкция "call" может иметь вид {call id="smth"}, а может {call id="smth"}{param}…{/param}{/call} - делать для первого случая маркер одиночности {call /} не хочется, надо раздуплить что он одиночный по следующим токенам.