Example #1
0
    private static ACState GetState(ACState currentState, char c)
    {
        ACState newCurrentState = currentState.NextState(c);

        while (newCurrentState == null)
        {
            currentState    = currentState.GetFailingState();
            newCurrentState = currentState.NextState(c);
        }
        return(newCurrentState);
    }
Example #2
0
    public void ConstructFailingStates()
    {
        if (m_FialingStatesConstructed)
        {
            return;
        }

        m_FialingStatesConstructed = true;
        Queue <ACState> queue = new Queue <ACState>();

        var childStates = m_RootState.GetStates();

        if (childStates != null)
        {
            foreach (var depthOneState in childStates)
            {
                depthOneState.SetFailingState(m_RootState);
                queue.Enqueue(depthOneState);
            }
        }

        while (queue.Count > 0)
        {
            ACState currentState = queue.Dequeue();
            var     transitions  = currentState.GetTransitions();
            if (transitions != null)
            {
                foreach (var transition in transitions)
                {
                    ACState targetState = currentState.NextState(transition);
                    queue.Enqueue(targetState);

                    ACState traceFailureState = currentState.GetFailingState();
                    while (traceFailureState.NextState(transition) == null)
                    {
                        traceFailureState = traceFailureState.GetFailingState();
                    }
                    ACState newFailureState = traceFailureState.NextState(transition);
                    targetState.SetFailingState(newFailureState);

                    targetState.AddEmits(newFailureState.GetEmits());
                }
            }
        }
    }