Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсинг метаязыка 
:(
    Опции темы
Foror
Дата 27.1.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 14.2.2004

Репутация: нет
Всего: 2



Сейчас мне нужно создать язык с помощью которого мне будет проще вытаскивать данные из таблиц и расскидывать эти данные по нужным объектам с учетом связей между ними. Весь проект разрабатывается на пхп5, также учитывается важное условие, чем меньше не стандартных модулей тем лучше. Было бы конечно здорово, если бы нашлось решение типа связки bison+lex, но если так не получится, то мне было бы интересно узнать каким образом оптимальнее будет пропарсить метаязык создав дерево для дальнейшего разбора.

Вот пример метаязыка:

[Aritcle]
(
id, title, content,
author->[Author]
(
id, name,
rating-<[Rating](plus, minus),
groups<->[UserGroup]
(
id, name,
permissions<->[Permission](id, permission)
)
),

comments->[Comment](id, content, author->[Author] as [Author2](id, name)),
categories<->[Category](id, name, categories<->[Category] as [Category2](id, name)),
rating-<[Rating](plus, minus),
topic.inherit->[Topic](id, name)
)

->, -<, <-> указывают связи между объектами

Пример использования на практике:

SELECT

[Aritcle]
(
id, title, content,
author->[Author]
(
id, name,
rating-<[Rating](plus, minus),
groups<->[UserGroup]
(
id, name,
permissions<->[Permission](id, permission)
)
),

comments->[Comment](id, content, author->[Author] as [Author2](id, name)),
categories<->[Category](id, name, categories<->[Category] as [Category2](id, name)),
rating-<[Rating](plus, minus),
topic.inherit->[Topic](id, name)
)

FROM

articles Article LEFT JOIN authors as Author ON Author.id = Article.id_author
LEFT JOIN authors_users_groups ON authors_users_groups.id_author = Author.id
LEFT JOIN users_groups as UserGroup ON authors_users_groups.id_user_group = UserGroup.id
LEFT JOIN users_groups_permissions ON users_groups_permissions.id_user_group = UserGroup.id
LEFT JOIN permissions as Permission ON users_groups_permissions.id_premission = Permission.id
LEFT JOIN comments Comment ON Comment.id_article = Article.id
LEFT JOIN authors as Author2 ON Comment.id_author = Author2.id
LEFT JOIN articles_categories ON articles_categories.id_article = Article.id
LEFT JOIN categories as Category ON articles_categories.id_category = Category.id
LEFT JOIN categories as Category2 ON Category.id_parent = Category2.id;

--------------------
Разработка веб-сайтов и создание интернет магазина
PM MAIL WWW ICQ   Вверх
Empirik
Дата 27.1.2006, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 28.10.2005
Где: Россия, Пермь

Репутация: нет
Всего: 1



Если я правельно тебя понял, то ты хочешь объяснить программе как твои объеты храняться в нутри базы данных, тоесть как объекта привязанны к полям в нутри таблиц базы данны. Это так?
--------------------
Постоянно удивляюсь человеческой фантазии напридумывают гаджетов
PM MAIL WWW ICQ   Вверх
Foror
Дата 27.1.2006, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 14.2.2004

Репутация: нет
Всего: 2



Да, если что я в курсе, что это называется ORM, а также про propel и прочее(хотя не против выслушать критику про убогость такого решения smile ). Но это сейчас не важно, важно то как мне это дело распарсить в дерево разбора. Использовать регулярные выражения? Или вручную проходить каждую букву? Как будет быстрее? А может для пхп уже есть какие либы, где это можно будеть сделать проще, пусть ущерб производительности.

Хотя я вообще в дальнейшем планирую просто кешировать каждый такой запрос и тогда производительность парсинга будет не важна. Тогда как сделать проще, можно даже в ущерб производительности? smile
--------------------
Разработка веб-сайтов и создание интернет магазина
PM MAIL WWW ICQ   Вверх
Foror
Дата 27.1.2006, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 14.2.2004

Репутация: нет
Всего: 2



Уфф хотел всё замутить через рекурсивную регулярку, но жестого побрился smile в общем решение найдено всего где-то 10 строчек smile :

preg_match_all('/([A-Za-z0-9_|\.]+)([\->|<\->|\-<]+)(\[[A-Za-z0-9_|\s]+\])/', $query, $lexemes, PREG_OFFSET_CAPTURE);

$amount_lexemes = count($lexemes[0]);

for ($i = $amount_lexemes - 1; $i >= 0 ; $i--)
{
$length_lexeme = strlen($lexemes[0][$i][0]);
preg_match('/\([^()]+\)/', $query, $test, PREG_OFFSET_CAPTURE, $lexemes[0][$i][1] + $length_lexeme);

for ($j = $test[0][1]; $j < $test[0][1] + strlen($test[0][0]); $j++)
$query[$j] = '';
}
--------------------
Разработка веб-сайтов и создание интернет магазина
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1218 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.