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; }