using Canon.Core.Abstractions; using Canon.Core.CodeGenerators; using Canon.Core.Enums; namespace Canon.Core.SyntaxNodes; public class ProgramBody : NonTerminatedSyntaxNode { public override NonTerminatorType Type => NonTerminatorType.ProgramBody; /// /// 常量声明 /// public ConstDeclarations ConstDeclarations => Children[0].Convert(); /// /// 变量声明 /// public VarDeclarations VarDeclarations => Children[1].Convert(); /// /// 子程序声明 /// public SubprogramDeclarations SubprogramDeclarations => Children[2].Convert(); /// /// 语句声明 /// public CompoundStatement CompoundStatement => Children[3].Convert(); public override void PreVisit(SyntaxNodeVisitor visitor) { visitor.PreVisit(this); } public override void PostVisit(SyntaxNodeVisitor visitor) { visitor.PostVisit(this); } public static ProgramBody Create(List children) { return new ProgramBody { Children = children }; } public override void GenerateCCode(CCodeBuilder builder) { //全局常量,变量 ConstDeclarations.GenerateCCode(builder); VarDeclarations.GenerateCCode(builder); //子函数声明 SubprogramDeclarations.GenerateCCode(builder); //main函数 builder.AddString(" int main(){"); CompoundStatement.GenerateCCode(builder); builder.AddString(" return 0;}"); } }