Пример #1
0
        //
        static bool Write_Default(Transpiler t, ClauseExpr d)
        {
            if (d.IsProperty)
            {
                t.WriteLine("if (_bwxClause != null && _bwxClause.Exists<{0}>({1}, {2}))",
                            d.Predicate.ToPredicate().Spec, t.Translate(d.Predicate), t.Translate(d.Object));
            }

            /*else if (d.HasMetaDefs)
             * {
             *  t.WriteLine("_bwxClause = bwxTask.Context.Find(new ClausePattern({0}, {1}, {2}));",
             *      t.Translate(d.Subject), t.Translate(d.Predicate), t.Translate(d.Object));
             *  t.WriteLine("if (_bwxClause != null)");
             * }*/
            else
            {
                if (d.Object.IsSnippet)
                {
                    t.WriteLine("if(bwxTask.Context.Exists<{0}>({1}, {2}, {3}))",
                                d.Type, t.Translate(d.Subject), t.Translate(d.Predicate), t.Translate(d.Object));
                }
                else
                {
                    t.WriteLine("if(bwxTask.Context.Exists({0}, {1}, {2}))",
                                t.Translate(d.Subject), t.Translate(d.Predicate), t.Translate(d.Object));
                }
            }
            return(false);
        }
Пример #2
0
        public ClauseExpr EvalClause(Token op)
        {
            Expression argument  = PopExpr();
            Expression subject   = PopExpr();
            Expression klassExpr = null;

            if (subject == Expression.Nil)
            {
                subject   = BuiltinDefs.Self.CreateName();
                klassExpr = BuiltinDefs.Perform.CreateName();
            }
            else if (subject.IsClauseExpr)
            {
                subject = new Name(TokenInstance.CSharp._BWXSUBJECT);
            }
            Expression predicate = new Name(op);
            ClauseExpr expr      = new ClauseExpr(subject, predicate, argument);

            expr.AtomTypeExpr = klassExpr;

            PushExpr(expr);
            //
            ExprSeq.AddChild(expr);
            return(expr);
        }
Пример #3
0
 static bool Write_FS_TS_U(Transpiler t, ClauseExpr d)
 {
     t.WriteLine("foreach({0} {1} in bwxTask.Context.QueryType({2}))",
                 d.Subject.Type, t.Translate(d.Subject), t.Translate(d.Subject.AtomTypeExpr));
     t.StartBlock(null);
     Write_U(t, d);
     return(false);
 }
Пример #4
0
        public void EvalProperty(Token op)
        {
            Expression argument  = PopExpr();
            Expression subject   = PopExpr();
            Expression predicate = new Name(op);
            ClauseExpr expr      = new ClauseExpr(predicate, argument);

            subject.AddPropertyExpr(expr);
            PushExpr(subject);
        }
Пример #5
0
        public void Visitback(AstNode n, Action cps)
        {
            if (n.MessageTag.TaskDef != null)
            {
                List <Var> vars = new List <Var>();
                t.CurrentScope.CollectVariables(vars);
                n.MessageTag.TaskDef.Parameters = vars;
                //(MessageCallback)
                var code = "(__bwxContext, __bwxExpert, __bwxMessage) => { ";
                code += "Method __bwxTask = new Method(__bwxContext, __bwxMessage); ";
                code += "__bwxContext.ScheduleTask(__bwxTask, ";
                code += string.Format("{0}({1}));", n.MessageTag.TaskDef.ProcedureDef.Name, n.MessageTag.TaskDef.CreateParameterString(t, false));
                code += " }";
                //TODO:There must be a problem here.
                ClauseExpr nClause = (ClauseExpr)n;
                nClause.Object.Token = new Token(TokenKind.Snippet, code);
                nClause.Type         = nClause.Predicate.ToPredicate().Spec;
            }

            if (n.MessageTag.Wait && n.MessageTag.Result.NotNil)
            {
                t.WriteLine("_bwxResult = new TaskResult(bwxTask);");
            }

            t.WriteIndented("_bwxMsg = ");

            if (n.IsNil)
            {
                t.Write("Message.NilMessage");
                t.Write(")");
                t.WriteStatementEnd();
                return;
            }
            //else
            t.Write("new Message(MessageKind.{0}, {1}, {2}, ", n.MessageTag.MessageKind, t.Translate(n.MessageTag.Sender), t.Translate(n.MessageTag.Result));
            //t.Visit(n);
            cps();
            //
            t.Write(")");
            t.WriteStatementEnd();

            //
            WriteSend(n);
            //
            if (n.MessageTag.Wait && n.MessageTag.Result.NotNil)
            {
                t.WriteLine("yield return TaskStatus.Suspended;");
                t.WriteLine("if(_bwxResult.Status != TaskStatus.Succeeded)");
                t.Indent();
                t.WriteLine("yield return Fail(bwxTask.Process, bwxTask.Message);");
                t.Dedent();
            }
        }
 static bool Write_FO(Transpiler t, ClauseExpr d)
 {
     if (d.IsMeta)
     {
         t.WriteLine("{0} {1} = ({0})_bwxClause[{2}];",
                     d.Type, t.Translate(d.Object), t.Translate(d.Predicate));
         return(false);
     }
     t.WriteLine("foreach({0} {1} in bwxTask.Context.QuerySubjPred<{0}>({2}, {3}))",
                 d.Type, t.Translate(d.Object), t.Translate(d.Subject), t.Translate(d.Predicate));
     return(true);
 }
Пример #7
0
        void ParseTaskMessage(ClauseExpr messageDef)
        {
            Advance(); //past 'task
            //
            TaskDef taskDef = CurrentTaskDef.CreateSubtaskDef();

            messageDef.MessageTag.TaskDef = taskDef;
            //
            ParseProperties(taskDef);
            //
            PushTaskDef(taskDef);
            ParseTaskItems(taskDef.ProcedureDef);
            PopTaskDef();
            //
            messageDef.MakeCallback();
        }
Пример #8
0
        public void WriteReceive(AstNode n_)
        {
            if (n_.IsVariable)
            {
                t.WriteLine("Atom {0} = bwxMsg.Clause;", t.Translate(n_));
                return;
            }
            //else
            ClauseExpr n = ((ClauseExpr)n_);

            if (n.HasBinding)
            {
                t.WriteLine("Atom {0} = bwxMsg.Clause;", n.Binding.Translate());
            }
            if (n.Subject != null && n.Subject.IsVariable)
            {
                t.CurrentScope.CreateVar(n.Subject.Token);
                t.WriteLine("Atom {0} = bwxMsg.Clause.Subject;", t.Translate(n.Subject));
            }
            if (n.Object != null && n.Object.IsVariable)
            {
                t.CurrentScope.CreateVar(n.Object.Token, n.Object.Type);
                t.WriteLine("{0} {1} = ({0})bwxMsg.Clause.Object;", n.Object.Type, t.Translate(n.Object));
            }

            foreach (ClauseExpr propExpr in n.PropertyExprs)
            {
                AstNode propPred = propExpr.Predicate;
                AstNode propObj  = propExpr.Object;
                Token   propSpec = propExpr.Type;
                if (propObj.Token.Kind == TokenKind.Variable)
                {
                    t.CurrentScope.CreateVar(propObj.Token);
                    t.WriteLine("{0} {1} = ({0})bwxMsg.Clause[{2}];", propSpec, t.Translate(propObj), t.Translate(propPred));
                }
            }
        }
Пример #9
0
 static bool Write_B(Transpiler t, ClauseExpr d)
 {
     t.WriteLine("if({0} {1} {2})",
                 t.Translate(d.Subject), t.Translate(d.Predicate), t.Translate(d.Object));
     return(false);
 }
Пример #10
0
 static bool Write_U(Transpiler t, ClauseExpr d)
 {
     t.WriteLine("if(!bwxTask.Context.Exists({0}, {1}, {2}))",
                 t.Translate(d.Subject), t.Translate(d.Predicate), t.Translate(d.Object));
     return(false);
 }
Пример #11
0
 //
 static bool Write_FS(Transpiler t, ClauseExpr d)
 {
     t.WriteLine("foreach({0} {1} in bwxTask.Context.QueryPredObj({2}, {3}))",
                 "Atom", t.Translate(d.Subject), t.Translate(d.Predicate), t.Translate(d.Object));
     return(true);
 }
Пример #12
0
 //
 static bool Write_TS(Transpiler t, ClauseExpr d)
 {
     t.WriteLine("if({0}.TypeCheck({1}) && bwxTask.Context.Exists({0}, {2}, {3}))",
                 t.Translate(d.Subject), t.Translate(d.Subject.AtomTypeExpr), t.Translate(d.Predicate), t.Translate(d.Object));
     return(false);
 }