rule_alias.hpp 2.0 KB

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