Exemplo n.º 1
0
        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;
            }
        }
Exemplo n.º 2
0
 public static IEnumerable <IToken> GetTokens(this IParseTree context)
 {
     return(context.DecendantsOfType <ITerminalNode>().Select(x => x.Symbol));
 }