/*[nonstandard]*/ /* Test whether BRE pluses work combined with subexpressions. */ #include "suite.h" int main(void) { cflags = 0; reject("\\(a\\+\\)\\(b\\+\\)", ""); reject("\\(a\\+\\)\\(b\\+\\)", "a"); reject("\\(a\\+\\)\\(b\\+\\)", "b"); reject("\\(a\\+\\)\\(b\\+\\)", "aa"); matches("\\(a\\+\\)\\(b\\+\\)", "ab", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); reject("\\(a\\+\\)\\(b\\+\\)", "ba"); reject("\\(a\\+\\)\\(b\\+\\)", "bb"); reject("\\(a\\)\\+\\(b\\)\\+", ""); reject("\\(a\\)\\+\\(b\\)\\+", "a"); reject("\\(a\\)\\+\\(b\\)\\+", "b"); reject("\\(a\\)\\+\\(b\\)\\+", "aa"); matches("\\(a\\)\\+\\(b\\)\\+", "ab", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); reject("\\(a\\)\\+\\(b\\)\\+", "ba"); reject("\\(a\\)\\+\\(b\\)\\+", "bb"); reject("\\(a\\+\\)\\(a\\+\\)", ""); reject("\\(a\\+\\)\\(a\\+\\)", "a"); matches("\\(a\\+\\)\\(a\\+\\)", "aa", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("\\(a\\+\\)\\(a\\+\\)", "aaa", 3, (M[]) { m(0, 3), m(0, 2), m(2, 3) }); matches("\\(a\\+\\)\\(a\\+\\)", "aaaa", 3, (M[]) { m(0, 4), m(0, 3), m(3, 4) }); reject("\\(a\\)\\+\\(a\\)\\+", ""); reject("\\(a\\)\\+\\(a\\)\\+", "a"); matches("\\(a\\)\\+\\(a\\)\\+", "aa", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("\\(a\\)\\+\\(a\\)\\+", "aaa", 3, (M[]) { m(0, 3), m(1, 2), m(2, 3) }); matches("\\(a\\)\\+\\(a\\)\\+", "aaaa", 3, (M[]) { m(0, 4), m(2, 3), m(3, 4) }); reject("\\(ab\\)\\+", ""); reject("\\(ab\\)\\+", "a"); matches("\\(ab\\)\\+", "ab", 2, (M[]) { m(0, 2), m(0, 2) }); matches("\\(ab\\)\\+", "aba", 2, (M[]) { m(0, 2), m(0, 2) }); matches("\\(ab\\)\\+", "abab", 2, (M[]) { m(0, 4), m(2, 4) }); reject("\\(a\\(\\(a\\+\\)\\+\\)\\)", ""); reject("\\(a\\(\\(a\\+\\)\\+\\)\\)", "a"); matches("\\(a\\(\\(a\\+\\)\\+\\)\\)", "aa", 4, (M[]) { m(0, 2), m(0, 2), m(1, 2), m(1, 2) }); matches("\\(a\\(\\(a\\+\\)\\+\\)\\)", "aaa", 4, (M[]) { m(0, 3), m(0, 3), m(1, 3), m(1, 3) }); matches("\\(a\\(\\(a\\+\\)\\+\\)\\)", "aaaa", 4, (M[]) { m(0, 4), m(0, 4), m(1, 4), m(1, 4) }); reject("\\(a\\)\\+ab", ""); reject("\\(a\\)\\+ab", "a"); reject("\\(a\\)\\+ab", "b"); reject("\\(a\\)\\+ab", "aa"); reject("\\(a\\)\\+ab", "ab"); matches("\\(a\\)\\+ab", "aab", 2, (M[]) { m(0, 3), m(0, 1) }); matches("\\(a\\)\\+ab", "aaab", 2, (M[]) { m(0, 4), m(1, 2) }); reject("\\(a\\+\\)ab", ""); reject("\\(a\\+\\)ab", "a"); reject("\\(a\\+\\)ab", "b"); reject("\\(a\\+\\)ab", "aa"); reject("\\(a\\+\\)ab", "ab"); matches("\\(a\\+\\)ab", "aab", 2, (M[]) { m(0, 3), m(0, 1) }); matches("\\(a\\+\\)ab", "aaab", 2, (M[]) { m(0, 4), m(0, 2) }); return 0; }