Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.29;
Скачать: CL | DM;

Вниз

Тоже хочу интерпретатор, но 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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.089 c
15-1136460784
Pave/\
2006-01-05 14:33
2006.01.29
Документация по разработке интерпретатора на паскаль


4-1132033313
френк
2005-11-15 08:41
2006.01.29
Сложность с передачей сообщения


2-1136755140
Exciter
2006-01-09 00:19
2006.01.29
Простой вопрос.


6-1129051977
Ultra Crash
2005-10-11 21:32
2006.01.29
Интеллектуальные агенты


15-1136897016
Kolan
2006-01-10 15:43
2006.01.29
А кто каким Download manager ом пользуется?