private DFANode DFANodeClone_DFS(Dictionary <DFANode, DFANode> NodeMap, DFANode CurNode) { if (NodeMap.ContainsKey(CurNode)) { return(NodeMap[CurNode]); } var newnode = new DFANode { ID = CurNode.ID, IsEndNode = CurNode.IsEndNode, Edge = new List <DFAEdge>() }; NodeMap[CurNode] = newnode; foreach (var item in CurNode.Edge) { var newedge = new DFAEdge { Condition = item.Condition, NextNode = null }; if (item.NextNode != null) { newedge.NextNode = DFANodeClone_DFS(NodeMap, item.NextNode); } newnode.Edge.Add(newedge); } return(newnode); }
public Token ReadToken() { if (_Index == _Str.Length) { return(new Token(TokenState.End, null, null, _Line, _Col)); } var index = _Index; var startIndex = index; var state = _Egt.DFAStateGroup[0]; Symbol acceptSymbol = null; int accpetIndex = -1; while (true) { DFAEdge edge = null; if (index <= _Str.Length - 1) { var cha = _Str[index]; edge = state.GetEdge(cha); } if (edge != null) { state = edge.TargetState; if (state.AcceptSymbol != null) { acceptSymbol = state.AcceptSymbol; accpetIndex = index; } index++; } else { if (acceptSymbol != null) { var token = new Token(TokenState.Accept, acceptSymbol, _Str.Substring(startIndex, accpetIndex - startIndex + 1), _Line, _Col); Consumn(token.Value); return(token); } else { var token = new Token(TokenState.Error, null, _Str[startIndex].ToString(), _Line, _Col); Consumn(token.Value); return(token); } } } }
private bool MatchDFA(string Code, int StartIndex, DFANode StartNode, out int Length) { var succlength = 0; var curnode = StartNode; var curlength = 0; while (true) { if (curnode.IsEndNode) { succlength = curlength; } if ((StartIndex + curlength) >= Code.Length) { break; } var matchedge = new DFAEdge(); foreach (var edge in curnode.Edge) { if (edge.Condition == Code[StartIndex + curlength]) { matchedge = edge; break; } } if (matchedge.NextNode == null) { Length = succlength; break; } curnode = matchedge.NextNode; curlength++; } Length = succlength; return(succlength == 0 ? false : true); }