Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Python: Общие вопросы > написал лексический анализатор |
Автор: setq 28.12.2005, 03:11 |
написал на питоне лексический анализатор. (как говорится "ещё один"). сейчас буду на его примере учиться создавать "устанавливающийся пакет". оставляю здесь для интересующихся. (советы всегда интересны) |
Автор: bialix 5.1.2006, 23:11 |
а что такое "устанавливающийся пакет"? |
Автор: setq 6.1.2006, 00:28 |
ну. который грамотно прописывает себя в site-packages/ . в общем, на самом деле хотелось бы познакомиться с пакетом distutils (кажется так называется). |
Автор: cardinal 6.1.2006, 03:23 |
А что без установки работать не будет? И где .exe в архиве? Хотел запустить, а запускать нечего... ![]() |
Автор: setq 6.1.2006, 10:55 |
анализатор представляет из себя модуль на языке Python (scan.py) ![]() .exe пока нет |
Автор: svg 6.1.2006, 16:35 |
Спасибо, посмотрел, только это несколько не то, что обычно понимают под лексическим анализом, хотя в его основе обычно тоже лежит регулярная грамматика. С помощью "чистых" регулярных выражений можно сканировать только весьма простые грамматики, да и слишком медленно это. Ежели интересуетесь вопросом, то лучше всего найдите "dragon book" Ахо, она есть в продаже. Кнут тоже ничего, но Ахо гораздо понятнее и конкретнее (для меня по крайней мере). Google можно попытать на предмет "deterministic finite automata" и "nondeterministic finite automata". Вторые проще кодировать и легче генерировать, первые - на несколько порядков быстрее. Есть и нерегулярные лексеры (в ANTLR, например), кодируются как LALR парсеры, но я такие никогда сам не программировал. |
Автор: Sardar 6.1.2006, 17:18 |
Питон - переполнен магией ![]() Из недостатков вижу, что требуеться постоянно подгружать модуль с классами-правилами, хотя это не проблема. Более серьёзная проблема в подходе к лексическому анализу, у тебя это список регов, что один за другим применяються к строке. Во первых постоянное сканирование подстроки это не эффективно, во вторых нет проверки на ошибки регов. Представь что вышестоящий рег полностью включает в себя диапазон строк нижестоящего рега, тем самым нижестоящий рег никогда не будет найден. Это конечно проблема многих лексеров (и компиляторов формальных грамматик вообще), но они строят общий ДКА, в котором такая бага всё равно может быть найдена и компилер ругнёться. Иначе можно часами думать почему же лексема не приходит, а виной тому опечатка ![]() Это не фича лексеров вообще, но хорошая спосбность flex'а (потомок lex'а, лексер на C) держать состояния. Состояние можно представить как некий механизм пространств имён. Каждый рег может находиться в одном или нескольких пространствах имён. На каждом шаге текущим может быть только одно пространство имён. Таким образом доступное множество регов включает в себя только те реги, что находяться в текущем пространстве имён, сменив состояние (=сменив пространство имён) мы получаем возможно уже другие реги. Это очень удобно, например для PHP выделять два режима строк: 'одинарные кaвычки' - где пермеенные не парсяться и "двойные кaвычки {$variable}" где парсяться переменные и большинство escape цепочек (\n и т.д.). Тем самым облегчаем реализацию синтаксического анализатора ![]() А вообще классная вещь, нравиться мне когда малым кодом получаeться мощный софт ![]() Сам буквально на днях написал синтаксический анализатор для SAX XML парсера. Идея в том что бы парсить большие XML получая "высокоуровневые события" типа "создать ресурс", "добавить значение" и т.д., а не SAX события "открываемый тег", "закрываемый тег" и "текст". Анализатор на магазинном автомате, немного разбухший на вид (ибо строки, PHP), если интересно, выложу ![]() |
Автор: setq 6.1.2006, 20:50 |
выкладывай %) |
Автор: Sardar 7.1.2006, 04:13 |
Выложил здесь: http://forum.vingrad.ru/index.php?showtopic=77053&hl= ![]() Это иодин из многих парсеров. |
Автор: bialix 19.1.2006, 02:47 |
Ребяты. Все украдено до нас. Смотрите и выбирайте на любой вкус: http://www.nedbatchelder.com/text/python-parsers.html |