Esempio n. 1
0
 bool Accept(ast.Part part)
 {
     foreach (var param in Leaf.paramList)
     {
         if (Accept(part, param))
         {
             return(true);
         }
     }
     if (Leaf != context.Leaf)
     {
         foreach (var child in Leaf.childList)
         {
             if (child.node != limit && Accept(part, child))
             {
                 return(true);
             }
         }
         var node = EvaluateNode(Leaf.node);
         while (node is Solver)
         {
             var super = node as Solver;
             foreach (var child in super.Leaf.childList)
             {
                 if (Accept(part, child))
                 {
                     return(true);
                 }
             }
             node = super.EvaluateNode(super.Leaf.node);
         }
     }
     return(false);
 }
Esempio n. 2
0
 bool Accept(ast.Part part, ast.Define define)
 {
     if (part.identity.name == define.identity.name)
     {
         var leaf = Enter(define);
         Trace();
         var success = (part.paramList.Count == define.paramList.Count);
         for (var i = 0; success && i < part.paramList.Count; i++)
         {
             var key  = context.EvaluateNode(part.paramList[i]);
             var hole = EvaluateNode(define.paramList[i].node);
             success = key.Type() == hole.Type();
             while (!success && key is Solver)
             {
                 var super = key as Solver;
                 key     = super.EvaluateNode(super.Leaf.node);
                 success = key.Type() == hole.Type();
             }
         }
         if (success)
         {
             return(true);
         }
         Leave(leaf);
     }
     return(false);
 }
Esempio n. 3
0
 void WriteCallLocal(ast.Part part, List <Route> paramList)
 {
     if (part.define.IsBuiltIn)
     {
         clang.Begin(clang.opLocalCall)
         .Put(part.define.Type.Name)
         .Put(part.Name)
         .Put(paramList[0].Value)
         .Put(part.define.identity.val)
         .Put(paramList[1].Value);
     }
     else
     {
         var format = clang.Begin(clang.typeLocalCall);
         format.Put(part.define.Type.Name);
         format.Put(part.Name);
         format.Put(part.define.Call.Name);
         format.Put(part.Name);
         foreach (var param in paramList)
         {
             clang.Begin(clang.paramCall).Put(param.Param);
         }
         format.End();
     }
 }
Esempio n. 4
0
        public void Append(ast.Part part)
        {
            var access = this.level == 0 ? "." : "->";

            value += access + part.define.Name;
            level  = part.define.IsParam ? 1 : 0;
            final  = part.define.IsFinal;
        }
Esempio n. 5
0
 ast.Node Error(ast.Part part)
 {
     Dojo.Error(part.identity, "Not found: " + part.ToString() + " in: " + context.ToString());
     foreach (var candidate in list)
     {
         Dojo.Error(candidate, "\tCandidate: " + candidate.name);
     }
     return(ast.Node.nil);
 }
Esempio n. 6
0
 void WriteCallTail(ast.Define define, ast.Define from, ast.Part part, List <Route> paramList)
 {
     if (define.IsReferred)
     {
         if (part.define.IsBuiltIn)
         {
             clang.Begin(clang.opTailCall)
             .Put(NameFinal(define, from))
             .Put(paramList[0].Value)
             .Put(part.define.identity.val)
             .Put(paramList[1].Value);
         }
         else
         {
             var format = clang.Begin(clang.typeTailCall);
             format.Put(define.Call.Name);
             format.Put(NameType(define, from));
             foreach (var param in paramList)
             {
                 clang.Begin(clang.paramCall).Put(param.Param);
             }
             format.End();
         }
     }
     else
     {
         if (part.define.IsBuiltIn)
         {
             clang.Begin(clang.opLocalCall)
             .Put(define.Type.Name)
             .Put(define.Name)
             .Put(paramList[0].Value)
             .Put(part.define.identity.val)
             .Put(paramList[1].Value);
         }
         else
         {
             var format = clang.Begin(clang.typeLocalCall);
             format.Put(define.Type.Name);
             format.Put(define.Name);
             format.Put(define.Call.Name);
             format.Put(define.Name);
             foreach (var param in paramList)
             {
                 clang.Begin(clang.paramCall).Put(param.Param);
             }
             format.End();
         }
     }
 }
Esempio n. 7
0
 bool EvaluatePart(ast.Part part)
 {
     if (Accept(part))
     {
         if (Leaf.paramList != ast.DefineList.nil)
         {
             var clone = new ast.Define();
             clone.identity  = part.identity;
             clone.paramList = new ast.DefineList();
             for (var i = 0; i < Leaf.paramList.Count; i++)
             {
                 var param = new ast.Define();
                 param.identity = Leaf.paramList[i].identity;
                 param.node     = context.EvaluateNode(part.paramList[i]);
                 clone.paramList.Add(param);
             }
             clone.node      = Leaf.node;
             clone.childList = Leaf.childList;
             Leaf            = clone;
         }
         return(true);
     }
     return(false);
 }
Esempio n. 8
0
 public Route(string value, ast.Part part)
 {
     this.value = value;
     level      = part.define.IsParam ? 1 : 0;
     final      = part.define.IsFinal;
 }