2010-03-18 6 views
4

VS2005와 함께 Boost-1.42.0과 함께 배포 된 Boost.Spirit을 사용하고 있습니다. 내 문제는 이것과 같다.Boost Spirit 2를 사용하여 사용자 정의 구조체의 데이터를 채우는 구문 분석 문자열

나는이 문자열을 쉼표로 구분했습니다. 처음 3 개의 필드는 문자열이고 나머지는 숫자입니다. 이렇게.

String1,String2,String3,12.0,12.1,13.0,13.1,12.4 

내 규칙은이 같은 구조에 데이터를 저장하기 위해 노력하고있어이

qi::rule<string::iterator, qi::skip_type> stringrule = *(char_ - ',') 
qi::rule<string::iterator, qi::skip_type> myrule= repeat(3)[*(char_ - ',') >> ','] >> (double_ % ',') ; 

같다.

struct MyStruct 
{ 
    vector<string> stringVector ; 
    vector<double> doubleVector ; 
} ; 

MyStruct var ; 

내가 영으로 그것을 사용하는 BOOST_FUSION_ADAPT_STRUCTURE에 싸서했습니다.

BOOST_FUSION_ADAPT_STRUCT (MyStruct, (vector<string>, stringVector) (vector<double>, doubleVector)) 

내 구문 분석 함수는 라인을 구문 분석하고 true를 돌려

qi::phrase_parse (iterBegin, iterEnd, myrule, boost::spirit::ascii::space, var) ; 

후 나는 var.stringVector과 var.doubleVector가 제대로 채워 기대하고있다. 그러나 그것은 사실이 아닙니다.

무엇이 잘못 되었나요?

코드 샘플이 사전에 here

감사합니다, 수르야

+1

문제를 재현 할 수있는 지속적이고 편집 가능한 코드 스 니펫을 게시 할 수 있다면 더 많은 사람들이보고 도움을 얻을 수 있습니다. –

+0

소스 코드 샘플은 pastebin 사이트에서 제공됩니다. http://www.pastebin.org/117703 – Surya

답변

6

qi::skip_type에 위치하면 선장을 사용할 수있는 것이 아닙니다. qi :: skip_type은 자리 표시 자 qi::skip의 유형으로 skip[] 지시문 (lexeme[] 내에서 건너 뛰기를 사용하거나 사용중인 skippper를 변경할 수 있음)에 적용 할 수 있으며 입력 자체와 일치하는 구문 분석 구성 요소가 아닙니다. 대신 특정 선장 유형을 지정해야합니다 (귀하의 경우는 boost::spirit::ascii:space_type).

또한 규칙에서 구문 분석 된 특성을 반환하려면 규칙을 정의하는 동안 예상되는 특성의 형식을 지정해야합니다. 그러면 다음과 같이 나타납니다.

qi::rule<string::iterator, std::string(), ascii:space_type> 
    stringrule = *(char_ - ','); 
qi::rule<string::iterator, MyStruct(), ascii:space_type> 
    myrule = repeat(3)[*(char_ - ',') >> ','] >> (double_ % ','); 

정확히 예상 한대로 수행해야합니다.