From 375a62dc0b1cfdbbddf61fb536e83ee73e1f15d7 Mon Sep 17 00:00:00 2001 From: Luke Date: Wed, 7 May 2025 18:05:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A0=87=E8=AF=86=E7=AC=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compiler/ir/builder/FunctionBuilder.java | 16 +++++----- .../compiler/ir/builder/IRProgramBuilder.java | 20 ++++++------ .../ir/builder/InstructionFactory.java | 30 ++++++++--------- .../compiler/ir/builder/StatementBuilder.java | 32 +++++++++---------- .../snow/compiler/ir/core/IRFunction.java | 6 ++-- .../jcnc/snow/compiler/ir/core/IRProgram.java | 6 ++-- .../jcnc/snow/compiler/ir/core/IRValue.java | 2 +- 7 files changed, 56 insertions(+), 56 deletions(-) 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 5a94fde..f598d9b 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 @@ -26,22 +26,22 @@ public class FunctionBuilder { */ public IRFunction build(FunctionNode fn) { // 创建 IRFunction 并包装到上下文 - IRFunction irFunc = new IRFunction(fn.name()); - IRContext ctx = new IRContext(irFunc); + IRFunction irFunction = new IRFunction(fn.name()); + IRContext irContext = new IRContext(irFunction); // 声明函数参数 - for (ParameterNode p : fn.parameters()) { + for (ParameterNode parameterNode : fn.parameters()) { // 在当前作用域中声明参数名称对应的虚拟寄存器 - ctx.getScope().declare(p.name()); + irContext.getScope().declare(parameterNode.name()); } // 使用 StatementBuilder 遍历并生成函数体所有语句的 IR - StatementBuilder sb = new StatementBuilder(ctx); - for (StatementNode s : fn.body()) { - sb.build(s); + StatementBuilder sb = new StatementBuilder(irContext); + for (StatementNode statementNode : fn.body()) { + sb.build(statementNode); } // 返回构建好的 IRFunction - return irFunc; + return irFunction; } } diff --git a/src/main/java/org/jcnc/snow/compiler/ir/builder/IRProgramBuilder.java b/src/main/java/org/jcnc/snow/compiler/ir/builder/IRProgramBuilder.java index 30a38ed..27a9267 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/builder/IRProgramBuilder.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/builder/IRProgramBuilder.java @@ -30,18 +30,18 @@ public final class IRProgramBuilder { */ public IRProgram buildProgram(List roots) { IRProgram irProgram = new IRProgram(); - for (Node n : roots) { - switch (n) { - case ModuleNode m -> + for (Node node : roots) { + switch (node) { + case ModuleNode moduleNode -> // 模块节点:将模块内的所有函数加入程序 - m.functions().forEach(f -> irProgram.add(buildFunction(f))); + moduleNode.functions().forEach(f -> irProgram.add(buildFunction(f))); case FunctionNode f -> // 顶层函数节点 irProgram.add(buildFunction(f)); - case StatementNode s -> + case StatementNode statementNode -> // 顶层脚本语句,包装为 _start 函数 - irProgram.add(buildFunction(wrapTopLevel(s))); - case null, default -> throw new IllegalStateException("Unsupported top-level node: " + n); + irProgram.add(buildFunction(wrapTopLevel(statementNode))); + case null, default -> throw new IllegalStateException("Unsupported top-level node: " + node); } } return irProgram; @@ -50,11 +50,11 @@ public final class IRProgramBuilder { /** * 使用 FunctionBuilder 构建 IRFunction。 * - * @param fn AST 中的 FunctionNode + * @param functionNode AST 中的 FunctionNode * @return 构建完成的 IRFunction */ - private IRFunction buildFunction(FunctionNode fn) { - return new FunctionBuilder().build(fn); + private IRFunction buildFunction(FunctionNode functionNode) { + return new FunctionBuilder().build(functionNode); } /** diff --git a/src/main/java/org/jcnc/snow/compiler/ir/builder/InstructionFactory.java b/src/main/java/org/jcnc/snow/compiler/ir/builder/InstructionFactory.java index ebab50c..f303f12 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/builder/InstructionFactory.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/builder/InstructionFactory.java @@ -22,43 +22,43 @@ public class InstructionFactory { /** * 生成加载整数常量的指令,并返回对应的结果寄存器。 * - * @param ctx 当前 IR 构建上下文 + * @param irContext 当前 IR 构建上下文 * @param value 要加载的整数值 * @return 存放常量的虚拟寄存器 */ - 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; + public static IRVirtualRegister loadConst(IRContext irContext, int value) { + IRVirtualRegister irVirtualRegister = irContext.newRegister(); + LoadConstInstruction instr = new LoadConstInstruction(irVirtualRegister, new IRConstant(value)); + irContext.addInstruction(instr); + return irVirtualRegister; } /** * 生成二元运算指令,并返回运算结果寄存器。 * - * @param ctx 当前 IR 构建上下文 - * @param op 要执行的 IR 运算符 + * @param irContext 当前 IR 构建上下文 + * @param irOpCode 要执行的 IR 运算符 * @param left 左操作数寄存器 * @param right 右操作数寄存器 * @return 存放运算结果的虚拟寄存器 */ - public static IRVirtualRegister binOp(IRContext ctx, IROpCode op, + public static IRVirtualRegister binOp(IRContext irContext, IROpCode irOpCode, IRVirtualRegister left, IRVirtualRegister right) { - IRVirtualRegister dest = ctx.newRegister(); - BinaryOperationInstruction instr = new BinaryOperationInstruction(op, dest, left, right); - ctx.addInstruction(instr); + IRVirtualRegister dest = irContext.newRegister(); + BinaryOperationInstruction binaryOperationInstruction = new BinaryOperationInstruction(irOpCode, dest, left, right); + irContext.addInstruction(binaryOperationInstruction); return dest; } /** * 生成带返回值的返回指令。 * - * @param ctx 当前 IR 构建上下文 + * @param irContext 当前 IR 构建上下文 * @param value 需要返回的虚拟寄存器 */ - public static void ret(IRContext ctx, IRVirtualRegister value) { - ctx.addInstruction(new ReturnInstruction(value)); + public static void ret(IRContext irContext, IRVirtualRegister value) { + irContext.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 261898a..9feeade 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 @@ -45,44 +45,44 @@ public class StatementBuilder { *
  • ReturnNode:如带返回表达式,则生成带返回值的指令;否则生成无返回值指令
  • * * - * @param stmt 要构建的语句 AST 节点 + * @param statementNode 要构建的语句 AST 节点 * @throws IllegalStateException 如果遇到不支持的语句类型,则抛出此异常 */ - public void build(StatementNode stmt) { + public void build(StatementNode statementNode) { // 表达式语句: 仅生成表达式对应的 IR 指令,不关注结果 - if (stmt instanceof ExpressionStatementNode( + if (statementNode instanceof ExpressionStatementNode( org.jcnc.snow.compiler.parser.ast.base.ExpressionNode expression)) { exprBuilder.build(expression); return; } // 赋值语句: 先生成右侧表达式指令,获取寄存器,再声明或更新变量的值绑定 - if (stmt instanceof AssignmentNode( + if (statementNode instanceof AssignmentNode( String variable, org.jcnc.snow.compiler.parser.ast.base.ExpressionNode value )) { - IRVirtualRegister vr = exprBuilder.build(value); + IRVirtualRegister irVirtualRegister = exprBuilder.build(value); if (ctx.getScope().lookup(variable) == null) { // 首次赋值:声明变量并绑定寄存器 - ctx.getScope().declare(variable, vr); + ctx.getScope().declare(variable, irVirtualRegister); } else { // 变量已存在:更新绑定的寄存器 - ctx.getScope().put(variable, vr); + ctx.getScope().put(variable, irVirtualRegister); } return; } // 声明语句: 如有初始化表达式,则先构建初始化值并声明;否则直接声明变量 - if (stmt instanceof DeclarationNode dn) { - if (dn.getInitializer().isPresent()) { - IRVirtualRegister init = exprBuilder.build(dn.getInitializer().get()); - ctx.getScope().declare(dn.getName(), init); + if (statementNode instanceof DeclarationNode declarationNode) { + if (declarationNode.getInitializer().isPresent()) { + IRVirtualRegister irVirtualRegister = exprBuilder.build(declarationNode.getInitializer().get()); + ctx.getScope().declare(declarationNode.getName(), irVirtualRegister); } else { - ctx.getScope().declare(dn.getName()); + ctx.getScope().declare(declarationNode.getName()); } return; } // 返回语句: 区分有返回值和无返回值两种情况 - if (stmt instanceof ReturnNode rn) { - if (rn.getExpression().isPresent()) { - IRVirtualRegister vr = exprBuilder.build(rn.getExpression().get()); + if (statementNode instanceof ReturnNode returnNode) { + if (returnNode.getExpression().isPresent()) { + IRVirtualRegister vr = exprBuilder.build(returnNode.getExpression().get()); InstructionFactory.ret(ctx, vr); } else { InstructionFactory.retVoid(ctx); @@ -90,6 +90,6 @@ public class StatementBuilder { return; } // 不支持的语句类型 - throw new IllegalStateException("Unsupported statement: " + stmt.getClass().getSimpleName()); + throw new IllegalStateException("Unsupported statement: " + statementNode.getClass().getSimpleName()); } } 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 256562d..a6a11c2 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 @@ -53,10 +53,10 @@ public class IRFunction { /** * 向函数体中添加一条中间表示指令。 * - * @param inst 要添加的 IRInstruction 对象 + * @param irInstruction 要添加的 IRInstruction 对象 */ - public void add(IRInstruction inst) { - body.add(inst); + public void add(IRInstruction irInstruction) { + body.add(irInstruction); } /** 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 54f1d44..0baf09c 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 @@ -17,10 +17,10 @@ public final class IRProgram { /** * 向 IRProgram 中添加一个函数。 * - * @param fn 要添加的 IRFunction 对象 + * @param irFunction 要添加的 IRFunction 对象 */ - public void add(IRFunction fn) { - functions.add(fn); + public void add(IRFunction irFunction) { + functions.add(irFunction); } /** 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 c593e5b..e7268be 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 @@ -13,7 +13,7 @@ import org.jcnc.snow.compiler.ir.value.IRVirtualRegister; *
  • {@link IRConstant} —— 常量值,表示字面量或计算常量
  • *
  • {@link IRLabel} —— 跳转标签,用于控制流跳转目标
  • * - * + *

    * 本接口使用 sealed 限定,明确列出了所有允许的实现子类型, * 有助于在编译期进行穷尽性对齐和类型安全检查。 */