增加注释

This commit is contained in:
Luke 2025-05-11 23:11:10 +08:00
parent 965b1a1add
commit c0d47ae3ef
5 changed files with 90 additions and 75 deletions

View File

@ -8,8 +8,8 @@ import org.jcnc.snow.compiler.parser.ast.base.StatementNode;
/**
* FunctionBuilder 负责将 AST 中的 FunctionNode 构建为可执行的 IRFunction
*
* <p>构建流程
* <p>
* 构建流程
* <ol>
* <li>创建 IRFunction 实例并初始化 IRContext</li>
* <li>将函数签名中的参数声明为虚拟寄存器</li>

View File

@ -7,38 +7,43 @@ import java.util.HashMap;
import java.util.Map;
/**
* IRBuilderScope 用于管理单个函数的变量名与虚拟寄存器的映射
* IRBuilderScope 用于管理单个函数内变量名与虚拟寄存器的映射关系
*
* <p>功能
* <p>主要功能包括
* <ul>
* <li>维护变量声明后的寄存器分配</li>
* <li>支持将已有寄存器与变量重新绑定</li>
* <li>根据变量名查找对应的虚拟寄存器</li>
* <li>维护在当前作用域中已声明变量的寄存器分配信息</li>
* <li>支持将已有虚拟寄存器与变量重新绑定</li>
* <li>根据变量名查找对应的虚拟寄存器实例</li>
* </ul>
*/
final class IRBuilderScope {
/** 存储变量名到 IRVirtualRegister 的映射 */
/**
* 存储变量名到对应 IRVirtualRegister 的映射
* 变量名为键虚拟寄存器对象为值用于查找和更新
*/
private final Map<String, IRVirtualRegister> vars = new HashMap<>();
/**
* 当前作用域所属的 IRFunction用于分配新的寄存器
* 当前作用域所绑定的 IRFunction 对象用于申请新的虚拟寄存器
*/
private IRFunction fn;
/**
* 关联一个 IRFunction 到当前作用域用于后续寄存器分配
* 将指定的 IRFunction 关联到当前作用域以便后续声明变量时能够
* 调用该函数的 newRegister() 方法生成新的寄存器
*
* @param fn 要绑定 IRFunction 实例
* @param fn 要绑定到本作用域 IRFunction 实例
*/
void attachFunction(IRFunction fn) {
this.fn = fn;
}
/**
* 声明一个新变量并为其分配一个新的虚拟寄存器
* 在当前作用域中声明一个新变量并为其分配一个新的虚拟寄存器
* 调用绑定的 IRFunction.newRegister() 生成寄存器后保存到映射表中
*
* @param name 变量名
* @param name 变量名作为映射键使用
*/
void declare(String name) {
IRVirtualRegister reg = fn.newRegister();
@ -46,30 +51,33 @@ final class IRBuilderScope {
}
/**
* 声明或导入一个已有寄存器到当前作用域
* 在当前作用域中声明或导入一个已有的虚拟寄存器并将其与指定变量名绑定
* 该方法可用于将外部或前一作用域的寄存器导入到本作用域
*
* @param name 变量名
* @param reg 对应的虚拟寄存器
* @param name 变量名作为映射键使用
* @param reg 要绑定到该名称的 IRVirtualRegister 实例
*/
void declare(String name, IRVirtualRegister reg) {
vars.put(name, reg);
}
/**
* 更新已声明变量对应的虚拟寄存器
* 更新已存在变量的虚拟寄存器绑定关系若变量已声明则替换其对应的寄存器
* 若尚未声明则等同于声明新变量
*
* @param name 变量名
* @param reg 新的虚拟寄存器
* @param name 变量名作为映射键使用
* @param reg 新的 IRVirtualRegister 实例用于替换旧绑定
*/
void put(String name, IRVirtualRegister reg) {
vars.put(name, reg);
}
/**
* 根据变量名查找对应的虚拟寄存器
* 根据变量名称在当前作用域中查找对应的虚拟寄存器
*
* @param name 变量名
* @return 对应的 IRVirtualRegister若未声明则返回 null
* @param name 需要查询的变量名称
* @return 如果该名称已绑定寄存器则返回对应的 IRVirtualRegister
* 如果未声明则返回 null
*/
IRVirtualRegister lookup(String name) {
return vars.get(name);

View File

@ -5,71 +5,74 @@ import org.jcnc.snow.compiler.ir.core.IRInstruction;
import org.jcnc.snow.compiler.ir.value.IRVirtualRegister;
/**
* IRContext 封装了当前函数的 IRFunction 实例和作用域管理IRBuilderScope
* 并提供分配寄存器和添加 IR 指令的便利方法
* IRContext 类负责封装当前正在构建的 IRFunction 实例
* 以及与之配套的作用域管理IRBuilderScope
* 并简化虚拟寄存器分配与 IR 指令添加操作
*
* <p>主要功能
* <p>本类提供以下核心功能
* <ul>
* <li>持有正在构建的 IRFunction 对象</li>
* <li>管理变量名到虚拟寄存器的映射作用域</li>
* <li>分配新的虚拟寄存器</li>
* <li>将生成的 IRInstruction 自动添加到 IRFunction</li>
* <li>持有并操作当前 IRFunction 对象</li>
* <li>管理变量名与虚拟寄存器的映射关系</li>
* <li>分配新的虚拟寄存器实例</li>
* <li>将生成的 IRInstruction 自动添加到 IRFunction </li>
* </ul>
*/
public class IRContext {
/**
* 正在构建的 IRFunction 对象
* 当前正在构建的 IRFunction 对象所有指令将添加至此
*/
private final IRFunction function;
/**
* 管理变量和寄存器映射的作用域
*/
private final IRBuilderScope IRBuilderScope;
/**
* 构造 IRContext并绑定要构建的 IRFunction
* 用于管理当前函数作用域内变量与虚拟寄存器的映射
*/
private final IRBuilderScope scope;
/**
* 构造一个新的 IRContext并将指定的 IRFunction 与作用域关联
*
* @param function 要构建的 IRFunction 对象
* @param function 要构建的 IRFunction 实例
*/
public IRContext(IRFunction function) {
this.function = function;
this.IRBuilderScope = new IRBuilderScope();
// IRFunction 与作用域关联以便指令生成时使用
this.IRBuilderScope.attachFunction(function);
this.scope = new IRBuilderScope();
// 关联作用域与 IRFunction以便在声明变量时申请寄存器
this.scope.attachFunction(function);
}
/**
* 获取当前 IRFunction
* 获取当前正在构建的 IRFunction 对象
*
* @return 当前正在构建的 IRFunction 对象
* @return 当前 IRFunction 实例
*/
public IRFunction getFunction() {
return function;
}
/**
* 获取当前作用域用于变量声明和查找
* 获取当前函数的变量与寄存器映射作用域
*
* @return 作用域对象 IRBuilderScope
* <p>包内可见仅限 builder 包内部使用
*
* @return IRBuilderScope 实例
*/
/* 包内可见:仅在 builder 包内部使用 IRBuilderScope */
IRBuilderScope getScope() {
return IRBuilderScope;
return scope;
}
/**
* 分配一个新的虚拟寄存器
* 为当前函数分配一个新的虚拟寄存器
*
* @return 分配的 IRVirtualRegister 对象
* @return 分配 IRVirtualRegister 对象
*/
public IRVirtualRegister newRegister() {
return function.newRegister();
}
/**
* 定的 IRInstruction 添加到 IRFunction
* 定的 IRInstruction 添加到当前 IRFunction 的指令列表
*
* @param instr 要添加的 IR 指令
* @param instr 要添加的 IRInstruction 实例
*/
public void addInstruction(IRInstruction instr) {
function.add(instr);

View File

@ -10,66 +10,70 @@ import org.jcnc.snow.compiler.parser.ast.base.StatementNode;
import java.util.List;
/**
* IRProgramBuilder 用于将 AST 根节点列表构建为 IRProgram
* 本类负责将解析生成的 AST 根节点列表转换为可执行的 IRProgram
*
* <p>功能
* <p>主要职责
* <ul>
* <li>遍历顶层节点识别模块函数或顶层语句</li>
* <li>将函数节点转换为 IRFunction 并添加到 IRProgram</li>
* <li>对脚本式顶层语句自动包装为特殊的 _start 函数</li>
* <li>遍历输入的顶层节点识别 ModuleNodeFunctionNode 及脚本式顶层 StatementNode</li>
* <li> ModuleNode 中的所有函数节点调用 FunctionBuilder 构建 IRFunction 并添加至 IRProgram</li>
* <li>对单独的 FunctionNode 节点直接构建并纳入 IRProgram</li>
* <li>对顶层脚本式 StatementNode 自动封装为名称固定的_start函数再行构建并纳入 IRProgram</li>
* <li>对不支持的节点类型抛出 IllegalStateException以确保编译流程严谨</li>
* </ul>
*/
public final class IRProgramBuilder {
/**
* 构建一个完整的 IRProgram
* 构建完整的 IRProgram 实例
*
* @param roots AST 根节点列表可包 ModuleNodeFunctionNode StatementNode
* @return 构建好的 IRProgram 实例
* @throws IllegalStateException 遇到不支持的顶层节点时抛出
* @param roots ModuleNodeFunctionNode StatementNode 的顶层 AST 根节点列表
* @return 包含所有转换后 IRFunction IRProgram 对象
* @throws IllegalStateException 遇到不支持的顶层节点类型时抛出
*/
public IRProgram buildProgram(List<Node> roots) {
IRProgram irProgram = new IRProgram();
for (Node node : roots) {
switch (node) {
case ModuleNode moduleNode ->
// 模块节点将模块内的所有函数加入程序
// 模块节点批量构建并添加模块内所有函数
moduleNode.functions().forEach(f -> irProgram.add(buildFunction(f)));
case FunctionNode f ->
// 顶层函数节点
irProgram.add(buildFunction(f));
case FunctionNode functionNode ->
// 顶层函数节点直接构建并添加
irProgram.add(buildFunction(functionNode));
case StatementNode statementNode ->
// 顶层脚本语句包装为 _start 函数
// 脚本式顶层语句封装为_start函数后构建并添加
irProgram.add(buildFunction(wrapTopLevel(statementNode)));
case null, default -> throw new IllegalStateException("Unsupported top-level node: " + node);
default ->
// 严格校验节点类型遇不支持者立即失败
throw new IllegalStateException("Unsupported top-level node: " + node);
}
}
return irProgram;
}
/**
* 使用 FunctionBuilder 构建 IRFunction
* 利用 FunctionBuilder FunctionNode 转换为 IRFunction
*
* @param functionNode AST 中的 FunctionNode
* @return 构建完成的 IRFunction
* @param functionNode 待构建的 AST FunctionNode
* @return 构建完成的 IRFunction 实例
*/
private IRFunction buildFunction(FunctionNode functionNode) {
return new FunctionBuilder().build(functionNode);
}
/**
* 顶层脚本式语句包装为名为 _start FunctionNode
* 单个脚本式顶层 StatementNode 封装为名称固定的_start函数节点
*
* <p>构造参数说明
* <p>封装规则
* <ul>
* <li>函数名固定为 "_start"</li>
* <li>返回类型设为 null表示类型推断或默认处理</li>
* <li>函数名固定为_start</li>
* <li>返回类型设为 null由后续流程处理</li>
* <li>参数列表为空</li>
* <li>函数体仅包含给定的单条语句</li>
* <li>函数主体仅包含传入的单条语句</li>
* </ul>
*
* @param stmt 要包装的顶层语句节点
* @return 新建的 FunctionNode
* @param stmt 待封装的顶层脚本语句节点
* @return 生成的 FunctionNode用于后续 IRFunction 构建
*/
private FunctionNode wrapTopLevel(StatementNode stmt) {
return new FunctionNode("_start", null, String.valueOf(List.of()), List.of(stmt));

View File

@ -10,7 +10,7 @@ import org.jcnc.snow.compiler.ir.value.IRVirtualRegister;
/**
* InstructionFactory 统一管理 IR 指令的创建并自动将生成的指令添加到上下文中
*
* <p>提供的功能包括
* <p>主要功能包括
* <ul>
* <li>生成加载常量指令LoadConstInstruction</li>
* <li>生成二元运算指令BinaryOperationInstruction</li>