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); }
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()); } } } }