boost :: spirit stream_parser消耗太多了?

Bri*_*edy 4 c++ boost boost-spirit

我在将带有iostream解析支持的类集成到精神解析器时遇到了一些麻烦.下面的示例(从Spirit示例中修改)演示了该问题.如果我尝试仅解析自定义类,它会成功,如第一个解析所示,并调用assert.如果我尝试解析自定义类以及(在本例中)逗号和浮点数,则解析器将失败.

任何人都可以说明为什么会这样吗?如果我使用精神解析器而不是流解析器,我可以使第二个示例工作,但这违背了使用stream_parser的目的.

我在本地示例中启用了规则调试,这表明自定义解析器使用了字符串的全部内容 - 但是,代码显示它不应该这样做...

任何帮助赞赏!

提升1.44.0,gcc 4.1.1

#include <boost/spirit/include/qi.hpp>

struct complex
{
  complex (double a = 0.0, double b = 0.0) : a(a), b(b) {}
  double a,b;
};

std::istream& operator>> (std::istream& is, complex& z)
{
  char lbrace = '\0', comma = '\0', rbrace = '\0';
  is >> lbrace >> z.a >> comma >> z.b >> rbrace;
  if (lbrace != '{' || comma != ',' || rbrace != '}')
      is.setstate(std::ios_base::failbit);
  return is;
}

int main( int argc, char**argv)
{
  using namespace boost::spirit;
  complex parsedComplex;
  float   parsedFloat;
  bool result;

  std::string str = "{1.0,2.5}";
  std::string::iterator first = str.begin();
  result = qi::phrase_parse(first,str.end(),
    qi::stream_parser<char,complex>(), ascii::blank,parsedComplex);
  assert(result && first==str.end()); // OK

  str = "{1.0,2.5},123.456";
  first = str.begin();
  result = qi::phrase_parse(first,str.end(),
     qi::stream_parser<char,complex>() >> qi::lit(',') >> qi::float_,
     ascii::blank,parsedComplex,parsedFloat);
  assert(result && first==str.end());  // FAILS
}
Run Code Online (Sandbox Code Playgroud)

hka*_*ser 5

这结果是流解析器组件中的一个错误.它没有解释底层std流缓冲输入的事实.该问题在SVN中得到修复,修复将成为Boost V1.47的一部分.我根据你的代码为Spirit的回归测试套件添加了一个新的测试 - 我希望你不介意.谢谢报道!