コード例 #1
0
        Create_NFAConcatenation
            (NFA_GRAPH graphOne,
            NFA_GRAPH graphTwo)
        {
            NFA_GRAPH newGraph = null;

            if (graphOne == null && graphTwo != null)
            {
                newGraph = graphTwo;
            }
            else if (graphOne != null && graphTwo == null)
            {
                newGraph = graphOne;
            }
            else if (graphOne != null && graphTwo != null)
            {
                graphOne.endNode.nodeType   = NODE_TYPE.TRANSITIONING;
                graphTwo.startNode.nodeType = NODE_TYPE.TRANSITIONING;

                EDGE newEdge = new EDGE(CONSTANTS.EMPTY_SYMBOL, graphTwo.startNode);

                graphOne.endNode.edges.Add(newEdge);

                graphOne.endNode = graphTwo.endNode;

                newGraph = graphOne;
            }

            return(newGraph);
        }
コード例 #2
0
        Process_GroupingSymbol
            (int regExp_itr,
            int EndOfRegEx_itr,
            NFA_GRAPH nfaGraph)
        {
            NFA_GRAPH newGraph = null;

            int startSubRE = regExp_itr + 1;
            int endSubRE   = Get_IndexOfGroupClosingSybol(regExp_itr + 1, EndOfRegEx_itr);


            if (endSubRE != 0)
            {
                regExp_itr = endSubRE;

                newGraph = Get_NFAFromRE(startSubRE, endSubRE, null);

                newGraph = Process_KleeneClosureSymbol(ref regExp_itr, EndOfRegEx_itr, newGraph);

                newGraph = Create_NFAConcatenation(nfaGraph, newGraph);

                newGraph = Get_NFAFromRE(regExp_itr + 1, EndOfRegEx_itr, newGraph);
            }
            else
            {
                newGraph = null;
            }

            return(newGraph);
        }
コード例 #3
0
 Process_UnionSymbol
     (int regExp_itr,
     int EndOfRegEx_itr,
     NFA_GRAPH nfaGraph)
 {
     return(Create_NFAUnion(nfaGraph, Get_NFAFromRE(regExp_itr + 1, EndOfRegEx_itr, null)));
 }
コード例 #4
0
        public static NFA_GRAPH Create_NFAKleeneClosure(NFA_GRAPH nfaGraph)
        {
            NFA_GRAPH newGraph = null;

            if (nfaGraph != null)
            {
                nfaGraph.startNode.nodeType = NODE_TYPE.TRANSITIONING;
                nfaGraph.endNode.nodeType   = NODE_TYPE.TRANSITIONING;

                NODE startNode = NODE.CreateNode(NODE_TYPE.START);
                NODE endNode   = NODE.CreateNode(NODE_TYPE.END);

                EDGE endEdge = new EDGE(CONSTANTS.EMPTY_SYMBOL, endNode);
                nfaGraph.endNode.edges.Add(endEdge);

                EDGE endToStartEdge = new EDGE(CONSTANTS.EMPTY_SYMBOL, nfaGraph.startNode);
                nfaGraph.endNode.edges.Add(endToStartEdge);

                EDGE newStartToStartEdge = new EDGE(CONSTANTS.EMPTY_SYMBOL, nfaGraph.startNode);
                startNode.edges.Add(newStartToStartEdge);

                EDGE newStartToNewEndEdge = new EDGE(CONSTANTS.EMPTY_SYMBOL, endNode);
                startNode.edges.Add(newStartToNewEndEdge);

                newGraph = new NFA_GRAPH(startNode, endNode);
            }

            return(newGraph);
        }
コード例 #5
0
ファイル: UnitTest1.cs プロジェクト: gespejels86/SIM-TESIS
        public void Get_NFAFromRE_Test()
        {
            //Arrange

            NFA_GRAPH nfaGraph = new NFA_GRAPH("AB");

            //Act

            //Assert

            Assert.IsTrue(true);
        }
コード例 #6
0
        Create_NFAOneChar
            (char character)
        {
            NODE startNode = NODE.CreateNode(NODE_TYPE.START);
            NODE endNode   = NODE.CreateNode(NODE_TYPE.END);

            EDGE edge = new EDGE(character, endNode);

            startNode.edges.Add(edge);

            NFA_GRAPH newGraph = new NFA_GRAPH(startNode, endNode);

            return(newGraph);
        }
コード例 #7
0
        Process_SkippingSymbol
            (int regExp_itr,
            int EndOfRegEx_itr,
            NFA_GRAPH nfaGraph)
        {
            NFA_GRAPH newGraph = null;

            if (regExp_itr + 1 < EndOfRegEx_itr)
            {
                newGraph = Process_ConcatenationSymbol(regExp_itr + 1, EndOfRegEx_itr, null);
            }

            return(newGraph);
        }
コード例 #8
0
        Process_ConcatenationSymbol
            (int regExp_itr,
            int EndOfRegEx_itr,
            NFA_GRAPH nfaGraph)
        {
            NFA_GRAPH newGraph = null;

            newGraph = Create_NFAOneChar(regExp[regExp_itr]);

            newGraph = Process_KleeneClosureSymbol(ref regExp_itr, EndOfRegEx_itr, newGraph);

            newGraph = Create_NFAConcatenation(nfaGraph, newGraph);

            newGraph = Get_NFAFromRE(regExp_itr + 1, EndOfRegEx_itr, newGraph);

            return(newGraph);
        }
コード例 #9
0
        Process_SequencingSymbol
            (int regExp_itr,
            int EndOfRegEx_itr,
            NFA_GRAPH nfaGraph)
        {
            NFA_GRAPH newGraph = null;

            char sequenceIterator = (char)0;

            int startSubRE = regExp_itr + 1;
            int endSubRE   = Get_IndexOfSequenceClosingSybol(regExp_itr + 1, EndOfRegEx_itr);


            if (endSubRE != 0)
            {
                regExp_itr = endSubRE;

                if (regExp[endSubRE - 1] > regExp[startSubRE])
                {
                    while ((regExp[startSubRE] + sequenceIterator) <= regExp[(endSubRE - 1)])
                    {
                        newGraph = Create_NFAUnion(Create_NFAOneChar((char)(regExp[startSubRE] + sequenceIterator)), newGraph);
                        sequenceIterator++;
                    }

                    newGraph = Process_KleeneClosureSymbol(ref regExp_itr, EndOfRegEx_itr, newGraph);

                    newGraph = Create_NFAConcatenation(nfaGraph, newGraph);

                    newGraph = Get_NFAFromRE(regExp_itr + 1, EndOfRegEx_itr, newGraph);
                }
                else
                {
                    newGraph = null;
                    //TODO: Log an Error
                }
            }
            else
            {
                newGraph = null;
                //TODO: Log an Error
            }

            return(newGraph);
        }
コード例 #10
0
        Process_KleeneClosureSymbol
            (ref int regExp_itr,
            int EndOfRegEx_itr,
            NFA_GRAPH nfaGraph)
        {
            NFA_GRAPH newGraph = nfaGraph;

            if (regExp_itr + 1 != EndOfRegEx_itr)
            {
                if (regExp[(regExp_itr + 1)].ToString() == CONSTANTS.KLEENE_STAR_SYMBOL)
                {
                    newGraph = Create_NFAKleeneClosure(nfaGraph);
                    regExp_itr++;
                }
            }

            return(newGraph);
        }
コード例 #11
0
        public static NFA_GRAPH Create_NFAUnion(NFA_GRAPH graphOne, NFA_GRAPH graphTwo)
        {
            NFA_GRAPH newGraph = null;

            if (graphOne == null && graphTwo != null)
            {
                newGraph = graphTwo;
            }
            else if (graphOne != null && graphTwo == null)
            {
                newGraph = graphOne;
            }
            else if (graphOne != null && graphTwo != null)
            {
                NODE startNode = NODE.CreateNode(NODE_TYPE.START);
                NODE endNode   = NODE.CreateNode(NODE_TYPE.END);

                graphOne.startNode.nodeType = NODE_TYPE.TRANSITIONING;
                graphTwo.startNode.nodeType = NODE_TYPE.TRANSITIONING;
                graphOne.endNode.nodeType   = NODE_TYPE.TRANSITIONING;
                graphTwo.endNode.nodeType   = NODE_TYPE.TRANSITIONING;

                EDGE startOneEdge = new EDGE(CONSTANTS.EMPTY_SYMBOL, graphOne.startNode);
                EDGE startTwoEdge = new EDGE(CONSTANTS.EMPTY_SYMBOL, graphTwo.startNode);

                startNode.edges.Add(startOneEdge);
                startNode.edges.Add(startTwoEdge);

                EDGE endOneEdge = new EDGE(CONSTANTS.EMPTY_SYMBOL, endNode);
                EDGE endTwoEdge = new EDGE(CONSTANTS.EMPTY_SYMBOL, endNode);

                graphOne.endNode.edges.Add(endOneEdge);
                graphTwo.endNode.edges.Add(endTwoEdge);

                newGraph = new NFA_GRAPH(startNode, endNode);
            }

            return(newGraph);
        }
コード例 #12
0
        private NFA_GRAPH Get_NFAFromRE
            (int regExp_itr,
            int EndOfRegEx_itr,
            NFA_GRAPH nfaGraph)
        {
            NFA_GRAPH new_NFAGraph = null;

            if (regExp_itr != EndOfRegEx_itr)
            {
                switch (regExp[regExp_itr].ToString())
                {
                case CONSTANTS.UNION_SYMBOL:

                    new_NFAGraph = Process_UnionSymbol(regExp_itr, EndOfRegEx_itr, nfaGraph);

                    break;

                case CONSTANTS.OPEN_GROUPING_SYMBOL:

                    new_NFAGraph = Process_GroupingSymbol(regExp_itr, EndOfRegEx_itr, nfaGraph);

                    break;

                case CONSTANTS.CLOSE_GROUPING_SYMBOL:

                    new_NFAGraph = null;
                    //ToDo: Log an Error

                    break;

                case CONSTANTS.SKIPPING_SYMBOL:

                    new_NFAGraph = Process_SkippingSymbol(regExp_itr, EndOfRegEx_itr, nfaGraph);

                    break;

                case CONSTANTS.KLEENE_STAR_SYMBOL:

                    new_NFAGraph = null;
                    regExp_itr++;
                    //ToDo: Log an Error

                    break;

                case CONSTANTS.OPEN_SEQUENCING_SYMBOL:

                    new_NFAGraph = Process_SequencingSymbol(regExp_itr, EndOfRegEx_itr, nfaGraph);

                    break;

                default:

                    new_NFAGraph = Process_ConcatenationSymbol(regExp_itr, EndOfRegEx_itr, nfaGraph);

                    break;
                }
            }

            if (new_NFAGraph == null)
            {
                new_NFAGraph = nfaGraph;
            }

            return(new_NFAGraph);
        }