示例#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
        protected override object DoEvaluate(ScriptThread thread)
        {
            // standard prolog
            thread.CurrentNode = this;

            // evaluate pattern and copy bound variables of the current block
            var patt = Pattern.Instantiate(thread);

            if (BlockPattern != null)
            {
                patt.CopyBoundVariables(BlockPattern);
            }

            object result = null;

            // if pattern is recognized, calculate new expression and return true
            var success = patt.Match(InputExpression);

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

                // simple sentence
                if (Expression != null)
                {
                    result = Expression.Evaluate(thread);
                }

                // sentence with a where- or when-clause
                else if (Conditions != null)
                {
                    result = Conditions.Evaluate(thread);
                }
            }

            // standard epilog
            thread.CurrentNode = Parent;
            return(result);
        }