コード例 #1
0
        object EvaluateWhereClause(Runtime.PassiveExpression expr, Runtime.Pattern lastPattern, ScriptThread thread)
        {
            // instantiate where-clause pattern
            var patt = Pattern.Instantiate(thread);

            patt.CopyBoundVariables(lastPattern);

            // perform matching
            var result = patt.Match(expr);

            if (result)
            {
                // store last recognized pattern as a local variable
                thread.SetLastPattern(patt);

                // match succeeded, return result expression
                if (ResultExpression != null)
                {
                    return(ResultExpression.Evaluate(thread));
                }

                // match succeeded, evaluate more conditions
                if (MoreConditions != null)
                {
                    return(MoreConditions.Evaluate(thread));
                }
            }

            // matching failed, return nothing
            return(null);
        }
コード例 #2
0
        public override Action ProcessToken(IParseResult token, Stack <IParseResult> resultTokens, IOutputProcessor outputProcessor)
        {
            ProcessedTokenCount++;

            //process result
            var          typedToken   = ( OperatorParseResult )token;
            IParseResult operandRight = resultTokens.Pop();
            IParseResult operandLeft  = resultTokens.Pop();

            if (operandLeft == null)
            {
                throw new InvalidTokenException(String.Format("Trying to perform {0} on invalid first operand",
                                                              token.GetType()));
            }

            if (operandRight == null)
            {
                throw new InvalidTokenException(String.Format("Trying to perform {0} on invalid second operand",
                                                              token.GetType()));
            }

            double leftResult  = GetResult(operandLeft);
            double rightResult = GetResult(operandRight);

            double result = typedToken.Result.Eval(leftResult, rightResult);

            var expr = new ResultExpression
            {
                Expressions = Tuple.Create(operandLeft, operandRight),
                Operator    = typedToken,
                Result      = result
            };

            resultTokens.Push(new ExpressionParseResult(expr));

            return(null);
        }
コード例 #3
0
        void EvaluateWhereClause(Runtime.Pattern lastPattern, EvaluationContext context, AstMode mode)
        {
            // instantiate where-clause pattern
            var patt = Pattern.Instantiate(context, mode);

            patt.CopyBoundVariables(lastPattern);

            // perform matching
            var expr   = context.Data.Pop() as Runtime.PassiveExpression;
            var result = patt.Match(expr);

            if (result)
            {
                // store last recognized pattern as a local variable
                context.SetLastPattern(patt);

                // match succeeded, return true
                if (ResultExpression != null)
                {
                    ResultExpression.Evaluate(context, AstMode.Read);
                    context.Data.Push(true);
                    return;
                }

                // match succeeded? depends on more conditions
                if (MoreConditions != null)
                {
                    // return true or false
                    MoreConditions.Evaluate(context, AstMode.Read);
                    return;
                }
            }

            // match failed, return false
            context.Data.Push(false);
        }
コード例 #4
0
 public CellExpression(ResultExpression parent, string cell)
 {
     _parent = parent;
     _cell   = cell;
 }
コード例 #5
0
 public void DivisionByZeroTest()
 {
     Assert.AreEqual(-1, ResultExpression.Result("3/0"));
 }
コード例 #6
0
 public void NegativeNumbersTest()
 {
     Assert.AreEqual(-20, ResultExpression.Result("10-(6/2)*10"));
 }
コード例 #7
0
 public void ResultExpressionTest()
 {
     Assert.AreEqual(24, ResultExpression.Result("2*(10+2)"));
 }
コード例 #8
0
 public void ResultExpressionInvalidInputTest()
 {
     ResultExpression.Result("(3*)");
 }
コード例 #9
0
 public void ResultExpressionBadCharactersTest()
 {
     ResultExpression.Result("3+3*s+1");
 }