2012-02-24 7 views
2

ここにコードサンプルがあります。boost :: spiritでdoubleのリストを解析する

// file temp.cpp 

#include <iostream> 

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

namespace qi = boost::spirit::qi; 

struct parser : qi::grammar<std::string::const_iterator, std::vector<double> > 
{ 
    parser() : parser::base_type(vector) 
    { 
     vector = +qi::double_; 
    } 

    qi::rule<std::string::const_iterator, std::vector<double> > vector; 
}; 

int main() 
{ 
    std::string const x("1 2 3 4"); 
    std::string::const_iterator b = x.begin(); 
    std::string::const_iterator e = x.end(); 
    parser p; 
    bool const r = qi::phrase_parse(b, e, p, qi::space); 
    // bool const r = qi::phrase_parse(b, e, +qi::double_, qi::space); // this this it PASSES 
    std::cerr << ((b == e && r) ? "PASSED" : "FAILED") << std::endl; 
} 

私はparserpstd::stringxを解析します。

struct parser

としての定義から、以下、ライン

qi::phrase_parse(b, e, p, qi::space); // PASSES 

qi::phrase_parse(b, e, +qi::double_, qi::space); // FAILS 

は同等であるべきです。しかし、最初の1回の解析では失敗し、2回目の解析では失敗します。

私はstruct parserの定義で間違っていますか?

答えて

2

スペースをスキップするための文法を教えてください。テンプレートにはもう1つの引数があります。

#include <iostream> 

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

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

struct parser 
    : qi::grammar<std::string::const_iterator, std::vector<double>(), ascii::space_type> 
{ 
    parser() : parser::base_type(vector) 
    { 
    vector %= +(qi::double_); 
    } 

    qi::rule<std::string::const_iterator, std::vector<double>(), ascii::space_type> vector; 
}; 

int main() 
{ 
    std::string const x("1 2 3 4"); 
    std::string::const_iterator b = x.begin(); 
    std::string::const_iterator e = x.end(); 
    parser p; 
    bool const r = qi::phrase_parse(b, e, p, ascii::space); 
    //bool const r = qi::phrase_parse(b, e, +qi::double_, qi::space); 
    std::cout << ((b == e && r) ? "PASSED" : "FAILED") << std::endl; 
} 

私は小さな修正もほとんど行っていません。引き数には角括弧を追加する必要があります。この場合、属性のタイプはstd::vector<double>()です。

関連する問題