Report position where parsing failed; resolves #2168
This commit is contained in:
parent
58ebadd7b3
commit
996a27dbd1
@ -15,7 +15,6 @@ namespace qi = boost::spirit::qi;
|
||||
template <typename Iterator, typename Into> //
|
||||
struct URLParser final : qi::grammar<Iterator, Into>
|
||||
{
|
||||
|
||||
URLParser() : URLParser::base_type(start)
|
||||
{
|
||||
alpha_numeral = qi::char_("a-zA-Z0-9");
|
||||
@ -29,10 +28,10 @@ struct URLParser final : qi::grammar<Iterator, Into>
|
||||
|
||||
// Example input: /route/v1/driving/7.416351,43.731205;7.420363,43.736189
|
||||
|
||||
start = qi::lit('/') >> service //
|
||||
>> qi::lit('/') >> qi::lit('v') >> version //
|
||||
>> qi::lit('/') >> profile //
|
||||
>> qi::lit('/') >> query; //
|
||||
start = qi::lit('/') > service //
|
||||
> qi::lit('/') > qi::lit('v') > version //
|
||||
> qi::lit('/') > profile //
|
||||
> qi::lit('/') > query; //
|
||||
|
||||
BOOST_SPIRIT_DEBUG_NODES((start)(service)(version)(profile)(query))
|
||||
}
|
||||
@ -65,10 +64,19 @@ boost::optional<ParsedURL> parseURL(std::string::iterator &iter, const std::stri
|
||||
static URLParser<It, ParsedURL()> const parser;
|
||||
ParsedURL out;
|
||||
|
||||
const auto ok = boost::spirit::qi::parse(iter, end, parser, out);
|
||||
try
|
||||
{
|
||||
const auto ok = boost::spirit::qi::parse(iter, end, parser, out);
|
||||
|
||||
if (ok && iter == end)
|
||||
return boost::make_optional(out);
|
||||
if (ok && iter == end)
|
||||
return boost::make_optional(out);
|
||||
}
|
||||
catch (const qi::expectation_failure<It> &failure)
|
||||
{
|
||||
// The grammar above using expectation parsers ">" does not automatically increment the
|
||||
// iterator to the failing position. Extract the position from the exception ourselves.
|
||||
iter = failure.first;
|
||||
}
|
||||
|
||||
return boost::none;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user