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); }
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); }
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(); } }
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; }
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); }
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(); } } }
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); }
public Route(string value, ast.Part part) { this.value = value; level = part.define.IsParam ? 1 : 0; final = part.define.IsFinal; }