| /*============================================================================= |
| Copyright (c) 1998-2003 Joel de Guzman |
| Copyright (c) 2003 Vaclav Vesely |
| http://spirit.sourceforge.net/ |
| |
| 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_NO_ACTIONS_HPP) |
| #define BOOST_SPIRIT_NO_ACTIONS_HPP |
| |
| #include <boost/spirit/home/classic/core/parser.hpp> |
| #include <boost/spirit/home/classic/core/composite/composite.hpp> |
| #include <boost/spirit/home/classic/core/non_terminal/rule.hpp> |
| |
| namespace boost { |
| namespace spirit { |
| BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN |
| |
| //----------------------------------------------------------------------------- |
| // no_actions_action_policy |
| |
| template<typename BaseT = action_policy> |
| struct no_actions_action_policy: |
| public BaseT |
| { |
| typedef BaseT base_t; |
| |
| no_actions_action_policy(): |
| BaseT() |
| {} |
| |
| template<typename PolicyT> |
| no_actions_action_policy(PolicyT const& other): |
| BaseT(other) |
| {} |
| |
| template<typename ActorT, typename AttrT, typename IteratorT> |
| void |
| do_action( |
| ActorT const& actor, |
| AttrT& val, |
| IteratorT const& first, |
| IteratorT const& last) const |
| {} |
| }; |
| |
| //----------------------------------------------------------------------------- |
| // no_actions_scanner |
| |
| |
| namespace detail |
| { |
| template <typename ActionPolicy> |
| struct compute_no_actions_action_policy |
| { |
| typedef no_actions_action_policy<ActionPolicy> type; |
| }; |
| |
| template <typename ActionPolicy> |
| struct compute_no_actions_action_policy<no_actions_action_policy<ActionPolicy> > |
| { |
| typedef no_actions_action_policy<ActionPolicy> type; |
| }; |
| } |
| |
| template<typename ScannerT = scanner<> > |
| struct no_actions_scanner |
| { |
| typedef scanner_policies< |
| typename ScannerT::iteration_policy_t, |
| typename ScannerT::match_policy_t, |
| typename detail::compute_no_actions_action_policy<typename ScannerT::action_policy_t>::type |
| > policies_t; |
| |
| typedef typename |
| rebind_scanner_policies<ScannerT, policies_t>::type type; |
| }; |
| |
| #if BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT > 1 |
| |
| template<typename ScannerT = scanner<> > |
| struct no_actions_scanner_list |
| { |
| typedef |
| scanner_list< |
| ScannerT, |
| typename no_actions_scanner<ScannerT>::type |
| > |
| type; |
| }; |
| |
| #endif // BOOST_SPIRIT_RULE_SCANNERTYPE_LIMIT > 1 |
| |
| //----------------------------------------------------------------------------- |
| // no_actions_parser |
| |
| struct no_actions_parser_gen; |
| |
| template<typename ParserT> |
| struct no_actions_parser: |
| public unary<ParserT, parser<no_actions_parser<ParserT> > > |
| { |
| typedef no_actions_parser<ParserT> self_t; |
| typedef unary_parser_category parser_category_t; |
| typedef no_actions_parser_gen parser_generator_t; |
| typedef unary<ParserT, parser<self_t> > base_t; |
| |
| template<typename ScannerT> |
| struct result |
| { |
| typedef typename parser_result<ParserT, ScannerT>::type type; |
| }; |
| |
| no_actions_parser(ParserT const& p) |
| : base_t(p) |
| {} |
| |
| template<typename ScannerT> |
| typename result<ScannerT>::type |
| parse(ScannerT const& scan) const |
| { |
| typedef typename no_actions_scanner<ScannerT>::policies_t policies_t; |
| |
| return this->subject().parse(scan.change_policies(policies_t(scan))); |
| } |
| }; |
| |
| //----------------------------------------------------------------------------- |
| // no_actions_parser_gen |
| |
| struct no_actions_parser_gen |
| { |
| template<typename ParserT> |
| struct result |
| { |
| typedef no_actions_parser<ParserT> type; |
| }; |
| |
| template<typename ParserT> |
| static no_actions_parser<ParserT> |
| generate(parser<ParserT> const& subject) |
| { |
| return no_actions_parser<ParserT>(subject.derived()); |
| } |
| |
| template<typename ParserT> |
| no_actions_parser<ParserT> |
| operator[](parser<ParserT> const& subject) const |
| { |
| return no_actions_parser<ParserT>(subject.derived()); |
| } |
| }; |
| |
| //----------------------------------------------------------------------------- |
| // no_actions_d |
| |
| const no_actions_parser_gen no_actions_d = no_actions_parser_gen(); |
| |
| //----------------------------------------------------------------------------- |
| BOOST_SPIRIT_CLASSIC_NAMESPACE_END |
| } // namespace spirit |
| } // namespace boost |
| |
| #endif // !defined(BOOST_SPIRIT_NO_ACTIONS_HPP) |