public void СложноеВетвление2() { FiniteAutomata finiteAutomat = new FiniteAutomata(); finiteAutomat.Add(0, 1, 11); finiteAutomat.Add(1, 'a', 2); finiteAutomat.Add(2, 3, 9); finiteAutomat.Add(3, 'b', 4); finiteAutomat.Add(4, 5, 7); finiteAutomat.Add(5, 'c', 6); finiteAutomat.Add(7, 'd', 8); finiteAutomat.Add(9, 'e', 10); finiteAutomat.Add(11, 'f', 12); finiteAutomat.Add(12, 13, 15, 18); finiteAutomat.Add(13, 'g', 14); finiteAutomat.Add(15, 'h', 16); finiteAutomat.Add(16, 'i', 17); finiteAutomat.Add(18, 'j', 19); finiteAutomat.SetFinaleStates(new int[] { 6, 8, 10, 14, 17, 19 }); Assert.AreEqual(true, Run(finiteAutomat, "abc")); Assert.AreEqual(true, Run(finiteAutomat, "abd")); Assert.AreEqual(true, Run(finiteAutomat, "ae")); Assert.AreEqual(true, Run(finiteAutomat, "fg")); Assert.AreEqual(true, Run(finiteAutomat, "fhi")); Assert.AreEqual(true, Run(finiteAutomat, "fj")); Assert.AreEqual(false, Run(finiteAutomat, "ad")); Assert.AreEqual(false, Run(finiteAutomat, "ff")); Assert.AreEqual(false, Run(finiteAutomat, "fe")); }
public void Линейный() { FiniteAutomata finiteAutomat = new FiniteAutomata(); finiteAutomat.Add(0, 'a', 1); finiteAutomat.Add(1, 'b', 2); finiteAutomat.Add(2, 'c', 3); finiteAutomat.Add(3, 'd', 4); finiteAutomat.SetFinaleStates(new int[] { 4 }); Assert.AreEqual(true, Run(finiteAutomat, "abcd")); }
public void СложноеВетвление1() { FiniteAutomata finiteAutomat = new FiniteAutomata(); finiteAutomat.Add(0, 1, 7); finiteAutomat.Add(1, 'a', 2); finiteAutomat.Add(2, 3, 5); finiteAutomat.Add(3, 'b', 4); finiteAutomat.Add(5, 'c', 6); finiteAutomat.Add(7, 'd', 8); finiteAutomat.Add(8, 'e', 9); finiteAutomat.SetFinaleStates(new int[] { 4, 6, 9 }); Assert.AreEqual(true, Run(finiteAutomat, "ab")); Assert.AreEqual(true, Run(finiteAutomat, "ac")); Assert.AreEqual(true, Run(finiteAutomat, "de")); Assert.AreEqual(false, Run(finiteAutomat, "af")); Assert.AreEqual(false, Run(finiteAutomat, "cf")); Assert.AreEqual(false, Run(finiteAutomat, "df")); }
/// <summary> /// По регулярному выражению создается конечный автомат /// "abc" 0 ---a----> 1 ---b----> 2 ---c--->3 /// "a*b" 0 ----->1----b--->2 1--a->1 /// </summary> /// <param name="pat">шаблон регулярного выражения</param> public Pattern(string pat) { avtomat = new FiniteAutomata(); int i = 0; int state = 0; while (i < pat.Length) { if (i + 1 < pat.Length && pat[i + 1] == '*') { avtomat.Add(state, state + 1); avtomat.Add(state + 1, pat[i], state + 1); i += 2; } else { avtomat.Add(state, pat[i], state + 1); i++; } state++; } avtomat.SetFinaleStates(new int[] { state }); }