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 7487aa4..5a94fde 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 @@ -4,6 +4,7 @@ import org.jcnc.snow.compiler.ir.core.IRFunction; import org.jcnc.snow.compiler.parser.ast.FunctionNode; import org.jcnc.snow.compiler.parser.ast.ParameterNode; import org.jcnc.snow.compiler.parser.ast.base.StatementNode; + /** * FunctionBuilder 负责将 AST 中的 FunctionNode 构建为可执行的 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 b257fd2..261898a 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 @@ -8,36 +8,68 @@ import org.jcnc.snow.compiler.parser.ast.ReturnNode; import org.jcnc.snow.compiler.parser.ast.base.StatementNode; /** - * 负责语句节点到 IR 的转换。 + * StatementBuilder 负责将解析器生成的语句 AST 节点(StatementNode) + * 转换为编译器中间表示(IR)中的指令序列。 + *
+ * 支持的语句类型包括: + *
+ * 每个 IRFunction 包含: + *
+ * func 方法名 {
+ * 指令1
+ * 指令2
+ * ...
+ * }
+ *
*
- * @return 函数的字符串表示
+ * @return 格式化后的函数字符串表示
*/
@Override
public String toString() {
@@ -86,4 +105,4 @@ public class IRFunction {
body.forEach(i -> sb.append(" ").append(i).append("\n"));
return sb.append('}').toString();
}
-}
+}
\ No newline at end of file
diff --git a/src/main/java/org/jcnc/snow/compiler/ir/core/IRProgram.java b/src/main/java/org/jcnc/snow/compiler/ir/core/IRProgram.java
index 779ea75..54f1d44 100644
--- a/src/main/java/org/jcnc/snow/compiler/ir/core/IRProgram.java
+++ b/src/main/java/org/jcnc/snow/compiler/ir/core/IRProgram.java
@@ -5,36 +5,36 @@ import java.util.Collections;
import java.util.List;
/**
- * IRProgram —— 表示一份完整的中间表示(IR)程序。
+ * IRProgram 表示一份完整的中间表示(IR)程序。
*
- * 每个 IRProgram 由多个函数(IRFunction)组成,
- * 是编译器后端生成目标代码的基础单位。
+ * 每个 IRProgram 由多个 IRFunction 组成,
+ * 是编译器后端进行目标代码生成的核心数据结构。
*/
public final class IRProgram {
- // 存储程序中所有函数的列表
+ /** 存储程序中所有函数的列表 */
private final List
- * 包括:
- * • IRVirtualRegister(虚拟寄存器)
- * • IRConstant(常量)
- * • IRLabel(跳转标签)
- *
- * 本接口使用 sealed 限定,明确列出所有允许实现它的子类型,
- * 保证类型安全,并便于在编译时做穷尽检查。
+ * 支持的具体类型包括:
+ *
+ * 支持的操作符由 IROpCode 定义,例如加法、减法、乘法、除法等。
+ * 将 lhs 和 rhs 两个操作数进行指定 OP 运算,并将结果存储到 dest 虚拟寄存器中。
*/
public final class BinaryOperationInstruction extends IRInstruction {
- // 二元操作符,例如加法、减法、乘法、除法等
+ /** 二元运算操作符,如 ADD、SUB、MUL、DIV 等 */
private final IROpCode op;
- // 存放运算结果的虚拟寄存器
+ /** 运算结果存放的目标虚拟寄存器 */
private final IRVirtualRegister dest;
- // 左操作数
+ /** 左操作数 */
private final IRValue lhs;
- // 右操作数
+ /** 右操作数 */
private final IRValue rhs;
/**
* 构造函数,创建一个二元运算指令实例。
*
- * @param op 运算操作符
- * @param dest 运算结果存放的目标寄存器
- * @param lhs 左侧操作数
- * @param rhs 右侧操作数
+ * @param op 指定的二元运算操作符
+ * @param dest 结果存放的目标虚拟寄存器
+ * @param lhs 左侧参与运算的操作数
+ * @param rhs 右侧参与运算的操作数
*/
public BinaryOperationInstruction(IROpCode op, IRVirtualRegister dest, IRValue lhs, IRValue rhs) {
this.op = op;
@@ -41,9 +42,9 @@ public final class BinaryOperationInstruction extends IRInstruction {
}
/**
- * 获取此指令对应的操作符。
+ * 获取指令的操作符。
*
- * @return 操作符
+ * @return 当前指令使用的 IROpCode 操作符
*/
@Override
public IROpCode op() {
@@ -53,7 +54,7 @@ public final class BinaryOperationInstruction extends IRInstruction {
/**
* 获取指令结果存放的目标寄存器。
*
- * @return 目标寄存器
+ * @return 目标虚拟寄存器
*/
@Override
public IRVirtualRegister dest() {
@@ -61,9 +62,9 @@ public final class BinaryOperationInstruction extends IRInstruction {
}
/**
- * 获取此指令所使用的操作数(左操作数和右操作数)。
+ * 获取指令使用的操作数列表。
*
- * @return 操作数列表
+ * @return 包含 lhs 和 rhs 的列表
*/
@Override
public List
+ * 将字面量常量 k 加载到目标虚拟寄存器 dest 中,以便后续指令使用该常量值。
*/
public final class LoadConstInstruction extends IRInstruction {
- // 要加载的常量值
+ /** 要加载的常量值 */
private final IRConstant k;
-
- // 存放常量的目标虚拟寄存器
+
+ /** 存放常量的目标虚拟寄存器 */
private final IRVirtualRegister dest;
/**
* 构造函数,创建一个常量加载指令实例。
*
- * @param dest 目标寄存器,用于存放常量
- * @param k 要加载的常量值
+ * @param dest 目标寄存器,用于存放常量值
+ * @param k 要加载的常量
*/
public LoadConstInstruction(IRVirtualRegister dest, IRConstant k) {
this.dest = dest;
@@ -44,7 +44,7 @@ public final class LoadConstInstruction extends IRInstruction {
/**
* 获取指令结果存放的目标寄存器。
*
- * @return 目标虚拟寄存器
+ * @return 存放常量的虚拟寄存器
*/
@Override
public IRVirtualRegister dest() {
@@ -52,9 +52,9 @@ public final class LoadConstInstruction extends IRInstruction {
}
/**
- * 获取此指令所用的操作数(只有一个常量)。
+ * 获取此指令的操作数列表,仅包含要加载的常量 k。
*
- * @return 仅包含常量 k 的操作数列表
+ * @return 包含常量 k 的单元素列表
*/
@Override
public List
- * - 如果是 void 返回(即没有返回值),val 为 null。
- * - 否则,返回指定寄存器中的值。
+ * 支持两种形式:
+ *
- * - dest:运算结果存放的目标寄存器
- * - OP:一元操作符(如取负、按位取反等)
- * - val:操作数
+ * 支持的操作符由 IROpCode 定义,例如:
+ *
+ * 示例:"v1 = NEG v2"
*
- * @return 字符串表示
+ * @return 指令的字符串形式,用于打印和调试
*/
@Override
public String toString() {
diff --git a/src/main/java/org/jcnc/snow/compiler/ir/value/IRConstant.java b/src/main/java/org/jcnc/snow/compiler/ir/value/IRConstant.java
index 180bcfd..7bf69c0 100644
--- a/src/main/java/org/jcnc/snow/compiler/ir/value/IRConstant.java
+++ b/src/main/java/org/jcnc/snow/compiler/ir/value/IRConstant.java
@@ -3,15 +3,16 @@ package org.jcnc.snow.compiler.ir.value;
import org.jcnc.snow.compiler.ir.core.IRValue;
/**
- * IRConstant 类 —— 表示一个常量值(例如整数常量、字符串常量等)。
+ * IRConstant 表示中间表示(IR)系统中的常量值。
*
- * 在中间表示(IR)中,常量通常是不可变的、直接使用的值,而不是寄存器或临时变量。
+ * 常量是不可变的字面量或编译期计算结果,
+ * 可以是整数、浮点数、字符串等类型。
+ * 在 IR 中,常量直接作为操作数使用,而不需要寄存器。
*/
public record IRConstant(Object value) implements IRValue {
/**
- * 将常量值转换为字符串表示。
- * 主要用于打印 IR 指令时显示常量内容。
+ * 将常量值转换为字符串表示,用于 IR 指令打印和调试。
*
* @return 常量的字符串形式
*/
diff --git a/src/main/java/org/jcnc/snow/compiler/ir/value/IRLabel.java b/src/main/java/org/jcnc/snow/compiler/ir/value/IRLabel.java
index a6e9e35..4ac77c5 100644
--- a/src/main/java/org/jcnc/snow/compiler/ir/value/IRLabel.java
+++ b/src/main/java/org/jcnc/snow/compiler/ir/value/IRLabel.java
@@ -3,20 +3,21 @@ package org.jcnc.snow.compiler.ir.value;
import org.jcnc.snow.compiler.ir.core.IRValue;
/**
- * IRLabel —— 表示 IR 中的跳转目标标签。
- *
- * 在中间表示(IR)中,控制流指令(如 JUMP、JUMP_IF_ZERO)需要依赖标签来指定跳转位置。
- * 本类通过名字(字符串)唯一标识一个标签。
- *
- * IRLabel 也是一种 IRValue,因此可以作为指令的操作数。
+ * IRLabel 表示中间表示(IR)系统中的跳转目标标签。
+ *
+ * 在控制流指令(如 JUMP、JUMP_IF_ZERO、JUMP_IF_NONZERO 等)中,
+ * 标签用于标识跳转目的地,确保程序执行流程的可控分支。
+ * 本类通过唯一的字符串名称 name 来标识一个标签实例。
+ *
+ * IRLabel 同时实现 IRValue 接口,可以直接作为操作数传递给 IRInstruction。
*/
public record IRLabel(String name) implements IRValue {
/**
- * 将标签转换为字符串形式。
- * 打印时在标签名后添加冒号,例如 "L1:"。
+ * 将标签转换为字符串表示,用于 IR 打印和调试。
+ * 格式为:name:,例如 "L1:"
*
- * @return 标签的字符串表示
+ * @return 带冒号的标签字符串
*/
@Override
public String toString() {
diff --git a/src/main/java/org/jcnc/snow/compiler/ir/value/IRVirtualRegister.java b/src/main/java/org/jcnc/snow/compiler/ir/value/IRVirtualRegister.java
index 54bf4fb..1dab9a1 100644
--- a/src/main/java/org/jcnc/snow/compiler/ir/value/IRVirtualRegister.java
+++ b/src/main/java/org/jcnc/snow/compiler/ir/value/IRVirtualRegister.java
@@ -3,26 +3,28 @@ package org.jcnc.snow.compiler.ir.value;
import org.jcnc.snow.compiler.ir.core.IRValue;
/**
- * IRVirtualRegister —— 表示一个 SSA(静态单赋值)虚拟寄存器。
- *
- * 在中间表示(IR)中,每个中间值都存储在一个虚拟寄存器中。
+ * IRVirtualRegister 表示一个静态单赋值(SSA)形式的虚拟寄存器。
*
+ * 在中间表示(IR)系统中,每个中间计算结果都分配到一个唯一的虚拟寄存器。
* 特点:
- * - 每个寄存器都有唯一的 id(通常由 IRBuilder 自动分配)
- * - 遵循 SSA 形式,即每个寄存器只被赋值一次
- *
- * IRVirtualRegister 也是一种 IRValue,可以作为指令的操作数。
+ *
+ *
+ *
+ * 本接口使用 sealed 限定,明确列出了所有允许的实现子类型,
+ * 有助于在编译期进行穷尽性对齐和类型安全检查。
*/
public sealed interface IRValue
permits IRVirtualRegister, IRConstant, IRLabel {
-}
+}
\ No newline at end of file
diff --git a/src/main/java/org/jcnc/snow/compiler/ir/instruction/BinaryOperationInstruction.java b/src/main/java/org/jcnc/snow/compiler/ir/instruction/BinaryOperationInstruction.java
index 7594c74..21455c6 100644
--- a/src/main/java/org/jcnc/snow/compiler/ir/instruction/BinaryOperationInstruction.java
+++ b/src/main/java/org/jcnc/snow/compiler/ir/instruction/BinaryOperationInstruction.java
@@ -8,30 +8,31 @@ import org.jcnc.snow.compiler.ir.value.IRVirtualRegister;
import java.util.List;
/**
- * 表示一个二元运算指令(Binary Operation Instruction)。
- * 格式为:dest = lhs (OP) rhs
- * 其中 dest 是结果寄存器,lhs 和 rhs 是操作数,OP 是操作符(如加法、减法等)。
+ * BinaryOperationInstruction 表示一个二元运算指令,格式:dest = lhs OP rhs
+ *
+ *
+ *
+ * 返回指令用于结束函数执行,并将可选的返回值传递给调用者。
*/
public final class ReturnInstruction extends IRInstruction {
- // 返回值对应的虚拟寄存器,如果是 void 返回则为 null
+ /**
+ * 要返回的虚拟寄存器;
+ * 如果是 void 返回,则为 null
+ */
private final IRVirtualRegister value;
/**
* 构造函数,创建一个返回指令实例。
*
- * @param value 要返回的虚拟寄存器,如果是 void 返回则传入 null
+ * @param value 要返回的寄存器;
+ * 如果函数不返回值(void),则传入 null
*/
public ReturnInstruction(IRVirtualRegister value) {
this.value = value;
@@ -38,9 +46,11 @@ public final class ReturnInstruction extends IRInstruction {
}
/**
- * 获取此指令的操作数列表。
- * - 如果是 void 返回,返回空列表;
- * - 否则,返回包含返回值寄存器的列表。
+ * 获取此指令的操作数列表:
+ *
+ *
*
* @return 操作数列表
*/
@@ -50,24 +60,27 @@ public final class ReturnInstruction extends IRInstruction {
}
/**
- * 获取要返回的值(虚拟寄存器)。
+ * 获取要返回的寄存器。
*
- * @return 返回值寄存器,或 null(表示 void 返回)
+ * @return 返回值寄存器;如果为 void 返回,则为 null
*/
public IRVirtualRegister value() {
return value;
}
/**
- * 将返回指令转换成字符串表示,用于调试和打印。
- * 格式示例:
- * - "RET" (无返回值)
- * - "RET v1"(返回寄存器 v1 的值)
+ * 将返回指令转换为字符串形式,便于打印和调试。
*
- * @return 字符串表示
+ * 格式:
+ *
+ *
+ *
+ * @return 指令的字符串表示
*/
@Override
public String toString() {
return value == null ? "RET" : "RET " + value;
}
-}
+}
\ No newline at end of file
diff --git a/src/main/java/org/jcnc/snow/compiler/ir/instruction/UnaryOperationInstruction.java b/src/main/java/org/jcnc/snow/compiler/ir/instruction/UnaryOperationInstruction.java
index 99e9ec9..540fc0d 100644
--- a/src/main/java/org/jcnc/snow/compiler/ir/instruction/UnaryOperationInstruction.java
+++ b/src/main/java/org/jcnc/snow/compiler/ir/instruction/UnaryOperationInstruction.java
@@ -8,29 +8,32 @@ import org.jcnc.snow.compiler.ir.value.IRVirtualRegister;
import java.util.List;
/**
- * 表示一元运算指令(Unary Operation Instruction)。
- * 格式为:dest = OP val
+ * UnaryOperationInstruction 表示一个一元运算指令,格式:dest = OP val
*
+ *
+ *
+ * 将单一操作数 val 进行指定 OP 运算,并将结果存储到目标寄存器 dest。
*/
public final class UnaryOperationInstruction extends IRInstruction {
- // 一元操作符,例如 NEG(取负)、NOT(逻辑非)等
+ /** 一元运算操作符,如 NEG、NOT 等 */
private final IROpCode op;
- // 运算结果存放的目标虚拟寄存器
+ /** 运算结果存放的目标虚拟寄存器 */
private final IRVirtualRegister dest;
- // 一元运算的操作数
+ /** 一元运算的操作数 */
private final IRValue val;
/**
* 构造函数,创建一个一元运算指令实例。
*
- * @param op 一元操作符
- * @param dest 结果存放的目标寄存器
- * @param val 操作数
+ * @param op 指定的一元操作符
+ * @param dest 运算结果存放的目标寄存器
+ * @param val 参与运算的操作数
*/
public UnaryOperationInstruction(IROpCode op, IRVirtualRegister dest, IRValue val) {
this.op = op;
@@ -41,7 +44,7 @@ public final class UnaryOperationInstruction extends IRInstruction {
/**
* 获取此指令对应的操作符。
*
- * @return 一元操作符
+ * @return 当前指令使用的一元操作符
*/
@Override
public IROpCode op() {
@@ -59,9 +62,9 @@ public final class UnaryOperationInstruction extends IRInstruction {
}
/**
- * 获取此指令所使用的操作数(只有一个操作数)。
+ * 获取此指令的操作数列表,仅包含一个操作数 val。
*
- * @return 仅包含 val 的操作数列表
+ * @return 单元素列表,其中元素为 val
*/
@Override
public List
+ *
+ *
+ * IRVirtualRegister 同时实现 IRValue 接口,可作为 IRInstruction 的操作数。
+ *
+ * @param id 寄存器的唯一编号
*/
public record IRVirtualRegister(int id) implements IRValue {
/**
- * 将虚拟寄存器转换为字符串形式。
- * 通常以 % 开头,例如 "%0"、"%1"。
+ * 将虚拟寄存器转换为字符串表示,格式为 "%