示例#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
        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);
        }