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); }