![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
More About Attributes of Compound ComponentsBoost , Spirit 2.5.2 , Attributes
|
Библиотека |
Выражение последовательности |
---|---|
Ци |
< |
Карма |
< |
К счастью, буквалы (такие как<'('
>и<", "
>) делают, а невыставляют какой-либо атрибут (ну, на самом деле, они выставляют особый тип<unused_type
>, но в этом контексте<unused_type
>интерпретируется так, как будто компонент вообще не выставляет какой-либо атрибут). Очень важно понимать, что буквалы не потребляют ни один из элементов последовательности синтеза, переданных этой компонентной последовательности. Как уже говорилось, они просто не выставляют никаких атрибутов и не производят (потребляют) никаких данных. Следующий пример показывает это:
// the following parses "(1.0, 2.0)" into a pair of double std::string input("(1.0, 2.0)"); std::string::iterator strbegin = input.begin(); std::pair<double, double> p; qi::parse(strbegin, input.end(), '(' >> qi::double_ >> ", " >> qi::double_ >> ')', // parser grammar p); // attribute to fill while parsing
В этом и состоит суть. Кармафрагмент кода:
// the following generates: (1.0, 2.0) std::string str; std::back_insert_iterator<std::string> out(str); generate(out, '(' << karma::double_ << ", " << karma::double_ << ')', // generator grammar (format description) p); // data to use as the attribute
где первый элемент пары, переданный в виде данных для генерации, по-прежнему связан с первым<double_
>, а второй элемент связан со вторым<double_
>генератором.
Это поведение должно быть знакомым, поскольку оно соответствует тому, как другие библиотеки форматирования ввода и вывода, такие как<scanf
>,<printf
>или<boost::format
>, обрабатывают свои переменные части. В этом контексте вы можете думать оДухе. ЦииДухе. Примитивные компоненты кармы(такие как<double_
>выше) как безопасные заполнители для значений атрибутов.
![]() |
Tip |
---|---|
Подобно приведенному выше наконечнику, этот пример можно переписать с помощью.Функция мультиатрибутного API Духа: double d1 = 0.0, d2 = 0.0; qi::parse(begin, end, '(' >> qi::double_ >> ", " >> qi::double_ >> ')', d1, d2); karma::generate(out, '(' << karma::double_ << ", " << karma::double_ << ')', d1, d2); который обеспечивает четкий и удобный синтаксис, более похожий на синтаксис на основе заполнителя, как показано< |
Давайте посмотрим на это с более формальной точки зрения. Правила распространения атрибутов последовательности определяют особое поведение, если задействованы генераторы, обнажающие<unused_type
>как свой атрибут (см.Правила атрибутов соединения генератора):
Библиотека |
Правило распространения атрибутов последовательности |
---|---|
Ци |
< |
Карма |
< |
который читается как:
<
a
>и<b
>являются парсерами (генераторами), и<A
>является типом атрибута<a
>, и<unused_type
>является типом атрибута<b
>, тогда тип атрибута<a >>b
><a<< b
>также будет<A
>. Это правило применяется независимо от положения, в котором находится элемент<unused_type
>.
Это правило является ключом к пониманию обработки атрибутов в последовательностях, как только используются буквы. Это как если бы элементы с<unused_type
>атрибутами «исчезли» при распространении атрибутов. Примечательно, что это верно не только для последовательностей, но и для любых составных компонентов. Например, для альтернативных компонентов соответствующее правило:
a: A, b: Unused --> (a | b): A
Опять же, позволяя упростить общий тип атрибута выражения.
Статья More About Attributes of Compound Components раздела Spirit 2.5.2 Attributes может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Attributes ::
реклама |