blob: da24503c2a57b8944bc9072b390cdb46a916c062 [file] [log] [blame]
// Copyright (c) 2001-2011 Hartmut Kaiser
// Copyright (c) 2011 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)
#if !defined(BOOST_SPIRIT_LEX_ARGUMENT_PHEONIX_MARCH_25_2011_1841PM)
#define BOOST_SPIRIT_LEX_ARGUMENT_PHEONIX_MARCH_25_2011_1841PM
#if defined(_MSC_VER)
#pragma once
#endif
#include <boost/spirit/include/phoenix_core.hpp>
namespace boost { namespace spirit { namespace lex
{
///////////////////////////////////////////////////////////////////////////
// The value_context is used as a noop Phoenix actor to create the
// placeholder '_val' (see below). It is a noop actor because it is used
// as a placeholder only, while it is being converted either to a
// value_getter (if used as a rvalue) or to a value_setter (if used as a
// lvalue). The conversion is achieved by specializing and overloading a
// couple of the Phoenix templates from the Phoenix expression composition
// engine (see the end of this file).
struct value_context
{
typedef mpl::true_ no_nullary;
typedef unused_type result_type;
template <typename Env>
struct result
{
typedef unused_type type;
};
template <typename Env>
unused_type
eval(Env const& env) const
{
return unused;
}
};
// forward declarations
struct value_getter;
template <typename> struct value_setter;
///////////////////////////////////////////////////////////////////////////
// The state_context is used as a noop Phoenix actor to create the
// placeholder '_state' (see below). It is a noop actor because it is used
// as a placeholder only, while it is being converted either to a
// state_getter (if used as a rvalue) or to a state_setter (if used as a
// lvalue). The conversion is achieved by specializing and overloading a
// couple of the Phoenix templates from the Phoenix expression composition
// engine (see the end of this file).
struct state_context
{
typedef mpl::true_ no_nullary;
typedef unused_type result_type;
template <typename Env>
struct result
{
typedef unused_type type;
};
template <typename Env>
unused_type
eval(Env const& env) const
{
return unused;
}
};
// forward declarations
struct state_getter;
template <typename> struct state_setter;
struct eoi_getter;
}}}
///////////////////////////////////////////////////////////////////////////////
#ifdef BOOST_SPIRIT_USE_PHOENIX_V3
BOOST_PHOENIX_DEFINE_EXPRESSION(
(boost)(spirit)(lex)(value_setter)
, (boost::phoenix::meta_grammar)
)
BOOST_PHOENIX_DEFINE_EXPRESSION(
(boost)(spirit)(lex)(state_setter)
, (boost::phoenix::meta_grammar)
)
namespace boost { namespace phoenix
{
namespace result_of
{
template <>
struct is_nullary<custom_terminal<boost::spirit::lex::value_context> >
: mpl::false_
{};
}
template <typename Dummy>
struct is_custom_terminal<boost::spirit::lex::value_context, Dummy>: mpl::true_ {};
template <typename Dummy>
struct custom_terminal<boost::spirit::lex::value_context, Dummy>
: proto::call<
v2_eval(
proto::make<boost::spirit::lex::value_getter()>
, proto::call<functional::env(proto::_state)>
)
>
{};
template <typename Dummy>
struct is_nullary::when<spirit::lex::rule::value_setter, Dummy>
: proto::make<mpl::false_()>
{};
template <typename Dummy>
struct default_actions::when<spirit::lex::rule::value_setter, Dummy>
: proto::call<
v2_eval(
proto::make<
spirit::lex::value_setter<proto::_child0>(
proto::_child0
)
>
, _env
)
>
{};
template <>
struct actor<spirit::lex::value_context>
: boost::phoenix::actor<proto::terminal<spirit::lex::value_context>::type>
{
typedef boost::phoenix::actor<
proto::terminal<spirit::lex::value_context>::type
> base_type;
actor(base_type const & base = base_type())
: base_type(base)
{}
template <typename Expr>
typename spirit::lex::expression::value_setter<
typename phoenix::as_actor<Expr>::type>::type const
operator=(Expr const & expr) const
{
return
spirit::lex::expression::value_setter<
typename phoenix::as_actor<Expr>::type
>::make(phoenix::as_actor<Expr>::convert(expr));
}
};
namespace result_of
{
template <>
struct is_nullary<custom_terminal<boost::spirit::lex::state_context> >
: mpl::false_
{};
}
template <typename Dummy>
struct is_custom_terminal<boost::spirit::lex::state_context, Dummy>: mpl::true_ {};
template <typename Dummy>
struct custom_terminal<boost::spirit::lex::state_context, Dummy>
: proto::call<
v2_eval(
proto::make<boost::spirit::lex::state_getter()>
, proto::call<functional::env(proto::_state)>
)
>
{};
template <typename Dummy>
struct is_nullary::when<spirit::lex::rule::state_setter, Dummy>
: proto::make<mpl::false_()>
{};
template <typename Dummy>
struct default_actions::when<spirit::lex::rule::state_setter, Dummy>
: proto::call<
v2_eval(
proto::make<
spirit::lex::state_setter<proto::_child0>(
proto::_child0
)
>
, _env
)
>
{};
template <>
struct actor<spirit::lex::state_context>
: boost::phoenix::actor<proto::terminal<spirit::lex::state_context>::type>
{
typedef boost::phoenix::actor<
proto::terminal<spirit::lex::state_context>::type
> base_type;
actor(base_type const & base = base_type())
: base_type(base)
{}
template <typename Expr>
typename spirit::lex::expression::state_setter<
typename phoenix::as_actor<Expr>::type>::type const
operator=(Expr const & expr) const
{
return
spirit::lex::expression::state_setter<
typename phoenix::as_actor<Expr>::type
>::make(phoenix::as_actor<Expr>::convert(expr));
}
};
namespace result_of
{
template <>
struct is_nullary<custom_terminal<boost::spirit::lex::eoi_getter> >
: mpl::false_
{};
}
template <typename Dummy>
struct is_custom_terminal<boost::spirit::lex::eoi_getter, Dummy>: mpl::true_ {};
template <typename Dummy>
struct custom_terminal<boost::spirit::lex::eoi_getter, Dummy>
: proto::call<
v2_eval(
proto::make<boost::spirit::lex::eoi_getter()>
, proto::call<functional::env(proto::_state)>
)
>
{};
}}
#endif // BOOST_SPIRIT_USE_PHOENIX_V3
#endif