// Copyright (C) 2018 T. Zachary Laine // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include using namespace boost::parser; void compile_or_attribute() { char const chars[] = ""; auto first = std::begin(chars); auto const last = std::end(chars); // scalar and eps { constexpr auto parser = int_ | eps; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert( std::is_same_v>>); static_assert(std::is_same_v< attribute_t< decltype(BOOST_PARSER_SUBRANGE(first, last)), decltype(parser)>, std::optional>); } // scalar | scalar { constexpr auto parser = char_ | char_; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert(std::is_same_v>); static_assert(std::is_same_v< attribute_t< decltype(BOOST_PARSER_SUBRANGE(first, last)), decltype(parser)>, char>); } { constexpr auto parser = char_ | char_ | eps; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert( std::is_same_v>>); static_assert(std::is_same_v< attribute_t< decltype(BOOST_PARSER_SUBRANGE(first, last)), decltype(parser)>, std::optional>); } { constexpr auto parser = int_ | char_; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert( std::is_same_v>>); static_assert(std::is_same_v< attribute_t< decltype(BOOST_PARSER_SUBRANGE(first, last)), decltype(parser)>, std::variant>); } { constexpr auto parser = int_ | char_ | eps; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert(std::is_same_v< attr_t, std::optional>>>); static_assert(std::is_same_v< attribute_t< decltype(BOOST_PARSER_SUBRANGE(first, last)), decltype(parser)>, std::optional>>); } // -scalar | -scalar { constexpr auto parser = -char_ | -char_; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert( std::is_same_v>>); static_assert(std::is_same_v< attribute_t< decltype(BOOST_PARSER_SUBRANGE(first, last)), decltype(parser)>, std::optional>); } { constexpr auto parser = -char_ | -char_ | eps; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert( std::is_same_v>>); static_assert(std::is_same_v< attribute_t< decltype(BOOST_PARSER_SUBRANGE(first, last)), decltype(parser)>, std::optional>); } { constexpr auto parser = -int_ | -char_; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert( std::is_same_v< attr_t, std::optional< std::variant, std::optional>>>); static_assert(std::is_same_v< attribute_t< decltype(BOOST_PARSER_SUBRANGE(first, last)), decltype(parser)>, std::variant, std::optional>>); } { constexpr auto parser = -int_ | -char_ | eps; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert( std::is_same_v< attr_t, std::optional, std::optional>>>>); static_assert( std::is_same_v< attribute_t< decltype(BOOST_PARSER_SUBRANGE(first, last)), decltype(parser)>, std::optional< std::variant, std::optional>>>); } // seq | seq { constexpr auto parser = *char_ | *char_; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert(std::is_same_v>); static_assert(std::is_same_v< attribute_t< decltype(BOOST_PARSER_SUBRANGE(first, last)), decltype(parser)>, std::string>); } { constexpr auto parser = *char_ | *char_ | eps; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert( std::is_same_v>>); static_assert(std::is_same_v< attribute_t< decltype(BOOST_PARSER_SUBRANGE(first, last)), decltype(parser)>, std::optional>); } { constexpr auto parser = *string("str") | *string("str"); using attr_t = decltype(prefix_parse(first, last, parser)); static_assert( std::is_same_v>>); static_assert(std::is_same_v< attribute_t< decltype(BOOST_PARSER_SUBRANGE(first, last)), decltype(parser)>, std::vector>); } { constexpr auto parser = *string("str") | *string("str") | eps; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert(std::is_same_v< attr_t, std::optional>>>); static_assert(std::is_same_v< attribute_t< decltype(BOOST_PARSER_SUBRANGE(first, last)), decltype(parser)>, std::optional>>); } // seq | seq { constexpr auto parser = *char_ | *string("str"); using attr_t = decltype(prefix_parse(first, last, parser)); static_assert( std::is_same_v< attr_t, std::optional< std::variant>>>); } { constexpr auto parser = *char_ | *string("str") | eps; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert( std::is_same_v< attr_t, std::optional>>>>); } // seq | T { constexpr auto parser = *char_ | char_; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert(std::is_same_v< attr_t, std::optional>>); } { constexpr auto parser = *char_ | char_ | eps; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert( std::is_same_v< attr_t, std::optional>>>); } { constexpr auto parser = *string("str") | char_; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert( std::is_same_v< attr_t, std::optional, char>>>); } { constexpr auto parser = *string("str") | char_ | eps; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert(std::is_same_v< attr_t, std::optional, char>>>>); } // T | seq { constexpr auto parser = char_ | *char_; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert(std::is_same_v< attr_t, std::optional>>); } { constexpr auto parser = char_ | *char_ | eps; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert( std::is_same_v< attr_t, std::optional>>>); } { constexpr auto parser = char_ | *string("str"); using attr_t = decltype(prefix_parse(first, last, parser)); static_assert( std::is_same_v< attr_t, std::optional>>>); } { constexpr auto parser = char_ | *string("str") | eps; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert(std::is_same_v< attr_t, std::optional>>>>); } // seq | std::optional { constexpr auto parser = *char_ | -char_; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert( std::is_same_v< attr_t, std::optional>>>); } { constexpr auto parser = *char_ | -char_ | eps; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert(std::is_same_v< attr_t, std::optional>>>>); } { constexpr auto parser = *string("str") | -char_; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert(std::is_same_v< attr_t, std::optional, std::optional>>>); } { constexpr auto parser = *string("str") | -char_ | eps; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert(std::is_same_v< attr_t, std::optional, std::optional>>>>); } // std::optional | seq { constexpr auto parser = -char_ | *char_; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert( std::is_same_v< attr_t, std::optional, std::string>>>); } { constexpr auto parser = -char_ | *char_ | eps; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert(std::is_same_v< attr_t, std::optional, std::string>>>>); } { constexpr auto parser = -char_ | *string("str"); using attr_t = decltype(prefix_parse(first, last, parser)); static_assert(std::is_same_v< attr_t, std::optional, std::vector>>>); } { constexpr auto parser = -char_ | *string("str") | eps; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert(std::is_same_v< attr_t, std::optional, std::vector>>>>); } // or grouping { constexpr auto parser = (-char_ | *string("str")) | eps; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert(std::is_same_v< attr_t, std::optional, std::vector>>>>); } { constexpr auto parser = -char_ | (*string("str") | eps); using attr_t = decltype(prefix_parse(first, last, parser)); static_assert(std::is_same_v< attr_t, std::optional, std::vector>>>>); } { constexpr auto parser = int_ | string("str") | double_; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert(std::is_same_v< attr_t, std::optional>>); } { constexpr auto parser = (int_ | string("str")) | double_; using attr_t = decltype(prefix_parse(first, last, parser)); static_assert(std::is_same_v< attr_t, std::optional>>); } { constexpr auto parser = int_ | (string("str") | double_); using attr_t = decltype(prefix_parse(first, last, parser)); static_assert(std::is_same_v< attr_t, std::optional>>); } { constexpr auto parser = (int_ | string("str")) | (double_ | float_); using attr_t = decltype(prefix_parse(first, last, parser)); static_assert( std::is_same_v< attr_t, std::optional>>); } }