/*============================================================================= Copyright (c) 2001-2010 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) =============================================================================*/ #if !defined(SPIRIT_KLEENE_JANUARY_07_2007_0818AM) #define SPIRIT_KLEENE_JANUARY_07_2007_0818AM #if defined(_MSC_VER) #pragma once #endif #include #include #include #include #include namespace boost { namespace spirit { /////////////////////////////////////////////////////////////////////////// // Enablers /////////////////////////////////////////////////////////////////////////// //[composite_parsers_kleene_enable_ template <> struct use_operator // enables *p : mpl::true_ {}; //] }} namespace boost { namespace spirit { namespace qi { //[composite_parsers_kleene template struct kleene : unary_parser > { typedef Subject subject_type; template struct attribute { // Build a std::vector from the subject's attribute. Note // that build_std_vector may return unused_type if the // subject's attribute is an unused_type. typedef typename traits::build_std_vector< typename traits:: attribute_of::type >::type type; }; kleene(Subject const& subject) : subject(subject) {} template bool parse(Iterator& first, Iterator const& last , Context& context, Skipper const& skipper , Attribute& attr) const { // create a local value if Attribute is not unused_type typedef typename traits::container_value::type value_type; value_type val = value_type(); // Repeat while subject parses ok Iterator save = first; while (subject.parse(save, last, context, skipper, val) && traits::push_back(attr, val)) // push the parsed value into our attribute { first = save; traits::clear(val); } return true; } template info what(Context& context) const { return info("kleene", subject.what(context)); } Subject subject; }; //] /////////////////////////////////////////////////////////////////////////// // Parser generators: make_xxx function (objects) /////////////////////////////////////////////////////////////////////////// //[composite_parsers_kleene_generator template struct make_composite : make_unary_composite {}; //] // /////////////////////////////////////////////////////////////////////////// // // Define what attributes are compatible with a kleene // template // struct is_attribute_compatible, Context, Iterator> // : traits::is_container_compatible, Context, Iterator> // {}; }}} namespace boost { namespace spirit { namespace traits { template struct has_semantic_action > : unary_has_semantic_action {}; }}} #endif