2
0
mirror of https://github.com/boostorg/parser.git synced 2026-02-23 16:02:08 +00:00

Add overloads of repeat() that take a parser param; the given parser is used

as a separator.

Implements #231.
This commit is contained in:
Zach Laine
2026-02-15 15:20:27 -06:00
parent e24163dd49
commit 85320bd6d7
3 changed files with 365 additions and 35 deletions

View File

@@ -1092,6 +1092,72 @@ int main()
// repeat
{
{
constexpr auto parser = repeat(2)[string("zs")];
{
std::string str = "";
std::vector<std::string> chars;
BOOST_TEST(!parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>{});
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(!chars);
}
}
{
std::string str = "z";
std::vector<std::string> chars;
BOOST_TEST(!parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>{});
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(!chars);
}
}
{
std::string str = "zs";
std::vector<std::string> chars;
BOOST_TEST(!parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>{});
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(!chars);
}
}
{
std::string str = "zszs";
std::vector<std::string> chars;
BOOST_TEST(parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>({"zs", "zs"}));
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(chars);
BOOST_TEST(
*chars == std::vector<std::string>({"zs", "zs"}));
}
}
{
std::string str = "zszszs";
std::vector<std::string> chars;
BOOST_TEST(!parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>{});
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(!chars);
}
}
}
{
constexpr auto parser = repeat(2, 3)[string("zs")];
@@ -1145,6 +1211,228 @@ int main()
*chars == std::vector<std::string>({"zs", "zs"}));
}
}
{
std::string str = "zszszs";
std::vector<std::string> chars;
BOOST_TEST(parse(str, parser, chars));
BOOST_TEST(
chars == std::vector<std::string>({"zs", "zs", "zs"}));
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(chars);
BOOST_TEST(
*chars == std::vector<std::string>({"zs", "zs", "zs"}));
}
}
{
std::string str = "zszszszs";
std::vector<std::string> chars;
BOOST_TEST(!parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>{});
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(!chars);
}
}
}
{
auto parser = repeat(2, char_(','))[string("zs")];
{
std::string str = "";
std::vector<std::string> chars;
BOOST_TEST(!parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>{});
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(!chars);
}
}
{
std::string str = "z";
std::vector<std::string> chars;
BOOST_TEST(!parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>{});
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(!chars);
}
}
{
std::string str = "zs";
std::vector<std::string> chars;
BOOST_TEST(!parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>{});
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(!chars);
}
}
{
std::string str = "zszs";
std::vector<std::string> chars;
BOOST_TEST(!parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>());
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(!chars);
}
}
{
std::string str = "zs,zs";
std::vector<std::string> chars;
BOOST_TEST(parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>({"zs", "zs"}));
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(chars);
BOOST_TEST(
*chars == std::vector<std::string>({"zs", "zs"}));
}
}
{
std::string str = "zs,zs,";
std::vector<std::string> chars;
BOOST_TEST(!parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>());
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(!chars);
}
}
{
std::string str = "zs,zs,zs";
std::vector<std::string> chars;
BOOST_TEST(!parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>());
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(!chars);
}
}
}
{
auto parser = repeat(2, 3, char_(','))[string("zs")];
{
std::string str = "";
std::vector<std::string> chars;
BOOST_TEST(!parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>{});
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(!chars);
}
}
{
std::string str = "z";
std::vector<std::string> chars;
BOOST_TEST(!parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>{});
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(!chars);
}
}
{
std::string str = "zs";
std::vector<std::string> chars;
BOOST_TEST(!parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>{});
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(!chars);
}
}
{
std::string str = "zs,";
std::vector<std::string> chars;
BOOST_TEST(!parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>{});
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(!chars);
}
}
{
std::string str = "zs,zs,";
std::vector<std::string> chars;
BOOST_TEST(!parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>{});
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(!chars);
}
}
{
std::string str = "zs,zs";
std::vector<std::string> chars;
BOOST_TEST(parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>({"zs", "zs"}));
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(chars);
BOOST_TEST(
*chars == std::vector<std::string>({"zs", "zs"}));
}
}
{
std::string str = "zs,zs,zs";
std::vector<std::string> chars;
BOOST_TEST(parse(str, parser, chars));
BOOST_TEST(
chars == std::vector<std::string>({"zs", "zs", "zs"}));
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(chars);
BOOST_TEST(
*chars == std::vector<std::string>({"zs", "zs", "zs"}));
}
}
{
std::string str = "zs,zs,zs,zs";
std::vector<std::string> chars;
BOOST_TEST(!parse(str, parser, chars));
BOOST_TEST(chars == std::vector<std::string>{});
{
std::optional<std::vector<std::string>> const chars =
parse(str, parser);
BOOST_TEST(!chars);
}
}
}
{
constexpr auto parser = *char_ >> eps >> *string("str");