![]() |
![]() ![]() ![]() ![]() |
![]() |
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.
реклама |