private SituationSegment BuildSituationSegment(ISequence Predicate, ISituationSegment NextSegment) { IPredicate[] predicates; ISituationSegment[] segments; ISituationSegment lastSegment; SituationSegment result; if ((Predicate.Items == null) || (!Predicate.Items.Any())) { throw new InvalidOperationException("Invalid sequence predicate"); } lastSegment = NextSegment; predicates = Predicate.Items.ToArray(); segments = new SituationSegment[predicates.Length]; for (int t = predicates.Length - 1; t >= 0; t--) { segments[t] = BuildSituationSegment(predicates[t], lastSegment); lastSegment = segments[t]; } result = new SituationSegment(); result.InputTransitions.AddRange(segments.First().InputTransitions); result.OutputSituations.AddRange(segments.Last().OutputSituations); return(result); }
private SituationSegment BuildSituationSegment(IShiftPredicate Predicate, ISituationSegment NextSegment) { Situation situation; ShiftTransition transition; SituationSegment result; situation = new Situation(); situation.Transitions.AddRange(NextSegment.InputTransitions); transition = new ShiftTransition(); transition.Predicate = Predicate; transition.TargetSituation = situation; result = new SituationSegment(); result.InputTransitions.Add(transition); result.OutputSituations.Add(situation); return(result); }
private SituationSegment BuildSituationSegment(IOr Predicate, ISituationSegment NextSegment) { List <ISituationSegment> segments; SituationSegment result; if ((Predicate.Items == null) || (!Predicate.Items.Any())) { throw new InvalidOperationException("Invalid or predicate"); } segments = new List <ISituationSegment>(); foreach (IPredicate item in Predicate.Items) { segments.Add(BuildSituationSegment(item, NextSegment)); } result = new SituationSegment(); result.InputTransitions.AddRange(segments.SelectMany(item => item.InputTransitions)); result.OutputSituations.AddRange(segments.SelectMany(item => item.OutputSituations)); return(result); }
public ISituation BuildRootSituation(params IRule[] Rules) { Situation root; SituationSegment nextSegment; ISituationSegment segment; if (Rules == null) { throw new ArgumentNullException("Rules"); } root = new Situation(); foreach (IRule rule in Rules) { nextSegment = new SituationSegment(); nextSegment.InputTransitions.Add(new ReductionTransition(rule)); segment = BuildSituationSegment(rule.Predicate, nextSegment); root.Transitions.AddRange(segment.InputTransitions); } return(root); }