Mercurial > pub > ImplabNet
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]]; }