示例#1
0
    // If   nfa1 has form s1s ----> s1e
    // and  nfa2 has form s2s ----> s2e
    // then nfa0 has form s0s -eps-> s1s ----> s1e -eps-> s0e
    //                    s0s -eps-> s2s ----> s2e -eps-> s0e
    public override Nfa MkNfa(Nfa.NameSource names)
    {
        var nfa1 = _r1.MkNfa(names);
        var nfa2 = _r2.MkNfa(names);
        var s0s  = names.Next();
        var s0e  = names.Next();
        var nfa0 = new Nfa(s0s, s0e);

        foreach (var entry in nfa1.Trans)
        {
            nfa0.AddTrans(entry);
        }

        foreach (var entry in nfa2.Trans)
        {
            nfa0.AddTrans(entry);
        }

        nfa0.AddTrans(s0s, null, nfa1.Start);
        nfa0.AddTrans(s0s, null, nfa2.Start);
        nfa0.AddTrans(nfa1.Exit, null, s0e);
        nfa0.AddTrans(nfa2.Exit, null, s0e);

        return(nfa0);
    }
示例#2
0
    public static void BuildAndShow(string fileprefix, RegexBase r)
    {
        var nfa = r.MkNfa(new Nfa.NameSource());

        Console.WriteLine(nfa);
        Console.WriteLine("Writing NFA graph to file");
        nfa.WriteDot(fileprefix + "nfa.dot");
        Console.WriteLine("---");
        var dfa = nfa.ToDfa();

        Console.WriteLine(dfa);
        Console.WriteLine("Writing DFA graph to file");
        dfa.WriteDot(fileprefix + "dfa.dot");
        Console.WriteLine();
    }