public void SetNFA(NFA nfa) { Tokens = nfa.Tokens; Graph = nfa.Graph; StartVertex = nfa.FindStart()[0]; }
private static NFA PostfixToNFA(string postfix) { Console.WriteLine("Построение NFA по постфикной нотации "); var result = NFA.fromPostfix(postfix); result.PrintGraph("NFA.gv"); return(result); }
private static DFA NFAtoDFA(NFA nfa) { Console.WriteLine("Построение DFA по NFA"); var result = DFA.FromNFA(nfa, new TompsonDFABuildAlgorithm()); result.PrintGraph("DFA.gv"); return(result); }
public static DFA FromNFA(NFA nfa, IDFABuildAlgorithm dfaBuildAlgorithm) { var dfa = new DFA { Graph = new BidirectionalGraph <Vertex, BaseEdge <Vertex> >(), Tokens = nfa.Tokens }; dfaBuildAlgorithm.SetNFA(nfa); dfaBuildAlgorithm.Build(); dfa.Graph.AddVertexRange(dfaBuildAlgorithm.States); dfa.Graph.AddEdgeRange(dfaBuildAlgorithm.Edges); return(dfa); }
public static NFA fromPostfix(string postfix) { var nfa = new NFA(); var stackFA = new Stack <BidirectionalGraph <BaseVertex, BaseEdge <BaseVertex> > >(); nfa.Tokens = new HashSet <char>(); foreach (var ch in postfix) { if (Lexer.AvailableSymbols.Contains(ch)) { stackFA.Push(GetTokenFA(ch)); nfa.Tokens.Add(ch); } else if (Lexer.ZeroOrMoreOperand.Equals(ch)) { stackFA.Push(GetZeroOrMoreFA(stackFA.Pop())); } else if (Lexer.OneOrMoreOperand.Equals(ch)) { stackFA.Push(GetOneOrMoreFA(stackFA.Pop())); } else if (Lexer.AndOperand.Equals(ch)) { var second = stackFA.Pop(); var first = stackFA.Pop(); stackFA.Push(getAndFA(first, second)); } else if (Lexer.OrOperand.Equals(ch)) { var second = stackFA.Pop(); var first = stackFA.Pop(); stackFA.Push(getOrFA(first, second)); } } nfa.Graph = stackFA.Pop(); var i = 0; foreach (var v in nfa.Graph.Vertices) { v.Title = (i++).ToString(); } return(nfa); }
public TompsonDFABuildAlgorithm(NFA nfa) { SetNFA(nfa); }