public static IEnumerable <T> NearestOfType <T>(this IParseTree context) { if (context == null) { yield break; } foreach (var result in context.DecendantsOfType <T>()) { yield return(result); } var node = context; var parent = context.Parent; while (parent != null) { var childIndex = parent.IndexOfChild(node); for (int i = 1; i < parent.ChildCount; i++) { var previousIndex = childIndex - i; var nextIndex = childIndex + i; if (previousIndex >= 0) { foreach (var result in parent.GetChild(previousIndex).DecendantsOfTypeReversed <T>()) { yield return(result); } } if (nextIndex < parent.ChildCount) { foreach (var result in parent.GetChild(nextIndex).DecendantsOfType <T>()) { yield return(result); } } } node = parent; parent = node.Parent; } }
public static IEnumerable <IToken> GetTokens(this IParseTree context) { return(context.DecendantsOfType <ITerminalNode>().Select(x => x.Symbol)); }