Exemplo n.º 1
0
        public StateMachineExpressionWithOriginal(StateMachineExpressionTuple stateMachineExpression, StateMachineExpressionTuple originalStateMachineExpression = null)
        {
            if (stateMachineExpression == null)
            {
                throw new ArgumentNullException(nameof(stateMachineExpression));
            }

            StateMachineExpression         = stateMachineExpression;
            OriginalStateMachineExpression = originalStateMachineExpression;
        }
Exemplo n.º 2
0
        private StateMachineExpressionTuple Mirror(StateMachineExpressionTuple stateMachine, ref int index, ref int additionalStateMachineNumber)
        {
            StateMachine newStateMachine = stateMachine.StateMachine.Reorganize(index);

            index += newStateMachine.States.Count;

            return
                (new StateMachineExpressionTuple(
                     stateMachine.Expression,
                     newStateMachine,
                     additionalStateMachineNumber++
                     ));
        }
Exemplo n.º 3
0
        internal override StateMachineExpressionTuple GenerateStateMachine(int stateMachineNumber, ref int index, ref int additionalStateMachineNumber, Action <StateMachinePostReport> onIterate, params StateMachineExpressionWithOriginal[] dependencies)
        {
            CheckDependencies(dependencies);

            if (IterationCount == 0)
            {
                return(Empty.Instance.GenerateStateMachine(stateMachineNumber, ref index, ref additionalStateMachineNumber, onIterate));
            }

            StateMachineExpressionTuple original = dependencies[0].StateMachineExpression;

            if (IterationCount == 1)
            {
                StateMachineExpressionTuple stateMachineExpressionTuple = new StateMachineExpressionTuple(this, original.StateMachine, stateMachineNumber);

                if (onIterate != null)
                {
                    onIterate(new StateMachinePostReport(stateMachineExpressionTuple, new StateMachineExpressionWithOriginal(original).AsSequence()));
                }

                return(stateMachineExpressionTuple);
            }

            StateMachineExpressionTuple dependency1 = original;

            for (int i = 1; i < IterationCount; i++)
            {
                StateMachineExpressionTuple dependency2 = Mirror(original, ref index, ref additionalStateMachineNumber);

                int number;

                if (i == IterationCount - 1)
                {
                    number = stateMachineNumber;
                }
                else
                {
                    number = additionalStateMachineNumber++;
                }

                StateMachineExpressionTuple expressionTuple =
                    new BinaryConcat(dependency1.Expression, dependency2.Expression).
                    GenerateStateMachine(number, ref index, ref additionalStateMachineNumber, onIterate, new StateMachineExpressionWithOriginal(dependency1), new StateMachineExpressionWithOriginal(dependency2, original));

                dependency1 = expressionTuple;
            }

            return(dependency1);
        }
Exemplo n.º 4
0
        internal override StateMachineExpressionTuple GenerateStateMachine(int stateMachineNumber, ref int index, ref int additionalStateMachineNumber, Action <StateMachinePostReport> onIterate, params StateMachineExpressionWithOriginal[] dependencies)
        {
            CheckDependencies(dependencies);

            StateMachine stateMachine1 = dependencies[0].StateMachineExpression.StateMachine;
            StateMachine stateMachine2 = dependencies[1].StateMachineExpression.StateMachine;

            Label initialState = stateMachine1.InitialState;

            ISet <Label> finalStates = stateMachine2.FinalStates.ToHashSet();

            if (stateMachine2.FinalStates.Contains(stateMachine2.InitialState))
            {
                finalStates.AddRange(stateMachine1.FinalStates);
            }

            ISet <Transition> transitions = stateMachine1.Transitions.ToHashSet();

            foreach (Transition transition in stateMachine2.Transitions)
            {
                if (transition.CurrentState == stateMachine2.InitialState)
                {
                    foreach (Label state in stateMachine1.FinalStates)
                    {
                        transitions.Add(new Transition(state, transition.Symbol, transition.NextState));
                    }
                }

                transitions.Add(transition);
            }

            IEnumerable <Label> states = stateMachine1.States.Concat(stateMachine2.States);

            StateMachineExpressionTuple stateMachineExpressionTuple =
                new StateMachineExpressionTuple(
                    this,
                    new StateMachine(initialState, finalStates, transitions, states),
                    stateMachineNumber
                    );

            if (onIterate != null)
            {
                onIterate(new StateMachinePostReport(stateMachineExpressionTuple, dependencies));
            }

            return(stateMachineExpressionTuple);
        }
Exemplo n.º 5
0
        internal override StateMachineExpressionTuple GenerateStateMachine(int stateMachineNumber, ref int index, ref int additionalStateMachineNumber, Action <StateMachinePostReport> onIterate, params StateMachineExpressionWithOriginal[] dependencies)
        {
            CheckDependencies(dependencies);

            StateMachine stateMachine1 = dependencies[0].StateMachineExpression.StateMachine;
            StateMachine stateMachine2 = dependencies[1].StateMachineExpression.StateMachine;

            Label initialState = new Label(new SingleLabel(StateMachine._DefaultStateSymbol, index++));

            ISet <Label> finalStates = new HashSet <Label>();

            ISet <Transition> transitions = new HashSet <Transition>();

            if (stateMachine1.FinalStates.Contains(stateMachine1.InitialState) ||
                stateMachine2.FinalStates.Contains(stateMachine2.InitialState))
            {
                finalStates.Add(initialState);
            }

            finalStates.AddRange(stateMachine1.FinalStates);
            finalStates.AddRange(stateMachine2.FinalStates);

            transitions.AddRange(stateMachine1.Transitions);
            transitions.AddRange(stateMachine2.Transitions);

            transitions.AddRange(stateMachine1.Transitions.Where(t => t.CurrentState == stateMachine1.InitialState).Select(t => new Transition(initialState, t.Symbol, t.NextState)));
            transitions.AddRange(stateMachine2.Transitions.Where(t => t.CurrentState == stateMachine2.InitialState).Select(t => new Transition(initialState, t.Symbol, t.NextState)));

            IEnumerable <Label> states = stateMachine1.States.Concat(stateMachine2.States).Concat(initialState);

            StateMachineExpressionTuple stateMachineExpressionTuple =
                new StateMachineExpressionTuple(
                    this,
                    new StateMachine(initialState, finalStates, transitions, states),
                    stateMachineNumber
                    );

            if (onIterate != null)
            {
                onIterate(new StateMachinePostReport(stateMachineExpressionTuple, dependencies));
            }

            return(stateMachineExpressionTuple);
        }
Exemplo n.º 6
0
        internal override StateMachineExpressionTuple GenerateStateMachine(int stateMachineNumber, ref int index, ref int additionalStateMachineNumber, Action <StateMachinePostReport> onIterate, params StateMachineExpressionWithOriginal[] dependencies)
        {
            CheckDependencies(dependencies);

            StateMachine original = dependencies[0].StateMachineExpression.StateMachine;

            Label initialState = new Label(new SingleLabel(StateMachine._DefaultStateSymbol, index++));

            ISet <Transition> transitions = original.Transitions.ToHashSet();

            ISet <Label> finalStates = original.FinalStates.ToHashSet();

            if (!IsPositive)
            {
                finalStates.Add(initialState);
            }

            foreach (Transition transition in original.Transitions)
            {
                if (transition.CurrentState == original.InitialState)
                {
                    transitions.AddRange(original.FinalStates.Select(fs => new Transition(fs, transition.Symbol, transition.NextState)));
                    transitions.Add(new Transition(initialState, transition.Symbol, transition.NextState));
                }
            }

            IEnumerable <Label> states = original.States.Concat(initialState);

            StateMachineExpressionTuple stateMachineExpressionTuple =
                new StateMachineExpressionTuple(
                    this,
                    new StateMachine(initialState, finalStates, transitions, states),
                    stateMachineNumber
                    );

            if (onIterate != null)
            {
                onIterate(new StateMachinePostReport(stateMachineExpressionTuple, dependencies));
            }

            return(stateMachineExpressionTuple);
        }
Exemplo n.º 7
0
        public StateMachinePostReport(StateMachineExpressionTuple @new, IEnumerable <StateMachineExpressionWithOriginal> dependencies)
        {
            if (@new == null)
            {
                throw new ArgumentNullException(nameof(@new));
            }

            if (dependencies == null)
            {
                throw new ArgumentNullException(nameof(dependencies));
            }

            New          = @new;
            Dependencies = dependencies.ToList().AsReadOnly();

            if (Dependencies.AnyNull())
            {
                throw new ArgumentException("At least one element is null.", nameof(dependencies));
            }
        }
Exemplo n.º 8
0
        internal override StateMachineExpressionTuple GenerateStateMachine(int stateMachineNumber, ref int index, ref int additionalStateMachineNumber, Action <StateMachinePostReport> onIterate, params StateMachineExpressionWithOriginal[] dependencies)
        {
            CheckDependencies(dependencies);

            Label state = new Label(new SingleLabel(StateMachine._DefaultStateSymbol, index++));

            StateMachineExpressionTuple stateMachineExpressionTuple =
                new StateMachineExpressionTuple(
                    this,
                    new StateMachine(state, state.AsSequence(), Enumerable.Empty <Transition>()),
                    stateMachineNumber
                    );

            if (onIterate != null)
            {
                onIterate(new StateMachinePostReport(stateMachineExpressionTuple, dependencies));
            }

            return(stateMachineExpressionTuple);
        }