Chris@16: /*============================================================================= Chris@16: Copyright (c) 2001-2011 Joel de Guzman Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: #if !defined(BOOST_SPIRIT_PARSER_OCTOBER_16_2008_0254PM) Chris@16: #define BOOST_SPIRIT_PARSER_OCTOBER_16_2008_0254PM Chris@16: Chris@16: #if defined(_MSC_VER) Chris@16: #pragma once Chris@16: #endif Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace spirit { namespace qi Chris@16: { Chris@16: Chris@16: //[parser_base_parser Chris@16: template Chris@16: struct parser Chris@16: { Chris@16: struct parser_id; Chris@16: typedef Derived derived_type; Chris@16: typedef qi::domain domain; Chris@16: Chris@16: // Requirement: p.parse(f, l, context, skip, attr) -> bool Chris@16: // Chris@16: // p: a parser Chris@16: // f, l: first/last iterator pair Chris@16: // context: enclosing rule context (can be unused_type) Chris@16: // skip: skipper (can be unused_type) Chris@16: // attr: attribute (can be unused_type) Chris@16: Chris@16: // Requirement: p.what(context) -> info Chris@16: // Chris@16: // p: a parser Chris@16: // context: enclosing rule context (can be unused_type) Chris@16: Chris@16: // Requirement: P::template attribute::type Chris@16: // Chris@16: // P: a parser type Chris@16: // Ctx: A context type (can be unused_type) Chris@16: // Iter: An iterator type (can be unused_type) Chris@16: Chris@16: Derived const& derived() const Chris@16: { Chris@16: return *static_cast(this); Chris@16: } Chris@16: }; Chris@16: //] Chris@16: Chris@16: template Chris@16: struct primitive_parser : parser Chris@16: { Chris@16: struct primitive_parser_id; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct nary_parser : parser Chris@16: { Chris@16: struct nary_parser_id; Chris@16: Chris@16: // Requirement: p.elements -> fusion sequence Chris@16: // Chris@16: // p: a composite parser Chris@16: Chris@16: // Requirement: P::elements_type -> fusion sequence Chris@16: // Chris@16: // P: a composite parser type Chris@16: }; Chris@16: Chris@16: template Chris@16: struct unary_parser : parser Chris@16: { Chris@16: struct unary_parser_id; Chris@16: Chris@16: // Requirement: p.subject -> subject parser Chris@16: // Chris@16: // p: a unary parser Chris@16: Chris@16: // Requirement: P::subject_type -> subject parser type Chris@16: // Chris@16: // P: a unary parser type Chris@16: }; Chris@16: Chris@16: template Chris@16: struct binary_parser : parser Chris@16: { Chris@16: struct binary_parser_id; Chris@16: Chris@16: // Requirement: p.left -> left parser Chris@16: // Chris@16: // p: a binary parser Chris@16: Chris@16: // Requirement: P::left_type -> left parser type Chris@16: // Chris@16: // P: a binary parser type Chris@16: Chris@16: // Requirement: p.right -> right parser Chris@16: // Chris@16: // p: a binary parser Chris@16: Chris@16: // Requirement: P::right_type -> right parser type Chris@16: // Chris@16: // P: a binary parser type Chris@16: }; Chris@16: }}} Chris@16: Chris@16: namespace boost { namespace spirit { namespace traits // classification Chris@16: { Chris@16: namespace detail Chris@16: { Chris@16: BOOST_MPL_HAS_XXX_TRAIT_DEF(parser_id) Chris@16: BOOST_MPL_HAS_XXX_TRAIT_DEF(primitive_parser_id) Chris@16: BOOST_MPL_HAS_XXX_TRAIT_DEF(nary_parser_id) Chris@16: BOOST_MPL_HAS_XXX_TRAIT_DEF(unary_parser_id) Chris@16: BOOST_MPL_HAS_XXX_TRAIT_DEF(binary_parser_id) Chris@16: } Chris@16: Chris@16: // parser type identification Chris@16: template Chris@16: struct is_parser : detail::has_parser_id {}; Chris@16: Chris@16: template Chris@16: struct is_primitive_parser : detail::has_primitive_parser_id {}; Chris@16: Chris@16: template Chris@16: struct is_nary_parser : detail::has_nary_parser_id {}; Chris@16: Chris@16: template Chris@16: struct is_unary_parser : detail::has_unary_parser_id {}; Chris@16: Chris@16: template Chris@16: struct is_binary_parser : detail::has_binary_parser_id {}; Chris@16: Chris@16: }}} Chris@16: Chris@16: #endif