diff Implab/Parsing/DFADefinition.cs @ 161:2a8466f0cb8a v2

DFA refactoring
author cin
date Fri, 19 Feb 2016 18:07:17 +0300
parents 5802131432e4
children
line wrap: on
line diff
--- a/Implab/Parsing/DFADefinition.cs	Thu Feb 18 19:38:54 2016 +0300
+++ b/Implab/Parsing/DFADefinition.cs	Fri Feb 19 18:07:17 2016 +0300
@@ -5,28 +5,20 @@
 using System.Linq;
 
 namespace Implab.Parsing {
-    public class DFADefinition : IDFADefinition {
-        readonly List<DFAStateDescriptior> m_states;
+    public class DFADefinition<TInput, TState, TTag> : IDFADefinition<TInput, TState, TTag> {
+        readonly List<DFAStateDescriptior<TTag>> m_states;
         
         public const int INITIAL_STATE = 1;
         public const int UNREACHEBLE_STATE = 0;
 
-        DFAStateDescriptior[] m_statesArray;
+        DFAStateDescriptior<TTag>[] m_statesArray;
         readonly int m_alpabetSize;
 
         public DFADefinition(int alphabetSize) {
-            m_states = new List<DFAStateDescriptior>();
+            m_states = new List<DFAStateDescriptior<TTag>>();
             m_alpabetSize = alphabetSize;
         
-            m_states.Add(new DFAStateDescriptior());
-        }
-
-        public DFAStateDescriptior[] States {
-            get {
-                if (m_statesArray == null)
-                    m_statesArray = m_states.ToArray();
-                return m_statesArray;
-            }
+            m_states.Add(new DFAStateDescriptior<TTag>());
         }
 
         public bool InitialStateIsFinal {
@@ -37,7 +29,7 @@
 
         public int AddState() {
             var index = m_states.Count;
-            m_states.Add(new DFAStateDescriptior {
+            m_states.Add(new DFAStateDescriptior<TTag> {
                 final = false,
                 transitions = new int[AlphabetSize]
             });
@@ -46,10 +38,10 @@
             return index;
         }
 
-        public int AddState(int[] tag) {
+        public int AddState(TTag[] tag) {
             var index = m_states.Count;
             bool final = tag != null && tag.Length != 0;
-            m_states.Add(new DFAStateDescriptior {
+            m_states.Add(new DFAStateDescriptior<TTag> {
                 final = final,
                 transitions = new int[AlphabetSize],
                 tag = final ? tag : null
@@ -58,15 +50,41 @@
             return index;
         }
 
-        public void DefineTransition(int s1,int s2, int symbol) {
-            Safe.ArgumentInRange(s1, 0, m_states.Count-1, "s1");
-            Safe.ArgumentInRange(s2, 0, m_states.Count-1, "s2");
-            Safe.ArgumentInRange(symbol, 0, AlphabetSize-1, "symbol");
+        public void DefineTransition(TState s1, TState s2, TInput symbol) {
+            int is1 = StateAlphabet.Translate(s1);
+            int is2 = StateAlphabet.Translate(s2);
+            int isym = InputAlphabet.Translate(symbol);
 
-            m_states[s1].transitions[symbol] = s2;
+            Safe.ArgumentAssert(is1 != 0, "s1");
+            Safe.ArgumentAssert(is2 != 0, "s2");
+            Safe.ArgumentAssert(isym != 0, "symbol");
+
+            m_states[is1].transitions[isym] = is2;
         }
 
-        protected IDFADefinition Optimize<TA>(Func<IAlphabet<TA>, IDFADefinition> dfaFactory,IAlphabet<TA> sourceAlphabet, IAlphabet<TA> minimalAlphabet) {
+        #region IDFADefinition implementation
+
+        public DFAStateDescriptior<TTag>[] GetTransitionTable() {
+            if (m_statesArray == null)
+                m_statesArray = m_states.ToArray();
+            return m_statesArray;
+        }
+
+        public IAlphabet<TInput> InputAlphabet {
+            get {
+                throw new NotImplementedException();
+            }
+        }
+
+        public IAlphabet<TState> StateAlphabet {
+            get {
+                throw new NotImplementedException();
+            }
+        }
+
+        #endregion
+
+        protected IDFADefinition<> Optimize<TA>(Func<IAlphabet<TA>, IDFADefinition> dfaFactory,IAlphabet<TA> sourceAlphabet, IAlphabet<TA> minimalAlphabet) {
             Safe.ArgumentNotNull(dfaFactory, "dfaFactory");
             Safe.ArgumentNotNull(minimalAlphabet, "minimalAlphabet");