/// <summary> /// Creates a version of the current /// <see cref="NFAState{TCheck, TNFAState, TDFAState, TSourceElement}"/> which is /// deterministic by creating a left-side union on elements /// which overlap on their <typeparamref name="TCheck"/> /// transition requirements. /// </summary> /// <returns>A new <typeparamref name="TDFAState"/> /// instance which represents the current automation /// in a deterministic manner.</returns> public TDFAState DeterminateAutomata() { DFAEntryTable entrySet = new DFAEntryTable(this.GetDFAState); TDFAState result = GetRootDFAState(); if (!this.IgnoreSources) { ReplicateSourcesToAlt <TDFAState, TDFAState>(result); } result.IsReductionSite = this.IsReductionSite; ReplicateStateTransitions(result, this.OutTransitions, entrySet); result.IsEdge = this.IsEdge; return(result); }
private void ReplicateStateTransitions(TDFAState result, IFiniteAutomataMultiTargetTransitionTable <TCheck, TNFAState> table, DFAEntryTable entrySet) { /* * * For every transition on the current transition table, * construct a new version of the target state via merging * the full transition tables of the NFA states. * * * This process is repeated with this merged table. * */ foreach (var transition in table.Keys) { var set = table[transition].Distinct().ToList(); if (entrySet.ContiansEntryFor(transition, set)) { result.MoveTo(transition, entrySet[transition][set].DFA); } else { var newElement = entrySet.Add(transition, set); FiniteAutomataMultiTargetTransitionTable <TCheck, TNFAState> mergedTable = new FiniteAutomataMultiTargetTransitionTable <TCheck, TNFAState>(); foreach (var subState in set) { foreach (var subTransition in subState.OutTransitions.Keys.ToArray()) { mergedTable.Add(subTransition, subState.OutTransitions[subTransition]); } } var curDFA = newElement.DFA; result.MoveTo(transition, curDFA); foreach (var item in set) { if (!item.IgnoreSources) { item.ReplicateSourcesToAlt <TDFAState, TDFAState>(curDFA); } } curDFA.ReduceSources(); ReplicateStateTransitions(newElement.DFA, mergedTable, entrySet); } } }