| @@ -160,8 +160,12 namespace Implab { | |||||
| 160 |
|
160 | |||
| 161 | if (slot < RESERVED_HANDLERS_COUNT) { |
|
161 | if (slot < RESERVED_HANDLERS_COUNT) { | |
| 162 |
|
162 | |||
| 163 | if (slot == 0) |
|
163 | if (slot == 0) { | |
| 164 |
|
|
164 | m_handlers = new THandler[RESERVED_HANDLERS_COUNT]; | |
|
|
165 | } else { | |||
|
|
166 | while (m_handlers == null) | |||
|
|
167 | Thread.MemoryBarrier(); | |||
|
|
168 | } | |||
| 165 |
|
169 | |||
| 166 | m_handlers[slot] = handler; |
|
170 | m_handlers[slot] = handler; | |
| 167 |
|
171 | |||
| @@ -11,10 +11,8 | |||||
| 11 | } |
|
11 | } | |
| 12 |
|
12 | |||
| 13 | public CDFADefinition Optimize() { |
|
13 | public CDFADefinition Optimize() { | |
| 14 | var optimized = new CDFADefinition(new CharAlphabet()); |
|
14 | ||
| 15 |
|
15 | return (CDFADefinition)Optimize(alphabet => new CDFADefinition((CharAlphabet)alphabet), m_alphabet, new CharAlphabet()); | ||
| 16 | Optimize(optimized, m_alphabet, optimized.Alphabet); |
|
|||
| 17 | return optimized; |
|
|||
| 18 | } |
|
16 | } | |
| 19 |
|
17 | |||
| 20 | public void PrintDFA() { |
|
18 | public void PrintDFA() { | |
| @@ -66,8 +66,8 namespace Implab.Parsing { | |||||
| 66 | m_states[s1].transitions[symbol] = s2; |
|
66 | m_states[s1].transitions[symbol] = s2; | |
| 67 | } |
|
67 | } | |
| 68 |
|
68 | |||
| 69 |
p |
|
69 | protected IDFADefinition Optimize<TA>(Func<IAlphabet<TA>, IDFADefinition> dfaFactory,IAlphabet<TA> sourceAlphabet, IAlphabet<TA> minimalAlphabet) { | |
| 70 |
Safe.ArgumentNotNull( |
|
70 | Safe.ArgumentNotNull(dfaFactory, "dfaFactory"); | |
| 71 | Safe.ArgumentNotNull(minimalAlphabet, "minimalAlphabet"); |
|
71 | Safe.ArgumentNotNull(minimalAlphabet, "minimalAlphabet"); | |
| 72 |
|
72 | |||
| 73 | var setComparer = new CustomEqualityComparer<HashSet<int>>( |
|
73 | var setComparer = new CustomEqualityComparer<HashSet<int>>( | |
| @@ -211,6 +211,8 namespace Implab.Parsing { | |||||
| 211 |
|
211 | |||
| 212 | // построение автомата |
|
212 | // построение автомата | |
| 213 |
|
213 | |||
|
|
214 | var minimalDFA = dfaFactory(minimalAlphabet); | |||
|
|
215 | ||||
| 214 | var states = new int[ optimalMap.Length ]; |
|
216 | var states = new int[ optimalMap.Length ]; | |
| 215 | states[0] = UNREACHEBLE_STATE; |
|
217 | states[0] = UNREACHEBLE_STATE; | |
| 216 |
|
218 | |||
| @@ -237,6 +239,7 namespace Implab.Parsing { | |||||
| 237 | } |
|
239 | } | |
| 238 | } |
|
240 | } | |
| 239 |
|
241 | |||
|
|
242 | return minimalDFA; | |||
| 240 | } |
|
243 | } | |
| 241 |
|
244 | |||
| 242 | public void PrintDFA<TA>(IAlphabet<TA> alphabet) { |
|
245 | public void PrintDFA<TA>(IAlphabet<TA> alphabet) { | |
| @@ -18,10 +18,8 namespace Implab.Parsing { | |||||
| 18 | } |
|
18 | } | |
| 19 |
|
19 | |||
| 20 | public EDFADefinition<T> Optimize() { |
|
20 | public EDFADefinition<T> Optimize() { | |
| 21 | var optimized = new EDFADefinition<T>(new EnumAlphabet<T>()); |
|
21 | ||
| 22 | Optimize(optimized, m_alphabet, optimized.Alphabet); |
|
22 | return (EDFADefinition<T>)Optimize(alphabet => new EDFADefinition<T>((EnumAlphabet<T>)alphabet), m_alphabet, new EnumAlphabet<T>()); | |
| 23 |
|
||||
| 24 | return optimized; |
|
|||
| 25 | } |
|
23 | } | |
| 26 |
|
24 | |||
| 27 | public void PrintDFA() { |
|
25 | public void PrintDFA() { | |
General Comments 0
You need to be logged in to leave comments.
Login now
