2016-05-31 1 views
1

boost.spirit 파서를 사용하여 구문 분석하는 방법을 배우려고합니다. VisualStudio 2015와 함께 Windows 8.1을 사용하고 있습니다. boost.spirit 설치 문서의 테스트 프로그램을 설치하고 successfuly 컴파일하여 부스트 설치가 잘된 것처럼 보입니다.boost.spirit.parser를 사용할 때 컴파일 오류를 해독 할 수 없습니다.

저는 페이저 사용에 관한 boost.org 튜토리얼을 따라 왔습니다.

'bool boost::function4<R,T0,T1,T2,T3>::operator()(T0,T1,T2,T3) const': cannot convert argument 4 from 'const boost::spirit::unused_type' to 'const boost::spirit::qi::char_class<boost::spirit::tag::char_code<boost::spirit::tag::space,boost::spirit::char_encoding::ascii>> ' 

어떤 도움을 크게 이해할 수있을 것이다 : 나는 rule.hpp 라인 (304)에서 다음과 같은 오류 메시지가 컴파일 할 때

#include <boost/config/warning_disable.hpp> 
    #include <boost/spirit/include/qi.hpp> 
    #include <boost/spirit/include/phoenix_core.hpp> 
    #include <boost/spirit/include/phoenix_operator.hpp> 
    #include <boost/spirit/include/phoenix_object.hpp> 

    namespace qi = boost::spirit::qi; 
    namespace ascii = boost::spirit::ascii; 

    template <typename Iterator> 
    bool myParser(Iterator first, Iterator last) { 
     using qi::double_; 
     qi::rule<Iterator, double(), ascii::space_type> myrule; 
     myrule %= double_; 
     bool r = parse(first, last, myrule, ascii::space); 
     return r; 
    } 
    int main() { 
     std::string dstr = std::string("2.1"); 
     bool r = myParser(dstr.begin(), dstr.end()); 
     return 0; 
    } 

: 나는 두 번을 구문 분석하는 다음 코드를 만들었습니다. 감사합니다

+2

'myrule % = double_;':-D ... 나는 표준 C++ 라이브러리로 만들기 위해 부스트 정신을 기다릴 수 없다. – 6502

+2

@ 6502 왜 그런 일이 일어 났을 까? (또한 EDSL 구문의 선택에있어 아주 약간의 잘못이있다.) %%'는 기발하다. 그러나 의미는 그렇다; 전혀 사용하지 않아야한다.) – sehe

답변

2

링크에서 jv_에 언급 된 것처럼 스키퍼를 사용하고 있지만 스키퍼를 허용하는 phrase_parse API는 호출하지 않습니다. 따라서 parse 호출은 ascii::space 파서를 첫 번째 노출 된 특성 (double)에 바인딩하려고 시도합니다.

할당이 실패합니다.

는 십중팔구 당신은이 간단한 문법에 대한 주장을 원하지 않는다, 나는 쓸 것 :

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

template <typename Iterator> bool myParser(Iterator first, Iterator last) { 
    namespace qi = boost::spirit::qi; 
    return qi::parse(first, last, qi::double_ >> qi::eoi); 
} 

int main() { 
    std::string const dstr("2.1"); 
    bool r = myParser(dstr.begin(), dstr.end()); 
    return r?0:1; 
} 

주 입력을 모두 소비 된 것을 확인하는 qi::eol.

+0

답과 고쳐 쓰기. 이중 파싱에 과도 함이 있었지만 더 복잡한 요구가 있었고 오류가 발생하여 오류가 발생했습니다. 나는 이제 의미 론적 행동을 첨부하는 문제가 있지만 도움을 요청하기 전에 스스로 디버그를하고있다. – cmoulikus

관련 문제