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