public void RegExpAllOperatorsToAutomata() { RegExp regExp = new RegExp("d").Or(new RegExp("e")).Star().Dot(new RegExp("a").Plus().Dot(new RegExp("b").Or(new RegExp("c")).Plus())); Automaat <string> automaat = ThompsonConstruction.ConvertRegExp(regExp); Assert.AreEqual("(0, $)-->2", automaat.Transitions.ToList()[0].ToString()); Assert.AreEqual("(0, $)-->3", automaat.Transitions.ToList()[1].ToString()); Assert.AreEqual("(10, a)-->11", automaat.Transitions.ToList()[2].ToString()); Assert.AreEqual("(11, $)-->10", automaat.Transitions.ToList()[3].ToString()); Assert.AreEqual("(11, $)-->9", automaat.Transitions.ToList()[4].ToString()); Assert.AreEqual("(12, $)-->14", automaat.Transitions.ToList()[5].ToString()); Assert.AreEqual("(12, $)-->16", automaat.Transitions.ToList()[6].ToString()); Assert.AreEqual("(13, $)-->1", automaat.Transitions.ToList()[7].ToString()); Assert.AreEqual("(13, $)-->12", automaat.Transitions.ToList()[8].ToString()); Assert.AreEqual("(14, b)-->15", automaat.Transitions.ToList()[9].ToString()); Assert.AreEqual("(15, $)-->13", automaat.Transitions.ToList()[10].ToString()); Assert.AreEqual("(16, c)-->17", automaat.Transitions.ToList()[11].ToString()); Assert.AreEqual("(17, $)-->13", automaat.Transitions.ToList()[12].ToString()); Assert.AreEqual("(2, $)-->10", automaat.Transitions.ToList()[13].ToString()); Assert.AreEqual("(3, $)-->5", automaat.Transitions.ToList()[14].ToString()); Assert.AreEqual("(3, $)-->7", automaat.Transitions.ToList()[15].ToString()); Assert.AreEqual("(4, $)-->2", automaat.Transitions.ToList()[16].ToString()); Assert.AreEqual("(4, $)-->3", automaat.Transitions.ToList()[17].ToString()); Assert.AreEqual("(5, d)-->6", automaat.Transitions.ToList()[18].ToString()); Assert.AreEqual("(6, $)-->4", automaat.Transitions.ToList()[19].ToString()); Assert.AreEqual("(7, e)-->8", automaat.Transitions.ToList()[20].ToString()); Assert.AreEqual("(8, $)-->4", automaat.Transitions.ToList()[21].ToString()); Assert.AreEqual("(9, $)-->12", automaat.Transitions.ToList()[22].ToString()); }
private void ReplaceTuple(Tuple <string, Automaat <int> > old, Automaat <int> newAutomaat) { var newTuple = new Tuple <string, Automaat <int> >(old.Item1, newAutomaat); Store.Instance.ListOfDfas.Remove(old); Store.Instance.ListOfDfas.Add(newTuple); }
public void DfaTest3() { char[] alphabet = { 'a', 'b' }; Automaat <string> dfa = new Automaat <string>(alphabet); dfa.AddTransition(new Transition <string>("0", 'a', "1")); dfa.AddTransition(new Transition <string>("0", 'b', "4")); dfa.AddTransition(new Transition <string>("1", 'b', "4")); dfa.AddTransition(new Transition <string>("1", 'a', "2")); dfa.AddTransition(new Transition <string>("2", 'a', "0")); dfa.AddTransition(new Transition <string>("2", 'b', "3")); dfa.AddTransition(new Transition <string>("3", 'a', "1")); dfa.AddTransition(new Transition <string>("3", 'b', "4")); dfa.AddTransition(new Transition <string>("4", 'a', "4")); dfa.AddTransition(new Transition <string>("4", 'b', "4")); dfa.DefineAsStartState("0"); dfa.DefineAsFinalState("3"); Assert.IsTrue(dfa.IsDfa()); }
public static Automaat <string> GetExampleSlide14Lesson2() { char[] alphabet = { 'a', 'b' }; Automaat <string> m = new Automaat <string>(alphabet); m.AddTransition(new Transition <string>("A", 'a', "C")); m.AddTransition(new Transition <string>("A", 'b', "B")); m.AddTransition(new Transition <string>("A", 'b', "C")); m.AddTransition(new Transition <string>("B", 'b', "C")); m.AddTransition(new Transition <string>("B", "C")); m.AddTransition(new Transition <string>("C", 'a', "D")); m.AddTransition(new Transition <string>("C", 'a', "E")); m.AddTransition(new Transition <string>("C", 'b', "D")); m.AddTransition(new Transition <string>("D", 'a', "B")); m.AddTransition(new Transition <string>("D", 'a', "C")); m.AddTransition(new Transition <string>("E", 'a')); m.AddTransition(new Transition <string>("E", "D")); // only on start state in a dfa: m.DefineAsStartState("A"); // two final states: m.DefineAsFinalState("C"); m.DefineAsFinalState("E"); return(m); }
public void RegExpOneA() { RegExp regExp = new RegExp("a"); Automaat <string> automaat = ThompsonConstruction.ConvertRegExp(regExp); Assert.AreEqual("(0, a)-->1", automaat.Transitions.ToList()[0].ToString()); }
public void AcceptTestInCorrectFinalState() { char[] alphabet = { 'a', 'b' }; Automaat <string> dfa = new Automaat <string>(alphabet); dfa.AddTransition(new Transition <string>("0", 'a', "1")); dfa.AddTransition(new Transition <string>("0", 'b', "4")); dfa.AddTransition(new Transition <string>("1", 'b', "2")); dfa.AddTransition(new Transition <string>("1", 'a', "4")); dfa.AddTransition(new Transition <string>("2", 'a', "3")); dfa.AddTransition(new Transition <string>("2", 'b', "4")); dfa.AddTransition(new Transition <string>("3", 'a', "1")); dfa.AddTransition(new Transition <string>("3", 'b', "2")); dfa.AddTransition(new Transition <string>("4", 'a', "4")); dfa.AddTransition(new Transition <string>("4", 'b', "4")); dfa.DefineAsStartState("0"); dfa.DefineAsFinalState("0"); dfa.DefineAsFinalState("2"); Assert.IsFalse(dfa.Accept("aba")); }
public void TestConvertAutomaat2() { Automaat <string> ndfa = new Automaat <string>(new[] { 'a', 'b' }); ndfa.AddTransition(new Transition <string>("S", 'a', "A")); ndfa.AddTransition(new Transition <string>("S", 'a', "S")); ndfa.AddTransition(new Transition <string>("A", 'b', "B")); ndfa.DefineAsStartState("S"); ndfa.DefineAsFinalState("B"); Automaat <string> dfa = NdfaToDfaConverter.Convert(ndfa); Assert.AreEqual("(AS, a)-->AS", dfa.Transitions.ToList()[0].ToString()); Assert.AreEqual("(AS, b)-->B", dfa.Transitions.ToList()[1].ToString()); Assert.AreEqual("(B, a)-->F", dfa.Transitions.ToList()[2].ToString()); Assert.AreEqual("(B, b)-->F", dfa.Transitions.ToList()[3].ToString()); Assert.AreEqual("(F, a)-->F", dfa.Transitions.ToList()[4].ToString()); Assert.AreEqual("(F, b)-->F", dfa.Transitions.ToList()[5].ToString()); Assert.AreEqual("(S, a)-->AS", dfa.Transitions.ToList()[6].ToString()); Assert.AreEqual("(S, b)-->F", dfa.Transitions.ToList()[7].ToString()); Assert.AreEqual("B", dfa.FinalStates.ToList()[0]); Assert.AreEqual("S", dfa.StartStates.ToList()[0]); }
public static Automaat <string> GetExampleSlide8Lesson2() { char[] alphabet = { 'a', 'b' }; Automaat <string> m = new Automaat <string>(alphabet); m.AddTransition(new Transition <string>("q0", 'a', "q1")); m.AddTransition(new Transition <string>("q0", 'b', "q4")); m.AddTransition(new Transition <string>("q1", 'a', "q4")); m.AddTransition(new Transition <string>("q1", 'b', "q2")); m.AddTransition(new Transition <string>("q2", 'a', "q3")); m.AddTransition(new Transition <string>("q2", 'b', "q4")); m.AddTransition(new Transition <string>("q3", 'a', "q1")); m.AddTransition(new Transition <string>("q3", 'b', "q2")); // the error state, loops for a and b: m.AddTransition(new Transition <string>("q4", 'a')); m.AddTransition(new Transition <string>("q4", 'b')); // only on start state in a dfa: m.DefineAsStartState("q0"); // two final states: m.DefineAsFinalState("q2"); m.DefineAsFinalState("q3"); return(m); }
public void RegExpPlus() { RegExp regExp = new RegExp("a").Plus(); Automaat <string> automaat = ThompsonConstruction.ConvertRegExp(regExp); Assert.AreEqual("(0, $)-->2", automaat.Transitions.ToList()[0].ToString()); Assert.AreEqual("(2, a)-->3", automaat.Transitions.ToList()[1].ToString()); Assert.AreEqual("(3, $)-->1", automaat.Transitions.ToList()[2].ToString()); Assert.AreEqual("(3, $)-->2", automaat.Transitions.ToList()[3].ToString()); }
public void RegExpAbDotCd() { RegExp regExp = new RegExp("ab").Dot(new RegExp("cd")); Automaat <string> automaat = ThompsonConstruction.ConvertRegExp(regExp); Assert.AreEqual("(0, a)-->3", automaat.Transitions.ToList()[0].ToString()); Assert.AreEqual("(2, c)-->4", automaat.Transitions.ToList()[1].ToString()); Assert.AreEqual("(3, b)-->2", automaat.Transitions.ToList()[2].ToString()); Assert.AreEqual("(4, d)-->1", automaat.Transitions.ToList()[3].ToString()); }
public void TestReverseStartStop() { Automaat <string> automaat = new Automaat <string>(); automaat.DefineAsStartState("0"); automaat.DefineAsFinalState("1"); Automaat <string> reverse = NdfaToDfaConverter.Reverse(automaat); Assert.AreEqual(automaat.StartStates, reverse.FinalStates); Assert.AreEqual(automaat.FinalStates, reverse.StartStates); }
public void GeefTaalTotLengte() { Automaat <string> automaat = new Automaat <string>(new[] { 'a', 'b' }); automaat.AddTransition(new Transition <string>("0", 'a', "1")); automaat.AddTransition(new Transition <string>("0", 'b', "0")); automaat.AddTransition(new Transition <string>("1", 'a', "1")); automaat.AddTransition(new Transition <string>("1", 'b', "0")); automaat.DefineAsStartState("0"); automaat.DefineAsFinalState("1"); Assert.AreEqual(4, automaat.GeefTaalTotLengte(2).Count); }
public void TestReverseTransition() { Automaat <string> automaat = new Automaat <string>(); automaat.AddTransition(new Transition <string>("0", 'a', "1")); automaat.AddTransition(new Transition <string>("0", 'b', "1")); automaat.AddTransition(new Transition <string>("1", 'b', "0")); automaat.AddTransition(new Transition <string>("1", 'a', "1")); Automaat <string> reverse = NdfaToDfaConverter.Reverse(automaat); Assert.AreEqual("(0, b)-->1", reverse.Transitions.ToList()[0].ToString()); Assert.AreEqual("(1, a)-->0", reverse.Transitions.ToList()[1].ToString()); Assert.AreEqual("(1, a)-->1", reverse.Transitions.ToList()[2].ToString()); Assert.AreEqual("(1, b)-->0", reverse.Transitions.ToList()[3].ToString()); }
public void RegExpAorBstar() { RegExp regExp = new RegExp("a").Or(new RegExp("b")).Star(); Automaat <string> automaat = ThompsonConstruction.ConvertRegExp(regExp); Assert.AreEqual("(0, $)-->1", automaat.Transitions.ToList()[0].ToString()); Assert.AreEqual("(0, $)-->2", automaat.Transitions.ToList()[1].ToString()); Assert.AreEqual("(2, $)-->4", automaat.Transitions.ToList()[2].ToString()); Assert.AreEqual("(2, $)-->6", automaat.Transitions.ToList()[3].ToString()); Assert.AreEqual("(3, $)-->1", automaat.Transitions.ToList()[4].ToString()); Assert.AreEqual("(3, $)-->2", automaat.Transitions.ToList()[5].ToString()); Assert.AreEqual("(4, a)-->5", automaat.Transitions.ToList()[6].ToString()); Assert.AreEqual("(5, $)-->3", automaat.Transitions.ToList()[7].ToString()); Assert.AreEqual("(6, b)-->7", automaat.Transitions.ToList()[8].ToString()); Assert.AreEqual("(7, $)-->3", automaat.Transitions.ToList()[9].ToString()); }
public void AcceptEpsilonTest() { char[] alphabet = { 'a', 'b' }; Automaat <string> epsilonNdfa = new Automaat <string>(alphabet); epsilonNdfa.AddTransition(new Transition <string>("0", 'a', "1")); epsilonNdfa.AddTransition(new Transition <string>("1", '$', "2")); epsilonNdfa.AddTransition(new Transition <string>("2", 'b', "3")); epsilonNdfa.AddTransition(new Transition <string>("3", '$', "4")); epsilonNdfa.AddTransition(new Transition <string>("4", '$', "5")); epsilonNdfa.AddTransition(new Transition <string>("5", 'c', "6")); epsilonNdfa.DefineAsStartState("0"); epsilonNdfa.DefineAsFinalState("6"); Assert.IsTrue(epsilonNdfa.Accept("abc")); }
public void TestConvertAutomaat3() { Automaat <string> ndfa = new Automaat <string>(new[] { 'a', 'b' }); ndfa.AddTransition(new Transition <string>("0", 'a', "0")); ndfa.AddTransition(new Transition <string>("0", 'a', "1")); ndfa.AddTransition(new Transition <string>("0", 'b', "1")); ndfa.AddTransition(new Transition <string>("1", 'a', "2")); ndfa.AddTransition(new Transition <string>("1", 'b', "2")); ndfa.AddTransition(new Transition <string>("2", 'a', "0")); ndfa.AddTransition(new Transition <string>("2", 'a', "2")); ndfa.DefineAsStartState("0"); ndfa.DefineAsFinalState("2"); Automaat <string> dfa = NdfaToDfaConverter.Convert(ndfa); Assert.AreEqual("(0, a)-->01", dfa.Transitions.ToList()[0].ToString()); Assert.AreEqual("(0, b)-->1", dfa.Transitions.ToList()[1].ToString()); Assert.AreEqual("(01, a)-->012", dfa.Transitions.ToList()[2].ToString()); Assert.AreEqual("(01, b)-->12", dfa.Transitions.ToList()[3].ToString()); Assert.AreEqual("(012, a)-->012", dfa.Transitions.ToList()[4].ToString()); Assert.AreEqual("(012, b)-->12", dfa.Transitions.ToList()[5].ToString()); Assert.AreEqual("(02, a)-->012", dfa.Transitions.ToList()[6].ToString()); Assert.AreEqual("(02, b)-->1", dfa.Transitions.ToList()[7].ToString()); Assert.AreEqual("(1, a)-->2", dfa.Transitions.ToList()[8].ToString()); Assert.AreEqual("(1, b)-->2", dfa.Transitions.ToList()[9].ToString()); Assert.AreEqual("(12, a)-->02", dfa.Transitions.ToList()[10].ToString()); Assert.AreEqual("(12, b)-->2", dfa.Transitions.ToList()[11].ToString()); Assert.AreEqual("(2, a)-->02", dfa.Transitions.ToList()[12].ToString()); Assert.AreEqual("(2, b)-->F", dfa.Transitions.ToList()[13].ToString()); Assert.AreEqual("(F, a)-->F", dfa.Transitions.ToList()[14].ToString()); Assert.AreEqual("(F, b)-->F", dfa.Transitions.ToList()[15].ToString()); Assert.AreEqual("012", dfa.FinalStates.ToList()[0]); Assert.AreEqual("02", dfa.FinalStates.ToList()[1]); Assert.AreEqual("12", dfa.FinalStates.ToList()[2]); Assert.AreEqual("2", dfa.FinalStates.ToList()[3]); Assert.AreEqual("0", dfa.StartStates.ToList()[0]); }
public void TestConvertAutomaat1() { char[] alphabet = { 'a', 'b' }; Automaat <string> ndfa = new Automaat <string>(alphabet); ndfa.AddTransition(new Transition <string>("1", 'a', "2")); ndfa.AddTransition(new Transition <string>("1", 'b', "2")); ndfa.AddTransition(new Transition <string>("1", 'b', "3")); ndfa.AddTransition(new Transition <string>("2", 'a', "4")); ndfa.AddTransition(new Transition <string>("2", 'a', "2")); ndfa.AddTransition(new Transition <string>("4", 'b', "3")); ndfa.AddTransition(new Transition <string>("4", 'b', "1")); ndfa.DefineAsStartState("1"); ndfa.DefineAsFinalState("1"); ndfa.DefineAsFinalState("4"); Automaat <string> dfa = NdfaToDfaConverter.Convert(ndfa); Assert.AreEqual("(1, a)-->2", dfa.Transitions.ToList()[0].ToString()); Assert.AreEqual("(1, b)-->23", dfa.Transitions.ToList()[1].ToString()); Assert.AreEqual("(13, a)-->2", dfa.Transitions.ToList()[2].ToString()); Assert.AreEqual("(13, b)-->23", dfa.Transitions.ToList()[3].ToString()); Assert.AreEqual("(2, a)-->24", dfa.Transitions.ToList()[4].ToString()); Assert.AreEqual("(2, b)-->F", dfa.Transitions.ToList()[5].ToString()); Assert.AreEqual("(23, a)-->24", dfa.Transitions.ToList()[6].ToString()); Assert.AreEqual("(23, b)-->F", dfa.Transitions.ToList()[7].ToString()); Assert.AreEqual("(24, a)-->24", dfa.Transitions.ToList()[8].ToString()); Assert.AreEqual("(24, b)-->13", dfa.Transitions.ToList()[9].ToString()); Assert.AreEqual("(F, a)-->F", dfa.Transitions.ToList()[10].ToString()); Assert.AreEqual("(F, b)-->F", dfa.Transitions.ToList()[11].ToString()); Assert.AreEqual("1", dfa.FinalStates.ToList()[0]); Assert.AreEqual("13", dfa.FinalStates.ToList()[1]); Assert.AreEqual("24", dfa.FinalStates.ToList()[2]); Assert.AreEqual("1", dfa.StartStates.ToList()[0]); }
private void CombineDfas() { var dfaOperator = combineDfaComboBox.SelectedItem; if (!(dfaOperator is DfaOperator)) { return; } dfaOperator = (DfaOperator)dfaOperator; if (_left == null || _right == null) { return; } Automaat <int> combineDfa = null; switch (dfaOperator) { case DfaOperator.En: combineDfa = _left.Item2 & _right.Item2; break; case DfaOperator.Of: combineDfa = _left.Item2 | _right.Item2; break; } var name = $"{_left.Item1} {dfaOperator} {_right.Item1}"; if (combineDfa == null) { return; } Store.Instance.ListOfDfas.Add(new Tuple <string, Automaat <int> >(name, combineDfa)); ResetCombineDfa(); }
public void HopcroftTest1() { char[] alphabet = { 'a', 'b' }; Automaat <string> dfaToHopcroft = new Automaat <string>(alphabet); dfaToHopcroft.AddTransition(new Transition <string>("1", 'a', "2")); dfaToHopcroft.AddTransition(new Transition <string>("1", 'b', "3")); dfaToHopcroft.AddTransition(new Transition <string>("2", 'a', "4")); dfaToHopcroft.AddTransition(new Transition <string>("2", 'b', "5")); dfaToHopcroft.AddTransition(new Transition <string>("3", 'a', "6")); dfaToHopcroft.AddTransition(new Transition <string>("3", 'b', "7")); dfaToHopcroft.AddTransition(new Transition <string>("4", 'a', "4")); dfaToHopcroft.AddTransition(new Transition <string>("4", 'b', "4")); dfaToHopcroft.AddTransition(new Transition <string>("5", 'a', "2")); dfaToHopcroft.AddTransition(new Transition <string>("5", 'b', "8")); dfaToHopcroft.AddTransition(new Transition <string>("6", 'a', "4")); dfaToHopcroft.AddTransition(new Transition <string>("6", 'b', "5")); dfaToHopcroft.AddTransition(new Transition <string>("7", 'a', "6")); dfaToHopcroft.AddTransition(new Transition <string>("7", 'b', "7")); dfaToHopcroft.AddTransition(new Transition <string>("8", 'a', "6")); dfaToHopcroft.AddTransition(new Transition <string>("8", 'b', "9")); dfaToHopcroft.AddTransition(new Transition <string>("9", 'a', "6")); dfaToHopcroft.AddTransition(new Transition <string>("9", 'b', "10")); dfaToHopcroft.AddTransition(new Transition <string>("10", 'a', "6")); dfaToHopcroft.AddTransition(new Transition <string>("10", 'b', "10")); dfaToHopcroft.DefineAsStartState("1"); dfaToHopcroft.DefineAsFinalState("3"); dfaToHopcroft.DefineAsFinalState("5"); dfaToHopcroft.DefineAsFinalState("7"); dfaToHopcroft.DefineAsFinalState("9"); dfaToHopcroft.DefineAsFinalState("10"); Automaat <string> hopcroftedDfa = HopcroftAlgorithm.MinimizeDfa(dfaToHopcroft); Assert.AreEqual("(A, a)-->B", hopcroftedDfa.Transitions.ToList()[0].ToString()); Assert.AreEqual("(A, b)-->D", hopcroftedDfa.Transitions.ToList()[1].ToString()); Assert.AreEqual("(B, a)-->C", hopcroftedDfa.Transitions.ToList()[2].ToString()); Assert.AreEqual("(B, b)-->E", hopcroftedDfa.Transitions.ToList()[3].ToString()); Assert.AreEqual("(C, a)-->C", hopcroftedDfa.Transitions.ToList()[4].ToString()); Assert.AreEqual("(C, b)-->C", hopcroftedDfa.Transitions.ToList()[5].ToString()); Assert.AreEqual("(D, a)-->B", hopcroftedDfa.Transitions.ToList()[6].ToString()); Assert.AreEqual("(D, b)-->D", hopcroftedDfa.Transitions.ToList()[7].ToString()); Assert.AreEqual("(E, a)-->B", hopcroftedDfa.Transitions.ToList()[8].ToString()); Assert.AreEqual("(E, b)-->A", hopcroftedDfa.Transitions.ToList()[9].ToString()); Assert.AreEqual("D", hopcroftedDfa.FinalStates.ToList()[0]); Assert.AreEqual("E", hopcroftedDfa.FinalStates.ToList()[1]); Assert.AreEqual("A", hopcroftedDfa.StartStates.ToList()[0]); }