From de21808c2ce2564562bb2911dbe3af88a69aa1c9 Mon Sep 17 00:00:00 2001 From: Luke Date: Wed, 7 May 2025 19:52:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A0=87=E8=AF=86=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compiler/ir/builder/FunctionBuilder.java | 14 ++++----- .../compiler/ir/builder/StatementBuilder.java | 31 ++++++++++--------- .../snow/compiler/ir/core/IRInstruction.java | 1 + 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/jcnc/snow/compiler/ir/builder/FunctionBuilder.java b/src/main/java/org/jcnc/snow/compiler/ir/builder/FunctionBuilder.java index f598d9b..1c096af 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/builder/FunctionBuilder.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/builder/FunctionBuilder.java @@ -21,24 +21,24 @@ public class FunctionBuilder { /** * 构建函数的 IR 表示 * - * @param fn 要构建的函数 AST 节点 + * @param functionNode 要构建的函数 AST 节点 * @return 构建完成的 IRFunction 对象 */ - public IRFunction build(FunctionNode fn) { + public IRFunction build(FunctionNode functionNode) { // 创建 IRFunction 并包装到上下文 - IRFunction irFunction = new IRFunction(fn.name()); + IRFunction irFunction = new IRFunction(functionNode.name()); IRContext irContext = new IRContext(irFunction); // 声明函数参数 - for (ParameterNode parameterNode : fn.parameters()) { + for (ParameterNode parameterNode : functionNode.parameters()) { // 在当前作用域中声明参数名称对应的虚拟寄存器 irContext.getScope().declare(parameterNode.name()); } // 使用 StatementBuilder 遍历并生成函数体所有语句的 IR - StatementBuilder sb = new StatementBuilder(irContext); - for (StatementNode statementNode : fn.body()) { - sb.build(statementNode); + StatementBuilder statementBuilder = new StatementBuilder(irContext); + for (StatementNode statementNode : functionNode.body()) { + statementBuilder.build(statementNode); } // 返回构建好的 IRFunction diff --git a/src/main/java/org/jcnc/snow/compiler/ir/builder/StatementBuilder.java b/src/main/java/org/jcnc/snow/compiler/ir/builder/StatementBuilder.java index 9feeade..19beba7 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/builder/StatementBuilder.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/builder/StatementBuilder.java @@ -5,6 +5,7 @@ import org.jcnc.snow.compiler.parser.ast.AssignmentNode; import org.jcnc.snow.compiler.parser.ast.DeclarationNode; import org.jcnc.snow.compiler.parser.ast.ExpressionStatementNode; import org.jcnc.snow.compiler.parser.ast.ReturnNode; +import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode; import org.jcnc.snow.compiler.parser.ast.base.StatementNode; /** @@ -22,18 +23,18 @@ import org.jcnc.snow.compiler.parser.ast.base.StatementNode; */ public class StatementBuilder { /** 当前的 IR 上下文,用于生成指令和管理作用域 */ - private final IRContext ctx; + private final IRContext irContext; /** 用于生成表达式对应的 IR 寄存器和指令的构建器 */ private final ExpressionBuilder exprBuilder; /** * 构造函数,初始化 IR 上下文并创建 ExpressionBuilder 实例。 * - * @param ctx IR 上下文对象,包含当前函数的作用域、指令列表等信息 + * @param irContext IR 上下文对象,包含当前函数的作用域、指令列表等信息 */ - public StatementBuilder(IRContext ctx) { - this.ctx = ctx; - this.exprBuilder = new ExpressionBuilder(ctx); + public StatementBuilder(IRContext irContext) { + this.irContext = irContext; + this.exprBuilder = new ExpressionBuilder(irContext); } /** @@ -51,21 +52,21 @@ public class StatementBuilder { public void build(StatementNode statementNode) { // 表达式语句: 仅生成表达式对应的 IR 指令,不关注结果 if (statementNode instanceof ExpressionStatementNode( - org.jcnc.snow.compiler.parser.ast.base.ExpressionNode expression)) { + ExpressionNode expression)) { exprBuilder.build(expression); return; } // 赋值语句: 先生成右侧表达式指令,获取寄存器,再声明或更新变量的值绑定 if (statementNode instanceof AssignmentNode( - String variable, org.jcnc.snow.compiler.parser.ast.base.ExpressionNode value + String variable, ExpressionNode value )) { IRVirtualRegister irVirtualRegister = exprBuilder.build(value); - if (ctx.getScope().lookup(variable) == null) { + if (irContext.getScope().lookup(variable) == null) { // 首次赋值:声明变量并绑定寄存器 - ctx.getScope().declare(variable, irVirtualRegister); + irContext.getScope().declare(variable, irVirtualRegister); } else { // 变量已存在:更新绑定的寄存器 - ctx.getScope().put(variable, irVirtualRegister); + irContext.getScope().put(variable, irVirtualRegister); } return; } @@ -73,19 +74,19 @@ public class StatementBuilder { if (statementNode instanceof DeclarationNode declarationNode) { if (declarationNode.getInitializer().isPresent()) { IRVirtualRegister irVirtualRegister = exprBuilder.build(declarationNode.getInitializer().get()); - ctx.getScope().declare(declarationNode.getName(), irVirtualRegister); + irContext.getScope().declare(declarationNode.getName(), irVirtualRegister); } else { - ctx.getScope().declare(declarationNode.getName()); + irContext.getScope().declare(declarationNode.getName()); } return; } // 返回语句: 区分有返回值和无返回值两种情况 if (statementNode instanceof ReturnNode returnNode) { if (returnNode.getExpression().isPresent()) { - IRVirtualRegister vr = exprBuilder.build(returnNode.getExpression().get()); - InstructionFactory.ret(ctx, vr); + IRVirtualRegister irVirtualRegister = exprBuilder.build(returnNode.getExpression().get()); + InstructionFactory.ret(irContext, irVirtualRegister); } else { - InstructionFactory.retVoid(ctx); + InstructionFactory.retVoid(irContext); } return; } diff --git a/src/main/java/org/jcnc/snow/compiler/ir/core/IRInstruction.java b/src/main/java/org/jcnc/snow/compiler/ir/core/IRInstruction.java index 8708068..a0a5379 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/core/IRInstruction.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/core/IRInstruction.java @@ -5,6 +5,7 @@ import org.jcnc.snow.compiler.ir.value.IRVirtualRegister; import java.util.List; /** + * * IRInstruction —— 所有 IR 指令的抽象基类(Abstract Base Class)。 *

* 每一条 IR 指令都至少具备以下基本属性: