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

Auto Parser

Boost , Spirit 2.5.2 , Reference

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext
Description

Этот модуль включает описание парсера<auto_>. Этот парсер можно использовать для автоматического создания парсера на основе поставляемого типа атрибута.

Header
// forwards to <boost/spirit/home/qi/auto.hpp>
#include <boost/spirit/include/qi_auto.hpp>

См. такжеВключите структуру.

Namespace

Имя

<boost::spirit::auto_// alias: boost::spirit::qi::auto_>

Model of
Expression Semantics

Семантика выражения определяется только там, где она отличается или не определена в.<PrimitiveGenerator>.

выражение

Описание

<auto_>

Создайте экземпляр парсера, совместимый с поставляемым типом атрибута, и используйте его для согласования ввода.

Additional Requirements

<auto_>парсеры могут использоваться для сопоставления ввода для любого типа данных, для которого определено отображение на тип парсера (мета-функция<traits::create_parser_exists>возвращает<mpl::true_>). В следующей таблице излагаются заранее определенные правила отображения от типа атрибута к типу парсера. Эти правила применяются рекурсивно для создания типа парсера, который может использоваться для сопоставления ввода для данного типа атрибута.

Тип атрибута

Тип парсера

<char>,<wchar_t>

<standard::char_>,<standard_wide::char_>

<short>,<int>,<long>

<short_>,<int_>,<long_>

<unsignedshort>,<unsignedint>,<unsignedlong>

<ushort_>,<uint_>,<ulong_>

<float>,<double>,<long double>

<float_>,<double_>,<long_double>

<longlong>,<unsignedlong long>

<long_long>,<ulong_long>

<bool>

<bool_>

Любой (STL) контейнер

Клин Стар<'*'>

Любая последовательность слияний

Оператор последовательностей<'>>'>

<boost::optional<>>

Факультативный оператор<'-'>

<boost::variant<>>

Альтернативный оператор<'|'>

Можно добавить поддержку любого пользовательского типа данных, реализовав специализацию точки настройки<traits::create_parser>. Эта настройка может также использоваться для переопределения любого из предопределенных отображений.

Attributes

выражение

атрибут

<auto_>

<hold_any>

[Important]Important

Тип атрибута<hold_any>, представленный парсером<auto_>, семантически и синтаксически эквивалентен типу, реализованномуBoost.Any. Он был добавлен кДуху, поскольку он имеет лучшую производительность и меньший след по сравнению сBoost.Any.

Complexity

Сложность парсера<auto_>зависит от поставляемого типа атрибута. Каждый тип атрибутов приводит к созданию другого типа парсера, который определяет общую сложность.

Example
[Note]Note

Испытательный ремень для примера (примеров) ниже представлен в разделеОсновные примеры.

Некоторые включают:

#include <boost/spirit/include/support_utree.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/assert.hpp>
#include <iostream>
#include <string>
#include <cstdlib>

Некоторые используют декларации:

using boost::spirit::qi::auto_;

Определение класса, используемое в примерах:

// a simple complex number representation z = a + bi
struct complex
{
    complex (double a = 0.0, double b = 0.0)
      : a(a), b(b)
    {}
    double a;
    double b;
};

Для использования структуры данных<complex>в качестве последовательностиBoost.Fusionтребуется следующая конструкция. Это необходимо, поскольку мы будем излучать выход для этой структуры данных с последовательностьюSpirit.Qi:<'{' >>qi::double_>>','>>qi::double_>>'}'>.

BOOST_FUSION_ADAPT_STRUCT(
    complex,
    (double, a)
    (double, b)
)

Добавляем специализацию для точки настройки create_parser, определяющей пользовательский формат вывода для сложного типа. Как правило, любая специализация для create_parser должна возвращать выражение прото, используемое для соответствия ввода типу, для которого была специализирована точка настройки.

Мы должны использовать<proto::deep_copy>, поскольку выражение содержит буквы<'{'>,<','>и<'}'>, которые обычно встраиваются в прото выражение только посредством ссылки. Глубокая копия преобразует прото-дерево, чтобы удерживать его по стоимости. Операция глубокой копии может быть исключена для более простых прото-выражений (не содержащих ссылок на временные периоды). В качестве альтернативы вы можете использовать средство<proto::make_expr>для создания требуемого выражения прото.

namespace boost { namespace spirit { namespace traits
{
    template <>
    struct create_parser<complex>
    {
        typedef proto::result_of::deep_copy<
            BOOST_TYPEOF('{' >> qi::double_ >> ',' >> qi::double_ >> '}')
        >::type type;
        static type call()
        {
            return proto::deep_copy(
                '{' >> qi::double_ >> ',' >> qi::double_ >> '}');
        }
    };
}}}

Некоторые примеры использования<auto_>парсеров:

Простые целочисленные числа с использованием сгенерированного парсерного компонента<int_>:

int i = 0;
test_parser_attr("123", auto_, i);
std::cout << i << std::endl;                    // prints: 123

Проанализируйте пример типа данных<complex>, как определено выше, используя парсер, генерируемый определенной точкой настройки:

complex c;
test_parser_attr("{1.2,2.4}", auto_, c);
std::cout << c.a << "," << c.b << std::endl;    // prints: 1.2,2.4


PrevUpHomeNext

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




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



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


реклама


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

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