| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | // Copyright 2008 Christophe Henry// henry UNDERSCORE christophe AT hotmail DOT com// This is an extended version of the state machine available in the boost::mpl library// Distributed under the same license as the original.// Copyright for the original version:// Copyright 2005 David Abrahams and Aleksey Gurtovoy. 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_MSM_GRAMMAR_H#define BOOST_MSM_GRAMMAR_H#include <boost/proto/core.hpp>#include <boost/msm/common.hpp>namespace boost { namespace msm{// base grammar for all of msm's proto-based grammarsstruct basic_grammar : proto::_{};// Forward-declare an expression wrappertemplate<typename Expr>struct msm_terminal;struct msm_domain    : proto::domain< proto::generator<msm_terminal>, basic_grammar >{};template<typename Expr>struct msm_terminal    : proto::extends<Expr, msm_terminal<Expr>, msm_domain>{    typedef        proto::extends<Expr, msm_terminal<Expr>, msm_domain>        base_type;    // Needs a constructor    msm_terminal(Expr const &e = Expr())        : base_type(e)    {}};// grammar forbidding address of for terminalsstruct terminal_grammar : proto::not_<proto::address_of<proto::_> >{};// Forward-declare an expression wrappertemplate<typename Expr>struct euml_terminal;struct sm_domain    : proto::domain< proto::generator<euml_terminal>, terminal_grammar, boost::msm::msm_domain >{};struct state_grammar :     proto::and_<        proto::not_<proto::address_of<proto::_> >,        proto::not_<proto::shift_right<proto::_,proto::_> >,        proto::not_<proto::shift_left<proto::_,proto::_> >,        proto::not_<proto::bitwise_and<proto::_,proto::_> >    >{};struct state_domain    : proto::domain< proto::generator<euml_terminal>, boost::msm::state_grammar,boost::msm::sm_domain >{};template<typename Expr>struct euml_terminal    : proto::extends<Expr, euml_terminal<Expr>, boost::msm::sm_domain>{    typedef        proto::extends<Expr, euml_terminal<Expr>, boost::msm::sm_domain>        base_type;    // Needs a constructor    euml_terminal(Expr const &e = Expr())        : base_type(e)    {}    // Unhide Proto's overloaded assignment operator    using base_type::operator=;};} } // boost::msm#endif //BOOST_MSM_GRAMMAR_H
 |