private static DfaNode merge(IEnumerable <DfaNode> nodes) { var result = new DfaNode(nodes.Select(it => it.nodes).Flatten().Distinct().ToArray()); result.connectionsTo.SetAcceptingValues(nodes.Select(it => it.AcceptingValues).Flatten()); return(result); }
internal IEnumerable <Link> ComputeLinks() { return(nodes .Select(it => it.Connections.To) .Flatten() .Where(it => !it.Item1.IsEmpty) // get only real connections .GroupBy(it => it.Item1) // group by edge range // create links per each edge value (not range) .Select(it => Link.CreateMany(this, it.Key, new DfaNode(it.Select(x => x.Item2).ToArray()))) .Flatten() .GroupBy(it => it.Edge) // group by edge value // create final links with merged nodes .Select(it => new Link(this, it.Key, DfaNode.merge(it.Select(x => x.Target))))); }
internal static IEnumerable <Link> CreateMany(DfaNode source, Nfa.NfaEdge.Fiber fiber, DfaNode target) { return(Enumerable.Range(fiber.Min, fiber.Max - fiber.Min + 1) .Select(it => new Link(source, it, target))); }
internal Link(DfaNode source, int edge, DfaNode target) { this.Source = source; this.Edge = edge; this.Target = target; }
internal bool SameNfaCore(DfaNode compNode) { return(nodes.SetEquals(compNode.nodes)); }
internal void ConnectTo(int edge, DfaNode target) { connectionsTo.AddTransition(edge, target); }