public void Test() { //make pattern for whole numbers divisible by 3 //digits mod 3 var d0 = CharRange.AnyOf("0369"); var d1 = Pattern.Match(CharRange.AnyOf("147")).ThenMaybeRepeat(d0); var d2 = Pattern.Match(CharRange.AnyOf("258")).ThenMaybeRepeat(d0); var plus2 = Pattern.MaybeRepeat(d1.Then(d2)).Then(Pattern.AnyOf(d1.Then(d1), d2)); var minus2 = Pattern.MaybeRepeat(d2.Then(d1)).Then(Pattern.AnyOf(d2.Then(d2), d1)); var by3 = Pattern.MaybeRepeat(Pattern.AnyOf(d0, d1.Then(d2), plus2.Then(minus2))); var builder = new DfaBuilder <bool>(); builder.AddPattern(by3, true); var start = builder.Build(new HashSet <bool> { true }, null); Assert.Equal(3, CountStates(start)); CheckDfa(start, "By3Test.out.txt", false); }
public void TestRegexParser() { IMatchable p1, p2; p1 = Pattern.AnyOf("A", "B"); p2 = Pattern.Regex("A|B"); Check(p1, p2); p1 = Pattern.Match("A").Then(Pattern.AnyOf("C", "D")); p2 = Pattern.Regex("A(C|D)"); Check(p1, p2); p1 = Pattern.Match("A").Then(Pattern.AnyOf("C", "D")).Then("B"); p2 = Pattern.Regex("A(C|D)B"); Check(p1, p2); p1 = Pattern.Match("A").ThenMaybe(Pattern.AnyOf("C", "D")).Then("B"); p2 = Pattern.Regex("A(C|D)?B"); Check(p1, p2); p1 = Pattern.Match("A").ThenRepeat(Pattern.AnyOf("C", "D")).Then("B"); p2 = Pattern.Regex("A(C|D)+B"); Check(p1, p2); p1 = Pattern.Match("A").ThenMaybeRepeat(Pattern.AnyOf("C", "D")).Then("B"); p2 = Pattern.Regex("A(C|D)*B"); Check(p1, p2); #pragma warning disable 618 p1 = Pattern.Match("A").ThenMaybe(Pattern.AnyOf("C", "D")).Then("B"); p2 = Pattern.Regex("A(C|D)??B", RegexOptions.Legacy); Check(p1, p2); p1 = Pattern.Match("A").ThenMaybeRepeat(Pattern.AnyOf("C", "D")).Then("B"); p2 = Pattern.Regex("A(C|D)+?B", RegexOptions.Legacy); Check(p1, p2); p1 = Pattern.Match("A").ThenMaybeRepeat(Pattern.AnyOf("C", "D")).Then("B"); p2 = Pattern.Regex("A(C|D)*?B", RegexOptions.Legacy); Check(p1, p2); #pragma warning restore 618 p1 = Pattern.AnyOf(Pattern.Match("A").ThenMaybeRepeat("B"), Pattern.Match("C")); p2 = Pattern.Regex("AB*|C"); Check(p1, p2); p1 = Pattern.Regex("\\s\\S\\d\\D\\w\\W"); p2 = Pattern.Regex("[ \\t\\n\\x0B\\f\\r][^ \\t\\n\\x0B\\f\\r][0-9][^0-9][a-zA-Z_0-9][^a-zA-Z_0-9]"); Check(p1, p2); p1 = Pattern.Regex("[^\\d][\\d]"); p2 = Pattern.Regex("[\\D][^\\D]"); Check(p1, p2); p1 = Pattern.Regex("[Cc][Aa][Tt][^0-9a-fA-F][^0-9a-f@-F]"); p2 = Pattern.RegexI("cAt[^\\da-f][^\\d@-F]"); Check(p1, p2); }