Example #1
0
        /// <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);
        }
Example #2
0
        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);
                }
            }
        }