C++ boost::spirit stream_解析器消耗太多?

C++ boost::spirit stream_解析器消耗太多?,c++,boost,boost-spirit,C++,Boost,Boost Spirit,我在将类与iostream解析集成时遇到一些问题 将支持转换为精神解析器。下面的示例(根据Spirit示例修改)演示了 问题如果我尝试只解析自定义类,它会成功 第一次解析和调用断言时显示。如果我试图解析 自定义类以及(在本例中)逗号和浮点,解析器 失败了 有人能解释为什么会这样吗?如果我使用精神分析器 我可以使用第二个示例代替流解析器,但是 这违背了使用stream_解析器的目的 我在本地示例中启用了规则调试,这表明 自定义解析器使用字符串的全部内容- 然而,代码显示它不应该这样做 感谢您的帮助

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

有人能解释为什么会这样吗?如果我使用精神分析器 我可以使用第二个示例代替流解析器,但是 这违背了使用stream_解析器的目的

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

感谢您的帮助

Boost 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
}
#包括
结构复合体
{
复合物(双a=0.0,双b=0.0):a(a),b(b){}
双a,b;
};
std::istream&operator>>(std::istream&is、complex&z)
{
字符lbrace='\0',逗号='\0',rbrace='\0';
is>>lbrace>>z.a>>逗号>>z.b>>rbrace;
if(lbrace!='{'| |逗号!=','| | rbrace!='}'))
is.setstate(std::ios_base::failbit);
回报是;
}
int main(int argc,字符**argv)
{
使用名称空间boost::spirit;
复杂解析复杂;
浮动解析浮点数;
布尔结果;
std::string str=“{1.0,2.5}”;
std::string::iterator first=str.begin();
result=qi::短语解析(首先,str.end(),
qi::stream_parser(),ascii::blank,parsedComplex);
断言(result&&first==str.end());//确定
str=“{1.0,2.5},123.456”;
first=str.begin();
result=qi::短语解析(首先,str.end(),
qi::stream_parser()>>qi::lit(',')>>qi::float_,
ascii::blank、parsedComplex、parsedFloat);
断言(result&&first==str.end());//失败
}

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

别急,我正在调查…谢谢你的快速回复和修复!