public object Clone()
        {
            ContinuationAppender appender = new ContinuationAppender(master, succ);

            appender.callers   = callers;
            appender.completes = completes;

            return(appender);
        }
        public override bool Evaluate()
        {
            if (context.Contents.Count == 0)
                return succ.Continue(context, fail);

            ContinuationAppender appender = new ContinuationAppender(context, succ);
            EvaluateAll evalall = new EvaluateAll(salience, argumentMode, appender.AsIndex(1), isUserInput);
            Evaluator eval = new Evaluator(salience, argumentMode, appender.AsIndex(0), evalall, isUserInput);

            return eval.Continue(context, fail);
        }
示例#3
0
        public override bool Evaluate()
        {
            if (context.Contents.Count == 0)
            {
                return(succ.Continue(context, fail));
            }

            ContinuationAppender appender = new ContinuationAppender(context, succ);
            EvaluateAll          evalall  = new EvaluateAll(salience, argumentMode, appender.AsIndex(1), isUserInput);
            Evaluator            eval     = new Evaluator(salience, argumentMode, appender.AsIndex(0), evalall, isUserInput);

            return(eval.Continue(context, fail));
        }
 public IndexedContinuationAppender(ContinuationAppender appender, uint index)
 {
     this.appender = appender;
     this.index    = index;
 }
示例#5
0
        public static Evaluator MakeMatcherContinue(double salience, Context context, IParsedPhrase input, List<IParsedPhrase> unmatched, IContinuation succ)
        {
            context.Map["$check"] = null;

            // Match this to first constituent, the continue for others
            Matcher matcheval = new Matcher(salience, input, unmatched, succ);

            ContinuationAppender appender = new ContinuationAppender(context, matcheval);

            Evaluator eval = new Evaluator(salience, ArgumentMode.SingleArgument, appender.AsIndex(0), appender.AsIndex(1), true);

            return eval;
        }
示例#6
0
        public override bool Evaluate()
        {
            List<IContent> contents = context.Contents;

            if (contents.Count == 0) {
                // nothing to do!
                succ.Continue(context, fail);
                aftersucc.Continue(new Context(context, null), fail);
                return true;
            }

            // Look ahead until first recursion
            int ii;
            for (ii = 0; ii < contents.Count; ii++)
                if ((contents[ii] is Special) && !(contents[ii].Name.StartsWith("*") || contents[ii].Name.StartsWith("_")))
                    break;

            if (ii > 0 && argumentMode == ArgumentMode.SingleArgument) {
                succ.Continue(new Context(context, contents.GetRange(0, 1)), fail);
                aftersucc.Continue(context.ChildRange(1), fail);
                return true;
            }

            if (ii == contents.Count)
            {
                // everything was done
                succ.Continue(context, fail);
                aftersucc.Continue(new Context(context, null), fail);
                return true;
            }

            if (contents[ii] == Special.EndDelimSpecial)
            {
                // everything to the # is done
                Context value = new Context(context, contents.GetRange(0, ii));
                Context after = new Context(context, contents.GetRange(ii + 1, contents.Count - ii - 1));
                succ.Continue(value, fail);
                aftersucc.Continue(after, fail);
                return true;
            }

            IContent content = contents[ii];

            object element = null;
            try {
                element = context.Lookup(content.Name);
            } catch (Exception ex) {
                if (isUserInput)
                    throw new UserException("The variable '" + content.Name + "' is unknown", ex);
                else
                    throw ex;
            }
            if (element is CallAgent)
            {
                IContinuation mysucc = succ;
                if (ii > 0)
                    mysucc = new ContextAppender(salience, context, ii, succ);
                List<IContent> sublst = context.Contents.GetRange(ii + 1, context.Contents.Count - ii - 1);

                if (((CallAgent)element).ArgumentOptions == ArgumentMode.NoArugments)
                {
                    if (argumentMode == ArgumentMode.SingleArgument)
                    {
                        ContinueToCallAgent.Instantiate((CallAgent)element, new Context(context, null), mysucc, fail);
                        aftersucc.Continue(new Context(context, sublst), fail);
                        return true;
                    }
                    else
                    {
                        ContinuationAppender evalappend = new ContinuationAppender(context, mysucc);

                        ContinueToCallAgent.Instantiate((CallAgent)element, new Context(context, null), evalappend.AsIndex(0), fail);

                        Evaluator eval = new Evaluator(salience, ArgumentMode.ManyArguments, evalappend.AsIndex(1), aftersucc, isUserInput);
                        eval.Continue(new Context(context, sublst), fail);

                        return true;
                    }
                }
                else if (((CallAgent)element).ArgumentOptions == ArgumentMode.RemainderUnevaluated)
                {
                    ContinueToCallAgent.Instantiate((CallAgent) element, new Context(context, sublst), mysucc, fail);
                    aftersucc.Continue(new Context(context, new List<IContent>()), fail);
                    return true;
                } else if (((CallAgent)element).ArgumentOptions == ArgumentMode.DelimitedUnevaluated) {
                    int jj;
                    for (jj = 0; jj < contents.Count; jj++)
                        if (contents[jj] == Special.EndDelimSpecial)
                            break;

                    List<IContent> before = context.Contents.GetRange(ii + 1, jj - 1);
                    List<IContent> after;
                    if (jj < context.Contents.Count - 1)
                        after = context.Contents.GetRange(jj + 1, context.Contents.Count - jj - 1);
                    else
                        after = new List<IContent>();

                    ContinuationAppender evalappend = new ContinuationAppender(context, mysucc);

                    ContinueToCallAgent.Instantiate((CallAgent) element, new Context(context, before), evalappend.AsIndex(0), fail);
                    Evaluator aftereval = new Evaluator(salience, ArgumentMode.ManyArguments, evalappend.AsIndex(1), aftersucc, isUserInput);
                    aftereval.Continue(new Context(context, after), fail);
                    return true;
                } else {
                    if (argumentMode == ArgumentMode.SingleArgument)
                    {
                        ContinueToCallAgent callagent = new ContinueToCallAgent((CallAgent)element, mysucc);
                        Evaluator eval = new Evaluator(salience, ((CallAgent) element).ArgumentOptions, callagent, aftersucc, isUserInput);
                        eval.Continue(new Context(context, sublst), fail);
                        return true;
                    }
                    else
                    {
                        ContinuationAppender evalappend = new ContinuationAppender(context, mysucc);

                        ContinueToCallAgent callagent = new ContinueToCallAgent((CallAgent)element, evalappend.AsIndex(0));

                        Evaluator aftereval = new Evaluator(salience, ArgumentMode.ManyArguments, evalappend.AsIndex(1), aftersucc, isUserInput);

                        Evaluator eval = new Evaluator(salience, ((CallAgent) element).ArgumentOptions, callagent, aftereval, isUserInput);
                        eval.Continue(new Context(context, sublst), fail);
                        return true;
                    }
                }
            } else if (element is Codelet) {
                IContinuation mysucc = succ;
                if (ii > 0)
                    mysucc = new ContextAppender(salience, context, ii, succ);
                List<IContent> sublst = context.Contents.GetRange(ii + 1, context.Contents.Count - ii - 1);

                coderack.AddCodelet((Codelet) element, "Codelet in content");

                Evaluator eval = new Evaluator(salience, argumentMode, mysucc, aftersucc, isUserInput);
                eval.Continue(new Context(context, sublst), fail);
                return true;
            } else {
                Context result = new Context(context, new List<IContent>(context.Contents.GetRange(0, ii)));
                if (element is IContent)
                    result.Contents.Add((IContent) element);
                else if (element is List<IContent>)
                    result.Contents.AddRange((List<IContent>) element);
                else
                    result.Contents.Add(new Value(element));

                if (argumentMode == ArgumentMode.SingleArgument)
                {
                    succ.Continue(result, fail);
                    aftersucc.Continue(context.ChildRange(1), fail);
                    return true;
                }
                else
                {
                    IContinuation appender = new ContextAppender(salience, result, result.Contents.Count, succ);
                    List<IContent> sublst = context.Contents.GetRange(ii + 1, context.Contents.Count - ii - 1);

                    Evaluator eval = new Evaluator(salience, argumentMode, appender, aftersucc, isUserInput);
                    eval.Continue(new Context(context, sublst), fail);
                    return true;
                }
            }
        }
        public object Clone()
        {
            ContinuationAppender appender = new ContinuationAppender(master, succ);
            appender.callers = callers;
            appender.completes = completes;

            return appender;
        }
 public IndexedContinuationAppender(ContinuationAppender appender, uint index)
 {
     this.appender = appender;
     this.index = index;
 }
        public override bool Produce(Context context, IContinuation succ, IFailure fail)
        {
            // Evaluate all children
            ContinueToCallAgent cont = CallAgentWrapper.MakeContinuation(ConstructSentence, succ, 100.0, 10, 10);

            ContinuationAppender appender = new ContinuationAppender(context, cont);

            Evaluator eval = new Evaluator(salience, ArgumentMode.ManyArguments, appender.AsIndex(0), appender.AsIndex(1), true);

            eval.Continue(context, fail);

            return true;
        }
        public override bool Evaluate()
        {
            List <IContent> contents = context.Contents;

            if (contents.Count == 0)
            {
                // nothing to do!
                succ.Continue(context, fail);
                aftersucc.Continue(new Context(context, null), fail);
                return(true);
            }

            // Look ahead until first recursion
            int ii;

            for (ii = 0; ii < contents.Count; ii++)
            {
                if ((contents[ii] is Special) && !(contents[ii].Name.StartsWith("*") || contents[ii].Name.StartsWith("_")))
                {
                    break;
                }
            }

            if (ii > 0 && argumentMode == ArgumentMode.SingleArgument)
            {
                succ.Continue(new Context(context, contents.GetRange(0, 1)), fail);
                aftersucc.Continue(context.ChildRange(1), fail);
                return(true);
            }

            if (ii == contents.Count)
            {
                // everything was done
                succ.Continue(context, fail);
                aftersucc.Continue(new Context(context, null), fail);
                return(true);
            }

            if (contents[ii] == Special.EndDelimSpecial)
            {
                // everything to the # is done
                Context value = new Context(context, contents.GetRange(0, ii));
                Context after = new Context(context, contents.GetRange(ii + 1, contents.Count - ii - 1));
                succ.Continue(value, fail);
                aftersucc.Continue(after, fail);
                return(true);
            }

            IContent content = contents[ii];

            object element = null;

            try {
                element = context.Lookup(content.Name);
            } catch (Exception ex) {
                if (isUserInput)
                {
                    throw new UserException("The variable '" + content.Name + "' is unknown", ex);
                }
                else
                {
                    throw ex;
                }
            }
            if (element is CallAgent)
            {
                IContinuation mysucc = succ;
                if (ii > 0)
                {
                    mysucc = new ContextAppender(salience, context, ii, succ);
                }
                List <IContent> sublst = context.Contents.GetRange(ii + 1, context.Contents.Count - ii - 1);

                if (((CallAgent)element).ArgumentOptions == ArgumentMode.NoArugments)
                {
                    if (argumentMode == ArgumentMode.SingleArgument)
                    {
                        ContinueToCallAgent.Instantiate((CallAgent)element, new Context(context, null), mysucc, fail);
                        aftersucc.Continue(new Context(context, sublst), fail);
                        return(true);
                    }
                    else
                    {
                        ContinuationAppender evalappend = new ContinuationAppender(context, mysucc);

                        ContinueToCallAgent.Instantiate((CallAgent)element, new Context(context, null), evalappend.AsIndex(0), fail);

                        Evaluator eval = new Evaluator(salience, ArgumentMode.ManyArguments, evalappend.AsIndex(1), aftersucc, isUserInput);
                        eval.Continue(new Context(context, sublst), fail);

                        return(true);
                    }
                }
                else if (((CallAgent)element).ArgumentOptions == ArgumentMode.RemainderUnevaluated)
                {
                    ContinueToCallAgent.Instantiate((CallAgent)element, new Context(context, sublst), mysucc, fail);
                    aftersucc.Continue(new Context(context, new List <IContent>()), fail);
                    return(true);
                }
                else if (((CallAgent)element).ArgumentOptions == ArgumentMode.DelimitedUnevaluated)
                {
                    int jj;
                    for (jj = 0; jj < contents.Count; jj++)
                    {
                        if (contents[jj] == Special.EndDelimSpecial)
                        {
                            break;
                        }
                    }

                    List <IContent> before = context.Contents.GetRange(ii + 1, jj - 1);
                    List <IContent> after;
                    if (jj < context.Contents.Count - 1)
                    {
                        after = context.Contents.GetRange(jj + 1, context.Contents.Count - jj - 1);
                    }
                    else
                    {
                        after = new List <IContent>();
                    }

                    ContinuationAppender evalappend = new ContinuationAppender(context, mysucc);

                    ContinueToCallAgent.Instantiate((CallAgent)element, new Context(context, before), evalappend.AsIndex(0), fail);
                    Evaluator aftereval = new Evaluator(salience, ArgumentMode.ManyArguments, evalappend.AsIndex(1), aftersucc, isUserInput);
                    aftereval.Continue(new Context(context, after), fail);
                    return(true);
                }
                else
                {
                    if (argumentMode == ArgumentMode.SingleArgument)
                    {
                        ContinueToCallAgent callagent = new ContinueToCallAgent((CallAgent)element, mysucc);
                        Evaluator           eval      = new Evaluator(salience, ((CallAgent)element).ArgumentOptions, callagent, aftersucc, isUserInput);
                        eval.Continue(new Context(context, sublst), fail);
                        return(true);
                    }
                    else
                    {
                        ContinuationAppender evalappend = new ContinuationAppender(context, mysucc);

                        ContinueToCallAgent callagent = new ContinueToCallAgent((CallAgent)element, evalappend.AsIndex(0));

                        Evaluator aftereval = new Evaluator(salience, ArgumentMode.ManyArguments, evalappend.AsIndex(1), aftersucc, isUserInput);

                        Evaluator eval = new Evaluator(salience, ((CallAgent)element).ArgumentOptions, callagent, aftereval, isUserInput);
                        eval.Continue(new Context(context, sublst), fail);
                        return(true);
                    }
                }
            }
            else if (element is Codelet)
            {
                IContinuation mysucc = succ;
                if (ii > 0)
                {
                    mysucc = new ContextAppender(salience, context, ii, succ);
                }
                List <IContent> sublst = context.Contents.GetRange(ii + 1, context.Contents.Count - ii - 1);

                coderack.AddCodelet((Codelet)element, "Codelet in content");

                Evaluator eval = new Evaluator(salience, argumentMode, mysucc, aftersucc, isUserInput);
                eval.Continue(new Context(context, sublst), fail);
                return(true);
            }
            else
            {
                Context result = new Context(context, new List <IContent>(context.Contents.GetRange(0, ii)));
                if (element is IContent)
                {
                    result.Contents.Add((IContent)element);
                }
                else if (element is List <IContent> )
                {
                    result.Contents.AddRange((List <IContent>)element);
                }
                else
                {
                    result.Contents.Add(new Value(element));
                }

                if (argumentMode == ArgumentMode.SingleArgument)
                {
                    succ.Continue(result, fail);
                    aftersucc.Continue(context.ChildRange(1), fail);
                    return(true);
                }
                else
                {
                    IContinuation   appender = new ContextAppender(salience, result, result.Contents.Count, succ);
                    List <IContent> sublst   = context.Contents.GetRange(ii + 1, context.Contents.Count - ii - 1);

                    Evaluator eval = new Evaluator(salience, argumentMode, appender, aftersucc, isUserInput);
                    eval.Continue(new Context(context, sublst), fail);
                    return(true);
                }
            }
        }