using System.Collections; using Canon.Core.Enums; namespace Canon.Core.SyntaxNodes; public abstract class NonTerminatedSyntaxNode : SyntaxNodeBase, IEnumerable { public override bool IsTerminated => false; public abstract NonTerminatorType Type { get; } public required List Children { get; init; } public IEnumerator GetEnumerator() { yield return this; foreach (SyntaxNodeBase child in Children) { if (child.IsTerminated) { yield return child; } else { NonTerminatedSyntaxNode nonTerminatedNode = child.Convert(); foreach (SyntaxNodeBase node in nonTerminatedNode) { yield return node; } } } } IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); public override string ToString() { return Type.ToString(); } }