![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
PrefaceBoost , ,
История Полтора десятилетия назад я написал свой первый калькулятор в Паскале. Это один из самых незабываемых опытов кодирования. Я был поражен тем, как взаимно рекурсивный набор функций может моделировать грамматические характеристики. Со временем навыки, которые я приобрел из этого академического опыта, стали очень практичными. Периодически мне было поручено сделать некоторый анализ. Например, всякий раз, когда мне нужно выполнить какую-либо форму ввода/вывода, даже в двоичном варианте, я пытаюсь подойти к задаче несколько формально, написав грамматику, используя синтаксические диаграммы, похожие на Паскаль, а затем написать соответствующий парсер рекурсивного спуска. Это сработало очень хорошо. Появление Интернета и Всемирной паутины увеличило это в тысячу раз. В какой-то момент мне пришлось написать HTML-парсер для веб-браузера. Я получил рекурсивный HTML-парсер, работающий на основе формальных спецификаций W3C. Я был рад, что HTML имеет формальную грамматику. Из-за влияния Интернета мне пришлось делать больше разборок. Спецификации RFC были повсюду. SGML, HTML, XML, даже адреса электронной почты и эти, казалось бы, тривиальные URL-адреса были формально указаны с использованием небольших грамматических спецификаций в стиле EBNF. Это заставило меня пожелать инструмент, похожий на большие генераторы парсера, такие как YACC и ANTLR, где парсер построен автоматически из грамматической спецификации. Тем не менее, я хочу, чтобы он был очень маленьким, достаточно маленьким, чтобы поместиться в моем кармане, но масштабируемым. Он должен быть в состоянии практически разбирать простые грамматики, такие как адреса электронной почты, на умеренно сложные грамматики, такие как XML и, возможно, некоторые языки сценариев малого и среднего размера. Масштабируемость является главной целью. Вы должны быть в состоянии использовать его для небольших задач, таких как разбор командных строк, не неся большой полезной нагрузки, как вы делаете, когда используете YACC или PCCTS. Даже сейчас, когда она развилась и созрела, чтобы стать многомодульной библиотекой, Дух все еще может использоваться для экстремальных задач микро-парсинга. Вы платите только за те функции, которые вам нужны. Сила Духа исходит из его модульности и расширяемости. Вместо того, чтобы давать вам кувалду, он дает вам правильные ингредиенты, чтобы легко создать кувалду. Например, у него нет лексера, но у вас есть все сырые ингредиенты, чтобы написать его, если он вам нужен. Результатом стал Дух. Spirit был личным проектом, который был задуман, когда я занимался R&D в Японии. Вдохновленный составными и интерпретаторными шаблонами GoF, я понял, что могу смоделировать рекурсивный парсер с иерархически-объектной композицией примитивов (терминалов) и композитов (продукций). Оригинальная версия была реализована с полиморфными классами времени выполнения. Парсер генерируется во время выполнения путем подачи в строках правил производства, таких как "prod ::= {‘A’ | ‘B’} ‘C’;" Функция компиляции компилировала парсер, динамически создавая иерархию объектов и связывая семантические действия на лету. Очень ранний текст можно найти здесь . Версия, которую мы имеем сейчас, является полным переписыванием оригинального парсера Spirit с использованием шаблонов экспрессии и статического полиморфизма, вдохновленного работами Тодда Велдхузена (« Шаблоны экспрессии», C++ Report, июнь 1995 года). Первоначально версия static-Spirit предназначалась только для замены ядра оригинала dynamic-Spirit. Динамический дух нуждался в парсере, чтобы реализовать себя. Оригинал использовал ручной кодированный парсер рекурсивного спуска для анализа строк спецификации входной грамматики. После своего первого дебюта с открытым исходным кодом в мае 2001 года, статичный Дух стал успешным. Примерно в ноябре 2001 года сайт Spirit имел процентиль активности 98%, что сделало его инструментом парсера номер один в Source Forge в то время. Неплохо для такого нишевого проекта, как парсерная библиотека. «Статическая» часть Духа была забыта, и статический Дух просто стал Духом. Вскоре фреймворк эволюционировал, чтобы приобрести более динамичные функции. Как использовать это руководство Структура Духа организована в логические модули, начиная с ядра. Эта документация предоставляет руководство пользователя и ссылку для каждого модуля в рамках. Простой и понятный пример кода стоит сотни строк документации, поэтому в руководстве пользователя представлены многочисленные примеры, аннотированные и объясненные поэтапно. Руководство пользователя основано на примерах из них. В максимально возможной степени пересылаемая информация (т.е. ссылка на конкретный фрагмент информации, который еще не обсуждался) исключается в ручной части каждого модуля пользователя. Однако во многих случаях неизбежно, что продвинутые, но связанные с ними темы перемежаются с обычным потоком обсуждений. Чтобы облегчить эту проблему, темы, классифицированные как «продвинутые», могут быть пропущены в первом чтении. Некоторые иконки используются для обозначения определенных тем, указывающих на их актуальность. Эти иконки предшествуют тексту, указывающему:
Поддержка Пожалуйста, направьте все вопросы в список рассылки Spirit. Вы можете подписаться на рассылку здесь. Список рассылки имеет архив с возможностью поиска. Поисковая ссылка на этот архив приведена на домашней странице Spirit. Вы также можете читать и отправлять сообщения в список рассылки через новостной портал NNTP (спасибо www.gmane.org). Группа новостей отражает список рассылки. Вот две ссылки на архивы: через gmane, через geocrawler.
Copyright © 1998-2003 Joel de Guzman
Статья Preface раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
|||||||||||||||||||||||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |