Mercurial > pub > ImplabNet
diff Implab/Automaton/RegularExpressions/RegularDFADefinition.cs @ 164:ec35731ae299 ref20160224
Almost complete DFA refactoring
author | cin |
---|---|
date | Thu, 25 Feb 2016 02:11:13 +0300 |
parents | |
children | e227e78d72e4 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Implab/Automaton/RegularExpressions/RegularDFADefinition.cs Thu Feb 25 02:11:13 2016 +0300 @@ -0,0 +1,46 @@ +using System; + +namespace Implab.Automaton.RegularExpressions { + public class RegularDFADefinition<TInput, TTag> : DFATransitionTable<TTag>, IDFATransitionTable<TTag> { + + readonly IAlphabet<TInput> m_alphabet; + readonly int m_initialState; + + public RegularDFADefinition(IAlphabet<TInput> alphabet, int initialState) { + Safe.ArgumentNotNull(alphabet, "aplhabet"); + + m_alphabet = alphabet; + m_initialState = initialState; + } + + + public IAlphabet<TInput> InputAlphabet { + get { + return m_alphabet; + } + } + + protected override DFAStateDescriptior<TTag>[] ConstructTransitionTable() { + if (InputAlphabet.Count != m_alphabet.Count) + throw new InvalidOperationException("The alphabet doesn't match the transition table"); + + return base.ConstructTransitionTable(); + } + + /// <summary> + /// Optimize the specified alphabet. + /// </summary> + /// <param name="alphabet">Пустой алфавит, который будет зполнен в процессе оптимизации.</param> + public RegularDFADefinition<TInput, TTag> Optimize(IAlphabetBuilder<TInput> alphabet) { + Safe.ArgumentNotNull(alphabet, "alphabet"); + + var optimalDFA = new RegularDFADefinition<TInput,TTag>(alphabet, m_initialState); + + Optimize(optimalDFA, InputAlphabet, alphabet, new DummyAlphabet(StateCount), new MapAlphabet<int>()); + + } + + + } +} +