diff --git a/src/main/java/org/jcnc/snow/compiler/ir/builder/IRContext.java b/src/main/java/org/jcnc/snow/compiler/ir/builder/IRContext.java index ca870c0..e931ff5 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/builder/IRContext.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/builder/IRContext.java @@ -6,114 +6,102 @@ import org.jcnc.snow.compiler.ir.value.IRVirtualRegister; /** - * IRContext 类负责封装当前正在构建的 IRFunction 实例 + * {@code IRContext} 类负责封装当前正在构建的 IRFunction 实例 * 以及与之配套的作用域管理(IRBuilderScope), * 并简化虚拟寄存器分配与 IR 指令添加操作。 * - *

本类提供以下核心功能: + *

本类提供以下核心功能: *

+ * 注: 该类一般不直接暴露给最终用户,仅供 IR 构建器内部流程调用。 */ public class IRContext { - /* 生成唯一标签用 */ + /** label 自动生成计数器,用于保证唯一性 */ private int labelCounter = 0; - /** - * 当前正在构建的 IRFunction 对象,所有指令将添加至此 - */ + + /** 当前正在构建的 IRFunction 对象,所有 IR 指令均将添加至此 */ private final IRFunction function; - /** - * 用于管理当前函数作用域内变量与虚拟寄存器的映射 - */ + /** 用于管理当前函数作用域内变量与虚拟寄存器、类型等的映射关系 */ private final IRBuilderScope scope; - /** - * 当前声明变量的类型,不在声明变量时为空 - */ + /** 当前 declare 编译阶段变量类型,不在变量声明流程时为 null */ private String varType; /** - * 构造一个新的 IRContext,并将指定的 IRFunction 与作用域关联。 + * 构造一个新的 IRContext,并将指定的 IRFunction 与作用域管理器关联。 * - * @param function 要构建的 IRFunction 实例 + * @param function 要构建的 IRFunction 实例(不可为 null) */ public IRContext(IRFunction function) { this.function = function; this.scope = new IRBuilderScope(); - // 关联作用域与 IRFunction,以便在声明变量时申请寄存器 + // 作用域需知晓当前 IRFunction,以便为变量分配寄存器 this.scope.attachFunction(function); this.varType = null; } - /** - * 获取当前正在构建的 IRFunction 对象。 - * - * @return 当前 IRFunction 实例 - */ + /** 获取当前正在构建的 IRFunction 对象。 */ public IRFunction getFunction() { return function; } /** * 获取当前函数的变量与寄存器映射作用域。 - * - *

包内可见: 仅限 builder 包内部使用。 - * - * @return IRBuilderScope 实例 + *

包内可见,仅限 builder 包内部调用,避免被外部滥用。

*/ IRBuilderScope getScope() { return scope; } - /** - * 为当前函数分配一个新的虚拟寄存器。 - * - * @return 分配到的 IRVirtualRegister 对象 - */ + /** 为当前函数分配一个新的虚拟寄存器。 */ public IRVirtualRegister newRegister() { return function.newRegister(); } /** - * 将指定的 IRInstruction 添加到当前 IRFunction 的指令列表中。 - * - * @param instr 要添加的 IRInstruction 实例 + * 兼容用法:分配一个“临时虚拟寄存器”。 + *

+ * 目前直接委托给 {@link #newRegister()},便于老代码兼容与简单用法。 + * 若将来有命名/临时寄存器区分的需要,可在此扩展实现。 + *

*/ + public IRVirtualRegister newTempRegister() { + return newRegister(); + } + + /** 将指定的 IRInstruction 添加到当前 IRFunction 的指令列表中。 */ public void addInstruction(IRInstruction instr) { function.add(instr); } - /** 生成一个形如 L0 / L1 ... 的唯一标签名 */ + /** + * 生成一个唯一标签名,如 L0、L1、L2... + *

常用于条件跳转、分支合流等 IR 控制流构建场景。

+ * + * @return 形如 "L0", "L1" 等的唯一字符串标签 + */ public String newLabel() { return "L" + (labelCounter++); } - /** - * 获取当前 declare 编译阶段变量类型 - * - * @return 当前 declare 的变量类型 - */ + /** 获取当前 declare 编译阶段变量类型(声明流程中临时记录) */ public String getVarType() { return varType; } - /** - * 设置当前 declare 编译阶段变量类型 - * - */ + /** 设置当前 declare 编译阶段变量类型(一般在变量声明时赋值) */ public void setVarType(String type) { this.varType = type; } - /** - * 清除当前 declare 编译阶段变量类型 - * - */ + /** 清除当前 declare 编译阶段变量类型(声明流程结束时调用) */ public void clearVarType() { this.varType = null; }