Exemplo n.º 1
0
    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;
    }
Exemplo n.º 2
0
    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;
    }