1 /*============================================================================= 2 Copyright (c) 2001-2011 Joel de Guzman 3 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_PARSER_OCTOBER_16_2008_0254PM) 8 #define BOOST_SPIRIT_PARSER_OCTOBER_16_2008_0254PM 9 10 #if defined(_MSC_VER) 11 #pragma once 12 #endif 13 14 #include <boost/mpl/has_xxx.hpp> 15 #include <boost/spirit/home/qi/domain.hpp> 16 17 namespace boost { namespace spirit { namespace qi 18 { 19 20 //[parser_base_parser 21 template <typename Derived> 22 struct parser 23 { 24 struct parser_id; 25 typedef Derived derived_type; 26 typedef qi::domain domain; 27 28 // Requirement: p.parse(f, l, context, skip, attr) -> bool 29 // 30 // p: a parser 31 // f, l: first/last iterator pair 32 // context: enclosing rule context (can be unused_type) 33 // skip: skipper (can be unused_type) 34 // attr: attribute (can be unused_type) 35 36 // Requirement: p.what(context) -> info 37 // 38 // p: a parser 39 // context: enclosing rule context (can be unused_type) 40 41 // Requirement: P::template attribute<Ctx, Iter>::type 42 // 43 // P: a parser type 44 // Ctx: A context type (can be unused_type) 45 // Iter: An iterator type (can be unused_type) 46 derivedboost::spirit::qi::parser47 Derived const& derived() const 48 { 49 return *static_cast<Derived const*>(this); 50 } 51 }; 52 //] 53 54 template <typename Derived> 55 struct primitive_parser : parser<Derived> 56 { 57 struct primitive_parser_id; 58 }; 59 60 template <typename Derived> 61 struct nary_parser : parser<Derived> 62 { 63 struct nary_parser_id; 64 65 // Requirement: p.elements -> fusion sequence 66 // 67 // p: a composite parser 68 69 // Requirement: P::elements_type -> fusion sequence 70 // 71 // P: a composite parser type 72 }; 73 74 template <typename Derived> 75 struct unary_parser : parser<Derived> 76 { 77 struct unary_parser_id; 78 79 // Requirement: p.subject -> subject parser 80 // 81 // p: a unary parser 82 83 // Requirement: P::subject_type -> subject parser type 84 // 85 // P: a unary parser type 86 }; 87 88 template <typename Derived> 89 struct binary_parser : parser<Derived> 90 { 91 struct binary_parser_id; 92 93 // Requirement: p.left -> left parser 94 // 95 // p: a binary parser 96 97 // Requirement: P::left_type -> left parser type 98 // 99 // P: a binary parser type 100 101 // Requirement: p.right -> right parser 102 // 103 // p: a binary parser 104 105 // Requirement: P::right_type -> right parser type 106 // 107 // P: a binary parser type 108 }; 109 }}} 110 111 namespace boost { namespace spirit { namespace traits // classification 112 { 113 namespace detail 114 { 115 BOOST_MPL_HAS_XXX_TRAIT_DEF(parser_id) 116 BOOST_MPL_HAS_XXX_TRAIT_DEF(primitive_parser_id) 117 BOOST_MPL_HAS_XXX_TRAIT_DEF(nary_parser_id) 118 BOOST_MPL_HAS_XXX_TRAIT_DEF(unary_parser_id) 119 BOOST_MPL_HAS_XXX_TRAIT_DEF(binary_parser_id) 120 } 121 122 // parser type identification 123 template <typename T> 124 struct is_parser : detail::has_parser_id<T> {}; 125 126 template <typename T> 127 struct is_primitive_parser : detail::has_primitive_parser_id<T> {}; 128 129 template <typename T> 130 struct is_nary_parser : detail::has_nary_parser_id<T> {}; 131 132 template <typename T> 133 struct is_unary_parser : detail::has_unary_parser_id<T> {}; 134 135 template <typename T> 136 struct is_binary_parser : detail::has_binary_parser_id<T> {}; 137 138 }}} 139 140 #endif 141