public static SyntaxTreeNode Convert(string regex) { RegexToSyntaxTreeConverter converter = new RegexToSyntaxTreeConverter(); SyntaxTreeNode result = converter.DoConvert(regex).SetPositions(); result.TopParent().CalculateFollowPos(); return(result); }
private Node DoConvert(string regex) { SyntaxTreeNode result = RegexToSyntaxTreeConverter.Convert(regex); SyntaxTreeNode s = result; SyntaxTreeNode topParent = s; while (s != null) { if (s.Parent != null) { topParent = s.Parent; } s = s.Parent; } TopSyntaxTreeNode = topParent; Alphabet = topParent.LeafNodes().Distinct().ToList(); Dictionary <Node, SyntaxTreeNodeSet> DStates = new Dictionary <Node, SyntaxTreeNodeSet>(); Node startNode = new Node(); startNode.IsEntry = true; DStates.Add(startNode, new SyntaxTreeNodeSet(topParent.FirstPos())); List <Node> MarkedStates = new List <Node>(); List <(Node, char, Node)> DTrans = new List <(Node, char, Node)>(); while (DStates.Keys.Any(x => !MarkedStates.Contains(x))) { Node S = DStates.Keys.First(x => !MarkedStates.Contains(x)); MarkedStates.Add(S); foreach (char a in Alphabet) { SyntaxTreeNodeSet U = new SyntaxTreeNodeSet(DStates[S].Where(x => x.Character == a).SelectMany(x => x.FollowPos).Distinct().ToList()); bool isAccepting = U.Any(x => x.Character == '#'); if (U.Any()) { Node targetNode = DStates.FirstOrDefault(x => x.Value.IsEqualTo(U)).Key; if (targetNode == null) { targetNode = new Node(); if (isAccepting) { targetNode.IsAccepting = true; } DStates.Add(targetNode, U); } else { targetNode.IsAccepting = true; } if (a != '#') { DTrans.Add((S, a, targetNode)); new Edge(a, S, targetNode); } } } } return(startNode); }