Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];

Вниз

Тоже хочу интерпретатор, но SQL   Найти похожие ветки 

 
Ломброзо ©   (2006-01-05 16:07) [0]

Всех с наступившим и наступающими.
Никогда раньше не имел дел с анализаторами и интерпретаторами, но вот захотелось сделать маленький интерпретатор SQL. Суть проблемы вот в чём: хотелось бы работать с XML-документом как с маленькой иерархической таблицей, т.е. выполнять команды select, update и delete.
В пакете MDAC от Microsof имеется OleDB-драйвер для XML-файлов, но в нём много ограничений на структуру входного файла, поэтому этот драйвер отметается.
С чего начать? Необходимо ли штудировать теорию анализаторов, всякие Яки и Лекксы, или в мире уже существуют какие-то волшебные библиотеки, которым можно скормить формальное описание того, что я хочу подать интерпретатору на вход и получить разобранную структуру на выходе?


 
TUser ©   (2006-01-05 16:15) [1]


> иерархической таблицей

А что это? Таблицы (relations) - они прямоугольные.


 
Mystic ©   (2006-01-05 16:19) [2]

А Lex + Yacc это и есть библиотека :) Можно еще boost::spirit попробовать :) В целом можно успешно сочетать теорию и практику :)


 
Ломброзо ©   (2006-01-05 16:21) [3]

Да какая разница. Проще говоря, хочу использовать для выражений выборки или обновлений не XPath, а синтаксис SQL, т.е. что-то навроде
select elements.item[1] from root
или там
update root set elements.item.@attr = "10" where elements.item.@attr = "0"


 
Игорь Шевченко ©   (2006-01-05 16:23) [4]


> в мире уже существуют какие-то волшебные библиотеки, которым
> можно скормить формальное описание того, что я хочу подать
> интерпретатору на вход и получить разобранную структуру
> на выходе?


Больше, чем уверен, что существует нечто, способное сделать AST из SQL-запроса. Просто url этого нечта я не знаю :)


 
Ломброзо ©   (2006-01-05 16:23) [5]

Mystic ©   (05.01.06 16:19) [2]

Спасибо. А кто такой spirit?


 
Игорь Шевченко ©   (2006-01-05 16:24) [6]


> А Lex + Yacc это и есть библиотека


Это два EXEшника :)


 
Mystic ©   (2006-01-05 16:33) [7]

>> А кто такой spirit?

C++ библиотека построена на шаблонах. Имхо, не самый лучший выбор для начинающих :) Я бы посоветовал все же Lex + Yacc, их я знаю. Будут опросы --- обращайся. Ну и найти YACC грамматику для SQL думаю возможно, хотя в целях обучения лучше это сделать с нуля :)


 
MOA ©   (2006-01-05 16:40) [8]

Тут вот какая штука - SQL работает с реляционной моделью. Чтобы отношения были хотя хотя бы в 1-й нормальной форме - т.е. были бы именно отношениями. Которая (первая форма) категорически запрещает иерархические таблицы - по определению этой самой формы.
Для иерархических данных заточен CODASYL.
М.б., есть и что получше ;).


 
Суслик ©   (2006-01-05 16:46) [9]

Думаю, что штудировать все равно надо.

Я написал в свое время 2 интерпретатора. Жалею, что тогда совсем не знал теории.


 
Ломброзо ©   (2006-01-05 16:59) [10]

Mystic ©   (05.01.06 16:33) [7]
ok

MOA ©   (05.01.06 16:40) [8]
Мне нужен не столь полноценный SQL-движок, сколь SQL-образный синтаксис. Написал update - обновились значения элементов и аттрибутов, удовлетворяющих условию. Делать то же самое при помощи XPath я уже подустал. Это надо сперва выгрести элементы, потом по ним пройтись, всякий раз разные условия и т.п. - в общем, возникает желание избавиться  от рутины.


 
pasha_golub ©   (2006-01-05 17:15) [11]


> Mystic ©   (05.01.06 16:33) [7]


Если ты скажешь, что ты работает с tplyacc вообще тебе цены не будет!!! А если с Сишными вариантаме, то буду плакать... ибо сам. :0)


 
Igorek ©   (2006-01-05 17:20) [12]

Мне кажется проще и перспективнее реализовать импорт/экспорт xml базу (на лету или по требованию) и юзать встроеный sql СУБД, чем лепить подобие языка запросов на коленке. Впрочем вопросы нормализации остаются, как было замечено.


 
Igorek ©   (2006-01-05 17:21) [13]


> Мне кажется проще и перспективнее реализовать импорт/экспорт
> xml в базу/из базы (на лету или по требованию) и юзать встроеный sql
> СУБД, чем лепить подобие языка запросов на коленке. Впрочем
> вопросы нормализации остаются, как было замечено.


 
Mystic ©   (2006-01-05 17:46) [14]

> pasha_golub ©   (05.01.06 17:15) [11]

Ну... я минимально подправил под свои нужды этот:
http://www.torry.net/tools/developers/compilers/tplyh.zip
(порт tplex)

В сишном варианте я не пробовал, но исходники просматриваю :)

> лепить подобие языка запросов на коленке

О простоте и перспективности никто не говорит :) Написание компилятора достаточно интересная тема :) Во вторых, как я понимаю, проблема в том, что сам язык SQL не удовлетворяет всем требованиям. А XPath удовлетворяет но не нравится. Вот и попытка их скрестить :)


 
unknown ©   (2006-01-05 17:53) [15]

Могу посоветовать GOLD Parsing System - Freeware
http://www.devincook.com/goldparser/index.htm
http://www.devincook.com/goldparser/engine/delphi.htm
Я сейчас конвертирую для собственных нужд Firebird-овский DSQL из
yacc в GOLD - т.к. у голда есть движок для дельфи. Вполне удобная весчь.
К стати, там уже есть готовый парсер для SQL 89 (ANSI) http://www.devincook.com/goldparser/grammars/files/sql-ansi-89.zip


 
pasha_golub ©   (2006-01-05 17:57) [16]

unknown ©   (05.01.06 17:53) [15]
Удоный, ага, токмо...

Он академический, а соответственно, нету приоритета операций (для меня это главное), и других "попустительств" Yacc"a.

И плюс писанный на ВижуалБасике и на больших грамматиках тормозит просто жутко...

А автор - мужик классный. Общалсо с ним.


> Mystic ©   (05.01.06 17:46) [14]

Ща гляну. Я чего спросил-то... У меня из под tplyacc"a файл выходит около 10 мешков, а на сишном Бизоне около 800 кило. Однако разница чуйственная. При том грамматика одна и та же.


 
Ломброзо ©   (2006-01-05 17:58) [17]

unknown ©   (05.01.06 17:53) [15]

ЗдОрово и понятно. Качаю.


 
pasha_golub ©   (2006-01-05 18:00) [18]


> Ломброзо ©   (05.01.06 17:58) [17]


Для небольших нужд самое то!!! Чессслово...


 
Ломброзо ©   (2006-01-05 18:04) [19]

pasha_golub ©   (05.01.06 18:00) [18]
Надеюсь. Во-первых, синтаксис привычный, у майкрософта почти такой же в Books online, во-вторых, аж три реализации под С#.


 
BiN ©   (2006-01-05 18:11) [20]


> unknown ©   (05.01.06 17:53) [15]
>
> Могу посоветовать GOLD Parsing System - Freeware

О! А я как раз подобный проект пишу (написал)...


 
pasha_golub ©   (2006-01-05 18:24) [21]

BiN ©   (05.01.06 18:11) [20]
О-о-о... А посмотреть где на него? ;0)


 
unknown ©   (2006-01-05 18:28) [22]


> BiN ©   (05.01.06 18:11) [20]

Да, действительно, очень интересно было бы посмотреть.


 
BiN ©   (2006-01-05 23:15) [23]


> pasha_golub ©   (05.01.06 18:24) [21]
>
> BiN ©   (05.01.06 18:11) [20]
> О-о-о... А посмотреть где на него? ;0)


Рано пока выкладывать. Позже - обязательно.


 
pasha_golub ©   (2006-01-06 09:14) [24]


> Mystic ©   (05.01.06 17:46) [14]
>
> > pasha_golub ©   (05.01.06 17:15) [11]
>
> Ну... я минимально подправил под свои нужды этот:
> http://www.torry.net/tools/developers/compilers/tplyh.zip
> (порт tplex)


Ну, да. Про него я и говорил. Только у меня уже есть порт для Делфи ( http://www.grendelproject.nl/dyacclex/ ). Много конечно не сделано и т.п.

А ты тама чего правил?


 
Mystic ©   (2006-01-06 13:10) [25]

> pasha_golub ©   (06.01.06 09:14) [24]

Насчет разницы в размере сказать не могу. Но собственно кода там не много, большая часть таблицы..

Так был небольшой глюк с потоками (вроде в конце ввода мог идти мусор) и ограничение в 255 символов на строку (if yyleng=255 then fatal("yytext overflow");). Хотелось бы немного оптимизировать LexLib и YaccLib (например, на операциях вроде yytext := yytext+get_char;), но скорость работы на современных машинах сейчас не критична :)

Вот пример на мусор (как я его фиксил -- не помню, но знаю, что такой есть):

Файл test.l:
%%
[A-Za-z_][A-Za-z_0-9]*   WriteLn(yytext);
[ \t\f\n]                (* -= Ship spaces =- *);
.                        WriteLn(yytext);
%%


Файл dpr:
program my;
{$APPTYPE CONSOLE}
uses SysUtils, Classes, LexLib in "LexLib.pas";
{$INCLUDE test.pas}
const S: string = "Test test";
begin
 yyinput := TMemoryStream.Create;
 try
   yyinput.Write(S[1], Length(S));
   yyinput.Position := 0;
   yylex;
 finally
   yyinput.Free;
 end;
end.


И вот что у меня выводит:

C:\Labs\LexStream>my.exe
Test
test
↑
├
б


 
pasha_golub ©   (2006-01-06 15:27) [26]

Дада, кстати с мусором есть тама проблемки. Только у меня оно проявляется в .pas файле после yacc"a. А если запускаю с ключамим -d -v, то  все пишет номано. Однако кучу лишней инфы создает :0)

Кстати, по ссылке http://www.grendelproject.nl/dyacclex/ лежит новая версия от декабря прошлого года. Хочу по свободе глянуть.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.036 c
2-1136898570
GEN++
2006-01-10 16:09
2006.01.29
Какпрограммно удалить каталог


1-1135201419
Destroyer
2005-12-22 00:43
2006.01.29
Узнать каким процессом занят фаил.


15-1136064024
begin...end
2006-01-01 00:20
2006.01.29
С днём рождения! 1 января


2-1136806368
psa247
2006-01-09 14:32
2006.01.29
TListItem ?


2-1137051263
Perf2k2
2006-01-12 10:34
2006.01.29
Как проверить введена в Edit строка или число?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский