Mercurial > pub > ImplabNet
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");