/*============================================================================= Copyright (c) 2001-2011 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_DIFFERENCE_FEBRUARY_11_2007_1250PM) #define SPIRIT_DIFFERENCE_FEBRUARY_11_2007_1250PM #if defined(_MSC_VER) #pragma once #endif #include #include #include #include #include #include #include #include namespace boost { namespace spirit { /////////////////////////////////////////////////////////////////////////// // Enablers /////////////////////////////////////////////////////////////////////////// template <> struct use_operator // enables - : mpl::true_ {}; }} namespace boost { namespace spirit { namespace qi { template struct difference : binary_parser > { typedef Left left_type; typedef Right right_type; template struct attribute { typedef typename traits::attribute_of::type type; }; difference(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 { // Unlike classic Spirit, with this version of difference, the rule // lit("policeman") - "police" will always fail to match. // Spirit2 does not count the matching chars while parsing and // there is no reliable and fast way to check if the LHS matches // more than the RHS. // Try RHS first Iterator start = first; if (right.parse(first, last, context, skipper, unused)) { // RHS succeeds, we fail. first = start; return false; } // RHS fails, now try LHS return left.parse(first, last, context, skipper, attr_); } template info what(Context& context) const { return info("difference", 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 {}; /////////////////////////////////////////////////////////////////////////// template struct handles_container, Attribute, Context , Iterator> : binary_handles_container {}; }}} #endif