我会像您在这里一样进行此操作。您应该考虑还原first
迭代器,以防进一步解析失败。
您可能需要仔细检查multi_pass<>
适应的迭代器上的刷新语义(我认为这是可以的,因为real_parser
无论如何,包装必须能够在失败时回退)。
当然,考虑到语法的简单性,可以减少样本,但这并不是我想的重点。
这是一个较短的演示,显示了更通用的跳过策略(blank_type
默认情况下使用):
Live On Coliru
#includenamespace qi = boost::spirit::qi; template struct skip_after_sign_policies : boost::spirit::qi::real_policies { // allow skipping chars between a possible sign and a folling real number template static bool parse_sign(Iterator& first, Iterator const& last) { return qi::extract_sign(first, last) && qi::phrase_parse(first, last, qi::eps, Skipper {}); } }; int main() { qi::real_parser > grammar; std::string const str = " - 1.234 "; auto it = str.begin(); double value; bool ok = phrase_parse(it, str.end(), grammar, qi::space, value); std::cout << std::boolalpha << ok << " " << value; if (it != str.end()) std::cout << "Remaining: '" << std::string(it, str.end()) << "'\n"; }
版画
true -1.234