/* Test whether BRE intervals work combined with subexpressions. */ #include "suite.h" int main(void) { cflags = 0; matches("\\(a\\{0,1\\}\\)\\(b\\{0,1\\}\\)", "", 3, (M[]) { m(0, 0), m(0, 0), m(0, 0) }); matches("\\(a\\{0,1\\}\\)\\(b\\{0,1\\}\\)", "a", 3, (M[]) { m(0, 1), m(0, 1), m(1, 1) }); matches("\\(a\\{0,1\\}\\)\\(b\\{0,1\\}\\)", "b", 3, (M[]) { m(0, 1), m(0, 0), m(0, 1) }); matches("\\(a\\{0,1\\}\\)\\(b\\{0,1\\}\\)", "aa", 3, (M[]) { m(0, 1), m(0, 1), m(1, 1) }); matches("\\(a\\{0,1\\}\\)\\(b\\{0,1\\}\\)", "ab", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("\\(a\\{0,1\\}\\)\\(b\\{0,1\\}\\)", "ba", 3, (M[]) { m(0, 1), m(0, 0), m(0, 1) }); matches("\\(a\\{0,1\\}\\)\\(b\\{0,1\\}\\)", "bb", 3, (M[]) { m(0, 1), m(0, 0), m(0, 1) }); matches("\\(a\\{0,1\\}\\)\\(b\\{0,1\\}\\)", "aaa", 3, (M[]) { m(0, 1), m(0, 1), m(1, 1) }); matches("\\(a\\{0,1\\}\\)\\(b\\{0,1\\}\\)", "aab", 3, (M[]) { m(0, 1), m(0, 1), m(1, 1) }); matches("\\(a\\{0,1\\}\\)\\(b\\{0,1\\}\\)", "aba", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("\\(a\\{0,1\\}\\)\\(b\\{0,1\\}\\)", "abb", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("\\(a\\{0,1\\}\\)\\(b\\{0,1\\}\\)", "baa", 3, (M[]) { m(0, 1), m(0, 0), m(0, 1) }); matches("\\(a\\{0,1\\}\\)\\(b\\{0,1\\}\\)", "bab", 3, (M[]) { m(0, 1), m(0, 0), m(0, 1) }); matches("\\(a\\{0,1\\}\\)\\(b\\{0,1\\}\\)", "bba", 3, (M[]) { m(0, 1), m(0, 0), m(0, 1) }); matches("\\(a\\{0,1\\}\\)\\(b\\{0,1\\}\\)", "bbb", 3, (M[]) { m(0, 1), m(0, 0), m(0, 1) }); reject("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", ""); reject("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "a"); reject("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "b"); reject("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "aa"); matches("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "ab", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); reject("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "ba"); reject("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "bb"); reject("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "aaa"); matches("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "aab", 3, (M[]) { m(0, 3), m(0, 2), m(2, 3) }); matches("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "aba", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "abb", 3, (M[]) { m(0, 3), m(0, 1), m(1, 3) }); reject("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "baa"); matches("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "bab", 3, (M[]) { m(1, 3), m(1, 2), m(2, 3) }); reject("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "bba"); reject("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "bbb"); reject("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "aaaa"); matches("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "aaab", 3, (M[]) { m(1, 4), m(1, 3), m(3, 4) }); matches("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "aaba", 3, (M[]) { m(0, 3), m(0, 2), m(2, 3) }); matches("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "aabb", 3, (M[]) { m(0, 4), m(0, 2), m(2, 4) }); matches("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "abaa", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "abab", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "abba", 3, (M[]) { m(0, 3), m(0, 1), m(1, 3) }); matches("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "abbb", 3, (M[]) { m(0, 3), m(0, 1), m(1, 3) }); reject("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "baaa"); matches("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "baab", 3, (M[]) { m(1, 4), m(1, 3), m(3, 4) }); matches("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "baba", 3, (M[]) { m(1, 3), m(1, 2), m(2, 3) }); matches("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "babb", 3, (M[]) { m(1, 4), m(1, 2), m(2, 4) }); reject("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "bbaa"); matches("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "bbab", 3, (M[]) { m(2, 4), m(2, 3), m(3, 4) }); reject("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "bbba"); reject("\\(a\\{1,2\\}\\)\\(b\\{1,2\\}\\)", "bbbb"); matches("\\(a\\)\\{0,1\\}\\(b\\)\\{0,1\\}", "", 3, (M[]) { m(0, 0), m(-1, -1), m(-1, -1) }); matches("\\(a\\)\\{0,1\\}\\(b\\)\\{0,1\\}", "a", 3, (M[]) { m(0, 1), m(0, 1), m(-1, -1) }); matches("\\(a\\)\\{0,1\\}\\(b\\)\\{0,1\\}", "b", 3, (M[]) { m(0, 1), m(-1, -1), m(0, 1) }); matches("\\(a\\)\\{0,1\\}\\(b\\)\\{0,1\\}", "aa", 3, (M[]) { m(0, 1), m(0, 1), m(-1, -1) }); matches("\\(a\\)\\{0,1\\}\\(b\\)\\{0,1\\}", "ab", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("\\(a\\)\\{0,1\\}\\(b\\)\\{0,1\\}", "ba", 3, (M[]) { m(0, 1), m(-1, -1), m(0, 1) }); matches("\\(a\\)\\{0,1\\}\\(b\\)\\{0,1\\}", "bb", 3, (M[]) { m(0, 1), m(-1, -1), m(0, 1) }); matches("\\(a\\)\\{0,1\\}\\(b\\)\\{0,1\\}", "aaa", 3, (M[]) { m(0, 1), m(0, 1), m(-1, -1) }); matches("\\(a\\)\\{0,1\\}\\(b\\)\\{0,1\\}", "aab", 3, (M[]) { m(0, 1), m(0, 1), m(-1, -1) }); matches("\\(a\\)\\{0,1\\}\\(b\\)\\{0,1\\}", "aba", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("\\(a\\)\\{0,1\\}\\(b\\)\\{0,1\\}", "abb", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("\\(a\\)\\{0,1\\}\\(b\\)\\{0,1\\}", "baa", 3, (M[]) { m(0, 1), m(-1, -1), m(0, 1) }); matches("\\(a\\)\\{0,1\\}\\(b\\)\\{0,1\\}", "bab", 3, (M[]) { m(0, 1), m(-1, -1), m(0, 1) }); matches("\\(a\\)\\{0,1\\}\\(b\\)\\{0,1\\}", "bba", 3, (M[]) { m(0, 1), m(-1, -1), m(0, 1) }); matches("\\(a\\)\\{0,1\\}\\(b\\)\\{0,1\\}", "bbb", 3, (M[]) { m(0, 1), m(-1, -1), m(0, 1) }); reject("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", ""); reject("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "a"); reject("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "b"); reject("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "aa"); matches("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "ab", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); reject("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "ba"); reject("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "bb"); reject("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "aaa"); matches("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "aab", 3, (M[]) { m(0, 3), m(1, 2), m(2, 3) }); matches("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "aba", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "abb", 3, (M[]) { m(0, 3), m(0, 1), m(2, 3) }); reject("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "baa"); matches("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "bab", 3, (M[]) { m(1, 3), m(1, 2), m(2, 3) }); reject("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "bba"); reject("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "bbb"); reject("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "aaaa"); matches("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "aaab", 3, (M[]) { m(1, 4), m(2, 3), m(3, 4) }); matches("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "aaba", 3, (M[]) { m(0, 3), m(1, 2), m(2, 3) }); matches("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "aabb", 3, (M[]) { m(0, 4), m(1, 2), m(3, 4) }); matches("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "abaa", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "abab", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "abba", 3, (M[]) { m(0, 3), m(0, 1), m(2, 3) }); matches("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "abbb", 3, (M[]) { m(0, 3), m(0, 1), m(2, 3) }); reject("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "baaa"); matches("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "baab", 3, (M[]) { m(1, 4), m(2, 3), m(3, 4) }); matches("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "baba", 3, (M[]) { m(1, 3), m(1, 2), m(2, 3) }); matches("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "babb", 3, (M[]) { m(1, 4), m(1, 2), m(3, 4) }); reject("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "bbaa"); matches("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "bbab", 3, (M[]) { m(2, 4), m(2, 3), m(3, 4) }); reject("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "bbba"); reject("\\(a\\)\\{1,2\\}\\(b\\)\\{1,2\\}", "bbbb"); reject("\\(a\\{1,2\\}\\)\\(a\\{1,2\\}\\)", ""); reject("\\(a\\{1,2\\}\\)\\(a\\{1,2\\}\\)", "a"); matches("\\(a\\{1,2\\}\\)\\(a\\{1,2\\}\\)", "aa", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("\\(a\\{1,2\\}\\)\\(a\\{1,2\\}\\)", "aaa", 3, (M[]) { m(0, 3), m(0, 2), m(2, 3) }); matches("\\(a\\{1,2\\}\\)\\(a\\{1,2\\}\\)", "aaaa", 3, (M[]) { m(0, 4), m(0, 2), m(2, 4) }); matches("\\(a\\{1,2\\}\\)\\(a\\{1,2\\}\\)", "aaaaa", 3, (M[]) { m(0, 4), m(0, 2), m(2, 4) }); reject("\\(a\\)\\{1,2\\}\\(a\\)\\{1,2\\}", ""); reject("\\(a\\)\\{1,2\\}\\(a\\)\\{1,2\\}", "a"); matches("\\(a\\)\\{1,2\\}\\(a\\)\\{1,2\\}", "aa", 3, (M[]) { m(0, 2), m(0, 1), m(1, 2) }); matches("\\(a\\)\\{1,2\\}\\(a\\)\\{1,2\\}", "aaa", 3, (M[]) { m(0, 3), m(1, 2), m(2, 3) }); matches("\\(a\\)\\{1,2\\}\\(a\\)\\{1,2\\}", "aaaa", 3, (M[]) { m(0, 4), m(1, 2), m(3, 4) }); matches("\\(a\\)\\{1,2\\}\\(a\\)\\{1,2\\}", "aaaaa", 3, (M[]) { m(0, 4), m(1, 2), m(3, 4) }); reject("\\(ab\\)\\{1,2\\}", ""); reject("\\(ab\\)\\{1,2\\}", "a"); matches("\\(ab\\)\\{1,2\\}", "ab", 2, (M[]) { m(0, 2), m(0, 2) }); matches("\\(ab\\)\\{1,2\\}", "aba", 2, (M[]) { m(0, 2), m(0, 2) }); matches("\\(ab\\)\\{1,2\\}", "abab", 2, (M[]) { m(0, 4), m(2, 4) }); reject("\\(a\\(\\(a\\{1,2\\}\\)\\{1,2\\}\\)\\)", ""); reject("\\(a\\(\\(a\\{1,2\\}\\)\\{1,2\\}\\)\\)", "a"); matches("\\(a\\(\\(a\\{1,2\\}\\)\\{1,2\\}\\)\\)", "aa", 4, (M[]) { m(0, 2), m(0, 2), m(1, 2), m(1, 2) }); matches("\\(a\\(\\(a\\{1,2\\}\\)\\{1,2\\}\\)\\)", "aaa", 4, (M[]) { m(0, 3), m(0, 3), m(1, 3), m(1, 3) }); matches("\\(a\\(\\(a\\{1,2\\}\\)\\{1,2\\}\\)\\)", "aaaa", 4, (M[]) { m(0, 4), m(0, 4), m(1, 4), m(3, 4) }); matches("\\(a\\(\\(a\\{1,2\\}\\)\\{1,2\\}\\)\\)", "aaaaa", 4, (M[]) { m(0, 5), m(0, 5), m(1, 5), m(3, 5) }); matches("\\(a\\(\\(a\\{1,2\\}\\)\\{1,2\\}\\)\\)", "aaaaaa", 4, (M[]) { m(0, 5), m(0, 5), m(1, 5), m(3, 5) }); reject("\\(a\\)\\{1,2\\}ab", ""); reject("\\(a\\)\\{1,2\\}ab", "a"); reject("\\(a\\)\\{1,2\\}ab", "b"); reject("\\(a\\)\\{1,2\\}ab", "aa"); reject("\\(a\\)\\{1,2\\}ab", "ab"); matches("\\(a\\)\\{1,2\\}ab", "aab", 2, (M[]) { m(0, 3), m(0, 1) }); matches("\\(a\\)\\{1,2\\}ab", "aaab", 2, (M[]) { m(0, 4), m(1, 2) }); reject("\\(a\\{1,2\\}\\)ab", ""); reject("\\(a\\{1,2\\}\\)ab", "a"); reject("\\(a\\{1,2\\}\\)ab", "b"); reject("\\(a\\{1,2\\}\\)ab", "aa"); reject("\\(a\\{1,2\\}\\)ab", "ab"); matches("\\(a\\{1,2\\}\\)ab", "aab", 2, (M[]) { m(0, 3), m(0, 1) }); matches("\\(a\\{1,2\\}\\)ab", "aaab", 2, (M[]) { m(0, 4), m(0, 2) }); matches("\\(a\\{1,2\\}\\)ab", "aaaab", 2, (M[]) { m(1, 5), m(1, 3) }); return 0; }