Exemple #1
0
        protected override ISet <DescriptorKind> Transfer(SubtractExpression expression, RuleEngine engine)
        {
            var left  = engine.Visit(expression.Left);
            var right = engine.Visit(expression.Right);

            if (right.Contains(Zero.Instance))
            {
                return(left);
            }

            var result = new HashSet <DescriptorKind>();

            if (_IsLoopDependent(left, right))
            {
                result.Add(LoopDependent.Instance);
            }

            if (left.Contains(Positive.Instance) && right.Contains(Negative.Instance))
            {
                result.Add(Positive.Instance);
                result.Add(NotZero.Instance);
            }
            else if (left.Contains(Negative.Instance) && right.Contains(Positive.Instance))
            {
                result.Add(Negative.Instance);
                result.Add(NotZero.Instance);
            }

            if (AllContainRule(LoopIndependent.Instance, left, right))
            {
                result.Add(LoopIndependent.Instance);
            }

            return(result);
        }
Exemple #2
0
        protected override ISet <DescriptorKind> Transfer(DivideExpression expression, RuleEngine engine)
        {
            var left  = engine.Visit(expression.Left);
            var right = engine.Visit(expression.Right);

            if (right.Contains(One.Instance) || left.Contains(Zero.Instance))
            {
                return(left);
            }

            if (AllContainRule(LoopIndependent.Instance, left, right))
            {
                return(_loopIndependentSet);
            }

            return(_emptySet);
        }
        protected override ISet <DescriptorKind> Transfer(ModuloExpression expression, RuleEngine engine)
        {
            var left  = engine.Visit(expression.Left);
            var right = engine.Visit(expression.Right);

            var result = new HashSet <DescriptorKind>();

            if (left.Contains(Zero.Instance) || right.Contains(One.Instance))
            {
                result.Add(Zero.Instance);
            }

            if (AllContainRule(LoopIndependent.Instance, left, right))
            {
                result.Add(LoopIndependent.Instance);
            }

            return(result);
        }
        protected override ISet <DescriptorKind> Transfer(UnaryMinusExpression expression, RuleEngine engine)
        {
            var result = new HashSet <DescriptorKind>(engine.Visit(expression.Expression));

            if (result.Contains(Positive.Instance))
            {
                result.Remove(Positive.Instance);
                result.Add(Negative.Instance);
            }
            else if (result.Contains(Negative.Instance))
            {
                result.Remove(Negative.Instance);
                result.Add(Positive.Instance);
            }

            return(result);
        }