diff Implab/Automaton/Scanner.cs @ 164:ec35731ae299 ref20160224

Almost complete DFA refactoring
author cin
date Thu, 25 Feb 2016 02:11:13 +0300
parents 0526412bbb26
children e227e78d72e4
line wrap: on
line diff
--- a/Implab/Automaton/Scanner.cs	Wed Feb 24 20:12:52 2016 +0300
+++ b/Implab/Automaton/Scanner.cs	Thu Feb 25 02:11:13 2016 +0300
@@ -17,12 +17,14 @@
         struct ScannerConfig {
             public DFAStateDescriptior<TTag>[] states;
             public int[] alphabetMap;
+            public int initialState;
         }
 
         Stack<ScannerConfig> m_defs = new Stack<ScannerConfig>();
 
         DFAStateDescriptior<TTag>[] m_states;
         int[] m_alphabetMap;
+        int m_initialState;
 
         protected DFAStateDescriptior<TTag> m_currentState;
         int m_previewCode;
@@ -39,12 +41,13 @@
         int m_chunkSize = 1024; // 1k
         int m_limit = 10 * 1024 * 1024; // 10Mb
 
-        protected Scanner(DFAStateDescriptior<TTag>[] states, int[] alphabet) {
+        protected Scanner(DFAStateDescriptior<TTag>[] states, int[] alphabet, int initialState) {
             Safe.ArgumentNotEmpty(states, "states");
             Safe.ArgumentNotNull(alphabet, "alphabet");
 
             m_states = states;
             m_alphabetMap = alphabet;
+            m_initialState = initialState;
 
             Feed(new char[0]);
         }
@@ -130,7 +133,7 @@
             if (m_pointer >= m_bufferSize)
                 return false;
 
-            m_currentState = m_states[DFADefinition.INITIAL_STATE];
+            m_currentState = m_states[m_initialState];
             m_tokenLen = 0;
             m_tokenOffset = m_pointer;
             int nextState;
@@ -217,16 +220,18 @@
         /// </summary>
         /// <param name="states">Таблица состояний нового ДКА</param>
         /// <param name="alphabet">Таблица входных символов для нового ДКА</param>
-        protected void Switch(DFAStateDescriptior<TTag>[] states, int[] alphabet) {
+        protected void Switch(DFAStateDescriptior<TTag>[] states, int[] alphabet, int initialState) {
             Safe.ArgumentNotNull(states, "dfa");
 
             m_defs.Push(new ScannerConfig {
                 states = m_states,
-                alphabetMap = m_alphabetMap
+                alphabetMap = m_alphabetMap,
+                initialState = m_initialState
             });
 
             m_states = states;
             m_alphabetMap = alphabet;
+            m_initialState = initialState;
 
             m_previewCode = m_alphabetMap[m_buffer[m_pointer]];
         }
@@ -240,6 +245,7 @@
             var prev = m_defs.Pop();
             m_states = prev.states;
             m_alphabetMap = prev.alphabetMap;
+            m_initialState = prev.initialState;
             m_previewCode = m_alphabetMap[m_buffer[m_pointer]];
         }