Имея все больше и больше выражений, вы начинаете понимать, что это очень показательная задача. Phoenix предоставляет шаблонные макросы, которые определяют выражения Феникса, как вы видели в предыдущем разделе Выглядит как кусок пирога.
BOOST_PHOENIX_DEFINE_EXPRESSION
- это макрос, который можно использовать для создания всех необходимых шаблонов для создания экспрессий Феникса
BOOST_PHOENIX_DEFINE_EXPRESSION(
(namespace_seq)(name)
, (child_grammar0)
(child_grammar1)
...
)
Приведенный выше макрос генерирует необходимый код для выражения name
в пространстве имен namespace_seq
. Последовательность (child_grammarN)
заявляет, сколько детей будет иметь это выражение, и что proto::grammar
они совпадают.
Макро следует использовать в глобальном масштабе. namespace_seq
- последовательность пространств имен, под которой будут определены следующие символы:
namespace tag
{
struct name;
}
namespace expression
{
template <typename A0, typename A1 ... typename AN>
struct name
: boost::phoenix::expr<
tag::name
, A0
, A1
...
, AN
>
}
namespace rule
{
struct name
: boost::phoenix::expr<
child_grammar0
, child_grammar1
...
, child_grammarN
>
{};
}
namespace functional
{
struct make_name;
}
namespace result_of
{
template <typename A0, typename A1 ... typename AN>
struct make_name;
}
template <typename A0, typename A1 ... typename AN>
result_of::make_name<A0, A1 ... AN>
make_name(A0 const & a0, A1 const & a1 ... AN const & an);
Этот макрос также добавляет специализацию для meta_grammar::case_<tag::name>
, чтобы включить правило для дальнейшего использования в действиях.
#include <boost/phoenix/core/expression.hpp>
Пример из предыдущего раздела можно переписать так:
BOOST_PHOENIX_DEFINE_EXPRESSION(
(plus)
, (meta_grammar)
(meta_grammar)
)
template <typename Lhs, typename Rhs>
typename plus<Lhs, Rhs>::type
plus(Lhs const & lhs, Rhs const & rhs)
{
return expression::plus<Lhs, Rhs>::make(lhs, rhs);
}
BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG
- это макрос, который можно использовать для создания всех необходимых шаблонов для создания экспрессий Феникса
BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG(
(namespace_seq)(name)
, (child_grammar0)
(child_grammar1)
...
(child_grammarN)
, N
)
Приведенный выше макрос генерирует необходимый код для выражения name
в пространстве имен namespace_seq
. N
- максимальное число детей. Все, кроме последних элементов грамматической последовательности, необходимы детям выражения, а последнее обозначает переменное число детей. Число детей, которое может содержать такое выражение, составляет N-1
плюс размер последовательности
Макро следует использовать в глобальном масштабе. namespace_seq
- последовательность пространств имен, под которой будут определены следующие символы:
namespace tag
{
struct name;
}
namespace expression
{
template <typename A0, typename A1 ... typename AN>
struct name
: boost::phoenix::expr<
tag::name
, A0
, A1
...
, AN
>
{};
}
namespace rule
{
struct name
: expression::name<
child_grammar0
, child_grammar1
...
, proto::vararg<child_grammarN>
>
{};
}
namespace functional
{
struct make_name;
}
namespace result_of
{
template <typename A0, typename A1 ... typename AN>
struct make_name;
}
template <typename A0, typename A1 ... typename AN>
result_of::make_name<A0, A1 ... AN>
make_name(A0 const & a0, A1 const & a1 ... AN const & an);
Этот макрос также добавляет специализацию для meta_grammar::case_<tag::name>
, чтобы включить правило для дальнейшего использования в действиях.
#include <boost/phoenix/core/expression.hpp>
BOOST_PHOENIX_DEFINE_EXPRESSION_VARARG(
(boost)(phoenix)(mem_fun_ptr)
, (meta_grammar)
(meta_grammar)
(meta_grammar)
, BOOST_PHOENIX_LIMIT
)
Это определяет выражение оператора указателя функции участника, как описано в операторах.
BOOST_PHOENIX_DEFINE_EXPRESSION_EXT
- это макрос, который можно использовать для создания всех необходимых шаблонов для создания Phoenix Expressions
BOOST_PHOENIX_DEFINE_EXPRESSION_EXT(
actor
, (namespace_seq)(name)
, (child_grammar0)
(child_grammar1)
...
(child_grammarN)
, N
)
Приведенный выше макрос генерирует необходимый код для выражения name
в пространстве имен namespace_seq
. Последовательность (child_grammarN)
заявляет, сколько детей будет иметь это выражение, и что proto::grammar
они совпадают.
Макро следует использовать в глобальном масштабе. namespace_seq
- последовательность пространств имен, под которой будут определены следующие символы:
namespace tag
{
struct name;
}
namespace expression
{
template <typename A0, typename A1 ... typename AN>
struct name
: boost::phoenix::expr_ext<
actor
, tag::name
, A0
, A1
...
, AN
>
}
namespace rule
{
struct name
: boost::phoenix::expr<
child_grammar0
, child_grammar1
...
, child_grammarN
>
{};
}
namespace functional
{
struct make_name;
}
namespace result_of
{
template <typename A0, typename A1 ... typename AN>
struct make_name;
}
template <typename A0, typename A1 ... typename AN>
result_of::make_name<A0, A1 ... AN>
make_name(A0 const & a0, A1 const & a1 ... AN const & an);
Этот макрос также добавляет специализацию для meta_grammar::case_<tag::name>
, чтобы включить правило для дальнейшего использования в действиях.
#include <boost/phoenix/core/expression.hpp>
BOOST_PHOENIX_DEFINE_EXPRESSION_EXT(
if_actor
, (boost)(phoenix)(if_)
, (meta_grammar)
(meta_grammar)
)
Это определяет выражение if_. Пользователь определяет else_
как участник.
BOOST_PHOENIX_DEFINE_EXPRESSION_EXT_VARARG
- это макрос, который можно использовать для создания всех необходимых шаблонов для создания Phoenix Expressions
BOOST_PHOENIX_DEFINE_EXPRESSION_EXT_VARARG(
actor
, (namespace_seq)(name)
, (child_grammar0)
(child_grammar1)
...
(child_grammarN)
, N
)
Приведенный выше макрос генерирует необходимый код для выражения name
в пространстве имен namespace_seq
. N
- максимальное число детей. Все, кроме последних элементов грамматической последовательности, необходимы детям выражения, а последнее обозначает переменное число детей. Число детей, которое может содержать такое выражение, составляет N-1
плюс размер последовательности
Макро следует использовать в глобальном масштабе. namespace_seq
- последовательность пространств имен, под которой будут определены следующие символы:
namespace tag
{
struct name;
}
namespace expression
{
template <typename A0, typename A1 ... typename AN>
struct name
: boost::phoenix::expr_ext<
actor
, tag::name
, A0
, A1
...
, AN
>
{};
}
namespace rule
{
struct name
: expression::name<
child_grammar0
, child_grammar1
...
, proto::vararg<child_grammarN>
>
{};
}
namespace functional
{
struct make_name;
}
namespace result_of
{
template <typename A0, typename A1 ... typename AN>
struct make_name;
}
template <typename A0, typename A1 ... typename AN>
result_of::make_name<A0, A1 ... AN>
make_name(A0 const & a0, A1 const & a1 ... AN const & an);
Этот макрос также добавляет специализацию для meta_grammar::case_<tag::name>
, чтобы включить правило для дальнейшего использования в действиях.
#include <boost/phoenix/core/expression.hpp>
ТБД