Regex: fix handling of strict quantifiers {N}

Previous behaviour was treating {N} as {N,}
This commit is contained in:
Maxime Coste 2017-09-26 20:44:01 +09:00
parent be157453ad
commit 1a8ad3759f

View File

@ -320,8 +320,8 @@ private:
case '{': case '{':
{ {
auto it = pos+1; auto it = pos+1;
int min = read_int(it, it, end); const int min = read_int(it, it, end);
int max = -1; int max = min;
if (*it == ',') if (*it == ',')
{ {
++it; ++it;
@ -801,7 +801,7 @@ auto test_regex = UnitTest{[]{
kak_assert(not vm.exec("foobar")); kak_assert(not vm.exec("foobar"));
} }
{ {
auto program = RegexCompiler::compile(R"(\`(foo|bar)\')"); auto program = RegexCompiler::compile(R"((foo|bar))");
dump(program); dump(program);
ThreadedRegexVM<const char*> vm{program}; ThreadedRegexVM<const char*> vm{program};
kak_assert(vm.exec("foo")); kak_assert(vm.exec("foo"));
@ -810,7 +810,7 @@ auto test_regex = UnitTest{[]{
} }
{ {
auto program = RegexCompiler::compile(R"(\`a{3,5}b\')"); auto program = RegexCompiler::compile(R"(a{3,5}b)");
dump(program); dump(program);
ThreadedRegexVM<const char*> vm{program}; ThreadedRegexVM<const char*> vm{program};
kak_assert(not vm.exec("aab")); kak_assert(not vm.exec("aab"));
@ -820,7 +820,16 @@ auto test_regex = UnitTest{[]{
} }
{ {
auto program = RegexCompiler::compile(R"(\`a{3,}b\')"); auto program = RegexCompiler::compile(R"(a{3}b)");
dump(program);
ThreadedRegexVM<const char*> vm{program};
kak_assert(not vm.exec("aab"));
kak_assert(vm.exec("aaab"));
kak_assert(not vm.exec("aaaab"));
}
{
auto program = RegexCompiler::compile(R"(a{3,}b)");
dump(program); dump(program);
ThreadedRegexVM<const char*> vm{program}; ThreadedRegexVM<const char*> vm{program};
kak_assert(not vm.exec("aab")); kak_assert(not vm.exec("aab"));
@ -829,7 +838,7 @@ auto test_regex = UnitTest{[]{
} }
{ {
auto program = RegexCompiler::compile(R"(\`a{,3}b\')"); auto program = RegexCompiler::compile(R"(a{,3}b)");
dump(program); dump(program);
ThreadedRegexVM<const char*> vm{program}; ThreadedRegexVM<const char*> vm{program};
kak_assert(vm.exec("b")); kak_assert(vm.exec("b"));