Форум: "Прочее";
Текущий архив: 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