using Canon.Core.CodeGenerators; using Canon.Core.Enums; namespace Canon.Core.SyntaxNodes; public class StatementList : NonTerminatedSyntaxNode { public override NonTerminatorType Type => NonTerminatorType.StatementList; public bool IsRecursive { get; private init; } public IEnumerable Statements => GetStatements(); public static StatementList Create(List children) { bool isRecursive; if (children.Count == 1) { isRecursive = false; } else if (children.Count == 3) { isRecursive = true; } else { throw new InvalidOperationException(); } return new StatementList { Children = children, IsRecursive = isRecursive }; } private IEnumerable GetStatements() { StatementList list = this; while (true) { if (list.IsRecursive) { yield return list.Children[2].Convert(); list = list.Children[0].Convert(); } else { yield return list.Children[0].Convert(); break; } } } public override void GenerateCCode(CCodeBuilder builder) { foreach (var statement in Statements.Reverse()) { if (statement.Children.Count > 0) { statement.GenerateCCode(builder); builder.AddString(";"); } } } }