| @@ -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()); |  | |||
| 15 |  | 14 | |||
| 16 | Optimize(optimized, m_alphabet, optimized.Alphabet); |  | 15 | return (CDFADefinition)Optimize(alphabet => new CDFADefinition((CharAlphabet)alphabet), m_alphabet, new CharAlphabet()); | |
| 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>()); |  | |||
| 22 | Optimize(optimized, m_alphabet, optimized.Alphabet); |  | |||
| 23 |  | 21 | |||
| 24 | return optimized; |  | 22 | return (EDFADefinition<T>)Optimize(alphabet => new EDFADefinition<T>((EnumAlphabet<T>)alphabet), m_alphabet, new EnumAlphabet<T>()); | |
| 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
                    
                