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

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

Spirit.Qi и Spirit.Karma реализуют четко определенные правила распространения атрибутного типа для всех парсеров соединений и генераторов, таких как последовательности, альтернативы, звезда Клин и т.д. Основным правилом распространения атрибутов для последовательностей является, например:

Библиотека

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

Ци

:: B -->

bAB

Карма

:: B -->(ab,B

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

Приведенные a и b являются парсерами (генераторами), а A является типом атрибута B является типом атрибута b, затем тип атрибута ab (a<<b). будет tuple<A,B>.

[Note] Note

Нотация tupleA> используется в качестве выражения заполнителя для любой последовательности слияния, содержащей типы A и B, такие как boost::tuple<::A>::B> (более подробную информацию см. Boost.Fusion).

Как видите, для того, чтобы тип был совместим с типом атрибута сложного выражения, он должен

  • быть конвертируемым в тип атрибута,
  • или он должен выявить определенные функциональные возможности, т.е. он должен соответствовать концепции, совместимой с компонентом.

Каждый компонент соединения реализует свой собственный набор правил распространения атрибутов. Для полного списка того, как различные генераторы соединений потребляют атрибуты, см. разделы Правила атрибутов соединения Парсера и Правила атрибутов соединения генератора .

The Attribute of Sequence Parsers and Generators

Последовательности требуют, чтобы тип атрибута обнажил концепцию последовательности синтеза, где все элементы этой последовательности синтеза должны быть совместимы с соответствующим элементом компонентной последовательности. Например, выражение:

Библиотека

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

Ци

double_ >> double_

Карма

double_ << double_

совместим с любой последовательностью синтеза, содержащей два типа, где оба типа должны быть совместимы с double. Первый элемент последовательности слияния должен быть совместим с атрибутом первого double_, а второй элемент последовательности слияния должен быть совместим с атрибутом второго double_. Если мы предположим, что имеем экземпляр std::pair<double, double>, мы можем напрямую использовать выражения выше для выполнения обоих, разбор ввода для заполнения атрибута:

// 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::phrase_parse(strbegin, input.end(),
    qi::double_ >> qi::double_,       // parser grammar 
    qi::space,                        // delimiter grammar
    p);                               // attribute to fill while parsing

и генерировать для него выход:

// the following generates: "1.0 2.0" from the pair filled above
std::string str;
std::back_insert_iterator<std::string> out(str);
karma::generate_delimited(out,
    karma::double_ << karma::double_, // generator grammar (format description)
    karma::space,                     // delimiter grammar
    p);                               // data to use as the attribute 

(где в качестве разграничителя используется генератор karma::space, позволяющий автоматически пропускать/вставлять разграничительные пространства между всеми примитивами).

[Tip] Tip

Только для последовательностей: Spirit.Qi и Spirit.Karma предоставляет набор функций API, используемых в основном с последовательностями. Очень похожие на функции семейств scanf и printf эти функции позволяют передавать атрибуты для каждого из элементов последовательности отдельно. Используя соответствующую перегрузку Qi, или Karma's generate(), выражение выше можно переписать следующим образом:

double d1 = 0.0, d2 = 0.0;
qi::phrase_parse(begin, end, qi::double_ >> qi::double_, qi::space, d1, d2);
karma::generate_delimited(out, karma::double_ << karma::double_, karma::space, d1, d2);

где первый атрибут используется для первого double_, а второй атрибут используется для второго double_.

The Attribute of Alternative Parsers and Generators

Альтернативные парсеры и генераторы — это все альтернативы. Для хранения возможных различных типов результатов (атрибутов) из различных альтернатив мы используем тип данных Boost.Variant. Основным правилом распространения атрибутов этих компонентов является:

a: A, b: B --> (a | b): variant<A, B>

Альтернативы имеют второе очень важное правило распространения атрибутов:

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

часто позволяет значительно упростить вещи. Если все подвыражения альтернативы выявляют один и тот же тип атрибута, общая альтернатива также выявляет точно такой же тип атрибута.


PrevUpHomeNext

Статья 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 21:43:16/0.0075428485870361/0