parser_traits.ipp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*=============================================================================
  2. Copyright (c) 2002-2003 Joel de Guzman
  3. Copyright (c) 2002-2003 Hartmut Kaiser
  4. Copyright (c) 2003 Martin Wille
  5. http://spirit.sourceforge.net/
  6. Use, modification and distribution is subject to the Boost Software
  7. License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  8. http://www.boost.org/LICENSE_1_0.txt)
  9. =============================================================================*/
  10. #if !defined(BOOST_SPIRIT_PARSER_TRAITS_IPP)
  11. #define BOOST_SPIRIT_PARSER_TRAITS_IPP
  12. #include <boost/spirit/home/classic/core/composite/operators.hpp>
  13. ///////////////////////////////////////////////////////////////////////////////
  14. namespace boost { namespace spirit {
  15. BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
  16. namespace impl
  17. {
  18. ///////////////////////////////////////////////////////////////////////////
  19. struct parser_type_traits_base {
  20. BOOST_STATIC_CONSTANT(bool, is_alternative = false);
  21. BOOST_STATIC_CONSTANT(bool, is_sequence = false);
  22. BOOST_STATIC_CONSTANT(bool, is_sequential_or = false);
  23. BOOST_STATIC_CONSTANT(bool, is_intersection = false);
  24. BOOST_STATIC_CONSTANT(bool, is_difference = false);
  25. BOOST_STATIC_CONSTANT(bool, is_exclusive_or = false);
  26. BOOST_STATIC_CONSTANT(bool, is_optional = false);
  27. BOOST_STATIC_CONSTANT(bool, is_kleene_star = false);
  28. BOOST_STATIC_CONSTANT(bool, is_positive = false);
  29. };
  30. template <typename ParserT>
  31. struct parser_type_traits : public parser_type_traits_base {
  32. // no definition here, fallback for all not explicitly mentioned parser
  33. // types
  34. };
  35. template <typename A, typename B>
  36. struct parser_type_traits<alternative<A, B> >
  37. : public parser_type_traits_base {
  38. BOOST_STATIC_CONSTANT(bool, is_alternative = true);
  39. };
  40. template <typename A, typename B>
  41. struct parser_type_traits<sequence<A, B> >
  42. : public parser_type_traits_base {
  43. BOOST_STATIC_CONSTANT(bool, is_sequence = true);
  44. };
  45. template <typename A, typename B>
  46. struct parser_type_traits<sequential_or<A, B> >
  47. : public parser_type_traits_base {
  48. BOOST_STATIC_CONSTANT(bool, is_sequential_or = true);
  49. };
  50. template <typename A, typename B>
  51. struct parser_type_traits<intersection<A, B> >
  52. : public parser_type_traits_base {
  53. BOOST_STATIC_CONSTANT(bool, is_intersection = true);
  54. };
  55. template <typename A, typename B>
  56. struct parser_type_traits<difference<A, B> >
  57. : public parser_type_traits_base {
  58. BOOST_STATIC_CONSTANT(bool, is_difference = true);
  59. };
  60. template <typename A, typename B>
  61. struct parser_type_traits<exclusive_or<A, B> >
  62. : public parser_type_traits_base {
  63. BOOST_STATIC_CONSTANT(bool, is_exclusive_or = true);
  64. };
  65. template <typename S>
  66. struct parser_type_traits<optional<S> >
  67. : public parser_type_traits_base {
  68. BOOST_STATIC_CONSTANT(bool, is_optional = true);
  69. };
  70. template <typename S>
  71. struct parser_type_traits<kleene_star<S> >
  72. : public parser_type_traits_base {
  73. BOOST_STATIC_CONSTANT(bool, is_kleene_star = true);
  74. };
  75. template <typename S>
  76. struct parser_type_traits<positive<S> >
  77. : public parser_type_traits_base {
  78. BOOST_STATIC_CONSTANT(bool, is_positive = true);
  79. };
  80. } // namespace impl
  81. ///////////////////////////////////////////////////////////////////////////////
  82. BOOST_SPIRIT_CLASSIC_NAMESPACE_END
  83. }} // namespace boost::spirit
  84. #endif // !defined(BOOST_SPIRIT_PARSER_TRAITS_IPP)