#include <iostream>
#include <string>
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
template <typename T>
struct real_with_separated_sign_policies : boost::spirit::qi::real_policies<T>
{
// allow skipping chars between a possible sign and a folling real number
template <typename Iterator>
static bool parse_sign(Iterator& first, Iterator const& last)
{
bool ret = qi::extract_sign(first, last);
if (ret)
qi::parse(first, last, *qi::lit(' '));
return ret;
}
};
template <typename Iterator, typename Skipper>
struct RealWithSeparatedSignParser
: qi::grammar<Iterator, double(), Skipper>
{
boost::spirit::qi::real_parser<double, real_with_separated_sign_policies<double> > RealWithSeparatedSignValue;
RealWithSeparatedSignParser() : RealWithSeparatedSignParser::base_type(start)
{
start %= RealWithSeparatedSignValue;
}
qi::rule<Iterator, double(), Skipper> start;
};
int main() {
std::string str = " - 1.234 ";
std::string::const_iterator it = str.begin();
std::string::const_iterator endIt = str.end();
RealWithSeparatedSignParser<std::string::const_iterator, ascii::space_type> grammar;
double realWithSeparatedSign;
bool ret = phrase_parse(it, endIt, grammar, ascii::space, realWithSeparatedSign);
std::cout << ret << " " << realWithSeparatedSign;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Ym9vc3Qvc3Bpcml0L2luY2x1ZGUvcWkuaHBwPgoKbmFtZXNwYWNlIHFpID0gYm9vc3Q6OnNwaXJpdDo6cWk7Cm5hbWVzcGFjZSBhc2NpaSA9IGJvb3N0OjpzcGlyaXQ6OmFzY2lpOwoKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgcmVhbF93aXRoX3NlcGFyYXRlZF9zaWduX3BvbGljaWVzIDogYm9vc3Q6OnNwaXJpdDo6cWk6OnJlYWxfcG9saWNpZXM8VD4KewoJLy8gYWxsb3cgc2tpcHBpbmcgY2hhcnMgYmV0d2VlbiBhIHBvc3NpYmxlIHNpZ24gYW5kIGEgZm9sbGluZyByZWFsIG51bWJlcgoJdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yPgoJc3RhdGljIGJvb2wgcGFyc2Vfc2lnbihJdGVyYXRvciYgZmlyc3QsIEl0ZXJhdG9yIGNvbnN0JiBsYXN0KQoJewoJCWJvb2wgcmV0ID0gcWk6OmV4dHJhY3Rfc2lnbihmaXJzdCwgbGFzdCk7CgkJaWYgKHJldCkKCQkJcWk6OnBhcnNlKGZpcnN0LCBsYXN0LCAqcWk6OmxpdCgnICcpKTsKCQlyZXR1cm4gcmV0OwoJfQp9OwoKCnRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvciwgdHlwZW5hbWUgU2tpcHBlcj4Kc3RydWN0IFJlYWxXaXRoU2VwYXJhdGVkU2lnblBhcnNlcgoJOiBxaTo6Z3JhbW1hcjxJdGVyYXRvciwgZG91YmxlKCksIFNraXBwZXI+CnsKCWJvb3N0OjpzcGlyaXQ6OnFpOjpyZWFsX3BhcnNlcjxkb3VibGUsIHJlYWxfd2l0aF9zZXBhcmF0ZWRfc2lnbl9wb2xpY2llczxkb3VibGU+ID4gUmVhbFdpdGhTZXBhcmF0ZWRTaWduVmFsdWU7CgoJUmVhbFdpdGhTZXBhcmF0ZWRTaWduUGFyc2VyKCkgOiBSZWFsV2l0aFNlcGFyYXRlZFNpZ25QYXJzZXI6OmJhc2VfdHlwZShzdGFydCkKCXsKCQlzdGFydCAlPSBSZWFsV2l0aFNlcGFyYXRlZFNpZ25WYWx1ZTsKCX0KCglxaTo6cnVsZTxJdGVyYXRvciwgZG91YmxlKCksIFNraXBwZXI+IHN0YXJ0Owp9OwoKaW50IG1haW4oKSB7CglzdGQ6OnN0cmluZyBzdHIgPSAiIC0gIDEuMjM0ICI7CglzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdHIuYmVnaW4oKTsKCXN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBlbmRJdCA9IHN0ci5lbmQoKTsKCVJlYWxXaXRoU2VwYXJhdGVkU2lnblBhcnNlcjxzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IsIGFzY2lpOjpzcGFjZV90eXBlPiBncmFtbWFyOwoJZG91YmxlIHJlYWxXaXRoU2VwYXJhdGVkU2lnbjsKCWJvb2wgcmV0ID0gcGhyYXNlX3BhcnNlKGl0LCBlbmRJdCwgZ3JhbW1hciwgYXNjaWk6OnNwYWNlLCByZWFsV2l0aFNlcGFyYXRlZFNpZ24pOwoJc3RkOjpjb3V0IDw8IHJldCA8PCAiICIgPDwgcmVhbFdpdGhTZXBhcmF0ZWRTaWduOwoJcmV0dXJuIDA7Cn0K