using Canon.Core.CodeGenerators; using Canon.Core.Enums; namespace Canon.Core.SyntaxNodes; public class SubprogramDeclarations : NonTerminatedSyntaxNode { public override NonTerminatorType Type => NonTerminatorType.SubprogramDeclarations; /// /// 声明的子程序列表 /// public IEnumerable Subprograms => GetSubprograms(); public static SubprogramDeclarations Create(List children) { return new SubprogramDeclarations { Children = children }; } private IEnumerable GetSubprograms() { SubprogramDeclarations declarations = this; while (true) { if (declarations.Children.Count == 0) { yield break; } yield return declarations.Children[1].Convert(); declarations = declarations.Children[0].Convert(); } } public override void GenerateCCode(CCodeBuilder builder) { foreach (var subprogram in Subprograms) { subprogram.GenerateCCode(builder); } } }