/*============================================================================= 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_LIST_MARCH_24_2007_1031AM) #define SPIRIT_LIST_MARCH_24_2007_1031AM #if defined(_MSC_VER) #pragma once #endif #include #include #include #include #include #include namespace boost { namespace spirit { /////////////////////////////////////////////////////////////////////////// // Enablers /////////////////////////////////////////////////////////////////////////// template <> struct use_operator // enables p % d : mpl::true_ {}; }} namespace boost { namespace spirit { namespace qi { template struct list : binary_parser > { typedef Left left_type; typedef Right right_type; template struct attribute { // Build a std::vector from the LHS'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; }; list(Left const& left, Right const& right) : left(left), right(right) {} 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(); Iterator save = first; if (!left.parse(save, last, context, skipper, val) || !traits::push_back(attr, val)) { return false; } first = save; while (right.parse(save, last, context, skipper, unused) && (traits::clear(val), true) && left.parse(save, last, context, skipper, val)) { if (!traits::push_back(attr, val)) break; first = save; } return true; } template info what(Context& context) const { return info("list", std::make_pair(left.what(context), right.what(context))); } Left left; Right right; }; /////////////////////////////////////////////////////////////////////////// // Parser generators: make_xxx function (objects) /////////////////////////////////////////////////////////////////////////// template struct make_composite : make_binary_composite {}; }}} namespace boost { namespace spirit { namespace traits { template struct has_semantic_action > : binary_has_semantic_action {}; }}} #endif