2016-11-04 5 views
2

나는 X 또는 Y 문자 다음에 부호없는 정수가 오는 더하기 또는 빼기 문자가있는 입력을 구문 분석하려고합니다. 대체 파서 (char | char) 유형 char이 될 것이기 때문에부스트 스피리트 합성 속성 혼동

(char_('+') | char_('-')) >> char_("xyXY") >> uint_ 

워드 프로세서의 내 독서에 따르면,이에 대한 합성 속성이 tuple<vector<char>,unsigned int> 될 것이라고는 char >> char("xyXY")vector<char> 것, 그리고 vector<char> >> uint_는 유형의 튜플 것 , 그래서 tuple<vector<char>,unsigned int>.

#include <iostream> 
#include <string> 
#include <vector> 

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

using namespace boost::spirit::qi; 

int main() 
{ 
    std::string input("-Y 512"); 
    typedef std::string::const_iterator Iterator; 
    Iterator first = input.begin(); 
    Iterator last = input.end(); 
    boost::tuple<std::vector<char>,unsigned int> output; 
    bool result = phrase_parse(first,last,(char_('+') | char_('-')) >> char_("xyXY") >> uint_,ascii::space,output); 
    if(result && first == last) 
     std::cout << "sign=" << boost::get<0>(output)[0] << ", xy=" << boost::get<0>(output)[1] << ", size=" << boost::get<1>(output) << '\n'; 
    else 
     std::cerr << "Parse error\n"; 
} 

내가 다음 속성 유형으로 tuple<char,char,unsigned int>을 시도 :이

qi\detail\assign_to.hpp(152) : error C2440: 'static_cast' : cannot convert from 'const char' to 'boost::tuples::tuple<T0,T1>' 

코드를 컴파일에 실패

출력이 잘못된 그러나 이것은 컴파일
#include <iostream> 
#include <string> 
#include <vector> 

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

using namespace boost::spirit::qi; 

int main() 
{ 
    std::string input("-Y 512"); 
    typedef std::string::const_iterator Iterator; 
    Iterator first = input.begin(); 
    Iterator last = input.end(); 
    boost::tuple<char,char,unsigned int> output; 
    bool result = phrase_parse(first,last,(char_('+') | char_('-')) >> char_("xyXY") >> uint_,ascii::space,output); 
    if(result && first == last) 
     std::cout << "sign=" << boost::get<0>(output) << ", xy=" << boost::get<1>(output) << ", size=" << boost::get<2>(output) << '\n'; 
    else 
     std::cerr << "Parse error\n"; 
} 

. 입력의 첫 번째 토큰은 올바르게 구문 분석되지만 이후의 토큰은 없습니다 :

나는 또한 as_string[] 시도
sign=-, xy= , size=0 

:

#include <iostream> 
#include <string> 
#include <vector> 

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

using namespace boost::spirit::qi; 

int main() 
{ 
    std::string input("-Y 512"); 
    typedef std::string::const_iterator Iterator; 
    Iterator first = input.begin(); 
    Iterator last = input.end(); 
    boost::tuple<std::string,unsigned int> output; 
    bool result = phrase_parse(first,last,as_string[(char_('+') | char_('-')) >> char_("xyXY")] >> uint_,ascii::space,output); 
    if(result && first == last) 
     std::cout << "sign=" << boost::get<0>(output)[0] << ", xy=" << boost::get<0>(output)[1] << ", size=" << boost::get<1>(output) << '\n'; 
    else 
     std::cerr << "Parse error\n"; 
} 

는 X/Y 토큰 등이 개선 된 것을 구문 분석있어,하지만 세 번째 정수 토큰이 아닙니다.

sign=-, xy=Y, size=0 

내가 잘못하고있는 곳을 알려주십시오.

내가 (부스트 1.58.0에서) 성령 버전 2.5.2 및 Microsoft Visual Studio를 사용하고 2008 년

답변

3

Spirit 라이브러리 문서는 Fusion tuple를 사용하는 것이 좋습니다. Boost tupleSpirit 라이브러리와 완전히 호환되지 않을 수도 있습니다 (지금은 없습니다).

는 여기 고정 된 예는 다음과 같습니다

#include <iostream> 
#include <string> 
#include <vector> 

#include <boost/fusion/include/tuple.hpp> 
#include <boost/spirit/include/qi.hpp> 
#include <boost/fusion/sequence.hpp> 

namespace qi = boost::spirit::qi; 

int main() 
{ 
    std::string input("-Y 512"); 
    typedef std::string::const_iterator Iterator; 
    Iterator first = input.begin(); 
    Iterator last = input.end(); 

    boost::fusion::tuple<char, char, unsigned int> output; 
    bool result = qi::phrase_parse(first, last, (qi::char_('+') | qi::char_('-')) >> qi::char_("xyXY") >> qi::uint_, qi::ascii::space, output); 
    if (result && first == last) 
     std::cout << "sign=" << boost::fusion::get<0>(output) << ", xy=" << boost::fusion::get<1>(output) << ", size=" << boost::fusion::get<2>(output) << '\n'; 
    else 
     std::cerr << "Parse error\n"; 

    return 0; 
} 

출력 : sign=-, xy=Y, size=512

업데이트 : #include <boost/fusion/include/boost_tuple.hpp>을 :이 사실 나는 그것이 boost::tuple를 사용하는 것이 가능하지만, 다른 헤더를 포함 할 필요가 here을 발견했다.

관련 문제