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

Functor Parser

Boost , ,

Functor Parser

Самый простой способ написать закодированный парсер рукой, который хорошо работает с остальной частью библиотеки Духа, - просто написать парсер функтора.

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

    struct functor
    {
        typedef T result_t;
        template <typename ScannerT>
        std::ptrdiff_t
        operator()(ScannerT const& scan, result_t& result) const;
    };

где typedef T result_t - тип атрибута парсера, который будет передан обратно результату матча (см. Глубоко: Парсер). Если парсеру не нужно возвращать атрибут, это может быть просто nil_t. Результат std::ptrdiff_t - количество совпадающих символов, совпадающих с вашим парсером. Отрицательное значение означает неудачное совпадение.

Соответствующий парсер функтора может быть преобразован в хорошо сформированный парсер Духа, завернув его в шаблон functor_parser:

    functor_parser<functor> functor_p;

Example

Следующий пример приводит в действие functor_parser:

    struct number_parser
    {
        typedef int result_t;
        template <typename ScannerT>
        std::ptrdiff_t
        operator()(ScannerT const& scan, result_t& result) const
        {
            if (scan.at_end())
                return -1;
            char ch = *scan;
            if (ch < '0' || ch > '9')
                return -1;
            result = 0;
            std::ptrdiff_t len = 0;
            do
            {
                result = result*10 + int(ch - '0');
                ++len;
                ++scan;
            } while (!scan.at_end() && (ch = *scan, ch >= '0' && ch <= '9'));
            return len;
        }
    };
    functor_parser<number_parser> number_parser_p;

Полный исходный код можно посмотреть здесь . Это часть духовного распределения.

Для дальнейшего понимания реализации см. Глубоко: Сканер для деталей API сканера. Теперь у нас есть парсер number_parser_p, который мы можем использовать так же, как любой другой парсер Spirit. Пример:

    r = number_parser_p >> *(',' >> number_parser_p);


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




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-07-05 13:34:32/0.0035860538482666/0