private void RemoveUnreachable(Transitions.Pair <int> tail, Transitions.Pair <int> head) { MakeAdjacent(tail); // walk the DFA graph marking reachable states for (var i = 0; i < m_reachableCount; ++i) { for (var j = m_offset[m_blocks.Elements[i]]; j < m_offset[m_blocks.Elements[i] + 1]; ++j) { Reach(head.Get(m_adjacent[j])); } } // remove unreachable states and transitions var count = 0; for (var t = 0; t < m_transitions.Count; ++t) { if (m_blocks.Location[tail.Get(t)] >= m_reachableCount) { continue; } head.Set(count, head.Get(t)); m_transitions.OnInput.Set(count, m_transitions.OnInput.Get(t)); tail.Set(count, tail.Get(t)); ++count; } m_transitions.Count = count; m_blocks.Past[0] = m_reachableCount; m_reachableCount = 0; }
private void MakeAdjacent(Transitions.Pair <int> states) { Array.Clear(m_offset, 0, m_offset.Length); for (var transition = 0; transition < m_transitions.Count; ++transition) { ++m_offset[states.Get(transition)]; } for (var state = 0; state < m_stateCount; ++state) { m_offset[state + 1] += m_offset[state]; } for (var transition = m_transitions.Count; transition-- != 0;) { m_adjacent[--m_offset[states.Get(transition)]] = transition; } }