![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Attributes of Compound ComponentsBoost , Spirit 2.5.2 , Attributes
|
Библиотека |
Правило распространения атрибутов последовательности |
---|---|
Ци |
|
Карма |
|
который читается как:
Приведенные
a
иb
являются парсерами (генераторами), аA
является типом атрибутаB
является типом атрибутаb
, затем тип атрибутаab
(a<<b
). будетtuple<A,B>
.
![]() |
Note |
---|---|
Нотация |
Как видите, для того, чтобы тип был совместим с типом атрибута сложного выражения, он должен
Каждый компонент соединения реализует свой собственный набор правил распространения атрибутов. Для полного списка того, как различные генераторы соединений потребляют атрибуты, см. разделы Правила атрибутов соединения Парсера и Правила атрибутов соединения генератора .
Последовательности требуют, чтобы тип атрибута обнажил концепцию последовательности синтеза, где все элементы этой последовательности синтеза должны быть совместимы с соответствующим элементом компонентной последовательности. Например, выражение:
Библиотека |
Выражение последовательности |
---|---|
Ци |
|
Карма |
|
совместим с любой последовательностью синтеза, содержащей два типа, где оба типа должны быть совместимы с 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 |
---|---|
Только для последовательностей: Spirit.Qi и Spirit.Karma предоставляет набор функций API, используемых в основном с последовательностями. Очень похожие на функции семейств 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); где первый атрибут используется для первого |
Альтернативные парсеры и генераторы — это все альтернативы. Для хранения возможных различных типов результатов (атрибутов) из различных альтернатив мы используем тип данных Boost.Variant. Основным правилом распространения атрибутов этих компонентов является:
a: A, b: B --> (a | b): variant<A, B>
Альтернативы имеют второе очень важное правило распространения атрибутов:
a: A, b: A --> (a | b): A
часто позволяет значительно упростить вещи. Если все подвыражения альтернативы выявляют один и тот же тип атрибута, общая альтернатива также выявляет точно такой же тип атрибута.
Статья Attributes of Compound Components раздела Spirit 2.5.2 Attributes может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Attributes ::
реклама |