Mercurial > pub > ImplabNet
comparison Implab/Parsing/DFADefinitionBase.cs @ 156:97fbbf816844 v2
Promises: SignalXXX methods merged into SignalHandler method.
Components: RunnableComponent In progress
author | cin |
---|---|
date | Mon, 15 Feb 2016 04:22:15 +0300 |
parents | c0bf853aa04f |
children |
comparison
equal
deleted
inserted
replaced
155:037df317f126 | 156:97fbbf816844 |
---|---|
13 public const int INITIAL_STATE = 1; | 13 public const int INITIAL_STATE = 1; |
14 public const int UNREACHEBLE_STATE = 0; | 14 public const int UNREACHEBLE_STATE = 0; |
15 | 15 |
16 DFAStateDescriptior[] m_statesArray; | 16 DFAStateDescriptior[] m_statesArray; |
17 | 17 |
18 public DFADefinitionBase() { | 18 protected DFADefinitionBase() { |
19 m_states = new List<DFAStateDescriptior>(); | 19 m_states = new List<DFAStateDescriptior>(); |
20 | 20 |
21 m_states.Add(new DFAStateDescriptior()); | 21 m_states.Add(new DFAStateDescriptior()); |
22 } | 22 } |
23 | 23 |
45 return index; | 45 return index; |
46 } | 46 } |
47 | 47 |
48 public int AddState(int[] tag) { | 48 public int AddState(int[] tag) { |
49 var index = m_states.Count; | 49 var index = m_states.Count; |
50 bool final = tag == null || tag.Length == 0 ? false : true; | 50 bool final = tag != null && tag.Length != 0; |
51 m_states.Add(new DFAStateDescriptior { | 51 m_states.Add(new DFAStateDescriptior { |
52 final = final, | 52 final = final, |
53 transitions = new int[AlphabetSize], | 53 transitions = new int[AlphabetSize], |
54 tag = final ? tag : null | 54 tag = final ? tag : null |
55 }); | 55 }); |
137 } | 137 } |
138 } | 138 } |
139 | 139 |
140 // строим карты соотвествия оптимальных состояний с оригинальными | 140 // строим карты соотвествия оптимальных состояний с оригинальными |
141 | 141 |
142 var initialState = optimalStates.Where(x => x.Contains(INITIAL_STATE)).Single(); | 142 var initialState = optimalStates.Single(x => x.Contains(INITIAL_STATE)); |
143 | 143 |
144 // карта получения оптимального состояния по соотвествующему ему простому состоянию | 144 // карта получения оптимального состояния по соотвествующему ему простому состоянию |
145 int[] reveseOptimalMap = new int[m_states.Count]; | 145 int[] reveseOptimalMap = new int[m_states.Count]; |
146 // карта с индексами оптимальных состояний | 146 // карта с индексами оптимальных состояний |
147 HashSet<int>[] optimalMap = new HashSet<int>[optimalStates.Count + 1]; | 147 HashSet<int>[] optimalMap = new HashSet<int>[optimalStates.Count + 1]; |
182 var classes = new Dictionary<int, HashSet<int>>(); | 182 var classes = new Dictionary<int, HashSet<int>>(); |
183 | 183 |
184 foreach (var term in A) { | 184 foreach (var term in A) { |
185 // ищем все переходы класса по символу term | 185 // ищем все переходы класса по символу term |
186 var s2 = reveseOptimalMap[ | 186 var s2 = reveseOptimalMap[ |
187 optimalMap[s].Select(x => m_states[x].transitions[term]) // все элементарные состояния, куда переходит класс s | 187 optimalMap[s].Select(x => m_states[x].transitions[term]).FirstOrDefault(x => x != 0) // первое допустимое элементарное состояние, если есть |
188 .Where(x => x != 0) // только допустимые | 188 ]; |
189 .FirstOrDefault() // первое допустимое элементарное состояние, если есть | |
190 ]; | |
191 | 189 |
192 HashSet<int> A2; | 190 HashSet<int> A2; |
193 if (!classes.TryGetValue(s2, out A2)) { | 191 if (!classes.TryGetValue(s2, out A2)) { |
194 A2 = new HashSet<int>(); | 192 A2 = new HashSet<int>(); |
195 newQueue.Enqueue(A2); | 193 newQueue.Enqueue(A2); |