private static void TestNfa(NFA nfa) { using (var tw = new StreamWriter(@"D:\Down\rtest\nfa.gv", false, Encoding.UTF8)) { nfa.ToGraphViz(tw); } //foreach (var kvp in nfa.LambdaClosure()) //{ // Console.WriteLine(kvp.Key); // foreach (var s in kvp.Value) // { // Console.WriteLine("\t{0}", s.Name); // } //} //foreach (var kvp in nfa.TFunction()) //{ // Console.WriteLine("{0} {1}", kvp.Key.Item1, kvp.Key.Item2); // foreach (var st in kvp.Value) // { // Console.WriteLine("\t{0}", st); // } //} }
public DFA(NFA nfa) { var lc = nfa.LambdaClosure(); var tf = nfa.TFunction(); StartState = MakeState(new SortedSet <State>(lc[nfa.StartState])); while (worklist.Count != 0) { var state = worklist.Pop(); foreach (var kvp in tf.Where(t => state.SubStates.Contains(t.Key.Item1)).GroupBy(t => t.Key.Item2)) { var key = kvp.Key; var val = kvp.SelectMany(t => t.Value); var st = MakeState(val); this.Transitions.Add(new Tuple <NfaSourcedState, char?, NfaSourcedState>(state, key, st)); } } foreach (var state in States) { if (state.SubStates.Any(s => s.IsFinal)) { state.IsFinal = true; } } }
static void Main(string[] args) { var sc = new Scanner(new StringReader("asdf(2|3|4)*")); //TestScanner(sc); var parser = new Parser(sc); var tree = parser.Result.Visit(new SimplifyingRewriter()); //tree.Visit(new TreePrinter()); var nfa = new NFA(tree); TestNfa(nfa); var dfa = new DFA(nfa); TestDfa(dfa); var csharp = new CSharpOutput(dfa); Console.WriteLine(csharp); //var f = new IlOutput(dfa).ToFunc(); //Console.WriteLine(f("asdf")); //Console.WriteLine(TestNS.Test.Match("asf")); //Console.WriteLine(new CSharpOutput(new DFA(new NFA(new Parser(new Scanner(new StringReader("asdf(2|3|4)*"))).Result.Visit(new SimplifyingRewriter()))))); }
public NfaVistor(NFA nfa) { this.nfa = nfa; }