Пример #1
0
        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);
        }
Пример #2
0
        private SituationSegment BuildSituationSegment(IPredicate Predicate, ISituationSegment NextSegment)
        {
            if (Predicate == null)
            {
                throw new ArgumentNullException("Predicate");
            }
            if (NextSegment == null)
            {
                throw new ArgumentNullException("NextSegment");
            }

            switch (Predicate)
            {
            case IShiftPredicate shiftPredicate:
                return(BuildSituationSegment(shiftPredicate, NextSegment));

            case ISequence sequencePredicate:
                return(BuildSituationSegment(sequencePredicate, NextSegment));

            case IOr orPredicate:
                return(BuildSituationSegment(orPredicate, NextSegment));

            case IPerhaps perhapsPredicate:
                return(BuildSituationSegment(perhapsPredicate, NextSegment));

            case IOneOrMoreTimes oneOrMoreTimesPredicate:
                return(BuildSituationSegment(oneOrMoreTimesPredicate, NextSegment));

            case IZeroOrMoreTimes zeroOrMoreTimesPredicate:
                return(BuildSituationSegment(zeroOrMoreTimesPredicate, NextSegment));

            default:
                throw new InvalidOperationException($"Invalid predicate type: {Predicate.GetType().Name}");
            }
        }
Пример #3
0
        private SituationSegment BuildSituationSegment(IPerhaps Predicate, ISituationSegment NextSegment)
        {
            SituationSegment result;

            if (Predicate.Item == null)
            {
                throw new InvalidOperationException("Invalid perhaps predicate");
            }

            result = BuildSituationSegment(Predicate.Item, NextSegment);
            result.InputTransitions.AddRange(NextSegment.InputTransitions);
            //result.OutputSituations.AddRange(NextSegment.OutputSituations);

            return(result);
        }
Пример #4
0
        private SituationSegment BuildSituationSegment(IOneOrMoreTimes Predicate, ISituationSegment NextSegment)
        {
            SituationSegment result;

            if (Predicate.Item == null)
            {
                throw new InvalidOperationException("Invalid one or more times predicate");
            }

            result = BuildSituationSegment(Predicate.Item, NextSegment);
            foreach (Situation situation in result.OutputSituations)
            {
                situation.Transitions.AddRange(result.InputTransitions);
            }
            return(result);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
 ISituationSegment ISituationSegmentFactory.BuildSituationSegment(IPredicate Predicate, ISituationSegment NextSegment)
 {
     return(BuildSituationSegment(Predicate, NextSegment));
 }
Пример #8
0
 private bool ParseSegment(ISituationSegment Segment, params Type[] PredicateTypes)
 {
     return(ParseSegment(Segment.InputTransitions, PredicateTypes));
 }