1 /*============================================================================= 2 Copyright (c) 1998-2003 Joel de Guzman 3 http://spirit.sourceforge.net/ 4 5 Distributed under the Boost Software License, Version 1.0. (See accompanying 6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 7 =============================================================================*/ 8 #if !defined(BOOST_SPIRIT_RULE_ALIAS_HPP) 9 #define BOOST_SPIRIT_RULE_ALIAS_HPP 10 11 #include <boost/spirit/home/classic/namespace.hpp> 12 #include <boost/spirit/home/classic/core/parser.hpp> 13 14 namespace boost { namespace spirit { 15 16 BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN 17 18 /////////////////////////////////////////////////////////////////////////// 19 // 20 // rule_alias class 21 // 22 /////////////////////////////////////////////////////////////////////////// 23 template <typename ParserT> 24 class rule_alias : 25 public parser<rule_alias<ParserT> > 26 { 27 public: 28 29 typedef rule_alias<ParserT> self_t; 30 31 template <typename ScannerT> 32 struct result 33 { 34 typedef typename parser_result<ParserT, ScannerT>::type type; 35 }; 36 rule_alias()37 rule_alias() 38 : ptr(0) {} 39 rule_alias(ParserT const & p)40 rule_alias(ParserT const& p) 41 : ptr(&p) {} 42 43 rule_alias& operator =(ParserT const & p)44 operator=(ParserT const& p) 45 { 46 ptr = &p; 47 return *this; 48 } 49 50 template <typename ScannerT> 51 typename parser_result<ParserT, ScannerT>::type parse(ScannerT const & scan) const52 parse(ScannerT const& scan) const 53 { 54 if (ptr) 55 return ptr->parse(scan); 56 else 57 return scan.no_match(); 58 } 59 60 ParserT const& get() const61 get() const 62 { 63 BOOST_ASSERT(ptr != 0); 64 return *ptr; 65 } 66 67 private: 68 69 ParserT const* ptr; // hold it by pointer 70 }; 71 72 BOOST_SPIRIT_CLASSIC_NAMESPACE_END 73 74 }} // namespace BOOST_SPIRIT_CLASSIC_NS 75 76 #endif 77