public override LAD Reify(NFA pad) { if (Lexer.LtmTrace) Console.WriteLine("+ Processing subrule {0}", name); if (name == "ws") return new LADImp(); pad.used_methods.Add(name); if (pad.method_stack.Contains(name)) { // NFAs cannot be recursive, so treat this as the end of the // declarative prefix. if (Lexer.LtmTrace) Console.WriteLine("+ Pruning to avoid recursion"); return new LADImp(); } Frame outer; LAD sub = pad.ResolveMethod(name, out outer); pad.method_stack.Add(name); pad.outer_stack.Add(outer); LAD ret; if (sub == null) { ret = new LADImp(); } else { ret = sub.Reify(pad); } pad.method_stack.Remove(name); pad.outer_stack.RemoveAt(pad.outer_stack.Count - 1); return ret; }
public LAD ResolveMethod(string name, out Frame outer) { LAD sub = null; if (method_cache.TryGetValue(name, out sub)) { if (Lexer.LtmTrace) Console.WriteLine("+ Method HIT for {0}", name); outer = outer_cache[name]; return sub; } if (Lexer.LtmTrace) Console.WriteLine("+ Method MISS for {0}", name); IP6 method = cursor_class.Can(name); if (Lexer.LtmTrace && method != null) Console.WriteLine("+ Found method"); if (method == null) { outer = outer_cache[name] = null; return method_cache[name] = new LADImp(); } sub = ((SubInfo)(((DynObject)method).GetSlot("info"))).ltm; outer = ((Frame)(((DynObject)method).GetSlot("outer"))); if (Lexer.LtmTrace) Console.WriteLine("+ {0} to sub-automaton", (sub != null ? "Resolved" : "Failed to resolve")); method_cache[name] = sub; outer_cache[name] = outer; return sub; }