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

More About Attributes of Compound Components

Boost , Spirit 2.5.2 , Attributes

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

При разборе входных или генерирующих выходных часто желательно комбинировать некоторые постоянные элементы с переменными частями. Например, рассмотрим пример разбора или форматирования сложного числа, которое записывается как<(real,imag)>, где<real>и<imag>являются переменными, представляющими реальную и мнимую части нашего сложного числа. Этого можно достичь, написав:

Библиотека

Выражение последовательности

Ци

<'('>> double_>> ", ">> double_>> ')'>

Карма

<'('<< double_<< ", "<< double_<< ')'>

К счастью, буквалы (такие как<'('>и<", ">) делают, а невыставляют какой-либо атрибут (ну, на самом деле, они выставляют особый тип<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] 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);

который обеспечивает четкий и удобный синтаксис, более похожий на синтаксис на основе заполнителя, как показано<printf>или<boost::format>.

Давайте посмотрим на это с более формальной точки зрения. Правила распространения атрибутов последовательности определяют особое поведение, если задействованы генераторы, обнажающие<unused_type>как свой атрибут (см.Правила атрибутов соединения генератора):

Библиотека

Правило распространения атрибутов последовательности

Ци

<a: A, b: Unused--> (a >>b):A>

Карма

<a: A, b: Unused--> (a <<b):A>

который читается как:

<a>и<b>являются парсерами (генераторами), и<A>является типом атрибута<a>, и<unused_type>является типом атрибута<b>, тогда тип атрибута<a >>b><a<< b>также будет<A>. Это правило применяется независимо от положения, в котором находится элемент<unused_type>.

Это правило является ключом к пониманию обработки атрибутов в последовательностях, как только используются буквы. Это как если бы элементы с<unused_type>атрибутами «исчезли» при распространении атрибутов. Примечательно, что это верно не только для последовательностей, но и для любых составных компонентов. Например, для альтернативных компонентов соответствующее правило:

a: A, b: Unused --> (a | b): A

Опять же, позволяя упростить общий тип атрибута выражения.


PrevUpHomeNext

Статья More About Attributes of Compound Components раздела Spirit 2.5.2 Attributes может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Attributes ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 20:32:44/0.029128789901733/1