2016-11-04 7 views
2

プラスまたはマイナスの文字の後ろに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年

答えて

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を見つけました。