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