diff --git a/lib/desugar.c b/lib/desugar.c index 2db4812..454c759 100644 --- a/lib/desugar.c +++ b/lib/desugar.c @@ -117,8 +117,11 @@ static void desugar_term(regex_term_t *term) desugar_class(term); break; - case REGEX_TERM_LITERAL: case REGEX_TERM_SUBEXPR: + desugar_regex(&term->subexpr); + break; + + case REGEX_TERM_LITERAL: case REGEX_TERM_EMPTY: break; } diff --git a/tests/desugar_tests.c b/tests/desugar_tests.c index 92a9e1d..a3226d2 100644 --- a/tests/desugar_tests.c +++ b/tests/desugar_tests.c @@ -287,6 +287,60 @@ static void class_abc_becomes_subexpr_a_or_b_or_c(void) regex_free(&t); } +static void subexpr_a_qmark_becomes_subexpr_subexpr_empty_or_a(void) +{ + regex_term_t *inner_terms = malloc(1 * sizeof(regex_term_t)); + inner_terms[0].quantifier = REGEX_QUANTIFIER_QMARK; + inner_terms[0].type = REGEX_TERM_LITERAL; + inner_terms[0].literal = 'a'; + regex_sequence_t *inner_alternatives + = malloc(1 * sizeof(regex_sequence_t)); + inner_alternatives[0].count = inner_alternatives[0].capacity = 1; + inner_alternatives[0].contents = inner_terms; + regex_term_t *terms = malloc(1 * sizeof(regex_term_t)); + terms[0].quantifier = REGEX_QUANTIFIER_NONE; + terms[0].type = REGEX_TERM_SUBEXPR; + terms[0].subexpr.count = terms[0].subexpr.capacity = 1; + terms[0].subexpr.contents = inner_alternatives; + regex_sequence_t *alternatives = malloc(1 * sizeof(regex_sequence_t)); + alternatives[0].count = alternatives[0].capacity = 1; + alternatives[0].contents = terms; + regex_t t = { .count = 1, .capacity = 1, .contents = alternatives }; + + desugar_regex(&t); + + ASSERT_EQ(1, t.count); + ASSERT_EQ(1, t.contents[0].count); + ASSERT_EQ(REGEX_QUANTIFIER_NONE, t.contents[0].contents[0].quantifier); + ASSERT_EQ(REGEX_TERM_SUBEXPR, t.contents[0].contents[0].type); + + const regex_t *inner; + + inner = &t.contents[0].contents[0].subexpr; + ASSERT_EQ(1, inner->count); + ASSERT_EQ(1, inner->contents[0].count); + ASSERT_EQ( + REGEX_QUANTIFIER_NONE, inner->contents[0].contents[0].quantifier); + ASSERT_EQ(REGEX_TERM_SUBEXPR, inner->contents[0].contents[0].type); + + inner = &inner->contents[0].contents[0].subexpr; + ASSERT_EQ(2, inner->count); + ASSERT_NOT_NULL(inner->contents); + ASSERT_EQ(1, inner->contents[0].count); + ASSERT_NOT_NULL(inner->contents[0].contents); + ASSERT_EQ( + REGEX_QUANTIFIER_NONE, inner->contents[0].contents[0].quantifier); + ASSERT_EQ(REGEX_TERM_EMPTY, inner->contents[0].contents[0].type); + ASSERT_EQ(1, inner->contents[1].count); + ASSERT_NOT_NULL(inner->contents[1].contents); + ASSERT_EQ( + REGEX_QUANTIFIER_NONE, inner->contents[1].contents[0].quantifier); + ASSERT_EQ(REGEX_TERM_LITERAL, inner->contents[1].contents[0].type); + ASSERT_EQ('a', inner->contents[1].contents[0].literal); + + regex_free(&t); +} + int main(void) { TESTING_BEGIN(); @@ -298,5 +352,6 @@ int main(void) a_plus_becomes_subexpr_aa_star(); a_qmark_becomes_subexpr_empty_or_a(); class_abc_becomes_subexpr_a_or_b_or_c(); + subexpr_a_qmark_becomes_subexpr_subexpr_empty_or_a(); return TESTING_END(); }