コード例 #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(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);
        }
コード例 #3
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);
        }
コード例 #4
0
        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);
        }