Sprout.Weed で特定の文字をマッチさせない

次のように特定の文字まで文字列を読み込む場合に、マイナス演算子を使用して、特定の文字をマッチさせないようにします。

[ソース]

#define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION
#include <sprout/weed.hpp>


template<typename Char, std::size_t N, typename Parser>
constexpr bool
check_parser(Char const(&str)[N], Parser&& parser){
    using sprout::weed::parse;
    return parse(str, str+N-1, sprout::forward<Parser>(parser)).success();
}

template<typename Char, std::size_t N, typename Parser, typename Attr>
constexpr bool
check_attr(Char const(&str)[N], Parser&& parser, Attr&& attr){
    using sprout::weed::parse;
    return parse(str, str+N-1, sprout::forward<Parser>(parser)).attr() == attr;
}


int
main(){
    namespace w = sprout::weed;
    
    // マイナス演算子を使用して、マッチしない文字を指定する
    // = までの文字列を読み込む
    static constexpr auto parser = *w::lim<4>(w::char_ - ':') >> ':' >> w::int_;

    static_assert(check_parser("homu:42", parser), "");
    static_assert(check_attr  ("homu:42", parser, sprout::make_tuple("homu", 42)), "");
    
    return 0;
}

ここら辺の書き方は Boost.Spirit.Qi と同じですね。

[コンパイラ]

  • g++ (GCC) 4.7.0 20111210 (experimental)