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

[コンパイラ]

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