// 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 #include #include using namespace boost::parser; using boost::is_same; using boost::optional; using boost::variant; using boost::hana::tuple; 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(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>>)); } { constexpr auto parser = eps | int_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>>)); } // scalar | scalar { constexpr auto parser = char_ | char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = eps | char_ | char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>>)); } { constexpr auto parser = char_ | eps | char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>>)); } { constexpr auto parser = char_ | char_ | eps; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>>)); } { constexpr auto parser = int_ | char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>>)); } { constexpr auto parser = eps | int_ | char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>>)); } { constexpr auto parser = int_ | eps | char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>>)); } { constexpr auto parser = int_ | char_ | eps; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>>)); } // -scalar | -scalar { constexpr auto parser = -char_ | -char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>>)); } { constexpr auto parser = eps | -char_ | -char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>>)); } { constexpr auto parser = -char_ | eps | -char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>>)); } { constexpr auto parser = -char_ | -char_ | eps; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>>)); } { constexpr auto parser = -int_ | -char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT(( is_same, optional>>>)); } { constexpr auto parser = eps | -int_ | -char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional, optional>>>>)); } { constexpr auto parser = -int_ | eps | -char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional, optional>>>>)); } { constexpr auto parser = -int_ | -char_ | eps; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional, optional>>>>)); } // seq | seq { constexpr auto parser = *char_ | *char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>>)); } { constexpr auto parser = eps | *char_ | *char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>>)); } { constexpr auto parser = *char_ | eps | *char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>>)); } { constexpr auto parser = *char_ | *char_ | eps; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>>)); } { constexpr auto parser = *string("str") | *string("str"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>)); } { constexpr auto parser = eps | *string("str") | *string("str"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>>)); } { constexpr auto parser = *string("str") | eps | *string("str"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>>)); } { constexpr auto parser = *string("str") | *string("str") | eps; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same>>)); } // seq | seq { constexpr auto parser = *char_ | *string("str"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT((is_same< attr_t, optional, std::string>>>)); } { constexpr auto parser = eps | *char_ | *string("str"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional, std::string>>>>)); } { constexpr auto parser = *char_ | eps | *string("str"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional, std::string>>>>)); } { constexpr auto parser = *char_ | *string("str") | eps; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional, std::string>>>>)); } // seq | T { constexpr auto parser = *char_ | char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same, char>>>)); } { constexpr auto parser = eps | *char_ | char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional, char>>>>)); } { constexpr auto parser = *char_ | eps | char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional, char>>>>)); } { constexpr auto parser = *char_ | char_ | eps; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional, char>>>>)); } { constexpr auto parser = *string("str") | char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>)); } { constexpr auto parser = eps | *string("str") | char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>>)); } { constexpr auto parser = *string("str") | eps | char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>>)); } { constexpr auto parser = *string("str") | char_ | eps; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>>)); } // T | seq { constexpr auto parser = char_ | *char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>>)); } { constexpr auto parser = eps | char_ | *char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional>>>>)); } { constexpr auto parser = char_ | eps | *char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional>>>>)); } { constexpr auto parser = char_ | *char_ | eps; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional>>>>)); } { constexpr auto parser = char_ | *string("str"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>)); } { constexpr auto parser = eps | char_ | *string("str"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>>)); } { constexpr auto parser = char_ | eps | *string("str"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>>)); } { constexpr auto parser = char_ | *string("str") | eps; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>>)); } // seq | optional { constexpr auto parser = *char_ | -char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional, optional>>>)); } { constexpr auto parser = eps | *char_ | -char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional< optional, optional>>>>)); } { constexpr auto parser = *char_ | eps | -char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional< optional, optional>>>>)); } { constexpr auto parser = *char_ | -char_ | eps; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional< optional, optional>>>>)); } { constexpr auto parser = *string("str") | -char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same>>>)); } { constexpr auto parser = eps | *string("str") | -char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional>>>>)); } { constexpr auto parser = *string("str") | eps | -char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional>>>>)); } { constexpr auto parser = *string("str") | -char_ | eps; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional>>>>)); } // optional | seq { constexpr auto parser = -char_ | *char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional, std::vector>>>)); } { constexpr auto parser = eps | -char_ | *char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional< optional, std::vector>>>>)); } { constexpr auto parser = -char_ | eps | *char_; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional< optional, std::vector>>>>)); } { constexpr auto parser = -char_ | *char_ | eps; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional< optional, std::vector>>>>)); } { constexpr auto parser = -char_ | *string("str"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same, std::string>>>)); } { constexpr auto parser = eps | -char_ | *string("str"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional, std::string>>>>)); } { constexpr auto parser = -char_ | eps | *string("str"); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional, std::string>>>>)); } { constexpr auto parser = -char_ | *string("str") | eps; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional, std::string>>>>)); } // or grouping { constexpr auto parser = (-char_ | *string("str")) | eps; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional, std::string>>>>)); } { constexpr auto parser = -char_ | (*string("str") | eps); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional, optional>>>)); } { constexpr auto parser = eps | (-char_ | *string("str") | eps); using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional, std::string>>>>)); } { constexpr auto parser = eps | (-char_ | *string("str") | eps) | eps; using attr_t = decltype(parse(first, last, parser)); BOOST_MPL_ASSERT( (is_same< attr_t, optional, std::string>>>>)); } }