Sprout.Weed で連続したスペースを無視する

*weed::omit[a]

という記述で連続した a を無視することが出来ます。
これを利用して連続したスペースを無視します。

[ソース]

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

template<typename Parsed>
struct parsed_holder{
    constexpr
    operator bool() const{
        return parsed.success();
    }
    template<typename T>
    constexpr bool
    operator ==(T&& t) const{
        return parsed.attr() == t;
    }
    Parsed parsed;
};

template<typename Char, std::size_t N, typename Parser>
constexpr auto
parse(Char const(&str)[N], Parser&& parser)
->parsed_holder<decltype(
    sprout::weed::parse(str, str+N-1, sprout::forward<Parser>(parser))
)>{
    return { sprout::weed::parse(str, str+N-1, sprout::forward<Parser>(parser)) };
}

int
main(){
    namespace w = sprout::weed;

    static_assert(parse("aaaaaab", *w::omit['a'] >> w::char_) == 'b', "");

    static constexpr auto spaces = *w::omit[w::space];
    static_assert(parse("   ", spaces), "");
    static_assert(parse("      42", spaces >> w::int_) == 42, "");

    static constexpr auto parser = w::int_ >> spaces >> w::int_;
    static constexpr auto result = sprout::make_array<std::intmax_t>(42, 3);
    static_assert(parse("42   3", parser) == result, "");
    
    
    return 0;
}

[コンパイラ]

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