private static IEnumerable <TokenDefinition> ProcessNode(XElement n, Counter counter)
        {
            var parent = n.Parent;
            var prefix = "";

            if (null != parent)
            {
                prefix = parent.Attribute(PrefixNode)?.Value;
            }

            if (n.Name == "define")
            {
                var t = new TokenDefinition {
                    ExecutionPriority = int.Parse(n.Attribute("priority")?.Value ?? "0"),
                    ParsingPriority   = counter.Increment(),
                    Name         = n.Attribute("name")?.Value,
                    Signature    = prefix + n.Attribute("signature")?.Value,
                    MatchOptions = n.Attribute("options")?.Value,
                    Type         = Enum.Parse <TokenType>(n.Attribute("type")?.Value ?? "operator", true)
                };

                foreach (var e in n.Elements())
                {
                    t.Rules.AddRange(ProcessNode(e, counter));
                }

                yield return(t);
            }
            else
            {
                // ReSharper disable once TailRecursiveCall
                foreach (var e in n.Elements())
                {
                    foreach (var child in ProcessNode(e, counter))
                    {
                        yield return(child);
                    }
                }
            }
        }
 /// <summary>
 ///     Registers a token with the parser
 /// </summary>
 /// <param name="token"></param>
 /// <returns></returns>
 public StandardParser RegisterToken(TokenDefinition token)
 {
     _tokens.Add(token);
     return(this);
 }