refactor: 优化 IRContext 类文档及代码结构

- 更新类文档,明确核心功能和使用场景
- 优化方法文档,提高代码可读性和易维护性
- 调整部分方法实现,如 newTempRegister,以简化用法
- 重新组织代码结构,提高逻辑清晰度
This commit is contained in:
Luke 2025-08-29 17:46:33 +08:00
parent 4b633bae70
commit 093e5a26b9

View File

@ -6,7 +6,7 @@ import org.jcnc.snow.compiler.ir.value.IRVirtualRegister;
/**
* IRContext 类负责封装当前正在构建的 IRFunction 实例
* {@code IRContext} 类负责封装当前正在构建的 IRFunction 实例
* 以及与之配套的作用域管理IRBuilderScope
* 并简化虚拟寄存器分配与 IR 指令添加操作
*
@ -16,104 +16,92 @@ import org.jcnc.snow.compiler.ir.value.IRVirtualRegister;
* <li>管理变量名与虚拟寄存器的映射关系</li>
* <li>分配新的虚拟寄存器实例</li>
* <li>将生成的 IRInstruction 自动添加到 IRFunction </li>
* <li>支持声明阶段临时类型记录如变量声明时的类型推断/校验</li>
* </ul>
* <b></b> 该类一般不直接暴露给最终用户仅供 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;
}
/**
* 获取当前函数的变量与寄存器映射作用域
*
* <p>包内可见: 仅限 builder 包内部使用
*
* @return IRBuilderScope 实例
* <p>包内可见仅限 builder 包内部调用避免被外部滥用</p>
*/
IRBuilderScope getScope() {
return scope;
}
/**
* 为当前函数分配一个新的虚拟寄存器
*
* @return 分配到的 IRVirtualRegister 对象
*/
/** 为当前函数分配一个新的虚拟寄存器。 */
public IRVirtualRegister newRegister() {
return function.newRegister();
}
/**
* 将指定的 IRInstruction 添加到当前 IRFunction 的指令列表中
*
* @param instr 要添加的 IRInstruction 实例
* 兼容用法分配一个临时虚拟寄存器
* <p>
* 目前直接委托给 {@link #newRegister()}便于老代码兼容与简单用法
* 若将来有命名/临时寄存器区分的需要可在此扩展实现
* </p>
*/
public IRVirtualRegister newTempRegister() {
return newRegister();
}
/** 将指定的 IRInstruction 添加到当前 IRFunction 的指令列表中。 */
public void addInstruction(IRInstruction instr) {
function.add(instr);
}
/** 生成一个形如 L0 / L1 ... 的唯一标签名 */
/**
* 生成一个唯一标签名 L0L1L2...
* <p>常用于条件跳转分支合流等 IR 控制流构建场景</p>
*
* @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;
}