diff --git a/src/main/java/org/jcnc/snow/compiler/backend/generator/InstructionGeneratorProvider.java b/src/main/java/org/jcnc/snow/compiler/backend/generator/InstructionGeneratorProvider.java
new file mode 100644
index 0000000..2b2517d
--- /dev/null
+++ b/src/main/java/org/jcnc/snow/compiler/backend/generator/InstructionGeneratorProvider.java
@@ -0,0 +1,42 @@
+package org.jcnc.snow.compiler.backend.generator;
+
+import org.jcnc.snow.compiler.backend.core.InstructionGenerator;
+import org.jcnc.snow.compiler.ir.core.IRInstruction;
+
+import java.util.List;
+
+/**
+ * 指令生成器集中注册表。
+ *
+ *
本类在类加载阶段即完成所有后端 {@link InstructionGenerator} 实例
+ * 的创建,并以不可变列表形式对外暴露。
+ */
+public final class InstructionGeneratorProvider {
+
+ /** 工具类禁止实例化。 */
+ private InstructionGeneratorProvider() { /* no-instance */ }
+
+ /** 缺省指令生成器列表(不可修改,顺序即执行顺序)。 */
+ private static final List> DEFAULT =
+ List.of(
+ new LoadConstGenerator(), // 常量加载
+ new BinaryOpGenerator(), // 二元运算
+ new UnaryOpGenerator(), // 一元运算
+ new CallGenerator(), // 函数调用
+ new ReturnGenerator(), // 函数返回
+ new LabelGenerator(), // 标签定义
+ new JumpGenerator(), // 无条件跳转
+ new CmpJumpGenerator() // 条件跳转
+ );
+
+ /**
+ * 返回生产环境使用的缺省指令生成器列表。
+ * 该列表为不可变集合,如尝试修改将抛出
+ * {@link UnsupportedOperationException}。
+ *
+ * @return 不可变的 {@code List} 实例
+ */
+ public static List> defaultGenerators() {
+ return DEFAULT;
+ }
+}
diff --git a/src/main/java/org/jcnc/snow/compiler/cli/SnowCompiler.java b/src/main/java/org/jcnc/snow/compiler/cli/SnowCompiler.java
index fa0831a..512da03 100644
--- a/src/main/java/org/jcnc/snow/compiler/cli/SnowCompiler.java
+++ b/src/main/java/org/jcnc/snow/compiler/cli/SnowCompiler.java
@@ -4,11 +4,12 @@ import org.jcnc.snow.compiler.backend.alloc.RegisterAllocator;
import org.jcnc.snow.compiler.backend.builder.VMCodeGenerator;
import org.jcnc.snow.compiler.backend.builder.VMProgramBuilder;
import org.jcnc.snow.compiler.backend.core.InstructionGenerator;
-import org.jcnc.snow.compiler.backend.generator.*;
+import org.jcnc.snow.compiler.backend.generator.InstructionGeneratorProvider;
import org.jcnc.snow.compiler.ir.builder.IRProgramBuilder;
import org.jcnc.snow.compiler.ir.core.IRFunction;
import org.jcnc.snow.compiler.ir.core.IRInstruction;
import org.jcnc.snow.compiler.ir.core.IRProgram;
+import org.jcnc.snow.compiler.ir.value.IRVirtualRegister;
import org.jcnc.snow.compiler.lexer.core.LexerEngine;
import org.jcnc.snow.compiler.parser.ast.base.Node;
import org.jcnc.snow.compiler.parser.context.ParserContext;
@@ -20,7 +21,8 @@ import org.jcnc.snow.vm.engine.VirtualMachineEngine;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
-import java.nio.file.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.util.*;
/**
@@ -78,19 +80,10 @@ public class SnowCompiler {
/* ---------- 5. IR → VM 指令 ---------- */
VMProgramBuilder builder = new VMProgramBuilder();
- List> generators = Arrays.asList(
- new LoadConstGenerator(),
- new BinaryOpGenerator(),
- new UnaryOpGenerator(),
- new CallGenerator(),
- new ReturnGenerator(),
- new LabelGenerator(),
- new JumpGenerator(),
- new CmpJumpGenerator()
- );
+ List> generators = InstructionGeneratorProvider.defaultGenerators();
for (IRFunction fn : program.functions()) {
- Map slotMap =
+ Map slotMap =
new RegisterAllocator().allocate(fn);
new VMCodeGenerator(slotMap, builder, generators).generate(fn);
}
@@ -108,8 +101,8 @@ public class SnowCompiler {
/**
* 根据参数收集待编译文件:
- * - snow file1 file2 … ← 多文件 / 单文件
- * - snow -d srcDir ← 目录递归所有 *.snow
+ * - snow file1 file2 … ← 多文件 / 单文件
+ * - snow -d srcDir ← 目录递归所有 *.snow
*/
private static List collectSources(String[] args) throws IOException {
if (args.length == 2 && "-d".equals(args[0])) {
@@ -137,7 +130,8 @@ public class SnowCompiler {
int idx = -1;
for (int i = 0; i < ordered.size(); i++) {
if ("main".equals(ordered.get(i).name())) {
- idx = i; break;
+ idx = i;
+ break;
}
}
if (idx > 0) Collections.swap(ordered, 0, idx);