Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Parametric Parsers

Boost , ,

Parametric Parsers

У нас уже есть намек на динамическую природу структуры Духа. Эта способность является фундаментальной для духа. Динамический анализ — очень мощная концепция. Мы рассмотрим эту концепцию далее через параметрические парсеры времени выполнения. Мы можем справиться с задачами разбора, которые невозможно выполнить с помощью синтаксиса EBNF.

A Little Secret

Маленький тварь под названиемboost::refПритаившийся в распределении импульсов довольно мощный зверь при использовании с примитивными парсерами Духа. Мы привыкли видеть примитивные парсеры Духа, созданные струнными или символьными буквами, такими как:

    ch_p('A')
    range_p('A', 'Z')
    str_p("Hello World")

str_p имеет вторую форму, которая принимает два итератора по струне:

    char const* first = "My oh my";
    char const* last = first + std::strlen(first);
    str_p(first, last)

Что не очевидно, так это то, что мы можем использоватьboost::refтакже:

    char ch = 'A';
    char from = 'A';
    char to = 'Z';
    ch_p(boost::ref(ch))
    range_p(boost::ref(from), boost::ref(to))

При использованииboost::refфактические параметрыch_pиrange_pПриведены ссылки. Это означает, что мы можем изменять значенияch,сидов любое время и соответствующиеch_pиrange_p.Парсер будет следовать их динамическим значениям. Конечно, поскольку они удерживаются ссылкой, вы должны убедиться, что объект не разрушается при разборе.

А как насчетstr_p?

В то время как первая формаstr_p(форма единственного аргумента) зарезервирована для нулевых констант струн, вторая форма (форма первого / последнего итератора аргумента) может использоваться:

    char const* first = "My oh my";
    char const* last = first + std::strlen(first);
    str_p(boost::ref(first), boost::ref(last))
Hey, don't forget chseq_p. All these apply to this seldom used primitive as well.

Functional Parametric Primitives

    #include <boost/spirit/attribute/parametric.hpp>

Далее, Дух включает в себя функциональные версии примитивов. Вместо того, чтобы брать символы, строки или ссылки на символы и строки (используя boost::ref), функциональные версии принимают функции или функторы.

f_chlit and f_ch_p

Функциональная версияchlit. Этот парсер принимает функцию или функтор (функциональный объект). Ожидается, что функция будет иметь интерфейс, совместимый с:

    CharT func()

где CharT - тип символа (например,char,int,wchar_t).

Ожидается, что функтор будет иметь интерфейс, совместимый с:

    struct functor
    {
        CharT operator()() const;
    };

где CharT - тип символа (например,char,int,wchar_t).

Вот надуманный пример:

    struct X
    {
        char operator()() const
        {
            return 'X'; 
        }
    };

Теперь мы можем использовать X для создания парсера f_chlit:

    f_ch_p(X())

f_range and f_range_p

Функциональная версиядиапазона. Этот парсер принимает функцию или функтор, совместимый с интерфейсами выше. Разница в том, чтоf_rangef_range_p) ожидает два функтора. Один для начала и один для конца диапазона.

f_chseq and f_chseq_p

Функциональная версияchseq. Этот парсер выполняет две функции или функторы. Один для начального итератора и один для конечного итератора. Ожидается, что функция будет иметь интерфейс, совместимый с:

    IteratorT func()

гдеIteratorT- тип итератора (например,char const*,wchar_t const*).

Ожидается, что функтор будет иметь интерфейс, совместимый с:

    struct functor
    {
        IteratorT operator()() const;
    };

гдеIteratorT- тип итератора (например,char const*,wchar_t const*).

f_strlit and f_str_p

Пояснения. Этот парсер принимает две функции или функторы, совместимые с интерфейсами, которые ожидаетf_chseq.



Статья Parametric Parsers раздела может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 08:21:06/0.0080180168151855/1