From f741bdaa3a969fdad1735aa8f9c5d39d35911619 Mon Sep 17 00:00:00 2001 From: Luke Date: Wed, 7 May 2025 17:24:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=90=8D=E8=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compiler/backend/RegisterAllocator.java | 8 ++--- .../compiler/backend/VMCodeGenerator.java | 28 +++++++-------- .../jcnc/snow/compiler/cli/SnowCompiler.java | 4 +-- .../ir/builder/ExpressionBuilder.java | 30 ++++++++-------- .../{Scope.java => IRBuilderScope.java} | 20 +++++------ .../snow/compiler/ir/builder/IRContext.java | 23 ++++++------ ...gramBuilder.java => IRProgramBuilder.java} | 4 +-- ...trFactory.java => InstructionFactory.java} | 36 +++++++++---------- .../compiler/ir/builder/StatementBuilder.java | 12 +++---- .../snow/compiler/ir/core/IRFunction.java | 6 ++-- .../snow/compiler/ir/core/IRInstruction.java | 8 ++--- .../ir/core/{IROp.java => IROpCode.java} | 8 ++--- .../jcnc/snow/compiler/ir/core/IRValue.java | 14 ++++---- .../BinaryOperationInstruction.java} | 18 +++++----- .../LoadConstInstruction.java | 24 ++++++------- .../ReturnInstruction.java | 18 +++++----- .../UnaryOperationInstruction.java} | 18 +++++----- .../value/{Constant.java => IRConstant.java} | 4 +-- .../ir/value/{Label.java => IRLabel.java} | 6 ++-- ...alRegister.java => IRVirtualRegister.java} | 6 ++-- 20 files changed, 147 insertions(+), 148 deletions(-) rename src/main/java/org/jcnc/snow/compiler/ir/builder/{Scope.java => IRBuilderScope.java} (71%) rename src/main/java/org/jcnc/snow/compiler/ir/builder/{ProgramBuilder.java => IRProgramBuilder.java} (96%) rename src/main/java/org/jcnc/snow/compiler/ir/builder/{InstrFactory.java => InstructionFactory.java} (56%) rename src/main/java/org/jcnc/snow/compiler/ir/core/{IROp.java => IROpCode.java} (87%) rename src/main/java/org/jcnc/snow/compiler/ir/{instr/BinOpInstruction.java => instruction/BinaryOperationInstruction.java} (78%) rename src/main/java/org/jcnc/snow/compiler/ir/{instr => instruction}/LoadConstInstruction.java (70%) rename src/main/java/org/jcnc/snow/compiler/ir/{instr => instruction}/ReturnInstruction.java (80%) rename src/main/java/org/jcnc/snow/compiler/ir/{instr/UnaryOpInstruction.java => instruction/UnaryOperationInstruction.java} (78%) rename src/main/java/org/jcnc/snow/compiler/ir/value/{Constant.java => IRConstant.java} (75%) rename src/main/java/org/jcnc/snow/compiler/ir/value/{Label.java => IRLabel.java} (74%) rename src/main/java/org/jcnc/snow/compiler/ir/value/{VirtualRegister.java => IRVirtualRegister.java} (73%) diff --git a/src/main/java/org/jcnc/snow/compiler/backend/RegisterAllocator.java b/src/main/java/org/jcnc/snow/compiler/backend/RegisterAllocator.java index 4521b32..970ea1e 100644 --- a/src/main/java/org/jcnc/snow/compiler/backend/RegisterAllocator.java +++ b/src/main/java/org/jcnc/snow/compiler/backend/RegisterAllocator.java @@ -5,21 +5,21 @@ package org.jcnc.snow.compiler.backend; import org.jcnc.snow.compiler.ir.core.IRFunction; import org.jcnc.snow.compiler.ir.core.IRInstruction; import org.jcnc.snow.compiler.ir.core.IRValue; -import org.jcnc.snow.compiler.ir.value.VirtualRegister; +import org.jcnc.snow.compiler.ir.value.IRVirtualRegister; import java.util.HashMap; import java.util.Map; /** 线性扫描寄存器分配(演示级) */ public final class RegisterAllocator { - private final Map map = new HashMap<>(); + private final Map map = new HashMap<>(); - public Map allocate(IRFunction fn){ + public Map allocate(IRFunction fn){ int next = 0; for (IRInstruction i : fn.body()){ if(i.dest()!=null && !map.containsKey(i.dest())) map.put(i.dest(), next++); for(IRValue v : i.operands()) - if(v instanceof VirtualRegister r && !map.containsKey(r)) map.put(r, next++); + if(v instanceof IRVirtualRegister r && !map.containsKey(r)) map.put(r, next++); } return map; } diff --git a/src/main/java/org/jcnc/snow/compiler/backend/VMCodeGenerator.java b/src/main/java/org/jcnc/snow/compiler/backend/VMCodeGenerator.java index 3acbdf8..92d2d80 100644 --- a/src/main/java/org/jcnc/snow/compiler/backend/VMCodeGenerator.java +++ b/src/main/java/org/jcnc/snow/compiler/backend/VMCodeGenerator.java @@ -2,9 +2,9 @@ package org.jcnc.snow.compiler.backend; import org.jcnc.snow.compiler.ir.core.IRFunction; import org.jcnc.snow.compiler.ir.core.IRInstruction; -import org.jcnc.snow.compiler.ir.instr.*; -import org.jcnc.snow.compiler.ir.value.Constant; -import org.jcnc.snow.compiler.ir.value.VirtualRegister; +import org.jcnc.snow.compiler.ir.instruction.*; +import org.jcnc.snow.compiler.ir.value.IRConstant; +import org.jcnc.snow.compiler.ir.value.IRVirtualRegister; import org.jcnc.snow.vm.engine.VMOpCode; import java.lang.reflect.Field; @@ -18,12 +18,12 @@ import java.util.Map; */ public final class VMCodeGenerator { - private final Map slotMap; + private final Map slotMap; private final List code = new ArrayList<>(); private String currentFnName; // ← 当前正在生成的函数名 - public VMCodeGenerator(Map slotMap){ + public VMCodeGenerator(Map slotMap){ this.slotMap = slotMap; } @@ -34,8 +34,8 @@ public final class VMCodeGenerator { for (IRInstruction inst : fn.body()) { switch (inst) { case LoadConstInstruction c -> genLoadConst(c); - case BinOpInstruction b -> genBinOp(b); - case UnaryOpInstruction u -> genUnary(u); + case BinaryOperationInstruction b -> genBinOp(b); + case UnaryOperationInstruction u -> genUnary(u); case ReturnInstruction r -> genRet(r); default -> throw new IllegalStateException("Unsupported IR: "+inst); } @@ -47,14 +47,14 @@ public final class VMCodeGenerator { /* ───────────── 指令生成 ───────────── */ private void genLoadConst(LoadConstInstruction c){ - Constant k = (Constant)c.operands().get(0); + IRConstant k = (IRConstant)c.operands().get(0); emit(op("I_PUSH"), k.value().toString()); emit(op("I_STORE"), slot(c.dest())+""); } - private void genBinOp(BinOpInstruction b){ - emit(op("I_LOAD"), slot((VirtualRegister)b.operands().get(0))+""); - emit(op("I_LOAD"), slot((VirtualRegister)b.operands().get(1))+""); + private void genBinOp(BinaryOperationInstruction b){ + emit(op("I_LOAD"), slot((IRVirtualRegister)b.operands().get(0))+""); + emit(op("I_LOAD"), slot((IRVirtualRegister)b.operands().get(1))+""); String opcode = switch (b.op()){ case ADD_I32 -> "I_ADD"; @@ -67,8 +67,8 @@ public final class VMCodeGenerator { emit(op("I_STORE"), slot(b.dest())+""); } - private void genUnary(UnaryOpInstruction u){ - emit(op("I_LOAD"), slot((VirtualRegister)u.operands().get(0))+""); + private void genUnary(UnaryOperationInstruction u){ + emit(op("I_LOAD"), slot((IRVirtualRegister)u.operands().get(0))+""); String opcode = switch (u.op()){ case NEG_I32 -> "I_NEG"; @@ -97,7 +97,7 @@ public final class VMCodeGenerator { /* ───────────── 工具函数 ───────────── */ - private int slot(VirtualRegister r){ + private int slot(IRVirtualRegister r){ Integer s = slotMap.get(r); if (s == null) throw new IllegalStateException("Register "+r+" 未映射槽位"); return s; 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 5ca20ce..79a0a6c 100644 --- a/src/main/java/org/jcnc/snow/compiler/cli/SnowCompiler.java +++ b/src/main/java/org/jcnc/snow/compiler/cli/SnowCompiler.java @@ -2,7 +2,7 @@ package org.jcnc.snow.compiler.cli; import org.jcnc.snow.compiler.backend.RegisterAllocator; import org.jcnc.snow.compiler.backend.VMCodeGenerator; -import org.jcnc.snow.compiler.ir.builder.ProgramBuilder; +import org.jcnc.snow.compiler.ir.builder.IRProgramBuilder; import org.jcnc.snow.compiler.ir.core.IRFunction; import org.jcnc.snow.compiler.ir.core.IRProgram; import org.jcnc.snow.compiler.lexer.core.LexerEngine; @@ -55,7 +55,7 @@ public class SnowCompiler { SemanticAnalyzerRunner.runSemanticAnalysis(ast, false); /* 4. AST → IRProgram */ - IRProgram program = new ProgramBuilder().buildProgram(ast); + IRProgram program = new IRProgramBuilder().buildProgram(ast); System.out.println("=== IR ==="); System.out.println(program); diff --git a/src/main/java/org/jcnc/snow/compiler/ir/builder/ExpressionBuilder.java b/src/main/java/org/jcnc/snow/compiler/ir/builder/ExpressionBuilder.java index 1d8f1fd..c5b5c1f 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/builder/ExpressionBuilder.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/builder/ExpressionBuilder.java @@ -1,7 +1,7 @@ package org.jcnc.snow.compiler.ir.builder; -import org.jcnc.snow.compiler.ir.core.IROp; -import org.jcnc.snow.compiler.ir.value.VirtualRegister; +import org.jcnc.snow.compiler.ir.core.IROpCode; +import org.jcnc.snow.compiler.ir.value.IRVirtualRegister; import org.jcnc.snow.compiler.parser.ast.BinaryExpressionNode; import org.jcnc.snow.compiler.parser.ast.IdentifierNode; import org.jcnc.snow.compiler.parser.ast.NumberLiteralNode; @@ -23,15 +23,15 @@ public class ExpressionBuilder { /** * 操作符到 IR 操作码的映射表 */ - private static final Map OP_MAP = Map.of( - "+", IROp.ADD_I32, - "-", IROp.SUB_I32, - "*", IROp.MUL_I32, - "/", IROp.DIV_I32 + private static final Map OP_MAP = Map.of( + "+", IROpCode.ADD_I32, + "-", IROpCode.SUB_I32, + "*", IROpCode.MUL_I32, + "/", IROpCode.DIV_I32 ); /** - * 当前 IR 构建上下文,包含 IRFunction 和 Scope + * 当前 IR 构建上下文,包含 IRFunction 和 IRBuilderScope */ private final IRContext ctx; @@ -51,17 +51,17 @@ public class ExpressionBuilder { * @return 存放表达式计算结果的虚拟寄存器 * @throws IllegalStateException 若遇到不支持的表达式节点或未定义变量 */ - public VirtualRegister build(ExpressionNode expr) { + public IRVirtualRegister build(ExpressionNode expr) { // 处理数字常量 if (expr instanceof NumberLiteralNode(String value)) { int v = Integer.parseInt(value); // 生成加载常量指令并返回结果寄存器 - return InstrFactory.loadConst(ctx, v); + return InstructionFactory.loadConst(ctx, v); } // 处理变量引用 if (expr instanceof IdentifierNode(String name)) { // 从作用域查找已声明的寄存器 - VirtualRegister vr = ctx.getScope().lookup(name); + IRVirtualRegister vr = ctx.getScope().lookup(name); if (vr == null) { throw new IllegalStateException("未定义的变量: " + name); } @@ -70,15 +70,15 @@ public class ExpressionBuilder { // 处理二元表达式 if (expr instanceof BinaryExpressionNode(ExpressionNode left, String operator, ExpressionNode right)) { // 递归构建左、右子表达式 - VirtualRegister l = build(left); - VirtualRegister r = build(right); + IRVirtualRegister l = build(left); + IRVirtualRegister r = build(right); // 根据操作符获取 IR 操作码 - IROp op = OP_MAP.get(operator); + IROpCode op = OP_MAP.get(operator); if (op == null) { throw new IllegalStateException("不支持的运算符: " + operator); } // 生成二元运算指令并返回结果寄存器 - return InstrFactory.binOp(ctx, op, l, r); + return InstructionFactory.binOp(ctx, op, l, r); } // 其他表达式类型暂不支持 throw new IllegalStateException( diff --git a/src/main/java/org/jcnc/snow/compiler/ir/builder/Scope.java b/src/main/java/org/jcnc/snow/compiler/ir/builder/IRBuilderScope.java similarity index 71% rename from src/main/java/org/jcnc/snow/compiler/ir/builder/Scope.java rename to src/main/java/org/jcnc/snow/compiler/ir/builder/IRBuilderScope.java index 1d449aa..70ab332 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/builder/Scope.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/builder/IRBuilderScope.java @@ -1,13 +1,13 @@ package org.jcnc.snow.compiler.ir.builder; import org.jcnc.snow.compiler.ir.core.IRFunction; -import org.jcnc.snow.compiler.ir.value.VirtualRegister; +import org.jcnc.snow.compiler.ir.value.IRVirtualRegister; import java.util.HashMap; import java.util.Map; /** - * Scope 用于管理单个函数的变量名与虚拟寄存器的映射。 + * IRBuilderScope 用于管理单个函数的变量名与虚拟寄存器的映射。 * *

功能: *

    @@ -16,10 +16,10 @@ import java.util.Map; *
  • 根据变量名查找对应的虚拟寄存器。
  • *
*/ -final class Scope { +final class IRBuilderScope { - /** 存储变量名到 VirtualRegister 的映射 */ - private final Map vars = new HashMap<>(); + /** 存储变量名到 IRVirtualRegister 的映射 */ + private final Map vars = new HashMap<>(); /** * 当前作用域所属的 IRFunction,用于分配新的寄存器。 @@ -41,7 +41,7 @@ final class Scope { * @param name 变量名 */ void declare(String name) { - VirtualRegister reg = fn.newRegister(); + IRVirtualRegister reg = fn.newRegister(); vars.put(name, reg); } @@ -51,7 +51,7 @@ final class Scope { * @param name 变量名 * @param reg 对应的虚拟寄存器 */ - void declare(String name, VirtualRegister reg) { + void declare(String name, IRVirtualRegister reg) { vars.put(name, reg); } @@ -61,7 +61,7 @@ final class Scope { * @param name 变量名 * @param reg 新的虚拟寄存器 */ - void put(String name, VirtualRegister reg) { + void put(String name, IRVirtualRegister reg) { vars.put(name, reg); } @@ -69,9 +69,9 @@ final class Scope { * 根据变量名查找其对应的虚拟寄存器。 * * @param name 变量名 - * @return 对应的 VirtualRegister,若未声明则返回 null + * @return 对应的 IRVirtualRegister,若未声明则返回 null */ - VirtualRegister lookup(String name) { + IRVirtualRegister lookup(String name) { return vars.get(name); } } diff --git a/src/main/java/org/jcnc/snow/compiler/ir/builder/IRContext.java b/src/main/java/org/jcnc/snow/compiler/ir/builder/IRContext.java index 866de5f..3d5edc4 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/builder/IRContext.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/builder/IRContext.java @@ -2,11 +2,10 @@ package org.jcnc.snow.compiler.ir.builder; import org.jcnc.snow.compiler.ir.core.IRFunction; import org.jcnc.snow.compiler.ir.core.IRInstruction; -import org.jcnc.snow.compiler.parser.ast.*; -import org.jcnc.snow.compiler.ir.value.VirtualRegister; +import org.jcnc.snow.compiler.ir.value.IRVirtualRegister; /** - * IRContext 封装了当前函数的 IRFunction 实例和作用域管理(Scope), + * IRContext 封装了当前函数的 IRFunction 实例和作用域管理(IRBuilderScope), * 并提供分配寄存器和添加 IR 指令的便利方法。 * *

主要功能: @@ -25,7 +24,7 @@ public class IRContext { /** * 管理变量和寄存器映射的作用域 */ - private final Scope scope; + private final IRBuilderScope IRBuilderScope; /** * 构造 IRContext,并绑定要构建的 IRFunction。 @@ -34,9 +33,9 @@ public class IRContext { */ public IRContext(IRFunction function) { this.function = function; - this.scope = new Scope(); + this.IRBuilderScope = new IRBuilderScope(); // 将 IRFunction 与作用域关联,以便指令生成时使用 - this.scope.attachFunction(function); + this.IRBuilderScope.attachFunction(function); } /** @@ -51,19 +50,19 @@ public class IRContext { /** * 获取当前作用域,用于变量声明和查找。 * - * @return 作用域对象 Scope + * @return 作用域对象 IRBuilderScope */ - /* 包内可见:仅在 builder 包内部使用 Scope */ - Scope getScope() { - return scope; + /* 包内可见:仅在 builder 包内部使用 IRBuilderScope */ + IRBuilderScope getScope() { + return IRBuilderScope; } /** * 分配一个新的虚拟寄存器。 * - * @return 新分配的 VirtualRegister 对象 + * @return 新分配的 IRVirtualRegister 对象 */ - public VirtualRegister newRegister() { + public IRVirtualRegister newRegister() { return function.newRegister(); } diff --git a/src/main/java/org/jcnc/snow/compiler/ir/builder/ProgramBuilder.java b/src/main/java/org/jcnc/snow/compiler/ir/builder/IRProgramBuilder.java similarity index 96% rename from src/main/java/org/jcnc/snow/compiler/ir/builder/ProgramBuilder.java rename to src/main/java/org/jcnc/snow/compiler/ir/builder/IRProgramBuilder.java index 1db3f2f..30a38ed 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/builder/ProgramBuilder.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/builder/IRProgramBuilder.java @@ -10,7 +10,7 @@ import org.jcnc.snow.compiler.parser.ast.base.StatementNode; import java.util.List; /** - * ProgramBuilder 用于将 AST 根节点列表构建为 IRProgram。 + * IRProgramBuilder 用于将 AST 根节点列表构建为 IRProgram。 * *

功能: *

    @@ -19,7 +19,7 @@ import java.util.List; *
  • 对脚本式顶层语句自动包装为特殊的 _start 函数。
  • *
*/ -public final class ProgramBuilder { +public final class IRProgramBuilder { /** * 构建一个完整的 IRProgram。 diff --git a/src/main/java/org/jcnc/snow/compiler/ir/builder/InstrFactory.java b/src/main/java/org/jcnc/snow/compiler/ir/builder/InstructionFactory.java similarity index 56% rename from src/main/java/org/jcnc/snow/compiler/ir/builder/InstrFactory.java rename to src/main/java/org/jcnc/snow/compiler/ir/builder/InstructionFactory.java index 12479bc..ebab50c 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/builder/InstrFactory.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/builder/InstructionFactory.java @@ -1,23 +1,23 @@ package org.jcnc.snow.compiler.ir.builder; -import org.jcnc.snow.compiler.ir.core.IROp; -import org.jcnc.snow.compiler.ir.instr.BinOpInstruction; -import org.jcnc.snow.compiler.ir.instr.LoadConstInstruction; -import org.jcnc.snow.compiler.ir.instr.ReturnInstruction; -import org.jcnc.snow.compiler.ir.value.Constant; -import org.jcnc.snow.compiler.ir.value.VirtualRegister; +import org.jcnc.snow.compiler.ir.core.IROpCode; +import org.jcnc.snow.compiler.ir.instruction.BinaryOperationInstruction; +import org.jcnc.snow.compiler.ir.instruction.LoadConstInstruction; +import org.jcnc.snow.compiler.ir.instruction.ReturnInstruction; +import org.jcnc.snow.compiler.ir.value.IRConstant; +import org.jcnc.snow.compiler.ir.value.IRVirtualRegister; /** - * InstrFactory 统一管理 IR 指令的创建,并自动将生成的指令添加到上下文中。 + * InstructionFactory 统一管理 IR 指令的创建,并自动将生成的指令添加到上下文中。 * *

提供的功能包括: *

    *
  • 生成加载常量指令(LoadConstInstruction);
  • - *
  • 生成二元运算指令(BinOpInstruction);
  • + *
  • 生成二元运算指令(BinaryOperationInstruction);
  • *
  • 生成返回指令(ReturnInstruction),支持有返回值和无返回值两种情况;
  • *
*/ -public class InstrFactory { +public class InstructionFactory { /** * 生成加载整数常量的指令,并返回对应的结果寄存器。 @@ -26,9 +26,9 @@ public class InstrFactory { * @param value 要加载的整数值 * @return 存放常量的虚拟寄存器 */ - public static VirtualRegister loadConst(IRContext ctx, int value) { - VirtualRegister vr = ctx.newRegister(); - LoadConstInstruction instr = new LoadConstInstruction(vr, new Constant(value)); + public static IRVirtualRegister loadConst(IRContext ctx, int value) { + IRVirtualRegister vr = ctx.newRegister(); + LoadConstInstruction instr = new LoadConstInstruction(vr, new IRConstant(value)); ctx.addInstruction(instr); return vr; } @@ -42,11 +42,11 @@ public class InstrFactory { * @param right 右操作数寄存器 * @return 存放运算结果的虚拟寄存器 */ - public static VirtualRegister binOp(IRContext ctx, IROp op, - VirtualRegister left, - VirtualRegister right) { - VirtualRegister dest = ctx.newRegister(); - BinOpInstruction instr = new BinOpInstruction(op, dest, left, right); + public static IRVirtualRegister binOp(IRContext ctx, IROpCode op, + IRVirtualRegister left, + IRVirtualRegister right) { + IRVirtualRegister dest = ctx.newRegister(); + BinaryOperationInstruction instr = new BinaryOperationInstruction(op, dest, left, right); ctx.addInstruction(instr); return dest; } @@ -57,7 +57,7 @@ public class InstrFactory { * @param ctx 当前 IR 构建上下文 * @param value 需要返回的虚拟寄存器 */ - public static void ret(IRContext ctx, VirtualRegister value) { + public static void ret(IRContext ctx, IRVirtualRegister value) { ctx.addInstruction(new ReturnInstruction(value)); } 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 b1fa215..29cc767 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 @@ -1,6 +1,6 @@ package org.jcnc.snow.compiler.ir.builder; -import org.jcnc.snow.compiler.ir.value.VirtualRegister; +import org.jcnc.snow.compiler.ir.value.IRVirtualRegister; import org.jcnc.snow.compiler.parser.ast.AssignmentNode; import org.jcnc.snow.compiler.parser.ast.DeclarationNode; import org.jcnc.snow.compiler.parser.ast.ExpressionStatementNode; @@ -26,7 +26,7 @@ public class StatementBuilder { return; } if (stmt instanceof AssignmentNode an) { - VirtualRegister vr = exprBuilder.build(an.value()); + IRVirtualRegister vr = exprBuilder.build(an.value()); if (ctx.getScope().lookup(an.variable()) == null) { ctx.getScope().declare(an.variable(), vr); } else { @@ -36,7 +36,7 @@ public class StatementBuilder { } if (stmt instanceof DeclarationNode dn) { if (dn.getInitializer().isPresent()) { - VirtualRegister init = exprBuilder.build(dn.getInitializer().get()); + IRVirtualRegister init = exprBuilder.build(dn.getInitializer().get()); ctx.getScope().declare(dn.getName(), init); } else { ctx.getScope().declare(dn.getName()); @@ -45,10 +45,10 @@ public class StatementBuilder { } if (stmt instanceof ReturnNode rn) { if (rn.getExpression().isPresent()) { - VirtualRegister vr = exprBuilder.build(rn.getExpression().get()); - InstrFactory.ret(ctx, vr); + IRVirtualRegister vr = exprBuilder.build(rn.getExpression().get()); + InstructionFactory.ret(ctx, vr); } else { - InstrFactory.retVoid(ctx); + InstructionFactory.retVoid(ctx); } return; } diff --git a/src/main/java/org/jcnc/snow/compiler/ir/core/IRFunction.java b/src/main/java/org/jcnc/snow/compiler/ir/core/IRFunction.java index 62eca61..d7ab005 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/core/IRFunction.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/core/IRFunction.java @@ -1,6 +1,6 @@ package org.jcnc.snow.compiler.ir.core; -import org.jcnc.snow.compiler.ir.value.VirtualRegister; +import org.jcnc.snow.compiler.ir.value.IRVirtualRegister; import java.util.ArrayList; import java.util.List; @@ -35,8 +35,8 @@ public class IRFunction { * * @return 新建的虚拟寄存器 */ - public VirtualRegister newRegister() { - return new VirtualRegister(regCounter++); + public IRVirtualRegister newRegister() { + return new IRVirtualRegister(regCounter++); } /** diff --git a/src/main/java/org/jcnc/snow/compiler/ir/core/IRInstruction.java b/src/main/java/org/jcnc/snow/compiler/ir/core/IRInstruction.java index c79ea3a..8708068 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/core/IRInstruction.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/core/IRInstruction.java @@ -1,6 +1,6 @@ package org.jcnc.snow.compiler.ir.core; -import org.jcnc.snow.compiler.ir.value.VirtualRegister; +import org.jcnc.snow.compiler.ir.value.IRVirtualRegister; import java.util.List; @@ -23,9 +23,9 @@ public abstract class IRInstruction { * 获取指令的操作符。 * 例如:ADD_I32、CONST、RET 等。 * - * @return 操作符枚举值(IROp) + * @return 操作符枚举值(IROpCode) */ - public abstract IROp op(); + public abstract IROpCode op(); /** * 获取指令的目标寄存器(若有的话)。 @@ -35,7 +35,7 @@ public abstract class IRInstruction { * * @return 目标寄存器或 null */ - public VirtualRegister dest() { + public IRVirtualRegister dest() { return null; } diff --git a/src/main/java/org/jcnc/snow/compiler/ir/core/IROp.java b/src/main/java/org/jcnc/snow/compiler/ir/core/IROpCode.java similarity index 87% rename from src/main/java/org/jcnc/snow/compiler/ir/core/IROp.java rename to src/main/java/org/jcnc/snow/compiler/ir/core/IROpCode.java index 8481809..73e794d 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/core/IROp.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/core/IROpCode.java @@ -1,12 +1,12 @@ package org.jcnc.snow.compiler.ir.core; /** - * IROp —— IR 层支持的操作码(Opcode)枚举类型。 + * IROpCode —— IR 层支持的操作码(Opcode)枚举类型。 *

* 每种操作码代表一条基本指令的种类,供 IRInstruction 使用。 * 可以根据编译器需求继续扩展。 */ -public enum IROp { +public enum IROpCode { /* ───── 算术运算 ───── */ /** 整型加法(32位) */ @@ -52,7 +52,7 @@ public enum IROp { /** 存储到内存(Store) */ STORE, - /** 加载常量(Constant) */ + /** 加载常量(IRConstant) */ CONST, /* ───── 控制流 ───── */ @@ -63,7 +63,7 @@ public enum IROp { /** 条件跳转(Jump if zero),若条件为 0 则跳转 */ JUMP_IF_ZERO, - /** 标签(Label),跳转目标位置 */ + /** 标签(IRLabel),跳转目标位置 */ LABEL, /* ───── 函数调用相关 ───── */ diff --git a/src/main/java/org/jcnc/snow/compiler/ir/core/IRValue.java b/src/main/java/org/jcnc/snow/compiler/ir/core/IRValue.java index 4129e60..22ec7ee 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/core/IRValue.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/core/IRValue.java @@ -1,20 +1,20 @@ package org.jcnc.snow.compiler.ir.core; -import org.jcnc.snow.compiler.ir.value.Constant; -import org.jcnc.snow.compiler.ir.value.Label; -import org.jcnc.snow.compiler.ir.value.VirtualRegister; +import org.jcnc.snow.compiler.ir.value.IRConstant; +import org.jcnc.snow.compiler.ir.value.IRLabel; +import org.jcnc.snow.compiler.ir.value.IRVirtualRegister; /** * IRValue —— 表示在中间表示(IR)系统中能作为操作数使用的基本单位。 *

* 包括: - * • VirtualRegister(虚拟寄存器) - * • Constant(常量) - * • Label(跳转标签) + * • IRVirtualRegister(虚拟寄存器) + * • IRConstant(常量) + * • IRLabel(跳转标签) *

* 本接口使用 sealed 限定,明确列出所有允许实现它的子类型, * 保证类型安全,并便于在编译时做穷尽检查。 */ public sealed interface IRValue - permits VirtualRegister, Constant, Label { + permits IRVirtualRegister, IRConstant, IRLabel { } diff --git a/src/main/java/org/jcnc/snow/compiler/ir/instr/BinOpInstruction.java b/src/main/java/org/jcnc/snow/compiler/ir/instruction/BinaryOperationInstruction.java similarity index 78% rename from src/main/java/org/jcnc/snow/compiler/ir/instr/BinOpInstruction.java rename to src/main/java/org/jcnc/snow/compiler/ir/instruction/BinaryOperationInstruction.java index ec3ac89..7594c74 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/instr/BinOpInstruction.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/instruction/BinaryOperationInstruction.java @@ -1,9 +1,9 @@ -package org.jcnc.snow.compiler.ir.instr; +package org.jcnc.snow.compiler.ir.instruction; import org.jcnc.snow.compiler.ir.core.IRInstruction; -import org.jcnc.snow.compiler.ir.core.IROp; +import org.jcnc.snow.compiler.ir.core.IROpCode; import org.jcnc.snow.compiler.ir.core.IRValue; -import org.jcnc.snow.compiler.ir.value.VirtualRegister; +import org.jcnc.snow.compiler.ir.value.IRVirtualRegister; import java.util.List; @@ -12,12 +12,12 @@ import java.util.List; * 格式为:dest = lhs (OP) rhs * 其中 dest 是结果寄存器,lhs 和 rhs 是操作数,OP 是操作符(如加法、减法等)。 */ -public final class BinOpInstruction extends IRInstruction { +public final class BinaryOperationInstruction extends IRInstruction { // 二元操作符,例如加法、减法、乘法、除法等 - private final IROp op; + private final IROpCode op; // 存放运算结果的虚拟寄存器 - private final VirtualRegister dest; + private final IRVirtualRegister dest; // 左操作数 private final IRValue lhs; @@ -33,7 +33,7 @@ public final class BinOpInstruction extends IRInstruction { * @param lhs 左侧操作数 * @param rhs 右侧操作数 */ - public BinOpInstruction(IROp op, VirtualRegister dest, IRValue lhs, IRValue rhs) { + public BinaryOperationInstruction(IROpCode op, IRVirtualRegister dest, IRValue lhs, IRValue rhs) { this.op = op; this.dest = dest; this.lhs = lhs; @@ -46,7 +46,7 @@ public final class BinOpInstruction extends IRInstruction { * @return 操作符 */ @Override - public IROp op() { + public IROpCode op() { return op; } @@ -56,7 +56,7 @@ public final class BinOpInstruction extends IRInstruction { * @return 目标寄存器 */ @Override - public VirtualRegister dest() { + public IRVirtualRegister dest() { return dest; } diff --git a/src/main/java/org/jcnc/snow/compiler/ir/instr/LoadConstInstruction.java b/src/main/java/org/jcnc/snow/compiler/ir/instruction/LoadConstInstruction.java similarity index 70% rename from src/main/java/org/jcnc/snow/compiler/ir/instr/LoadConstInstruction.java rename to src/main/java/org/jcnc/snow/compiler/ir/instruction/LoadConstInstruction.java index a327e0c..6f32448 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/instr/LoadConstInstruction.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/instruction/LoadConstInstruction.java @@ -1,24 +1,24 @@ -package org.jcnc.snow.compiler.ir.instr; +package org.jcnc.snow.compiler.ir.instruction; import org.jcnc.snow.compiler.ir.core.IRInstruction; -import org.jcnc.snow.compiler.ir.core.IROp; +import org.jcnc.snow.compiler.ir.core.IROpCode; import org.jcnc.snow.compiler.ir.core.IRValue; -import org.jcnc.snow.compiler.ir.value.Constant; -import org.jcnc.snow.compiler.ir.value.VirtualRegister; +import org.jcnc.snow.compiler.ir.value.IRConstant; +import org.jcnc.snow.compiler.ir.value.IRVirtualRegister; import java.util.List; /** - * 表示常量加载指令(Load Constant Instruction)。 + * 表示常量加载指令(Load IRConstant Instruction)。 * 格式为:dest = CONST k * 其中 dest 是结果寄存器,k 是要加载的常量值。 */ public final class LoadConstInstruction extends IRInstruction { // 要加载的常量值 - private final Constant k; + private final IRConstant k; // 存放常量的目标虚拟寄存器 - private final VirtualRegister dest; + private final IRVirtualRegister dest; /** * 构造函数,创建一个常量加载指令实例。 @@ -26,7 +26,7 @@ public final class LoadConstInstruction extends IRInstruction { * @param dest 目标寄存器,用于存放常量 * @param k 要加载的常量值 */ - public LoadConstInstruction(VirtualRegister dest, Constant k) { + public LoadConstInstruction(IRVirtualRegister dest, IRConstant k) { this.dest = dest; this.k = k; } @@ -34,11 +34,11 @@ public final class LoadConstInstruction extends IRInstruction { /** * 获取此指令的操作符,恒为 CONST。 * - * @return 操作符 IROp.CONST + * @return 操作符 IROpCode.CONST */ @Override - public IROp op() { - return IROp.CONST; + public IROpCode op() { + return IROpCode.CONST; } /** @@ -47,7 +47,7 @@ public final class LoadConstInstruction extends IRInstruction { * @return 目标虚拟寄存器 */ @Override - public VirtualRegister dest() { + public IRVirtualRegister dest() { return dest; } diff --git a/src/main/java/org/jcnc/snow/compiler/ir/instr/ReturnInstruction.java b/src/main/java/org/jcnc/snow/compiler/ir/instruction/ReturnInstruction.java similarity index 80% rename from src/main/java/org/jcnc/snow/compiler/ir/instr/ReturnInstruction.java rename to src/main/java/org/jcnc/snow/compiler/ir/instruction/ReturnInstruction.java index 9d70e60..0331fc5 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/instr/ReturnInstruction.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/instruction/ReturnInstruction.java @@ -1,9 +1,9 @@ -package org.jcnc.snow.compiler.ir.instr; +package org.jcnc.snow.compiler.ir.instruction; import org.jcnc.snow.compiler.ir.core.IRInstruction; -import org.jcnc.snow.compiler.ir.core.IROp; +import org.jcnc.snow.compiler.ir.core.IROpCode; import org.jcnc.snow.compiler.ir.core.IRValue; -import org.jcnc.snow.compiler.ir.value.VirtualRegister; +import org.jcnc.snow.compiler.ir.value.IRVirtualRegister; import java.util.List; @@ -16,25 +16,25 @@ import java.util.List; */ public final class ReturnInstruction extends IRInstruction { // 返回值对应的虚拟寄存器,如果是 void 返回则为 null - private final VirtualRegister value; + private final IRVirtualRegister value; /** * 构造函数,创建一个返回指令实例。 * * @param value 要返回的虚拟寄存器,如果是 void 返回则传入 null */ - public ReturnInstruction(VirtualRegister value) { + public ReturnInstruction(IRVirtualRegister value) { this.value = value; } /** * 获取此指令的操作符,恒为 RET。 * - * @return 操作符 IROp.RET + * @return 操作符 IROpCode.RET */ @Override - public IROp op() { - return IROp.RET; + public IROpCode op() { + return IROpCode.RET; } /** @@ -54,7 +54,7 @@ public final class ReturnInstruction extends IRInstruction { * * @return 返回值寄存器,或 null(表示 void 返回) */ - public VirtualRegister value() { + public IRVirtualRegister value() { return value; } diff --git a/src/main/java/org/jcnc/snow/compiler/ir/instr/UnaryOpInstruction.java b/src/main/java/org/jcnc/snow/compiler/ir/instruction/UnaryOperationInstruction.java similarity index 78% rename from src/main/java/org/jcnc/snow/compiler/ir/instr/UnaryOpInstruction.java rename to src/main/java/org/jcnc/snow/compiler/ir/instruction/UnaryOperationInstruction.java index 8045bd5..99e9ec9 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/instr/UnaryOpInstruction.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/instruction/UnaryOperationInstruction.java @@ -1,9 +1,9 @@ -package org.jcnc.snow.compiler.ir.instr; +package org.jcnc.snow.compiler.ir.instruction; import org.jcnc.snow.compiler.ir.core.IRInstruction; -import org.jcnc.snow.compiler.ir.core.IROp; +import org.jcnc.snow.compiler.ir.core.IROpCode; import org.jcnc.snow.compiler.ir.core.IRValue; -import org.jcnc.snow.compiler.ir.value.VirtualRegister; +import org.jcnc.snow.compiler.ir.value.IRVirtualRegister; import java.util.List; @@ -15,12 +15,12 @@ import java.util.List; * - OP:一元操作符(如取负、按位取反等) * - val:操作数 */ -public final class UnaryOpInstruction extends IRInstruction { +public final class UnaryOperationInstruction extends IRInstruction { // 一元操作符,例如 NEG(取负)、NOT(逻辑非)等 - private final IROp op; + private final IROpCode op; // 运算结果存放的目标虚拟寄存器 - private final VirtualRegister dest; + private final IRVirtualRegister dest; // 一元运算的操作数 private final IRValue val; @@ -32,7 +32,7 @@ public final class UnaryOpInstruction extends IRInstruction { * @param dest 结果存放的目标寄存器 * @param val 操作数 */ - public UnaryOpInstruction(IROp op, VirtualRegister dest, IRValue val) { + public UnaryOperationInstruction(IROpCode op, IRVirtualRegister dest, IRValue val) { this.op = op; this.dest = dest; this.val = val; @@ -44,7 +44,7 @@ public final class UnaryOpInstruction extends IRInstruction { * @return 一元操作符 */ @Override - public IROp op() { + public IROpCode op() { return op; } @@ -54,7 +54,7 @@ public final class UnaryOpInstruction extends IRInstruction { * @return 目标虚拟寄存器 */ @Override - public VirtualRegister dest() { + public IRVirtualRegister dest() { return dest; } diff --git a/src/main/java/org/jcnc/snow/compiler/ir/value/Constant.java b/src/main/java/org/jcnc/snow/compiler/ir/value/IRConstant.java similarity index 75% rename from src/main/java/org/jcnc/snow/compiler/ir/value/Constant.java rename to src/main/java/org/jcnc/snow/compiler/ir/value/IRConstant.java index e692d12..180bcfd 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/value/Constant.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/value/IRConstant.java @@ -3,11 +3,11 @@ package org.jcnc.snow.compiler.ir.value; import org.jcnc.snow.compiler.ir.core.IRValue; /** - * Constant 类 —— 表示一个常量值(例如整数常量、字符串常量等)。 + * IRConstant 类 —— 表示一个常量值(例如整数常量、字符串常量等)。 *

* 在中间表示(IR)中,常量通常是不可变的、直接使用的值,而不是寄存器或临时变量。 */ -public record Constant(Object value) implements IRValue { +public record IRConstant(Object value) implements IRValue { /** * 将常量值转换为字符串表示。 diff --git a/src/main/java/org/jcnc/snow/compiler/ir/value/Label.java b/src/main/java/org/jcnc/snow/compiler/ir/value/IRLabel.java similarity index 74% rename from src/main/java/org/jcnc/snow/compiler/ir/value/Label.java rename to src/main/java/org/jcnc/snow/compiler/ir/value/IRLabel.java index f9d7d62..a6e9e35 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/value/Label.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/value/IRLabel.java @@ -3,14 +3,14 @@ package org.jcnc.snow.compiler.ir.value; import org.jcnc.snow.compiler.ir.core.IRValue; /** - * Label —— 表示 IR 中的跳转目标标签。 + * IRLabel —— 表示 IR 中的跳转目标标签。 * * 在中间表示(IR)中,控制流指令(如 JUMP、JUMP_IF_ZERO)需要依赖标签来指定跳转位置。 * 本类通过名字(字符串)唯一标识一个标签。 * - * Label 也是一种 IRValue,因此可以作为指令的操作数。 + * IRLabel 也是一种 IRValue,因此可以作为指令的操作数。 */ -public record Label(String name) implements IRValue { +public record IRLabel(String name) implements IRValue { /** * 将标签转换为字符串形式。 diff --git a/src/main/java/org/jcnc/snow/compiler/ir/value/VirtualRegister.java b/src/main/java/org/jcnc/snow/compiler/ir/value/IRVirtualRegister.java similarity index 73% rename from src/main/java/org/jcnc/snow/compiler/ir/value/VirtualRegister.java rename to src/main/java/org/jcnc/snow/compiler/ir/value/IRVirtualRegister.java index e4c8411..54bf4fb 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/value/VirtualRegister.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/value/IRVirtualRegister.java @@ -3,7 +3,7 @@ package org.jcnc.snow.compiler.ir.value; import org.jcnc.snow.compiler.ir.core.IRValue; /** - * VirtualRegister —— 表示一个 SSA(静态单赋值)虚拟寄存器。 + * IRVirtualRegister —— 表示一个 SSA(静态单赋值)虚拟寄存器。 *

* 在中间表示(IR)中,每个中间值都存储在一个虚拟寄存器中。 *

@@ -11,9 +11,9 @@ import org.jcnc.snow.compiler.ir.core.IRValue; * - 每个寄存器都有唯一的 id(通常由 IRBuilder 自动分配) * - 遵循 SSA 形式,即每个寄存器只被赋值一次 *

- * VirtualRegister 也是一种 IRValue,可以作为指令的操作数。 + * IRVirtualRegister 也是一种 IRValue,可以作为指令的操作数。 */ -public record VirtualRegister(int id) implements IRValue { +public record IRVirtualRegister(int id) implements IRValue { /** * 将虚拟寄存器转换为字符串形式。