comparison Implab/Automaton/DFATransitionTable.cs @ 167:96681e9d0cea ref20160224

sync
author cin
date Wed, 02 Mar 2016 00:20:48 +0300
parents e227e78d72e4
children 8fb9c9507a26
comparison
equal deleted inserted replaced
166:b84cdbe82e7f 167:96681e9d0cea
2 using System; 2 using System;
3 using System.Collections.Generic; 3 using System.Collections.Generic;
4 using System.Linq; 4 using System.Linq;
5 5
6 namespace Implab.Automaton { 6 namespace Implab.Automaton {
7 public class DFATransitionTable<TTag> : IDFATableBuilder { 7 public class DFATransitionTable : IDFATableBuilder {
8 DFAStateDescriptior[] m_dfaTable; 8 DFAStateDescriptior[] m_dfaTable;
9 9
10 int m_stateCount; 10 int m_stateCount;
11 int m_symbolCount; 11 int m_symbolCount;
12 int m_initialState; 12 int m_initialState;
13 13
14 readonly Dictionary<int, TTag[]> m_finalStates = new Dictionary<int, TTag[]>(); 14 readonly HashSet<int> m_finalStates = new HashSet<int>();
15 readonly HashSet<AutomatonTransition> m_transitions = new HashSet<AutomatonTransition>(); 15 readonly HashSet<AutomatonTransition> m_transitions = new HashSet<AutomatonTransition>();
16 16
17 17
18 #region IDFADefinition implementation 18 #region IDFADefinition implementation
19 19
30 } 30 }
31 31
32 public bool IsFinalState(int s) { 32 public bool IsFinalState(int s) {
33 Safe.ArgumentInRange(s, 0, m_stateCount, "s"); 33 Safe.ArgumentInRange(s, 0, m_stateCount, "s");
34 34
35 return m_finalStates.ContainsKey(s); 35 return m_dfaTable != null ? m_dfaTable[s].final : m_finalStates.Contains(s);
36 } 36 }
37 37
38 public IEnumerable<KeyValuePair<int,TTag[]>> FinalStates { 38 public IEnumerable<int> FinalStates {
39 get { 39 get {
40 return m_finalStates; 40 return m_finalStates;
41 } 41 }
42 } 42 }
43 43
53 get { return m_initialState; } 53 get { return m_initialState; }
54 } 54 }
55 55
56 #endregion 56 #endregion
57 57
58 protected virtual DFAStateDescriptior<TTag>[] ConstructTransitionTable() { 58 protected virtual DFAStateDescriptior[] ConstructTransitionTable() {
59 var dfaTable = new DFAStateDescriptior<TTag>[m_stateCount]; 59 var dfaTable = new DFAStateDescriptior[m_stateCount];
60 60
61 foreach (var pair in m_finalStates) { 61 foreach (var pair in m_finalStates) {
62 var idx = pair.Key; 62 var idx = pair.Key;
63 63
64 dfaTable[idx].final = true; 64 dfaTable[idx].final = true;