Ejemplo n.º 1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="AssumptionCondition" /> class.
        /// </summary>
        /// <param name="form">Form of condition parts conjunction</param>
        /// <param name="parts">Condition parts</param>
        internal AssumptionCondition(ConditionForm form, params Expression[] parts)
        {
            _initialParts = parts;
            Parts         = from part in parts select Expressions.Converter.GetPostfix(part);

            Form = form;
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="AssumptionExecuter" /> class.
 ///
 /// Note that astElement can be n-ary expression with n > 1.
 /// However, it cannot be logical expression (and, or, xor). Logical expressions are eliminated
 /// in the stage of control-flow graph generation.
 /// </summary>
 /// <param name="conditionForm">The condition form. See <see cref="ConditionForm"/> for more details.</param>
 /// <param name="astElement">The AST element corresponding to the condition.</param>
 /// <param name="log">The log of evaluation the astElement and its sub-expressions.</param>
 /// <param name="flowOutputSet">The Output set of a program point.</param>
 public AssumptionExecuter(ConditionForm conditionForm, LangElement astElement, EvaluationLog log, FlowOutputSet flowOutputSet)
 {
     this.flowOutputSet = flowOutputSet;
     this.astElement    = astElement;
     this.conditionForm = conditionForm;
     this.log           = log;
 }
Ejemplo n.º 3
0
        private void barButtonItem11_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            //添加雨量字段并赋值 测试
            ConditionForm condtion = new ConditionForm();

            condtion.Show();
            //addRains();
            //roadRaskCaculate.RoadRaskCaulte(@"w001001.adf", 20, @"..\..\Rources\RoadData\RoadRasterData");
        }
Ejemplo n.º 4
0
        // 插入指令:条件语句
        private void button5_Click(object sender, EventArgs e)
        {
            // 检查这个节点可否插入
            if (this.isAbleInsert() == false)
            {
                return;
            }
            this.moveCursorToPoint(this, new Point(this.Size.Width / 2, this.Size.Height / 2), Cursor.Position, 0, 0);
            ConditionForm cf = new ConditionForm();

            cf.ShowDialog(this);
        }
Ejemplo n.º 5
0
        public EffectFormBuilder SetConditionForm(ConditionDefinition condition, ConditionForm.ConditionOperation operation, bool applyToSelf, bool forceOnSelf, List <ConditionDefinition> detrimentalConditions)
        {
            effectForm.FormType = EffectForm.EffectFormType.Condition;
            ConditionForm conditionForm = new ConditionForm
            {
                Operation           = operation,
                ConditionDefinition = condition
            };

            conditionForm.SetConditionDefinitionName(condition.Name);
            conditionForm.SetApplyToSelf(applyToSelf);
            conditionForm.SetForceOnSelf(forceOnSelf);
            conditionForm.SetField("detrimentalConditions", detrimentalConditions);
            effectForm.ConditionForm = conditionForm;
            return(this);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Assumes the condition according to the possible results of the condition. The state of the inner block will be set up.
        /// </summary>
        /// <param name="conditionForm">The condition form. See <see cref="ConditionForm"/> for more details.</param>
        /// <param name="memoryContext">The memory context of the code block and it's variables.</param>
        /// <param name="flowOutputSet">The Output set of a program point.</param>
        /// <exception cref="System.NotSupportedException"></exception>
        public void AssumeCondition(ConditionForm conditionForm, MemoryContext memoryContext, FlowOutputSet flowOutputSet)
        {
            var variables = GetVariables();

            if (variables.Count() == 0)
            {
                //There is nothing to assume because there is no variable used in the expression.
                return;
            }

            if (ConditionResult == PossibleValues.OnlyTrue)
            {
                AssumeTrue(conditionPart, memoryContext, flowOutputSet);
            }
            else if (ConditionResult == PossibleValues.OnlyFalse)
            {
                AssumeFalse(conditionPart, memoryContext, flowOutputSet);
            }
            else if (ConditionResult == PossibleValues.Unknown)
            {
                if (conditionForm == ConditionForm.All)
                {
                    AssumeTrue(conditionPart, memoryContext, flowOutputSet);
                }
                else if (conditionForm == ConditionForm.None)
                {
                    AssumeFalse(conditionPart, memoryContext, flowOutputSet);
                }
                else
                {
                    //run both assumptions and merge results
                    MemoryContext memoryContextTrue = new MemoryContext(log, flowOutputSet);
                    AssumeTrue(conditionPart, memoryContextTrue, flowOutputSet);

                    AssumeFalse(conditionPart, memoryContext, flowOutputSet);
                    memoryContext.UnionMerge(memoryContextTrue);
                }
            }
            else
            {
                throw new NotSupportedException(string.Format("Condition result \"{0}\" is not supported.", ConditionResult));
            }
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ConditionParts" /> class.
        /// </summary>
        /// <param name="conditionForm">The condition form.</param>
        /// <param name="flowOutputSet">Output set where condition will be assumed.</param>
        /// <param name="log">The log of evaluation of the conditions' parts.</param>
        /// <param name="conditionParts">The elements of the condition.</param>
        public ConditionParts(ConditionForm conditionForm, FlowOutputSet flowOutputSet, EvaluationLog log, IEnumerable <ConditionPart> conditionParts)
        {
            this.flowOutputSet = flowOutputSet;
            this.conditionParts.AddRange(conditionParts);
            this.log = log;

            this.conditionForm = conditionForm;
            if (this.conditionParts.Count == 1)
            {
                if (conditionForm == ConditionForm.Some || conditionForm == ConditionForm.ExactlyOne)
                {
                    this.conditionForm = ConditionForm.All;
                }
                else if (conditionForm == ConditionForm.SomeNot || conditionForm == ConditionForm.NotExactlyOne)
                {
                    this.conditionForm = ConditionForm.None;
                }
            }
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Gets the condition result.
        /// </summary>
        /// <returns>see <see cref="PossibleValues"/> for details of possible result.</returns>
        private PossibleValues GetConditionResult(ConditionForm conditionForm, FlowOutputSet flowOutputSet, MemoryEntry evaluatedPart)
        {
            var converter = new BooleanConverter(flowOutputSet.Snapshot);
            var value     = converter.EvaluateToBoolean(evaluatedPart);

            if (value == null)
            {
                return(PossibleValues.Unknown);
            }

            var flipResult = (conditionForm == ConditionForm.None) ? true : false;

            if (value.Value ^ flipResult)
            {
                return(PossibleValues.OnlyTrue);
            }
            else
            {
                return(PossibleValues.OnlyFalse);
            }
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Makes the assumption in case of <c>false</c> as a condition result.
        /// </summary>
        /// <param name="langElement">The language element to assume.</param>
        /// <param name="memoryContext">The memory context of the code block and it's variables.</param>
        /// <param name="flowOutputSet">The Output set of a program point.</param>
        void AssumeFalse(LangElement langElement, MemoryContext memoryContext, FlowOutputSet flowOutputSet)
        {
            if (langElement is BinaryEx)
            {
                BinaryEx binaryExpression = (BinaryEx)langElement;
                if (binaryExpression.PublicOperation == Operations.Equal)
                {
                    AssumeNotEquals(binaryExpression.LeftExpr, binaryExpression.RightExpr, memoryContext);
                }
                else if (binaryExpression.PublicOperation == Operations.NotEqual)
                {
                    AssumeEquals(binaryExpression.LeftExpr, binaryExpression.RightExpr, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.GreaterThan)
                {
                    AssumeLesserThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, true, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.GreaterThanOrEqual)
                {
                    AssumeLesserThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, false, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.LessThan)
                {
                    AssumeGreaterThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, true, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.LessThanOrEqual)
                {
                    AssumeGreaterThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, false, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.And ||
                         binaryExpression.PublicOperation == Operations.Or ||
                         binaryExpression.PublicOperation == Operations.Xor)
                {
                    ConditionForm conditionForm = ConditionForm.SomeNot; // !(a AND b) --> !a OR !b
                    if (binaryExpression.PublicOperation == Operations.Or)
                    {
                        conditionForm = ConditionForm.None; // !(a OR b) --> !a AND !b
                    }
                    else if (binaryExpression.PublicOperation == Operations.Xor)
                    {
                        conditionForm = ConditionForm.NotExactlyOne; //!(a XOR b) --> !((a OR b) AND !(a AND b)) --> (!a AND !b) OR (a AND b)
                    }

                    MemoryContext  currentMemoryContext = new MemoryContext(log, flowOutputSet);
                    ConditionParts condition            = new ConditionParts(conditionForm, flowOutputSet, log, binaryExpression.LeftExpr, binaryExpression.RightExpr);
                    condition.MakeAssumption(currentMemoryContext);
                    memoryContext.UnionMerge(currentMemoryContext);
                }
            }
            else if (langElement is UnaryEx)
            {
                UnaryEx unaryExpression = (UnaryEx)langElement;
                if (unaryExpression.PublicOperation == Operations.LogicNegation)
                {
                    AssumeTrue(unaryExpression.Expr, memoryContext, flowOutputSet);
                }
            }
            else if (langElement is DirectVarUse)
            {
                DirectVarUse directVarUse = (DirectVarUse)langElement;
                AssumeFalseDirectVarUse(directVarUse, memoryContext, flowOutputSet.Snapshot);
            }
            else if (langElement is IssetEx)
            {
                IssetEx issetEx = (IssetEx)langElement;
                AssumeIsset(issetEx, memoryContext, flowOutputSet.Snapshot, false);
            }
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Makes the assumption in case of <c>true</c> as a condition result.
        /// </summary>
        /// <param name="langElement">The language element to assume.</param>
        /// <param name="memoryContext">The memory context of the code block and it's variables.</param>
        /// <param name="flowOutputSet">The Output set of a program point.</param>
        void AssumeTrue(LangElement langElement, MemoryContext memoryContext, FlowOutputSet flowOutputSet)
        {
            if (langElement is BinaryEx)
            {
                BinaryEx binaryExpression = (BinaryEx)langElement;
                if (binaryExpression.PublicOperation == Operations.Equal)
                {
                    AssumeEquals(binaryExpression.LeftExpr, binaryExpression.RightExpr, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.NotEqual)
                {
                    AssumeNotEquals(binaryExpression.LeftExpr, binaryExpression.RightExpr, memoryContext);
                }
                else if (binaryExpression.PublicOperation == Operations.GreaterThan)
                {
                    AssumeGreaterThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, false, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.GreaterThanOrEqual)
                {
                    AssumeGreaterThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, true, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.LessThan)
                {
                    AssumeLesserThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, false, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.LessThanOrEqual)
                {
                    AssumeLesserThan(binaryExpression.LeftExpr, binaryExpression.RightExpr, true, memoryContext, flowOutputSet.Snapshot);
                }
                else if (binaryExpression.PublicOperation == Operations.And ||
                         binaryExpression.PublicOperation == Operations.Or ||
                         binaryExpression.PublicOperation == Operations.Xor)
                {
                    ConditionForm conditionForm = ConditionForm.All;
                    if (binaryExpression.PublicOperation == Operations.Or)
                    {
                        conditionForm = ConditionForm.Some;
                    }
                    else if (binaryExpression.PublicOperation == Operations.Xor)
                    {
                        conditionForm = ConditionForm.ExactlyOne;
                    }

                    MemoryContext  currentMemoryContext = new MemoryContext(log, flowOutputSet);
                    ConditionParts condition            = new Weverca.Analysis.FlowResolver.Deprecated.ConditionParts(conditionForm, flowOutputSet, log, binaryExpression.LeftExpr, binaryExpression.RightExpr);
                    condition.MakeAssumption(currentMemoryContext);
                    memoryContext.UnionMerge(currentMemoryContext);
                }
            }
            else if (langElement is UnaryEx)
            {
                UnaryEx unaryExpression = (UnaryEx)langElement;
                if (unaryExpression.PublicOperation == Operations.LogicNegation)
                {
                    AssumeFalse(unaryExpression.Expr, memoryContext, flowOutputSet);
                }
            }
            else if (langElement is DirectVarUse)
            {
                DirectVarUse directVarUse = (DirectVarUse)langElement;
                AssumeTrueDirectVarUse(directVarUse, memoryContext, flowOutputSet.Snapshot);
            }
            else if (langElement is IssetEx)
            {
                IssetEx issetEx = (IssetEx)langElement;
                AssumeIsset(issetEx, memoryContext, flowOutputSet.Snapshot, true);
            }
        }
Ejemplo n.º 11
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ConditionParts" /> class.
 /// </summary>
 /// <param name="conditionForm">The condition form.</param>
 /// <param name="flowOutputSet">Output set where condition will be assumed.</param>
 /// <param name="log">The log of evaluation of the conditions' parts.</param>
 /// <param name="conditionParts">The elements of the condition.</param>
 public ConditionParts(ConditionForm conditionForm, FlowOutputSet flowOutputSet, EvaluationLog log, IEnumerable <Postfix> conditionParts)
     : this(conditionForm, flowOutputSet, log, conditionParts.Select(a => a.SourceElement).ToArray())
 {
 }
Ejemplo n.º 12
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ConditionParts" /> class.
 /// </summary>
 /// <param name="conditionForm">The condition form.</param>
 /// <param name="flowOutputSet">Output set where condition will be assumed.</param>
 /// <param name="log">The log of evaluation of the conditions' parts.</param>
 /// <param name="langElements">The elements of the condition.</param>
 public ConditionParts(ConditionForm conditionForm, FlowOutputSet flowOutputSet, EvaluationLog log, params LangElement[] langElements)
     : this(conditionForm, flowOutputSet, log, langElements.Select(a => new ConditionPart(a, log, flowOutputSet)))
 {
 }