Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
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;
            }
        }