From 40db26a62dd3906a0ba7fbcf07396e4059e5518e Mon Sep 17 00:00:00 2001 From: Camden Dixie O'Brien Date: Fri, 25 Oct 2024 14:59:24 +0100 Subject: [PATCH] Handle quantifiers in parse_term() --- lib/parser.c | 22 +++++++++++++++++++++- tests/parser_tests.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/lib/parser.c b/lib/parser.c index e8897e3..94d2418 100644 --- a/lib/parser.c +++ b/lib/parser.c @@ -18,6 +18,9 @@ static bool is_special(char c) case '\\': case '(': case ')': + case '*': + case '+': + case '?': return true; default: return false; @@ -67,7 +70,24 @@ static int parse_term(const char *input, int rem, term_t *out) used += result; } - out->quantifier = QUANTIFIER_NONE; + if (used < rem) { + switch (input[used]) { + case '*': + out->quantifier = QUANTIFIER_ZERO_OR_MORE; + ++used; + break; + case '+': + out->quantifier = QUANTIFIER_ONE_OR_MORE; + ++used; + break; + case '?': + out->quantifier = QUANTIFIER_ZERO_OR_ONE; + ++used; + break; + default: + out->quantifier = QUANTIFIER_NONE; + } + } return used; } diff --git a/tests/parser_tests.c b/tests/parser_tests.c index 0f96f14..b914cc4 100644 --- a/tests/parser_tests.c +++ b/tests/parser_tests.c @@ -172,6 +172,45 @@ static void a_in_parens_b_is_parsed_as_sequence_with_regex_term(void) regex_free_children(&r); } +static void dot_star_is_parsed_as_zero_or_more_wildcard(void) +{ + regex_t r = { 0 }; + const int result = PARSE_REGEX_STRING(".*", &r); + ASSERT_NE(-1, result); + + ASSERT_EQ(1, r.sequence.len); + ASSERT_EQ(QUANTIFIER_ZERO_OR_MORE, r.sequence.contents[0].quantifier); + ASSERT_EQ(TERM_TYPE_WILDCARD, r.sequence.contents[0].type); + + regex_free_children(&r); +} + +static void dot_plus_is_parsed_as_one_or_more_wildcard(void) +{ + regex_t r = { 0 }; + const int result = PARSE_REGEX_STRING(".+", &r); + ASSERT_NE(-1, result); + + ASSERT_EQ(1, r.sequence.len); + ASSERT_EQ(QUANTIFIER_ONE_OR_MORE, r.sequence.contents[0].quantifier); + ASSERT_EQ(TERM_TYPE_WILDCARD, r.sequence.contents[0].type); + + regex_free_children(&r); +} + +static void dot_question_mark_is_parsed_as_zero_or_one_wildcard(void) +{ + regex_t r = { 0 }; + const int result = PARSE_REGEX_STRING(".?", &r); + ASSERT_NE(-1, result); + + ASSERT_EQ(1, r.sequence.len); + ASSERT_EQ(QUANTIFIER_ZERO_OR_ONE, r.sequence.contents[0].quantifier); + ASSERT_EQ(TERM_TYPE_WILDCARD, r.sequence.contents[0].type); + + regex_free_children(&r); +} + int main(void) { TESTING_BEGIN(); @@ -186,5 +225,8 @@ int main(void) backslash_backslash_is_parsed_as_unquantified_literal(); a_pipe_b_in_parens_is_parsed_as_regex_term(); a_in_parens_b_is_parsed_as_sequence_with_regex_term(); + dot_star_is_parsed_as_zero_or_more_wildcard(); + dot_plus_is_parsed_as_one_or_more_wildcard(); + dot_question_mark_is_parsed_as_zero_or_one_wildcard(); return TESTING_END(); }