2011-03-24 63 views
4

我在将一个类与解析 支持的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 
} 
+1

不要不耐烦,我正在调查... – hkaiser 2011-03-25 11:28:27

+0

谢谢Hartmut! – 2011-03-25 14:44:06

回答

4

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

+0

感谢您的快速响应和修复! – 2011-03-30 07:34:54