[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Универсальный парсер
magnuz
Часть большого проекта, который как GNU неизвестно будет ли когда-нибудь доделана, но этот кусок может быть отделен от проекта и без особых усилий вставлен в любой другой проект ибо количество зависимостей от каких-то вещей из всего проекта там минимально.

https://github.com/1datr/micron/tree/master/modules/treep .

Короче может существовать код в с произвольным синтаксисом открывающих и закрывающих конструкций, с произвольным форматом комментариев и экранирующих последовательностей. Например,

/# {#rz
#/
{@
{#reef #}
@}

xxx
{#if c=\"xx\" (x==0)
{#then
x=x+1;
#}
{#else
x=x+2;
#}
// #}
#}
xxx
{#foreach(arr_x as idx => x)

#}
ddd

/# #/ - комментарии
{#([[:alnum:]]+)
#} - формат элемента
{@ @} - экраниирующая последовательность.
Код

$root = $treep->compile([
'code'=>$_code,
'nstart'=>'/\{\#([[:alnum:]]+)/',
'nend'=>'/\#\}/',
'comments'=>['#\/\*.*\*\/#s','#\/\/.*$#m'],
'shields'=>[['{@','@}']])

выдаст дерево объектов. Которое потом можно обойти кодом типа
$tree->walk(function($item)
{
if(is_string($item))
echo $item;
else
{
print_r($item->_START_TAG_REGEXP_RESULT);
print_r($item->_END_TAG_REGEXP_RESULT);
}
}
);

И на такой основе можно создать любой парсер любого существующего или несуществующего языка разметки (xml, допустим) либо даже программирования.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.