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 と同じですね。