【问题标题】:boost::spirit stream_parser consumes too much?boost::spirit stream_parser 消耗太多?
【发布时间】:2011-03-24 15:37:54
【问题描述】:

我在将类与 iostream 解析集成时遇到了一些问题 支持精神解析器。下面的示例(根据 Spirit 示例修改)演示了 问题。如果我尝试仅解析自定义类,它会成功 由第一次解析和调用断言显示。如果我尝试解析 自定义类以及(在这种情况下)一个逗号和浮点数,解析器 失败。

谁能解释为什么会这样?如果我使用精神解析器 而不是流解析器,我可以使第二个示例工作,但是 这违背了使用 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
}

【问题讨论】:

  • 别急,我正在调查……

标签: c++ boost boost-spirit


【解决方案1】:

这原来是流解析器组件中的一个错误。它没有考虑底层标准流正在缓冲输入的事实。该问题已在 SVN 中修复,该修复将成为 Boost V1.47 的一部分。我根据您的代码在 Spirit 的回归测试套件中添加了一个新测试 - 希望您不介意。感谢您的报告!

【讨论】:

  • 感谢您的快速响应和修复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多