Как вы знаете из разделаАктеры в деталях, действия — это то, что приносит жизнь в дерево выражения Феникса.
При работе с деревом выражения Феникса оно оценивается сверху вниз. Пример:
_1 + 3 * _2
Можно визуализировать как AST следующим образом:

С точки зрения действий это означает:
- <
rule::plus
>Соответствует
- Оценка слева:
- <
rule::placeholder
>соответствует
- <
rule::multiplies
>соответствует- оценка слева:
- <
rule::value
>соответствует
- <
rule::placeholder
><rule::placeholder
>[<rule::placeholder
>]
Каждый раз, когда выполняется какое-то правило, называется действие. Действие определяет, как будет проходить Phoenix AST.
Как упоминалось вАктёры в деталяхдействийПротопримитивные преобразованиядля удобства Феникс предоставляет абстракцию к этому:
template <typename Fun>
struct call;
Это подобно<proto::call
>, но делает больше. Он называет объект функции<Fun
>принятым в качестве шаблонного параметра с<Context
>и детьми выражения, связанного с правилом.
Приведем (упрощенный) пример того, как написать оценочное действие для<rule::plus
>:
struct plus_eval
{
typedef int result_type;
template <typename Lhs, typename Rhs, typename Context>
result_type operator()(Lhs const& lhs, Rhs const &rhs, Context & ctx)
{
return eval(lhs, ctx) + eval(rhs, ctx);
}
};
template <>
struct default_actions::when<rule::plus>
: call<plus_eval>
{};
Вот так. При оценке выражения<plus
>вызывающий<plus_eval
>вызывается выражением левой стороны и правой стороны и связанным с ним контекстом.
Но есть и другое:Поскольку действиямогут быть полными, а— полными,Прото-преобразования, вы можете фактически использовать любое прото-выражение, которое вы можете себе представить как действие. Феникс предопределяет набор вызывающих и трансформирует, чтобы иметь дело с передаваемой контекстной информацией, и, конечно, каждое выражение Феникса может использоваться в качестве грамматики Феникса или. Прото проходит через трансформацию.
functional::context(Env, Actions)
Прото-вызываемая трансформация, создающая новый контекст из параметра<Env
>и<Actions
>.
functional::env(Context)
Прото-вызываемое преобразование, которое возвращает окружающую среду из<Context
>параметра
functional::actions(Context)
Преобразование, которое возвращает действия из<Context
>параметра
_context
Протопримитивная трансформация, возвращающая текущий контекст
_env
Протопримитивная трансформация, возвращающая текущую среду
_actions
Протопримитивная трансформация, возвращающая текущие действия
context(env, actions)
Регулярная функция, создающая контекст
env(ctx)
Регулярная функция, которая возвращает окружающую среду из данного контекста.
actions(ctx)
Регулярная функция, которая возвращает действия из данного контекста.
Phoenix оснащен предопределенным набором выражений, правил и действий, чтобы заставить работать все, что вы узнали в разделахStarter KitиModules. Смотрите следующий разделдля более подробной информации!