public StateMachineExpressionWithOriginal(StateMachineExpressionTuple stateMachineExpression, StateMachineExpressionTuple originalStateMachineExpression = null) { if (stateMachineExpression == null) { throw new ArgumentNullException(nameof(stateMachineExpression)); } StateMachineExpression = stateMachineExpression; OriginalStateMachineExpression = originalStateMachineExpression; }
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++ )); }
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); }
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); }
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); }
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); }
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)); } }
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); }