157 lines
4.9 KiB
Plaintext
157 lines
4.9 KiB
Plaintext
/*=============================================================================
|
|
Copyright (c) 2005-2010 Joel de Guzman
|
|
Copyright (c) 2010 Eric Niebler
|
|
Copyright (c) 2010 Thomas Heller
|
|
|
|
Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
==============================================================================*/
|
|
#ifndef BOOST_PHOENIX_CORE_META_GRAMMAR_HPP
|
|
#define BOOST_PHOENIX_CORE_META_GRAMMAR_HPP
|
|
|
|
#include <boost/phoenix/core/limits.hpp>
|
|
#include <boost/mpl/deref.hpp>
|
|
#include <boost/phoenix/core/environment.hpp>
|
|
#include <boost/proto/matches.hpp>
|
|
#include <boost/proto/transform/call.hpp>
|
|
#include <boost/proto/transform/default.hpp>
|
|
|
|
namespace boost { namespace phoenix
|
|
{
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// The grammar defining valid phoenix expressions
|
|
struct meta_grammar
|
|
: proto::switch_<meta_grammar>
|
|
{
|
|
template <typename Tag, typename Dummy = void>
|
|
struct case_
|
|
: proto::not_<proto::_>
|
|
{};
|
|
};
|
|
|
|
struct evaluator
|
|
{
|
|
BOOST_PROTO_TRANSFORM(evaluator)
|
|
|
|
template <typename Expr, typename State, typename Data>
|
|
struct impl
|
|
: proto::transform_impl<Expr, State, Data>
|
|
{
|
|
typedef meta_grammar::impl<Expr, State, Data> what;
|
|
|
|
typedef typename what::result_type result_type;
|
|
|
|
result_type operator()(
|
|
typename impl::expr_param e
|
|
, typename impl::state_param s
|
|
, typename impl::data_param d
|
|
) const
|
|
{
|
|
return what()(e, s, d);
|
|
}
|
|
};
|
|
|
|
template <typename Expr, typename State>
|
|
struct impl<Expr, State, proto::empty_env>
|
|
: proto::transform_impl<Expr, State, proto::empty_env>
|
|
{
|
|
typedef
|
|
meta_grammar::impl<
|
|
Expr
|
|
, typename result_of::env<State>::type
|
|
, typename result_of::actions<State>::type
|
|
>
|
|
what;
|
|
|
|
typedef typename what::result_type result_type;
|
|
|
|
result_type operator()(
|
|
typename impl::expr_param e
|
|
, typename impl::state_param s
|
|
, typename impl::data_param
|
|
) const
|
|
{
|
|
return what()(e, phoenix::env(s), actions(s));
|
|
}
|
|
};
|
|
|
|
template <typename Expr, typename State>
|
|
struct impl<Expr, State, unused>
|
|
: proto::transform_impl<Expr, State, unused>
|
|
{
|
|
typedef
|
|
meta_grammar::impl<
|
|
Expr
|
|
, typename result_of::env<State>::type
|
|
, typename result_of::actions<State>::type
|
|
>
|
|
what;
|
|
|
|
typedef typename what::result_type result_type;
|
|
|
|
result_type operator()(
|
|
typename impl::expr_param e
|
|
, typename impl::state_param s
|
|
, typename impl::data_param
|
|
) const
|
|
{
|
|
return what()(e, phoenix::env(s), actions(s));
|
|
}
|
|
};
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Set of default actions. Extend this whenever you add a new phoenix
|
|
// construct
|
|
struct default_actions
|
|
{
|
|
template <typename Rule, typename Dummy = void>
|
|
struct when
|
|
: proto::_default<meta_grammar>
|
|
{};
|
|
};
|
|
|
|
template <typename Rule, typename Dummy = void>
|
|
struct enable_rule
|
|
: proto::when<Rule, proto::external_transform>
|
|
{};
|
|
|
|
namespace result_of
|
|
{
|
|
template <typename Expr, typename Context>
|
|
struct eval
|
|
: boost::result_of< ::boost::phoenix::evaluator(Expr, Context)>
|
|
{};
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// A function we can call to evaluate our expression
|
|
template <typename Expr, typename Context>
|
|
inline
|
|
typename meta_grammar::template impl<
|
|
Expr const&
|
|
, typename result_of::env<Context const&>::type
|
|
, typename result_of::actions<Context const&>::type
|
|
>::result_type
|
|
eval(Expr const& expr, Context const & ctx)
|
|
{
|
|
static evaluator const e = {};
|
|
return e(expr, ctx);
|
|
}
|
|
|
|
template <typename Expr, typename Context>
|
|
inline
|
|
typename meta_grammar::template impl<
|
|
Expr &
|
|
, typename result_of::env<Context const&>::type
|
|
, typename result_of::actions<Context const&>::type
|
|
>::result_type
|
|
eval(Expr & expr, Context const & ctx)
|
|
{
|
|
static evaluator const e = {};
|
|
return e(expr, ctx);
|
|
}
|
|
}}
|
|
|
|
#endif
|