private int traverseStates(string word) { Queue <RegularState> queue = new Queue <RegularState>(states); Set <RegularState> visited = new Set <RegularState>(); states.Clear(); while (queue.Count > 0) { RegularState state = queue.Dequeue(); hasGreedyEnd = state.isGreedyEnd(); if (hasGreedyEnd) { return(0); } visited.Add(state); foreach (RegularTransition rt in state.getOutTransitions()) { if (rt.isEmpty()) { RegularState rst = rt.getEndState(); if (!queue.Contains(rst) && !visited.Contains(rst)) { queue.Enqueue(rst); } } else if (rt.match(word)) { addState(rt.getEndState()); } } } return(states.Count); }
/// <summary> /// Replace end states in all transitions starting from base /// </summary> /// <param name="instat"></param> /// <param name="from"></param> /// <param name="to"></param> private static void replaceStates(RegularState instat, RegularState from, RegularState to) { Stack <RegularState> states = new Stack <RegularState>(); states.Push(instat); Set <RegularState> visited = new Set <RegularState>(); visited.Add(to); while (states.Count > 0) { RegularState state = states.Pop(); visited.Add(state); foreach (RegularTransition rt in state.getOutTransitions()) { if (rt.getEndState().Equals(from)) { rt.setEndState(to); continue; } RegularState st = rt.getEndState(); if (!visited.Contains(st)) { states.Push(st); } } } }
private void addState(RegularState state) { if (states.Contains(state)) { return; } states.Add(state); // add lambda transitions foreach (RegularTransition rt in state.getOutTransitions()) { if (rt.isEmpty()) { addState(rt.getEndState()); } } }
/// <summary> /// Return true when the provided state has a path to itself /// </summary> /// <param name="self"></param> /// <returns></returns> private static bool hasSelfReference(RegularState self) { Stack <RegularState> states = new Stack <RegularState>(); states.Push(self); Set <RegularState> visited = new Set <RegularState>(); while (states.Count > 0) { RegularState state = states.Pop(); visited.Add(state); foreach (RegularTransition rt in state.getOutTransitions()) { if (rt.getEndState().Equals(self)) { return(true); } } } return(false); }