![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Dynamic ParsersBoost , ,
Мы видим динамический разбор повсюду в Духе. Специальная группа парсеров, метко названных динамическими парсерами, образует самые основные строительные блоки для динамического парсеринга. Эта глава посвящена этим тварям. Вы заметите сходство этих парсеров со структурами управления C++. Сходство не является совпадением. Эти парсеры придают императивный вкус парсингу, и, поскольку императивные конструкции не являются родными для декларативного EBNF, имитируя язык хоста, C++, должны сделать их использование сразу знакомым. Динамические парсеры изменяют поведение парсинга в соответствии с условиями. Построение динамических парсеров требует аргумента состояния и аргумента парсера тела. Дополнительные аргументы требуются некоторыми парсерами. ConditionsВ качестве условий могут использоваться функции или функторы, возвращающие значения, конвертируемые в bool. Когда оценка функции/функтора дает истинное значение, она рассматривается как удовлетворяющая условию. Парсеры также могут использоваться в качестве условий. Когда парсер совпадает, условие выполняется. Парсеры, используемые в качестве условий, работают в режиме «все или ничего»: сканер не будет усовершенствован, когда они не совпадают. Неспособность выполнить условие не приведет к ошибке анализа. if_pif_pМожно использовать с другой частью или без нее. Синтаксис это: if_p(condition)[then-parser] или if_p(condition)[then-parser].else_p[else-parser] Когда условие выполнено, тогда-парсер используется следующим в процессе разбора. Когда условие не выполнено и другой-парсер доступен, другой-парсер используется следующим. Когда условие не выполнено и больше не доступен парсер, тогда весь парсер соответствует пустой последовательности. ( Пример: if_p("0x")[hex_p].else_p[uint_p] while_p, do_pв то время как_p/do_pСинтаксис: while_p(condition)[body-parser] До тех пор, пока условие выполнено, динамический парсер, построенный, в то время как _pбудет пытаться соответствовать парсеру тела.do_pвозвращает парсер, который пытается соответствовать парсеру тела, а затем ведет себя так же, как парсер, возвращенный, в то время как_p. Неспособность сопоставить тело-парсер приведет к тому, что не будет сообщено в то время / до-парсер. Пример: uint_p[assign_a(sum)] >> while_p('+')[uint_p[add(sum)]] Предполагая, чтодобавитьявляется объектом функции, определенной пользователем. for_pдля pтребуется четыре аргумента. Синтаксис это: for_p(init, condition, step)[body-parser] Init и step должны быть 0-ary функциями. for_p возвращает парсер, который:
Copyright © 2002-2003 Joel de Guzman
Статья Dynamic Parsers раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
|||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |