internal static IList <ParseNode> AncestorsAndSelf(this ParseNode node) { var result = node.Ancestors().Reverse().ToList(); result.Add(node); return(result); }
internal static IEnumerable <ParseNode> AncestorsToIntersection(this ParseNode segment, ParseNode lastFoundSegment) { if (segment.Prefix != Prefixes.S) { throw new ParserException("Not a segment " + segment.Name); } var lastParents = lastFoundSegment.Ancestors(); var parents = segment.Ancestors().ToList(); var intersect = parents.Select(n => n.Name).Intersect(lastParents.Select(n => n.Name)).ToList(); var result = parents.TakeWhile(parent => parent.Name != intersect.First()).Reverse().ToList(); if (!result.Any() && segment.IsTrigger) { result.Add(segment.Parent); } result.Add(segment); return(result); }
internal static ParseNode Root(this ParseNode parseNode) { return(parseNode.Ancestors().Last()); }