From 49f91e3b4edb58e8ab8b1fe846126301704662bf Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 17 Jun 2025 18:34:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=8C=87=E4=BB=A4?= =?UTF-8?q?=E7=94=9F=E6=88=90=E5=99=A8=E9=9B=86=E4=B8=AD=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InstructionGeneratorProvider.java | 42 +++++++++++++++++++ .../jcnc/snow/compiler/cli/SnowCompiler.java | 26 +++++------- 2 files changed, 52 insertions(+), 16 deletions(-) create mode 100644 src/main/java/org/jcnc/snow/compiler/backend/generator/InstructionGeneratorProvider.java 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);