![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Auto ParserBoost , Spirit 2.5.2 , Reference
|
Имя |
---|
< |
Семантика выражения определяется только там, где она отличается или не определена в.<PrimitiveGenerator
>.
выражение |
Описание |
---|---|
< | Создайте экземпляр парсера, совместимый с поставляемым типом атрибута, и используйте его для согласования ввода. |
<auto_
>парсеры могут использоваться для сопоставления ввода для любого типа данных, для которого определено отображение на тип парсера (мета-функция<traits::create_parser_exists
>возвращает<mpl::true_
>). В следующей таблице излагаются заранее определенные правила отображения от типа атрибута к типу парсера. Эти правила применяются рекурсивно для создания типа парсера, который может использоваться для сопоставления ввода для данного типа атрибута.
Тип атрибута |
Тип парсера |
---|---|
< | < |
< | < |
< | < |
< | < |
< | < |
< | < |
Любой (STL) контейнер | Клин Стар< |
Любая последовательность слияний | Оператор последовательностей< |
< | Факультативный оператор< |
< | Альтернативный оператор< |
Можно добавить поддержку любого пользовательского типа данных, реализовав специализацию точки настройки<traits::create_parser
>. Эта настройка может также использоваться для переопределения любого из предопределенных отображений.
выражение |
атрибут |
---|---|
< | < |
![]() | Important |
---|---|
Тип атрибута< |
Сложность парсера<
auto_
>зависит от поставляемого типа атрибута. Каждый тип атрибутов приводит к созданию другого типа парсера, который определяет общую сложность.
![]() | 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
Статья Auto Parser раздела Spirit 2.5.2 Reference может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
реклама |