public static Machine GetFromOptions(SMOptions options) { Machine stateMachine; if (options.Transitions.Any(tr => tr.IsEpsilon) || options.Transitions .GroupBy(tr => tr.StartState + tr.Token) .Any(gr => gr.Count() > 1)) { stateMachine = new MachineNonDetermined(); } else { stateMachine = new MachineDetermined(); } var statesNames = options.GetStates(); var statesDict = new Dictionary <string, State>(); foreach (var stateName in statesNames) { var state = new State(stateName, options.FinalStates.Contains(stateName)); statesDict.Add(stateName, state); stateMachine.AddState(state); } foreach (var transitionOptions in options.Transitions) { if (transitionOptions.IsEpsilon) { stateMachine.AddTransition(new Transition( statesDict[transitionOptions.StartState], statesDict[transitionOptions.EndState] )); } else { stateMachine.AddTransition(new Transition( statesDict[transitionOptions.StartState], transitionOptions.Token, statesDict[transitionOptions.EndState] )); } } stateMachine.Init(options.InitialState); return(stateMachine); }
public new MachineNonDetermined RenameToNormalNames(string startsWith = null) { startsWith ??= "q"; var renameDict = new Dictionary <State, State>(); var buffer = new List <State> { InitialState }; var n = 1; while (buffer.Any()) { var currentNode = buffer[0]; var nextStops = Transitions.Where(tr => Equals(tr.StartState, currentNode) && !buffer.Contains(tr.EndState) && !renameDict.Keys.Contains(tr.EndState)).Select(tr => tr.EndState).Distinct(new StatesComparer()).ToList(); if (nextStops.Any()) { buffer.AddRange(nextStops); } buffer.Remove(currentNode); renameDict.Add(currentNode, new State($"{startsWith}{n}", currentNode.IsFinal)); n++; } var renamedMachine = new MachineNonDetermined(); renamedMachine.AddStateRange(renameDict.Values); renamedMachine.AddTransitionRange(Transitions.Select(transition => transition.ChangeStartState(renameDict[transition.StartState]).ChangeEndState(renameDict[transition.EndState]))); renamedMachine.Init(renameDict[InitialState].Id); return(renamedMachine); }