using Canon.Core.Enums; using Canon.Core.LexicalParser; namespace Canon.Core.SyntaxNodes; public class IdentifierList : NonTerminatedSyntaxNode { public override NonTerminatorType Type => NonTerminatorType.IdentifierList; /// /// 是否含有递归定义 /// public bool IsRecursive { get; private init; } /// /// 声明的标识符列表 /// public IEnumerable Identifiers => GetIdentifiers(); public static IdentifierList Create(List children) { bool isRecursive; if (children.Count == 1) { isRecursive = false; } else if (children.Count == 3) { isRecursive = true; } else { throw new InvalidOperationException(); } return new IdentifierList { IsRecursive = isRecursive, Children = children }; } private IEnumerable GetIdentifiers() { IdentifierList identifier = this; while (true) { if (identifier.IsRecursive) { yield return (IdentifierSemanticToken)identifier.Children[2].Convert().Token; identifier = identifier.Children[0].Convert(); } else { yield return (IdentifierSemanticToken)identifier.Children[0].Convert().Token; break; } } } }