/** * Copyright (C) 2024 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 using namespace boost::parser; int main() { // merge_ { { constexpr auto parser = merge[char_ >> ' ' >> char_]; static_assert( std::is_same_v>); { auto result = parse("a b", parser); BOOST_TEST(result); BOOST_TEST(*result == 'b'); } } { constexpr auto parser = char_ >> merge[char_ >> char_] >> char_; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { BOOST_TEST(!parse("ab", parser)); BOOST_TEST(!parse("abc", parser)); auto result = parse("abcd", parser); BOOST_TEST(result); BOOST_TEST(*result == detail::hl::make_tuple('a', 'c', 'd')); } } { constexpr auto parser = char_ >> merge[eps >> char_ >> char_] >> char_; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { BOOST_TEST(!parse("ab", parser)); BOOST_TEST(!parse("abc", parser)); auto result = parse("abcd", parser); BOOST_TEST(result); BOOST_TEST(*result == detail::hl::make_tuple('a', 'c', 'd')); } } { constexpr auto parser = eps >> merge[eps >> char_ >> char_] >> char_; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { BOOST_TEST(!parse("ab", parser)); auto result = parse("abc", parser); BOOST_TEST(result); BOOST_TEST(*result == detail::hl::make_tuple('b', 'c')); } } { constexpr auto parser = char_ >> merge[char_ >> eps >> char_] >> char_; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { BOOST_TEST(!parse("ab", parser)); BOOST_TEST(!parse("abc", parser)); auto result = parse("abcd", parser); BOOST_TEST(result); BOOST_TEST(*result == detail::hl::make_tuple('a', 'c', 'd')); } } { constexpr auto parser = char_ >> merge[char_ >> char_ >> eps] >> char_; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { BOOST_TEST(!parse("ab", parser)); BOOST_TEST(!parse("abc", parser)); auto result = parse("abcd", parser); BOOST_TEST(result); BOOST_TEST(*result == detail::hl::make_tuple('a', 'c', 'd')); } } { constexpr auto parser = eps >> merge[char_ >> char_ >> eps] >> char_; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { auto result = parse("abc", parser); BOOST_TEST(result); BOOST_TEST(*result == detail::hl::make_tuple('b', 'c')); } } { constexpr auto parser = merge[string("abc") >> string("def")]; static_assert( std::is_same_v>); { auto result = parse("abcdef", parser); BOOST_TEST(result); BOOST_TEST(*result == "abcdef"); } } { constexpr auto parser = eps >> merge[string("abc") >> string("def")]; static_assert( std::is_same_v>); { auto result = parse("abcdef", parser); BOOST_TEST(result); BOOST_TEST(*result == "abcdef"); } } { constexpr auto parser = eps >> merge[eps >> string("abc") >> string("def")]; static_assert( std::is_same_v>); { auto result = parse("abcdef", parser); BOOST_TEST(result); BOOST_TEST(*result == "abcdef"); } } { constexpr auto parser = merge[string("abc") >> string("def")] >> eps; static_assert( std::is_same_v>); { auto result = parse("abcdef", parser); BOOST_TEST(result); BOOST_TEST(*result == "abcdef"); } } { constexpr auto parser = eps >> merge[string("abc") >> string("def")] >> eps; static_assert( std::is_same_v>); { auto result = parse("abcdef", parser); BOOST_TEST(result); BOOST_TEST(*result == "abcdef"); } } { constexpr auto parser = char_ >> merge[string("abc") >> string("def")] >> string("ghi"); static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { auto result = parse("zabcdefghi", parser); BOOST_TEST(result); BOOST_TEST( *result == detail::hl::make_tuple( 'z', std::string("abcdef"), std::string("ghi"))); } } { constexpr auto parser = char_ >> merge[merge[string("abc") >> string("def")] >> string("ghi")]; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { auto result = parse("zabcdefghi", parser); BOOST_TEST(result); BOOST_TEST( *result == detail::hl::make_tuple('z', std::string("abcdefghi"))); } } #if 0 // Intentionally ill-formed. { constexpr auto parser = char_ >> merge[(string("abc") >> char_ >> char_) >> string("ghi")]; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { auto result = parse("abcefghi", parser); BOOST_TEST(result); BOOST_TEST( *result == detail::hl::make_tuple('z', std::string("abcefghi"))); } } #endif } // separate_ { { constexpr auto parser = +char_('a') >> ' ' >> char_; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>); { auto result = parse("a b", parser); BOOST_TEST(result); BOOST_TEST(*result == "ab"); } } { constexpr auto parser = separate[+char_('a') >> ' ' >> char_]; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { auto result = parse("a b", parser); BOOST_TEST(result); BOOST_TEST( *result == detail::hl::make_tuple(std::string("a"), 'b')); } } { constexpr auto parser = separate[eps >> +char_('a') >> ' ' >> char_]; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { auto result = parse("a b", parser); BOOST_TEST(result); BOOST_TEST(*result == detail::hl::make_tuple(std::string("a"), 'b')); } } { constexpr auto parser = separate[+char_('a') >> ' ' >> char_]; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { auto result = parse("a b", parser); BOOST_TEST(result); BOOST_TEST(*result == detail::hl::make_tuple(std::string("a"), 'b')); } } { constexpr auto parser = separate[+char_('a') >> ' ' >> char_ >> eps]; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { auto result = parse("a b", parser); BOOST_TEST(result); BOOST_TEST(*result == detail::hl::make_tuple(std::string("a"), 'b')); } } { constexpr auto parser = eps >> separate[+char_('a') >> ' ' >> char_ >> eps]; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { auto result = parse("a b", parser); BOOST_TEST(result); BOOST_TEST(*result == detail::hl::make_tuple(std::string("a"), 'b')); } } { constexpr auto parser = separate[+char_('a') >> ' ' >> char_ >> eps] >> eps; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { auto result = parse("a b", parser); BOOST_TEST(result); BOOST_TEST(*result == detail::hl::make_tuple(std::string("a"), 'b')); } } { constexpr auto parser = eps >> separate[+char_('a') >> ' ' >> char_ >> eps] >> eps; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { auto result = parse("a b", parser); BOOST_TEST(result); BOOST_TEST(*result == detail::hl::make_tuple(std::string("a"), 'b')); } } { constexpr auto parser = eps >> separate[+char_('a') >> ' ' >> char_]; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { auto result = parse("a b", parser); BOOST_TEST(result); BOOST_TEST(*result == detail::hl::make_tuple(std::string("a"), 'b')); } } { constexpr auto parser = separate[+char_('a') >> ' ' >> char_] >> eps; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { auto result = parse("a b", parser); BOOST_TEST(result); BOOST_TEST(*result == detail::hl::make_tuple(std::string("a"), 'b')); } } { constexpr auto parser = eps >> separate[+char_('a') >> ' ' >> char_] >> eps; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { auto result = parse("a b", parser); BOOST_TEST(result); BOOST_TEST(*result == detail::hl::make_tuple(std::string("a"), 'b')); } } } // merge_separate_interop { [[maybe_unused]] constexpr auto A = eps >> separate[+char_('a') >> ' ' >> char_] >> eps; [[maybe_unused]] constexpr auto B = char_ >> separate[+char_('a') >> ' ' >> char_] >> eps; [[maybe_unused]] constexpr auto C = eps >> separate[+char_('a') >> ' ' >> char_] >> char_; [[maybe_unused]] constexpr auto D = char_ >> separate[+char_('a') >> ' ' >> char_] >> char_; [[maybe_unused]] constexpr auto _0 = eps >> merge[string("abc") >> string("def")] >> eps; [[maybe_unused]] constexpr auto _1 = char_ >> merge[string("abc") >> string("def")] >> eps; [[maybe_unused]] constexpr auto _2 = eps >> merge[string("abc") >> string("def")] >> char_; [[maybe_unused]] constexpr auto _3 = char_ >> merge[string("abc") >> string("def")] >> char_; { // A0 constexpr auto parser = eps >> separate[+char_('a') >> ' ' >> char_] >> eps >> merge[string("abc") >> string("def")] >> eps; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); { auto result = parse("a babcdef", parser); BOOST_TEST(result); BOOST_TEST( *result == detail::hl::make_tuple( std::string("a"), 'b', std::string("abcdef"))); } } { // A1 constexpr auto parser = eps >> separate[+char_('a') >> ' ' >> char_] >> eps >> char_ >> merge[string("abc") >> string("def")] >> eps; static_assert( std::is_same_v< decltype(parse("", parser)), std::optional>>); { auto result = parse("a bzabcdef", parser); BOOST_TEST(result); BOOST_TEST( *result == detail::hl::make_tuple( std::string("a"), 'b', 'z', std::string("abcdef"))); } } { // A2 constexpr auto parser = eps >> separate[+char_('a') >> ' ' >> char_] >> eps >> merge[string("abc") >> string("def")] >> char_; static_assert( std::is_same_v< decltype(parse("", parser)), std::optional>>); { auto result = parse("a babcdefz", parser); BOOST_TEST(result); BOOST_TEST( *result == detail::hl::make_tuple( std::string("a"), 'b', std::string("abcdef"), 'z')); } } { // A3 constexpr auto parser = eps >> separate[+char_('a') >> ' ' >> char_] >> eps >> char_ >> merge[string("abc") >> string("def")] >> char_; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional< tuple>>); { auto result = parse("a byabcdefz", parser); BOOST_TEST(result); BOOST_TEST( *result == detail::hl::make_tuple( std::string("a"), 'b', 'y', std::string("abcdef"), 'z')); } } { // B0 constexpr auto parser = char_ >> separate[+char_('a') >> ' ' >> char_] >> eps >> merge[string("abc") >> string("def")] >> eps; static_assert( std::is_same_v< decltype(parse("", parser)), std::optional>>); } { // B1 constexpr auto parser = char_ >> separate[+char_('a') >> ' ' >> char_] >> eps >> char_ >> merge[string("abc") >> string("def")] >> eps; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional< tuple>>); } { // B2 constexpr auto parser = char_ >> separate[+char_('a') >> ' ' >> char_] >> eps >> merge[string("abc") >> string("def")] >> char_; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional< tuple>>); } { // B3 constexpr auto parser = char_ >> separate[+char_('a') >> ' ' >> char_] >> eps >> char_ >> merge[string("abc") >> string("def")] >> char_; static_assert( std::is_same_v< decltype(parse("", parser)), std::optional< tuple>>); } { // C0 constexpr auto parser = eps >> separate[+char_('a') >> ' ' >> char_] >> char_ >> eps >> merge[string("abc") >> string("def")] >> eps; static_assert( std::is_same_v< decltype(parse("", parser)), std::optional>>); } { // C1 constexpr auto parser = eps >> separate[+char_('a') >> ' ' >> char_] >> char_ >> char_ >> merge[string("abc") >> string("def")] >> eps; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional< tuple>>); } { // C2 constexpr auto parser = eps >> separate[+char_('a') >> ' ' >> char_] >> char_ >> eps >> merge[string("abc") >> string("def")] >> char_; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional< tuple>>); } { // C3 constexpr auto parser = eps >> separate[+char_('a') >> ' ' >> char_] >> char_ >> char_ >> merge[string("abc") >> string("def")] >> char_; static_assert( std::is_same_v< decltype(parse("", parser)), std::optional< tuple>>); } { // D0 constexpr auto parser = char_ >> separate[+char_('a') >> ' ' >> char_] >> char_ >> eps >> merge[string("abc") >> string("def")] >> eps; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional< tuple>>); } { // D1 constexpr auto parser = char_ >> separate[+char_('a') >> ' ' >> char_] >> char_ >> char_ >> merge[string("abc") >> string("def")] >> eps >> char_; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); } { // D2 constexpr auto parser = char_ >> separate[+char_('a') >> ' ' >> char_] >> char_ >> eps >> merge[string("abc") >> string("def")] >> char_; static_assert( std::is_same_v< decltype(parse("", parser)), std::optional< tuple>>); } { // D3 constexpr auto parser = char_ >> separate[+char_('a') >> ' ' >> char_] >> char_ >> char_ >> merge[string("abc") >> string("def")] >> char_; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); } { constexpr auto parser = separate[+char_('a') >> ' ' >> char_] >> merge[string("abc") >> string("def")] >> separate[+char_('a') >> ' ' >> char_] >> merge[string("abc") >> string("def")]; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); } { constexpr auto parser = separate[+char_('a') >> ' ' >> char_] >> eps >> merge[string("abc") >> string("def")] >> eps >> separate[+char_('a') >> ' ' >> char_] >> eps >> merge[string("abc") >> string("def")]; static_assert(std::is_same_v< decltype(parse("", parser)), std::optional>>); } } return boost::report_errors(); }