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
							 |