You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
251 lines
7.3 KiB
251 lines
7.3 KiB
// 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
|
|
|