Sprout.Weed で改行コードにマッチするパーサ
weed::eol を使用します。
[ソース]
#define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> #include <iostream> #include <sprout/array.hpp> #include <sprout/tuple/array.hpp> #include <sprout/string/alias.hpp> template<typename Parsed> struct parsed_holder{ constexpr operator bool() const{ return parsed.success(); } constexpr decltype(std::declval<Parsed>().attr()) attr(){ return parsed.attr(); } 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("\n", w::eol), ""); static_assert( parse("\r", w::eol), ""); static_assert(!parse("", w::eol), ""); static_assert( parse("1234\n", w::int_ >> w::eol), ""); static_assert(!parse("1234u\n", w::int_ >> w::eol), ""); return 0; }