private static void EnsureComplete(FA dfa) { EnsureDfa(dfa); foreach (var state in dfa.States) { var all = new Integers(); var sum = 0; foreach (var transition in state.Transitions) { sum += transition.Set.Cardinality; all.Add(transition.Set); } if (!UnicodeSets.IsAny(all)) { throw new Exception("DFA: incomplete transition set (DFA is not `complete´)"); } if (sum != all.Cardinality) { throw new Exception("DFA: overlapping transitions (DFA is not `sane´)"); } } }
public static FA Complete(FA dfa) { EnsureDfa(dfa); State?sink = null; foreach (var state in dfa.States) { var rest = UnicodeSets.Any(); foreach (var transition in state.Transitions) { rest = rest.ExceptWith(transition.Set); } if (!rest.IsEmpty) { if (sink == null) { sink = new State(); sink.Add(Integers.Any, sink); } state.Add(Integers.From(rest), sink); } } if (sink != null) { sink.Id = dfa.States.Count; dfa.States.Add(sink); } EnsureComplete(dfa); return(dfa); }