2011-03-24 5 views
4

클래스를 iostream 구문 분석 파싱을 정신 파서로 통합하는 데 문제가 있습니다. 아래의 예 (성령의 예에서 수정 됨)는 문제를 보여줍니다. 사용자 지정 클래스 만 구문 분석하려고하면 첫 번째 구문 분석에 의해 표시된 으로 성공하고 assert를 호출합니다. 사용자 지정 클래스와이 경우 쉼표 및 부동 소수를 구문 분석하려고하면 파서가 실패합니다.boost :: spirit stream_parser가 너무 많이 소비합니까?

왜 이럴 수 있습니까? 스트림 파서 대신에 영혼 파서 을 사용하면 두 번째 예제를 사용할 수 있지만 은 stream_parser를 사용하는 목적을 상쇄합니다. ...

그러나, 코드가이 일을해서는 안 보여줍니다 -

내 지역의 예에서 규칙 디버깅을 사용하도록 설정하고이 사용자 정의 파서가 문자열의 전체 내용을 소비하는 것을 보여줍니다

도움을 주시면 감사하겠습니다. 이 스트림 파서 구성 요소의 버그로 밝혀졌다 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

+0

감사합니다. Hartmut! –

답변

4

부스트 1.44.0, GCC. 기본 std 스트림이 입력을 버퍼링한다는 사실을 설명하지 않았습니다. 이 문제는 SVN에서 수정되었으며 수정 사항은 Boost V1.47의 일부가됩니다. 당신의 코드를 기반으로 Spirit의 회귀 테스트 스위트에 새로운 테스트를 추가했습니다. 신고 해 주셔서 감사합니다.

+0

빠른 응답과 문제를 해결해 주셔서 감사합니다! –

관련 문제