Sprout.Weed でどちらかにマッチするパーサを書く
演算子を使用して |
// 数値かアルファベットにマッチするパーサ
weed::int_ | weed::alpha
のようなパーサを記述することが出来ます。
また、上記のパーサだと attribute の型は
sprout::variant<std::intmax_t, char>
のように sprout::variant 型になります。
[ソース]
#define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> #include <sprout/variant.hpp> #include <sprout/tuple.hpp> int main(){ namespace w = sprout::weed; // 数値とアルファベットのマッチするパーサ static constexpr auto parser = w::int_ | w::alpha; typedef sprout::variant<std::intmax_t, char> attr_type; { static constexpr auto data = sprout::to_string("42"); static constexpr auto result = w::parse(data.begin(), data.end(), parser); static_assert(result.success(), ""); static constexpr attr_type attr = result.attr(); static_assert(sprout::get<0>(attr) == 42, ""); // もしくは variant で比較 static_assert(attr == attr_type{ std::intmax_t{42} }, ""); } { static constexpr auto data = sprout::to_string("c"); static constexpr auto result = w::parse(data.begin(), data.end(), parser); static_assert(result.success(), ""); static constexpr attr_type attr = result.attr(); static_assert(sprout::get<1>(attr) == 'c', ""); static_assert(attr == attr_type{ 'c' }, ""); } return 0; }