public void DFA_RemoveTrapStates() { var dfa = new DFATable(); var a = dfa.CreateNode(); var c = dfa.CreateNode(); a.IsFinal = true; dfa.StartState = a; dfa.AddTransition(a, a, "0"); dfa.AddTransition(a, c, "1"); dfa.AddTransition(c, c, "1"); dfa.AddTransition(c, c, "0"); var nfa = dfa.RemoveTrapStates(); Assert.AreEqual(1, nfa.Nodes.Count()); Assert.AreEqual(1, nfa.Transitions.Count()); Assert.AreEqual(0, nfa.Transitions.First().Source.ID); Assert.AreEqual(0, nfa.Transitions.First().Destination.ID); Assert.AreEqual("0", nfa.Transitions.First().Symbol); Assert.AreEqual(1, nfa.GetAllPossibleSymbols().Count); Assert.IsTrue(nfa.GetAllPossibleSymbols().Contains("0")); }
internal DFATable ToDFATable() { var dfa = new DFATable(); var nodes = dfa.CreateNodes(this._rows.Count); foreach (var row in this._rows) { var node = nodes[this._rowMapping[row.GetStatesIdentifier()]]; node.IsFinal = row.IsRowFinal(); foreach (var n in row.States) { node.UnionTags(n.GetTags()); } foreach (var symbol in this._symbols) { if (symbol == NFATable.Epsilon) { continue; } var source = node; var destination = nodes[this._rowMapping[row.GetTransition(symbol).GetIdentifier()]]; dfa.AddTransition(source, destination, symbol); } } // First row should be the start state. dfa.StartState = nodes[this._rowMapping[this._rows[0].GetStatesIdentifier()]]; return(dfa); }
public DFATests() { dfa = new DFATable(); a = dfa.CreateNode(); b = dfa.CreateNode(); c = dfa.CreateNode(); d = dfa.CreateNode(); e = dfa.CreateNode(); f = dfa.CreateNode(); dfa.StartState = a; c.IsFinal = true; d.IsFinal = true; e.IsFinal = true; dfa.AddTransition(a, b, "0"); dfa.AddTransition(a, c, "1"); dfa.AddTransition(b, a, "0"); dfa.AddTransition(b, d, "1"); dfa.AddTransition(c, f, "1"); dfa.AddTransition(c, e, "0"); dfa.AddTransition(d, e, "0"); dfa.AddTransition(d, f, "1"); dfa.AddTransition(e, e, "0"); dfa.AddTransition(e, f, "1"); dfa.AddTransition(f, f, "1"); dfa.AddTransition(f, f, "0"); }