Chris@16: // Copyright 2008 Christophe Henry Chris@16: // henry UNDERSCORE christophe AT hotmail DOT com Chris@16: // This is an extended version of the state machine available in the boost::mpl library Chris@16: // Distributed under the same license as the original. Chris@16: // Copyright for the original version: Chris@16: // Copyright 2005 David Abrahams and Aleksey Gurtovoy. Distributed Chris@16: // under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_MSM_FRONT_EUML_STT_GRAMMAR_H Chris@16: #define BOOST_MSM_FRONT_EUML_STT_GRAMMAR_H Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace proto = boost::proto; Chris@16: Chris@16: namespace boost { namespace msm { namespace front { namespace euml Chris@16: { Chris@16: Chris@16: template Chris@16: struct TempRow Chris@16: { Chris@16: typedef SOURCE Source; Chris@16: typedef EVENT Evt; Chris@16: typedef TARGET Target; Chris@16: typedef ACTION Action; Chris@16: typedef GUARD Guard; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct convert_to_row Chris@16: { Chris@16: typedef Row type; Chris@16: }; Chris@16: template Chris@16: struct convert_to_internal_row Chris@16: { Chris@16: typedef Internal type; Chris@16: }; Chris@16: // explicit + fork + entry point + exit point grammar Chris@16: struct BuildEntry Chris@16: : proto::or_< Chris@16: proto::when< Chris@16: proto::function,proto::terminal,proto::terminal >, Chris@16: get_fct,get_state_name() >(),get_state_name() >() >() Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: // row grammar Chris@16: struct BuildNextStates Chris@16: : proto::or_< Chris@16: proto::when< Chris@16: proto::terminal, Chris@16: get_state_name() Chris@16: >, Chris@16: proto::when< Chris@16: BuildEntry, Chris@16: BuildEntry Chris@16: >, Chris@16: proto::when< Chris@16: proto::comma, Chris@16: ::boost::mpl::push_back< Chris@16: make_vector_one_row(), Chris@16: BuildEntry(proto::_right)>() Chris@16: >, Chris@16: proto::when < Chris@16: proto::comma, Chris@16: ::boost::mpl::push_back< Chris@16: BuildNextStates(proto::_left), Chris@16: BuildEntry(proto::_right) >() Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct fusion_event_action_guard Chris@16: { Chris@16: typedef TempRow type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct fusion_source_action_guard Chris@16: { Chris@16: typedef TempRow type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct fusion_source_event_action_guard Chris@16: { Chris@16: typedef TempRow type; Chris@16: }; Chris@16: template Chris@16: struct fusion_left_right Chris@16: { Chris@16: typedef TempRow type; Chris@16: }; Chris@16: Chris@16: struct BuildEventPlusGuard Chris@16: : proto::or_< Chris@16: proto::when< Chris@16: proto::subscript, GuardGrammar >, Chris@16: TempRow(proto::_right) Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: struct BuildSourceState Chris@16: : proto::or_< Chris@16: proto::when< Chris@16: proto::terminal, Chris@16: get_state_name() Chris@16: >, Chris@16: proto::when< Chris@16: BuildEntry, Chris@16: BuildEntry Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: struct BuildSourcePlusGuard Chris@16: : proto::when< Chris@16: proto::subscript, Chris@16: TempRow(proto::_right) Chris@16: > Chris@16: {}; Chris@16: Chris@16: struct BuildEvent Chris@16: : proto::or_< Chris@16: // just event without guard/action Chris@16: proto::when< Chris@16: proto::terminal, Chris@16: TempRow() > Chris@16: // event / action Chris@16: , proto::when< Chris@16: proto::divides,ActionGrammar >, Chris@16: TempRow(proto::_right) > Chris@16: // event [ guard ] Chris@16: , proto::when< Chris@16: proto::subscript,GuardGrammar >, Chris@16: TempRow(proto::_right) > Chris@16: // event [ guard ] / action Chris@16: , proto::when< Chris@16: proto::divides, Chris@16: fusion_event_action_guard(proto::_right) Chris@16: >() Chris@16: > Chris@16: > Chris@16: {}; Chris@16: struct BuildSource Chris@16: : proto::or_< Chris@16: // after == if just state without event or guard/action Chris@16: proto::when< Chris@16: BuildSourceState, Chris@16: TempRow() > Chris@16: // == source / action Chris@16: , proto::when< Chris@16: proto::divides, Chris@16: TempRow(proto::_right) > Chris@16: // == source [ guard ] Chris@16: , proto::when< Chris@16: proto::subscript, Chris@16: TempRow(proto::_right) > Chris@16: // == source [ guard ] / action Chris@16: , proto::when< Chris@16: proto::divides, Chris@16: fusion_source_action_guard(proto::_right) Chris@16: >() Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: struct BuildRight Chris@16: : proto::or_< Chris@16: proto::when< Chris@16: proto::plus, Chris@16: fusion_source_event_action_guard() Chris@16: >, Chris@16: proto::when< Chris@16: BuildSource, Chris@16: BuildSource Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: struct BuildRow Chris@16: : proto::or_< Chris@16: // grammar 1 Chris@16: proto::when< Chris@16: proto::equal_to, Chris@16: convert_to_row< Chris@16: fusion_left_right,BuildRight(proto::_right)> >() Chris@16: >, Chris@16: // internal events Chris@16: proto::when< Chris@16: BuildRight, Chris@16: convert_to_row< Chris@16: fusion_left_right,BuildRight(proto::_)> >() Chris@16: >, Chris@16: // grammar 2 Chris@16: proto::when< Chris@16: proto::equal_to, Chris@16: convert_to_row< Chris@16: fusion_left_right,BuildRight(proto::_left)> >() Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: // stt grammar Chris@16: struct BuildStt Chris@16: : proto::or_< Chris@16: proto::when< Chris@16: proto::comma, Chris@16: boost::mpl::push_back() Chris@16: >, Chris@16: proto::when < Chris@16: BuildRow, Chris@16: make_vector_one_row() Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type Chris@101: build_stt(Expr const&) Chris@16: { Chris@16: return typename boost::result_of::type(); Chris@16: } Chris@16: Chris@16: // internal stt grammar Chris@16: struct BuildInternalRow Chris@16: : proto::when< Chris@16: BuildEvent, Chris@16: convert_to_internal_row< Chris@16: fusion_left_right,BuildEvent(proto::_)> >() Chris@16: > Chris@16: {}; Chris@16: struct BuildInternalStt Chris@16: : proto::or_< Chris@16: proto::when< Chris@16: proto::comma, Chris@16: boost::mpl::push_back() Chris@16: >, Chris@16: proto::when < Chris@16: BuildInternalRow, Chris@16: make_vector_one_row() Chris@16: > Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: typename ::boost::mpl::eval_if< Chris@16: typename proto::matches::type, Chris@16: boost::result_of, Chris@16: make_invalid_type>::type Chris@101: build_internal_stt(Expr const&) Chris@16: { Chris@16: return typename boost::result_of::type(); Chris@16: } Chris@16: Chris@16: Chris@16: }}}} Chris@16: #endif //BOOST_MSM_FRONT_EUML_STT_GRAMMAR_H