Beispiel #1
0
        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);
        }