diff -uart boost-orig/spirit/home/qi/auxiliary/eoi.hpp boost/spirit/home/qi/auxiliary/eoi.hpp --- boost-orig/spirit/home/qi/auxiliary/eoi.hpp 2015-07-14 22:38:56 +0000 +++ boost/spirit/home/qi/auxiliary/eoi.hpp 2015-11-28 08:10:05 +0000 @@ -50,8 +50,14 @@ , Context& /*context*/, Skipper const& skipper , Attribute& /*attr*/) const { - qi::skip_over(first, last, skipper); - return first == last; + Iterator it = first; + qi::skip_over(it, last, skipper); + if (it == last) + { + first = it; + return true; + } + return false; } template diff -uart boost-orig/spirit/home/qi/auxiliary/eol.hpp boost/spirit/home/qi/auxiliary/eol.hpp --- boost-orig/spirit/home/qi/auxiliary/eol.hpp 2015-07-14 22:38:56 +0000 +++ boost/spirit/home/qi/auxiliary/eol.hpp 2015-11-28 08:04:51 +0000 @@ -50,9 +50,10 @@ , Context& /*context*/, Skipper const& skipper , Attribute& /*attr*/) const { - qi::skip_over(first, last, skipper); - Iterator it = first; + + qi::skip_over(it, last, skipper); + bool matched = false; if (it != last && *it == '\r') // CR { diff -uart boost-orig/spirit/home/qi/auxiliary/eps.hpp boost/spirit/home/qi/auxiliary/eps.hpp --- boost-orig/spirit/home/qi/auxiliary/eps.hpp 2015-07-14 22:38:56 +0000 +++ boost/spirit/home/qi/auxiliary/eps.hpp 2015-11-28 08:03:12 +0000 @@ -89,7 +89,8 @@ , Context& /*context*/, Skipper const& skipper , Attribute& /*attr*/) const { - qi::skip_over(first, last, skipper); + if (predicate) + qi::skip_over(first, last, skipper); return predicate; } diff -uart boost-orig/spirit/home/qi/binary/binary.hpp boost/spirit/home/qi/binary/binary.hpp --- boost-orig/spirit/home/qi/binary/binary.hpp 2015-07-14 22:38:56 +0000 +++ boost/spirit/home/qi/binary/binary.hpp 2015-11-28 08:04:29 +0000 @@ -243,12 +243,13 @@ , Context& /*context*/, Skipper const& skipper , Attribute& attr_param) const { - qi::skip_over(first, last, skipper); + Iterator it = first; + + qi::skip_over(it, last, skipper); typename attribute::type attr_; unsigned char* bytes = reinterpret_cast(&attr_); - Iterator it = first; for (unsigned int i = 0; i < sizeof(attr_); ++i) { if (it == last) @@ -289,7 +290,9 @@ , Context& /*context*/, Skipper const& skipper , Attribute& attr_param) const { - qi::skip_over(first, last, skipper); + Iterator it = first; + + qi::skip_over(it, last, skipper); // Even if the endian types are not pod's (at least not in the // definition of C++03) it seems to be safe to assume they are @@ -309,7 +312,6 @@ unsigned char* bytes = reinterpret_cast(&attr_); - Iterator it = first; for (unsigned int i = 0; i < sizeof(attr_); ++i) { if (it == last || *bytes++ != static_cast(*it++)) diff -uart boost-orig/spirit/home/qi/char/char_parser.hpp boost/spirit/home/qi/char/char_parser.hpp --- boost-orig/spirit/home/qi/char/char_parser.hpp 2015-07-14 22:38:56 +0000 +++ boost/spirit/home/qi/char/char_parser.hpp 2015-11-28 08:05:43 +0000 @@ -63,12 +63,15 @@ bool parse(Iterator& first, Iterator const& last , Context& context, Skipper const& skipper, Attribute& attr_) const { - qi::skip_over(first, last, skipper); + Iterator it = first; + + qi::skip_over(it, last, skipper); - if (first != last && this->derived().test(*first, context)) + if (it != last && this->derived().test(*it, context)) { - spirit::traits::assign_to(*first, attr_); - ++first; + spirit::traits::assign_to(*it, attr_); + ++it; + first = it; return true; } return false; diff -uart boost-orig/spirit/home/qi/directive/lexeme.hpp boost/spirit/home/qi/directive/lexeme.hpp --- boost-orig/spirit/home/qi/directive/lexeme.hpp 2015-07-14 22:38:56 +0000 +++ boost/spirit/home/qi/directive/lexeme.hpp 2015-11-28 08:09:27 +0000 @@ -61,9 +61,15 @@ , Context& context, Skipper const& skipper , Attribute& attr_) const { - qi::skip_over(first, last, skipper); - return subject.parse(first, last, context - , detail::unused_skipper(skipper), attr_); + Iterator it = first; + qi::skip_over(it, last, skipper); + if (subject.parse(it, last, context + , detail::unused_skipper(skipper), attr_)) + { + first = it; + return true; + } + return false; } template diff -uart boost-orig/spirit/home/qi/directive/raw.hpp boost/spirit/home/qi/directive/raw.hpp --- boost-orig/spirit/home/qi/directive/raw.hpp 2015-07-14 22:38:56 +0000 +++ boost/spirit/home/qi/directive/raw.hpp 2015-11-28 08:09:03 +0000 @@ -58,12 +58,13 @@ bool parse(Iterator& first, Iterator const& last , Context& context, Skipper const& skipper, Attribute& attr_) const { - qi::skip_over(first, last, skipper); - Iterator i = first; - if (subject.parse(i, last, context, skipper, unused)) + Iterator it = first; + qi::skip_over(it, last, skipper); + Iterator start = it; + if (subject.parse(it, last, context, skipper, unused)) { - spirit::traits::assign_to(first, i, attr_); - first = i; + spirit::traits::assign_to(start, it, attr_); + first = it; return true; } return false; diff -uart boost-orig/spirit/home/qi/nonterminal/rule.hpp boost/spirit/home/qi/nonterminal/rule.hpp --- boost-orig/spirit/home/qi/nonterminal/rule.hpp 2015-07-14 22:38:56 +0000 +++ boost/spirit/home/qi/nonterminal/rule.hpp 2015-11-28 08:12:24 +0000 @@ -277,9 +277,10 @@ { if (f) { + Iterator it = first; // do a preskip if this is an implied lexeme if (is_same::value) - qi::skip_over(first, last, skipper); + qi::skip_over(it, last, skipper); typedef traits::make_attribute make_attribute; @@ -301,11 +302,12 @@ // fourth parameter can't be converted to a required target type // then you are probably trying to use a rule or a grammar with // an incompatible skipper type. - if (f(first, last, context, skipper)) + if (f(it, last, context, skipper)) { // do up-stream transformation, this integrates the results // back into the original attribute value, if appropriate traits::post_transform(attr_param, attr_); + first = it; return true; } @@ -323,9 +325,10 @@ { if (f) { + Iterator it = first; // do a preskip if this is an implied lexeme if (is_same::value) - qi::skip_over(first, last, skipper); + qi::skip_over(it, last, skipper); typedef traits::make_attribute make_attribute; @@ -347,11 +350,12 @@ // fourth parameter can't be converted to a required target type // then you are probably trying to use a rule or a grammar with // an incompatible skipper type. - if (f(first, last, context, skipper)) + if (f(it, last, context, skipper)) { // do up-stream transformation, this integrates the results // back into the original attribute value, if appropriate traits::post_transform(attr_param, attr_); + first = it; return true; } diff -uart boost-orig/spirit/home/qi/numeric/bool.hpp boost/spirit/home/qi/numeric/bool.hpp --- boost-orig/spirit/home/qi/numeric/bool.hpp 2015-07-14 22:38:56 +0000 +++ boost/spirit/home/qi/numeric/bool.hpp 2015-11-28 08:18:46 +0000 @@ -156,8 +156,14 @@ , Attribute& attr_) const { typedef detail::bool_impl extract; - qi::skip_over(first, last, skipper); - return extract::parse(first, last, attr_, BoolPolicies()); + Iterator it = first; + qi::skip_over(it, last, skipper); + if (extract::parse(it, last, attr_, BoolPolicies())) + { + first = it; + return true; + } + return false; } template @@ -187,8 +193,14 @@ , Attribute& attr_) const { typedef detail::bool_impl extract; - qi::skip_over(first, last, skipper); - return extract::parse(first, last, attr_, BoolPolicies(), n_, n_); + Iterator it = first; + qi::skip_over(it, last, skipper); + if (extract::parse(if, last, attr_, BoolPolicies(), n_, n_)) + { + first = it; + return true; + } + return false; } template diff -uart boost-orig/spirit/home/qi/numeric/int.hpp boost/spirit/home/qi/numeric/int.hpp --- boost-orig/spirit/home/qi/numeric/int.hpp 2015-07-14 22:38:56 +0000 +++ boost/spirit/home/qi/numeric/int.hpp 2015-11-28 08:20:39 +0000 @@ -205,8 +205,14 @@ , Attribute& attr_) const { typedef extract_int extract; - qi::skip_over(first, last, skipper); - return extract::call(first, last, attr_); + Iterator it = first; + qi::skip_over(it, last, skipper); + if (extract::call(it, last, attr_)) + { + first = it; + return true; + } + return false; } template @@ -243,18 +249,18 @@ , Attribute& attr_param) const { typedef extract_int extract; - qi::skip_over(first, last, skipper); + Iterator it = first; + qi::skip_over(it, last, skipper); - Iterator save = first; T attr_; - if (extract::call(first, last, attr_) && (attr_ == n_)) + if (extract::call(it, last, attr_) && (attr_ == n_)) { traits::assign_to(attr_, attr_param); + first = it; return true; } - first = save; return false; } diff -uart boost-orig/spirit/home/qi/numeric/real.hpp boost/spirit/home/qi/numeric/real.hpp --- boost-orig/spirit/home/qi/numeric/real.hpp 2015-07-14 22:38:56 +0000 +++ boost/spirit/home/qi/numeric/real.hpp 2015-11-28 08:21:59 +0000 @@ -164,8 +164,14 @@ , T& attr_) const { typedef detail::real_impl extract; - qi::skip_over(first, last, skipper); - return extract::parse(first, last, attr_, RealPolicies()); + Iterator it = first; + qi::skip_over(it, last, skipper); + if (extract::parse(it, last, attr_, RealPolicies())) + { + first = it; + return true; + } + return false; } template extract; - qi::skip_over(first, last, skipper); + Iterator it = first; + qi::skip_over(it, last, skipper); - Iterator save = first; T attr_; - if (extract::parse(first, last, attr_, RealPolicies()) && + if (extract::parse(it, last, attr_, RealPolicies()) && (attr_ == n_)) { traits::assign_to(attr_, attr_param); + first = it; return true; } - first = save; return false; } diff -uart boost-orig/spirit/home/qi/numeric/uint.hpp boost/spirit/home/qi/numeric/uint.hpp --- boost-orig/spirit/home/qi/numeric/uint.hpp 2015-07-14 22:38:56 +0000 +++ boost/spirit/home/qi/numeric/uint.hpp 2015-11-28 08:22:50 +0000 @@ -238,8 +238,14 @@ , Attribute& attr_) const { typedef extract_uint extract; - qi::skip_over(first, last, skipper); - return extract::call(first, last, attr_); + Iterator it = first; + qi::skip_over(it, last, skipper); + if (extract::call(it, last, attr_)) + { + first = it; + return true; + } + return false; } template @@ -276,18 +282,18 @@ , Attribute& attr_param) const { typedef extract_uint extract; - qi::skip_over(first, last, skipper); + Iterator it = first; + qi::skip_over(it, last, skipper); - Iterator save = first; T attr_; - if (extract::call(first, last, attr_) && (attr_ == n_)) + if (extract::call(it, last, attr_) && (attr_ == n_)) { traits::assign_to(attr_, attr_param); + first = it; return true; } - first = save; return false; } diff -uart boost-orig/spirit/home/qi/stream/stream.hpp boost/spirit/home/qi/stream/stream.hpp --- boost-orig/spirit/home/qi/stream/stream.hpp 2015-07-14 22:38:56 +0000 +++ boost/spirit/home/qi/stream/stream.hpp 2015-11-28 08:23:48 +0000 @@ -62,20 +62,23 @@ { typedef qi::detail::iterator_source source_device; typedef boost::iostreams::stream instream; + + Iterator it = first; - qi::skip_over(first, last, skipper); + qi::skip_over(it, last, skipper); - instream in(first, last); // copies 'first' - in >> attr_; // use existing operator>>() + instream in(it, last); // copies 'first' + in >> attr_; // use existing operator>>() // advance the iterator if everything is ok if (in) { if (!in.eof()) { std::streamsize pos = in.tellg(); - std::advance(first, pos); + std::advance(it, pos); } else { - first = last; + it = last; } + first = it; return true; } diff -uart boost-orig/spirit/home/qi/string/lit.hpp boost/spirit/home/qi/string/lit.hpp --- boost-orig/spirit/home/qi/string/lit.hpp 2015-07-14 22:38:56 +0000 +++ boost/spirit/home/qi/string/lit.hpp 2015-11-28 08:24:53 +0000 @@ -106,8 +106,14 @@ bool parse(Iterator& first, Iterator const& last , Context& /*context*/, Skipper const& skipper, Attribute& attr_) const { - qi::skip_over(first, last, skipper); - return detail::string_parse(str, first, last, attr_); + Iterator it = first; + qi::skip_over(it, last, skipper); + if (detail::string_parse(str, first, last, attr_)) + { + first = it; + return true; + } + return false; } template @@ -165,8 +171,14 @@ bool parse(Iterator& first, Iterator const& last , Context& /*context*/, Skipper const& skipper, Attribute& attr_) const { - qi::skip_over(first, last, skipper); - return detail::string_parse(str_lo, str_hi, first, last, attr_); + Iterator it = first; + qi::skip_over(it, last, skipper); + if (detail::string_parse(str_lo, str_hi, first, last, attr_)) + { + first = it; + return true; + } + return false; } template diff -uart boost-orig/spirit/home/qi/string/symbols.hpp boost/spirit/home/qi/string/symbols.hpp --- boost-orig/spirit/home/qi/string/symbols.hpp 2015-07-14 22:38:56 +0000 +++ boost/spirit/home/qi/string/symbols.hpp 2015-11-28 08:25:23 +0000 @@ -259,12 +259,15 @@ bool parse(Iterator& first, Iterator const& last , Context& /*context*/, Skipper const& skipper, Attribute& attr_) const { - qi::skip_over(first, last, skipper); + Iterator it = first; + + qi::skip_over(it, last, skipper); if (value_type* val_ptr - = lookup->find(first, last, Filter())) + = lookup->find(it, last, Filter())) { spirit::traits::assign_to(*val_ptr, attr_); + first = it; return true; } return false; diff -uart boost-orig/spirit/repository/home/qi/directive/distinct.hpp boost/spirit/repository/home/qi/directive/distinct.hpp --- boost-orig/spirit/repository/home/qi/directive/distinct.hpp 2015-07-14 22:38:56 +0000 +++ boost/spirit/repository/home/qi/directive/distinct.hpp 2015-11-28 08:28:08 +0000 @@ -76,18 +76,18 @@ bool parse(Iterator& first, Iterator const& last , Context& context, Skipper const& skipper, Attribute& attr) const { - Iterator iter = first; + Iterator it = first; - spirit::qi::skip_over(iter, last, skipper); - if (!subject.parse(iter, last, context + spirit::qi::skip_over(it, last, skipper); + if (!subject.parse(it, last, context , spirit::qi::detail::unused_skipper(skipper), attr)) return false; - Iterator i = iter; + Iterator i = it; if (tail.parse(i, last, context, unused, unused)) return false; - first = iter; + first = it; return true; } diff -uart boost-orig/spirit/repository/home/qi/operator/detail/keywords.hpp boost/spirit/repository/home/qi/operator/detail/keywords.hpp --- boost-orig/spirit/repository/home/qi/operator/detail/keywords.hpp 2015-07-14 22:38:56 +0000 +++ boost/spirit/repository/home/qi/operator/detail/keywords.hpp 2015-11-28 08:31:22 +0000 @@ -98,8 +98,14 @@ (!is_distinct::value) || skipper.parse(first,last,unused,unused,unused) ){ - spirit::qi::skip_over(first, last, skipper); - return call_subject_unused(fusion::at_c(elements), first, last, context, skipper, idx ); + Iterator it = first; + spirit::qi::skip_over(it, last, skipper); + if (call_subject_unused(fusion::at_c(elements), it, last, context, skipper, idx )) + { + first = it; + return true; + } + return false; } return false; } diff -uart boost-orig/spirit/repository/home/qi/operator/keywords.hpp boost/spirit/repository/home/qi/operator/keywords.hpp --- boost-orig/spirit/repository/home/qi/operator/keywords.hpp 2015-07-14 22:38:56 +0000 +++ boost/spirit/repository/home/qi/operator/keywords.hpp 2015-11-28 08:32:37 +0000 @@ -254,7 +254,7 @@ // We have a bool array 'flags' with one flag for each parser as well as a 'counter' // array. - // The kwd directive sets and increments the counter when a successeful parse occurred + // The kwd directive sets and increments the counter when a successful parse occurred // as well as the slot of the corresponding parser to true in the flags array as soon // the minimum repetition requirement is met and keeps that value to true as long as // the maximum repetition requirement is met. @@ -264,9 +264,8 @@ while(true) { - - spirit::qi::skip_over(first, last, skipper); Iterator save = first; + spirit::qi::skip_over(first, last, skipper); if (string_keywords_inst.parse(first, last,parse_visitor,skipper)) { save = first; @@ -277,7 +276,7 @@ if(!complex_keywords_inst.parse(complex_function)) { first = save; - // Check that we are leaving the keywords parser in a successfull state + // Check that we are leaving the keywords parser in a successful state BOOST_FOREACH(bool &valid,flags) { if(!valid) @@ -335,7 +334,7 @@ // We have a bool array 'flags' with one flag for each parser as well as a 'counter' // array. - // The kwd directive sets and increments the counter when a successeful parse occurred + // The kwd directive sets and increments the counter when a successful parse occurred // as well as the slot of the corresponding parser to true in the flags array as soon // the minimum repetition requirement is met and keeps that value to true as long as // the maximum repetition requirement is met. @@ -345,8 +344,8 @@ while(true) { - spirit::qi::skip_over(first, last, skipper); Iterator save = first; + spirit::qi::skip_over(first, last, skipper); // String keywords pass if (string_keywords_inst.parse(first,last,parse_visitor,no_case_parse_visitor,skipper)) { @@ -358,7 +357,7 @@ if(!complex_keywords_inst.parse(complex_function)) { first = save; - // Check that we are leaving the keywords parser in a successfull state + // Check that we are leaving the keywords parser in a successful state BOOST_FOREACH(bool &valid,flags) { if(!valid)