2017-01-16 9 views
2

を使用して0以上のリストを分離ブーストスピリット×3で0 or more listを分離しました。 私はstd::vector1 or more listを解析し%-operatorを知っています。 私が必要とするとき0 or more list私は現在、私が何をしたいんが、私は後の午前はかなりのものではありませんこれは、boost::optional<std::vector>に解析し、この-(element_parser % separator)、のようにそれを行います。 それでは、どのようにしてコンマを区切りますか?0 or more listは、boost spirit x3を使って普通のstd :: vectorに分解されます。は、私は、多くの場合、コンマを解析する必要がブーストスピリット×3

+1

属性は互換性があります。それを試してみてください。互換性/変換規則は、あなたが私に尋ねるならば、スピリットライブラリの勝利点です。 – sehe

答えて

3

はおそらく、私は何かが欠けているが、私のために期待されるよう-作品を使用しています:

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

#include <boost/spirit/home/x3.hpp> 

namespace x3 = boost::spirit::x3; 

const x3::rule<class number_list_tag, std::vector<int>> integer_list = "integer_list"; 
const auto integer_list_def = -(x3::int_ % ','); 
BOOST_SPIRIT_DEFINE(integer_list); 

template <typename T> 
std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec) 
{ 
    bool first = true; 
    os << '['; 
    for (const T& x : vec) 
    { 
     if (first) 
      first = false; 
     else 
      os << ", "; 

     os << x; 
    } 
    os << ']'; 
    return os; 
} 

std::vector<int> parse(const std::string& src) 
{ 
    std::vector<int> result; 
    auto iter = src.begin(); 
    bool success = x3::phrase_parse(iter, src.end(), integer_list, x3::space, result); 
    if (!success || iter != src.end()) 
     throw std::runtime_error("Failed to parse"); 
    else 
     return result; 
} 

int main() 
{ 
    std::cout << "\"\":\t" << parse("") << std::endl; 
    std::cout << "\"5\":\t" << parse("5") << std::endl; 
    std::cout << "\"1, 2, 3\":\t" << parse("1, 2, 3") << std::endl; 
} 

出力は次のとおりです。

"":  [] 
"5": [5] 
"1, 2, 3":  [1, 2, 3] 
関連する問題