我在将一个类与解析 支持的iostream集成到一个spirit解析器中时遇到了一些麻烦。下面的例子(从Spirit例子中修改)演示了 问题。如果我试图仅解析自定义类,它会成功为第一个解析和调用assert所显示的 。如果我试图解析 自定义类以及(在本例中)逗号和浮点数,解析器 将失败。boost :: spirit stream_parser消耗太多了吗?
任何人都可以投光为什么这会是?如果我使用灵魂解析器 而不是流解析器,我可以使第二个示例工作,但是 这违背了使用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
}
不要不耐烦,我正在调查... – hkaiser 2011-03-25 11:28:27
谢谢Hartmut! – 2011-03-25 14:44:06