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>()); 
+
+        }
+
+
+    }
+}
+