private Transition GenerateNewTransition(State state, Symbol symbol) { var transitions = _nfsm.Transitions; var multyState = new MultyState(state); var newMultyStateTemp = new HashSet <State>(); for (int i = 0; i < multyState.Count; i++) { var temp = transitions.FindAll(a => (multyState[i] == a.CurrentState && symbol == a.Symbol)); if (temp.Count != 0) { foreach (var tr in temp) { var func = GetEpsillonTransitionStates(tr.NextState); foreach (var st in func) { newMultyStateTemp.Add(st); } } } } var oldState = new State(multyState.ToString()); var newMultyState = new MultyState(newMultyStateTemp); if (newMultyStateTemp.Count == 0) { return(new Transition(oldState, new State("#"), symbol)); } newMultyState.Sort(_dict, _reverseDict); var newState = new State(newMultyState.ToString()); return(new Transition(oldState, newState, symbol)); }
private State GetNewStartState() { var multState = new MultyState(GetEpsillonTransitionStates(_nfsm.StartState)); multState.Sort(_dict, _reverseDict); return(multState.ToState()); }
private List <State> GetFinalStates(List <State> allStates) { var finalStates = new List <State>(); foreach (var st in allStates) { var mult = new MultyState(st); for (int i = 0; i < mult.Count; i++) { if (_nfsm.FinalStates.Contains(mult[i])) { finalStates.Add(st); break; } } } return(finalStates); }
public FiniteStateMachine Build(FiniteStateMachine nfsm) { _nfsm = nfsm; _dict = new Dictionary <State, int>(); _reverseDict = new Dictionary <int, State>(); for (int i = 0; i < _nfsm.States.Count; i++) { _dict.Add(_nfsm.States[i], i); _reverseDict.Add(i, _nfsm.States[i]); } var newStartState = GetNewStartState(); _alphabet = GenerateAlphabet(); var states = new List <State>(); states.Add(newStartState); var transitions = new List <Transition>(); var queue = new Queue <State>(); foreach (var symbol in _alphabet) { var temp1 = GenerateNewTransition(newStartState, symbol); transitions.Add(temp1); var temp = temp1.NextState; if (!states.Contains(temp)) { queue.Enqueue(temp); } } while (true) { if (queue.Count == 0) { break; } var nowState = queue.Dequeue(); var tempMult = new MultyState(nowState); tempMult.Sort(_dict, _reverseDict); nowState = tempMult.ToState(); if (!states.Contains(nowState)) { states.Add(nowState); } foreach (var symbol in _alphabet) { var temp1 = GenerateNewTransition(nowState, symbol); if (temp1.NextState == "#") { if (transitions.Contains(temp1)) { break; } } transitions.Add(temp1); var temp = temp1.NextState; if (!states.Contains(temp) && !queue.Contains(temp)) { queue.Enqueue(temp); } } } var finalStates = GetFinalStates(states); states.Remove("#"); transitions.RemoveAll(a => (a.CurrentState == "#" || a.NextState == "#")); finalStates.RemoveAll(a => (a == "#")); return(new FiniteStateMachine(states, transitions, finalStates, newStartState)); }