プラスまたはマイナスの文字の後ろにXまたはYの文字が続き、その後に符号なし整数が続く入力を解析しようとしています。ブーストスピリット合成属性の混乱
(char_('+') | char_('-')) >> char_("xyXY") >> uint_
ドキュメントの私の読書によると、このために合成された属性は、代替パーサ(char | char)
はタイプchar
であろうので、char >> char("xyXY")
はvector<char>
だろう、とvector<char> >> uint_
は種類のタプルになりtuple<vector<char>,unsigned int>
だろう、のでtuple<vector<char>,unsigned int>
。私は、属性タイプとしてtuple<char,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";
}
:これは
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";
}
これはコンパイルが、出力が正しくありません。入力の最初のトークンが正しく解析されるが、後続のトークンはない:
Iも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トークンとしてこの改良ものが解析されましたが、 3番目の整数トークンではありません。
sign=-, xy=Y, size=0
私が間違っている場所を教えてください。
私は(ブースト1.58.0から)スピリットバージョン2.5.2とMicrosoft Visual Studioを使用していますが、2008年