![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Semantic Actions with GeneratorsBoost , Spirit 2.5.2 , Reference
|
выражение |
Семантика |
---|---|
< | Призывайте семантические действия< |
Возможными сигнатурами для функций, используемых в качестве семантических действий, являются:
template <typename Attrib> void fa(Attrib& attr); template <typename Attrib, typename Context> void fa(Attrib& attr, Context& context); template <typename Attrib, typename Context> void fa(Attrib& attr, Context& context, bool& pass);
Предполагается, что функция или объект функции возвращают значение для генерации вывода путем присвоения ему первого параметра<attr
>. Вот<Attrib
>тип атрибута генератора, прикрепленный к семантическому действию.
Тип<Context
>— тип контекста исполнения генератора. Этот тип не определен и зависит от контекста, в котором используется генератор. Значение<context
>используется семантическими действиями, написанными с использованиемФениксадля доступа к различным зависящим от контекста атрибутам и значениям. Для получения дополнительной информации оФениксевыражениях, используемых в семантических действиях см.<Nonterminal
>.
Третий параметр,<pass
>, может быть использован семантическим действием, чтобы заставить соответствующий генератор выйти из строя. В случае, если передатчик установлен на<false
>, генератор действия сразу же вернется<false
>, при этом не ссылаясь<g
>и не генерируя никакого вывода.
выражение |
атрибут |
---|---|
< | < |
Сложность генератора действия определяется сложностью генератора, к которому присоединено семантическое действие, и сложностью функции или объекта функции, используемого в качестве семантического действия.
![]() | Important |
---|---|
Обратите внимание, что использование семантических действий вДух. Кармаобычно заставляет библиотеку создаватькопиюатрибута, что может быть дорогостоящей операцией. Всегда подумайте об использовании других средств связи значения с конкретным генератором. |
![]() | Note |
---|---|
Тестовый ремень для примера (примеров) ниже представлен в разделеОсновные примеры. |
Некоторые включают:
#include <boost/spirit/include/karma.hpp> #include <boost/spirit/include/support_utree.hpp> #include <boost/spirit/include/phoenix_core.hpp> #include <boost/spirit/include/phoenix_operator.hpp> #include <boost/fusion/include/std_pair.hpp> #include <iostream> #include <string>
Некоторые используют декларации:
using boost::spirit::karma::int_; using boost::spirit::karma::string; using boost::spirit::karma::_1; using boost::phoenix::ref; using boost::phoenix::val;
Некоторые примеры:
int i = 42; test_generator("42", int_[_1 = ref(i)]); test_generator("abc", string[_1 = val("abc")]);
Больше примеров семантических действий можно найти здесь:Примеры семантических действий.
Статья Semantic Actions with Generators раздела Spirit 2.5.2 Reference может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
реклама |