public void SetNFA(NFA nfa)
        {
            Tokens = nfa.Tokens;
            Graph  = nfa.Graph;

            StartVertex = nfa.FindStart()[0];
        }
Example #2
0
        private static NFA PostfixToNFA(string postfix)
        {
            Console.WriteLine("Построение NFA по постфикной нотации ");
            var result = NFA.fromPostfix(postfix);

            result.PrintGraph("NFA.gv");
            return(result);
        }
Example #3
0
        private static DFA NFAtoDFA(NFA nfa)
        {
            Console.WriteLine("Построение DFA по NFA");
            var result = DFA.FromNFA(nfa, new TompsonDFABuildAlgorithm());

            result.PrintGraph("DFA.gv");
            return(result);
        }
Example #4
0
        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);
        }
Example #5
0
        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);
 }