/// Author: Bert van Montfort
 /// <summary>
 /// Creates a new ConditionCombo without a rightsolver
 /// Use this ConditionCombo for Not statement
 /// </summary>
 /// <param name="leftSolver">Solver.</param>
 /// <param name="logicOperator">Logic operator.</param>
 public ConditionCombo(Solver leftSolver, ELogicOperators logicOperator)
 {
     this.leftSolver = leftSolver;
     this.logicOperator = logicOperator;
 }
        /// Author: Max Hamulyak
        /// Date:	08-06-2015
        /// <summary>
        /// Builds the condition class to be used, using priority rules
        /// </summary>
        /// <returns>The condition class.</returns>
        /// <param name="conditions">Conditions.</param>
        /// <param name="priorityOperator">Priority operator.</param>
        protected virtual ICondition BuildConditionClass(List<ICondition> conditions, ELogicOperators priorityOperator, int lineNumber)
        {
            int index = 0;
            bool stopLoop = false;

            while (index < conditions.Count && !stopLoop) {

                if (conditions.Count > 3) {
                    int loopIndex = 0;
                    while (loopIndex < conditions.Count) {
                        ICondition item = conditions.ElementAt (loopIndex);
                        if (item is Operator) {

                            if ((item as Operator).LogicOperator == priorityOperator) {

                                int itemIndex = conditions.IndexOf (item);
                                ICondition left = conditions.ElementAt (itemIndex - 1);
                                ICondition right = conditions.ElementAt (itemIndex + 1);
                                conditions.Remove (left);
                                conditions.Remove (right);
                                conditions.Remove (item);
                                if ((left is Solver) && (right is Solver)) {
                                    ConditionCombo newCondition = new ConditionCombo ((left as Solver), (right as Solver), priorityOperator);
                                    conditions.Insert (itemIndex - 1, newCondition);
                                } else {
                                    throw InvalidConditionCombo (left, right);
                                }
                            }
                        }
                        loopIndex++;
                    }
                    BuildConditionClass (conditions, priorityOperator + 1, lineNumber);
                } else {
                    stopLoop = true;
                }

            }
            //There is only one element, should be concrete instruction, if valid syntax
            ICondition returnCondition = null;
            if (conditions.Count == 1) {
                returnCondition = conditions.ElementAt (0);
            } else if (conditions.Count == 2) {

                if (conditions.ElementAt (0) is Operator) {
                    Operator o = conditions.ElementAt (0) as Operator;
                    if (o.LogicOperator == ELogicOperators.Not) {

                        if (conditions.ElementAt (1) is Solver) {

                            returnCondition = new ConditionCombo (conditions.ElementAt (1) as Solver, o.LogicOperator);

                        } else {
                            throw ExpectedConditionAfterNOT (lineNumber);
                        }

                    } else {
                        throw ExpectedButFound(lineNumber,ETokenType.LogicalOperator,"not", ETokenType.LogicalOperator, o.LogicOperator.ToString());
                    }
                } else {
                    throw ExpectedButFound (lineNumber);
                }

            } else if (conditions.Count == 3) {
                if (conditions.ElementAt (1) is Operator) {

                    if ((conditions.ElementAt (0) is Solver) && (conditions.ElementAt (2) is Solver)) {
                        returnCondition = new ConditionCombo (conditions.ElementAt (0) as Solver, conditions.ElementAt (2) as Solver, (conditions.ElementAt (1) as Operator).LogicOperator);
                    }
                }
            } else {
                throw EmptyConditionCombo (lineNumber);
            }
            return returnCondition;
        }
Example #3
0
 /// Author: Bert van Montfort
 /// <summary>
 /// Creates a new logicOperator, it doesnt have any use on its own but it is used by CondintionCombo
 /// </summary>
 /// <param name="logicOperator">Logic operator.</param>
 public Operator(ELogicOperators logicOperator)
 {
     this.logicOperator = logicOperator;
 }