Chris@16: /*============================================================================== Chris@16: Copyright (c) 2005-2010 Joel de Guzman Chris@16: Copyright (c) 2010 Thomas Heller Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: #ifndef BOOST_PHOENIX_CORE_TERMINAL_HPP Chris@16: #define BOOST_PHOENIX_CORE_TERMINAL_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #define BOOST_PHOENIX_DEFINE_CUSTOM_TERMINAL(Template, Terminal, IsNullary, EvalFun)\ Chris@16: namespace boost { namespace phoenix \ Chris@16: { \ Chris@16: namespace result_of \ Chris@16: { \ Chris@16: Template \ Chris@16: struct is_nullary< \ Chris@16: custom_terminal< \ Chris@16: Terminal \ Chris@16: > \ Chris@16: > \ Chris@16: : IsNullary \ Chris@16: {}; \ Chris@16: } \ Chris@16: Template \ Chris@16: struct is_custom_terminal: mpl::true_ {}; \ Chris@16: \ Chris@16: Template \ Chris@16: struct custom_terminal : proto::call {}; \ Chris@16: }} \ Chris@16: /**/ Chris@16: Chris@16: namespace boost { namespace phoenix Chris@16: { Chris@16: template Chris@16: struct is_custom_terminal Chris@16: : mpl::false_ {}; Chris@16: Chris@16: template Chris@16: struct custom_terminal; Chris@101: Chris@101: namespace tag { Chris@101: struct terminal /*: public proto::tag::terminal */ {}; Chris@101: } Chris@16: Chris@16: namespace expression Chris@16: { Chris@16: template class Actor = actor> Chris@16: struct terminal Chris@16: : proto::terminal< Chris@16: T//typename call_traits::value_type Chris@16: > Chris@16: { Chris@16: typedef Chris@16: proto::basic_expr< Chris@101: proto::tag::terminal Chris@101: // tag::terminal //cannot change to use phoenix tag - breaks code. Chris@16: , proto::term Chris@16: , 0 Chris@16: > Chris@16: base_type; Chris@16: typedef Actor type; Chris@16: Chris@16: static const type make(typename call_traits::param_type t) Chris@16: { Chris@101: // ?? Should the next line be Actor not actor which is the default? Chris@16: actor const e = {base_type::make(t)}; Chris@101: //Actor const e = {base_type::make(t)}; Chris@16: return e; Chris@16: } Chris@16: }; Chris@16: } Chris@16: Chris@16: namespace rule Chris@16: { Chris@16: struct argument Chris@16: : proto::if_()> Chris@16: {}; Chris@16: Chris@16: struct custom_terminal Chris@16: : proto::if_()> Chris@16: {}; Chris@16: Chris@16: struct terminal Chris@16: : proto::terminal Chris@16: {}; Chris@16: } Chris@16: Chris@16: template Chris@16: struct meta_grammar::case_ Chris@16: : proto::or_< Chris@16: enable_rule Chris@16: , enable_rule Chris@16: , enable_rule Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct default_actions::when Chris@16: : proto::lazy< Chris@16: custom_terminal( Chris@16: proto::_value Chris@16: , _context Chris@16: ) Chris@16: > Chris@16: {}; Chris@16: Chris@16: namespace detail Chris@16: { Chris@16: template Chris@16: struct placeholder_idx Chris@16: : mpl::int_ Chris@16: {}; Chris@16: } Chris@16: Chris@16: template Chris@16: struct default_actions::when Chris@16: : proto::call< Chris@16: proto::functional::at( Chris@16: _env Chris@16: , proto::make< Chris@16: detail::placeholder_idx< Chris@16: proto::make< Chris@16: boost::is_placeholder() Chris@16: > Chris@16: >() Chris@16: > Chris@16: ) Chris@16: > Chris@16: {}; Chris@16: }} Chris@16: Chris@16: #endif