![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Parametric ParsersBoost , ,
У нас уже есть намек на динамическую природу структуры Духа. Эта способность является фундаментальной для духа. Динамический анализ — очень мощная концепция. Мы рассмотрим эту концепцию далее через параметрические парсеры времени выполнения. Мы можем справиться с задачами разбора, которые невозможно выполнить с помощью синтаксиса EBNF. A Little SecretМаленький тварь под названиемboost::refПритаившийся в распределении импульсов довольно мощный зверь при использовании с примитивными парсерами Духа. Мы привыкли видеть примитивные парсеры Духа, созданные струнными или символьными буквами, такими как:
str_p имеет вторую форму, которая принимает два итератора по струне:
Что не очевидно, так это то, что мы можем использоватьboost::refтакже:
При использованииboost::refфактические параметрыch_pиrange_pПриведены ссылки. Это означает, что мы можем изменять значенияch,сидов любое время и соответствующиеch_pиrange_p.Парсер будет следовать их динамическим значениям. Конечно, поскольку они удерживаются ссылкой, вы должны убедиться, что объект не разрушается при разборе. А как насчетstr_p? В то время как первая формаstr_p(форма единственного аргумента) зарезервирована для нулевых констант струн, вторая форма (форма первого / последнего итератора аргумента) может использоваться:
Functional Parametric Primitives#include <boost/spirit/attribute/parametric.hpp> Далее, Дух включает в себя функциональные версии примитивов. Вместо того, чтобы брать символы, строки или ссылки на символы и строки (используя boost::ref), функциональные версии принимают функции или функторы. f_chlit and f_ch_pФункциональная версияchlit. Этот парсер принимает функцию или функтор (функциональный объект). Ожидается, что функция будет иметь интерфейс, совместимый с:
где CharT - тип символа (например,char,int,wchar_t). Ожидается, что функтор будет иметь интерфейс, совместимый с:
где CharT - тип символа (например,char,int,wchar_t). Вот надуманный пример:
Теперь мы можем использовать X для создания парсера f_chlit:
f_range and f_range_pФункциональная версиядиапазона. Этот парсер принимает функцию или функтор, совместимый с интерфейсами выше. Разница в том, чтоf_range(иf_range_p) ожидает два функтора. Один для начала и один для конца диапазона. f_chseq and f_chseq_pФункциональная версияchseq. Этот парсер выполняет две функции или функторы. Один для начального итератора и один для конечного итератора. Ожидается, что функция будет иметь интерфейс, совместимый с:
гдеIteratorT- тип итератора (например,char const*,wchar_t const*). Ожидается, что функтор будет иметь интерфейс, совместимый с:
гдеIteratorT- тип итератора (например,char const*,wchar_t const*). f_strlit and f_str_pПояснения. Этот парсер принимает две функции или функторы, совместимые с интерфейсами, которые ожидаетf_chseq.
Copyright © 1998-2003 Joel de Guzman
Статья Parametric Parsers раздела может быть полезна для разработчиков на c++ и boost. Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: ::
|
||||||||||||||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |