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); }
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); }
Process_UnionSymbol (int regExp_itr, int EndOfRegEx_itr, NFA_GRAPH nfaGraph) { return(Create_NFAUnion(nfaGraph, Get_NFAFromRE(regExp_itr + 1, EndOfRegEx_itr, null))); }
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); }
public void Get_NFAFromRE_Test() { //Arrange NFA_GRAPH nfaGraph = new NFA_GRAPH("AB"); //Act //Assert Assert.IsTrue(true); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }