2014-01-06 5 views
2

"abc"를 추출하려면 "start abc end"와 같은 입력을 구문 분석하고 싶습니다.키워드에서 구문 분석을 중지하기 위해 boost :: spirit을 얻으려면 어떻게해야합니까?

#include <boost/spirit/include/qi.hpp> 
#include <ostream> 

namespace qi = boost::spirit::qi; 

int main(int argc, char* argv[]) 
{ 
    typedef std::string::const_iterator iterator; 

    qi::rule<iterator, std::string(), qi::space_type> rule = 
     "start" >> 
     qi::lexeme[+qi::char_] >> 
     "end"; 

    std::string input("start abc end"); 
    auto iter = input.begin(); 
    std::string result; 
    qi::phrase_parse(iter, input.end(), rule, qi::space, result); 

    std::cout << "Result: " << result << std::endl; 
} 

출력은 "ABC 최종 결과"입니다 :

여기 내 테스트 코드입니다.

+0

'qi :: phrase_parse'의 결과를 확인했다면 파싱에 실패했음을 알 수 있습니다. –

+0

"end"가 일찍 소비 되었기 때문에 파서가 일치를 완료하지 못했기 때문에이를 알았습니다. –

+0

코드를 컴파일 할 수 없습니다. 어떤 버전의 부스트를 사용하고 있습니까? – HeyYO

답변

3

문제는 파서가 공백이나 "end"키워드에서 멈출 것으로 예상됩니다. 그러나 파서는 기본적으로 "start"키워드 다음에 어떤 문자를 받아들입니다.

+char_ 

위의 구문 분석기를 의미합니다. 1보다 긴 문자 시퀀스 (공백 포함).

어떻게 든 공백 또는 "end"키워드에서 멈추도록 파서에게 지시해야합니다. 파서 아래의 예는 "끝"키워드

+(char_ - lit("end")) 

때까지 문자를 받아 들어 당신이 정신 설명서 파서의 목록을 살펴 가지고하는 것이 좋습니다. http://www.boost.org/doc/libs/1_55_0/libs/spirit/doc/html/spirit/qi/quick_reference/qi_parsers.html

+0

답변 주셔서 감사합니다. 그러나 도움이되지 않았습니다. \t 치 : 규칙 룰 변경 <반복기, STD : 문자열() 치 : space_type> 룰 = \t \t "시작">> \t \t 치 :: 어휘 [+ 치 :: char_] - qi :: lit ("end") >> \t \t "end"; 도 같은 결과를 산출했습니다. –

+0

나는 이것이 시작과 같아야한다고 생각한다. >> qi :: lexeme [+ qi :: char_ - qi :: lit ("end")] >> "end"' – HeyYO

+0

그건 내가 시도하지 않은 순열이다. 그러나 그것은 도움이되지 않았습니다. 더있어? –