나는 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 년