private AutomataState _NextState(AutomataState states, char input) { AutomataState deststates = new AutomataState(); foreach (Tuple <int, int> state in states.State) { Dictionary <char, AutomataState> stateTransitions; if (!_transitions.TryGetValue(state, out stateTransitions)) { continue; } AutomataState set; if (stateTransitions.TryGetValue(input, out set)) { foreach (var item in set.State) { deststates.Add(item); } } if (!stateTransitions.TryGetValue(Any, out set)) { continue; } foreach (var item in set.State) { deststates.Add(item); } } return(_Expand(deststates)); }
private AutomataState _Expand(AutomataState states) { List <Tuple <int, int> > frontier = new List <Tuple <int, int> >(); frontier.AddRange(states.State); while (frontier.Count > 0) { Tuple <int, int> state = frontier[frontier.Count - 1]; frontier.RemoveAt(frontier.Count - 1); Dictionary <char, AutomataState> set; if (_transitions.TryGetValue(state, out set)) { AutomataState innerSet; if (set.TryGetValue(Epsilon, out innerSet)) { IList <Tuple <int, int> > newStates = innerSet.State.Except(states.State).ToList(); frontier.AddRange(newStates); foreach (var entry in newStates) { states.Add(entry); } } } } return(states); }
public void AddFinalState(Tuple <int, int> finalState) { _finalStates.Add(finalState); }