166 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			166 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /*============================================================================= | ||
|  |     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) |