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 1c425f0..4521b32 100644 --- a/src/main/java/org/jcnc/snow/compiler/backend/RegisterAllocator.java +++ b/src/main/java/org/jcnc/snow/compiler/backend/RegisterAllocator.java @@ -2,8 +2,10 @@ // file: compiler/backend/RegisterAllocator.java package org.jcnc.snow.compiler.backend; -import org.jcnc.snow.compiler.ir.*; -import org.jcnc.snow.compiler.ir.instr.IRFunction; +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 java.util.HashMap; import java.util.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 f61fd34..3acbdf8 100644 --- a/src/main/java/org/jcnc/snow/compiler/backend/VMCodeGenerator.java +++ b/src/main/java/org/jcnc/snow/compiler/backend/VMCodeGenerator.java @@ -1,7 +1,10 @@ package org.jcnc.snow.compiler.backend; -import org.jcnc.snow.compiler.ir.*; +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.vm.engine.VMOpCode; import java.lang.reflect.Field; diff --git a/src/main/java/org/jcnc/snow/compiler/ir/BasicIRBuilder.java b/src/main/java/org/jcnc/snow/compiler/builder/BasicIRBuilder.java similarity index 91% rename from src/main/java/org/jcnc/snow/compiler/ir/BasicIRBuilder.java rename to src/main/java/org/jcnc/snow/compiler/builder/BasicIRBuilder.java index ff4f534..23f9bff 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/BasicIRBuilder.java +++ b/src/main/java/org/jcnc/snow/compiler/builder/BasicIRBuilder.java @@ -1,9 +1,13 @@ -package org.jcnc.snow.compiler.ir; +package org.jcnc.snow.compiler.builder; +import org.jcnc.snow.compiler.ir.core.IROp; +import org.jcnc.snow.compiler.ir.core.IRProgram; import org.jcnc.snow.compiler.ir.instr.BinOpInstruction; -import org.jcnc.snow.compiler.ir.instr.IRFunction; +import org.jcnc.snow.compiler.ir.core.IRFunction; 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.parser.ast.*; import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode; import org.jcnc.snow.compiler.parser.ast.base.Node; @@ -110,10 +114,10 @@ public final class BasicIRBuilder { */ private void stmt(StatementNode n) { switch (n) { - case ExpressionStatementNode es -> expr(es.expression()); // 表达式语句:只求值,无需保存 - case AssignmentNode as -> { // 赋值语句 - VirtualRegister rhs = expr(as.value()); - variables.put(as.variable(), rhs); + case ExpressionStatementNode expressionStatementNode -> expr(expressionStatementNode.expression()); // 表达式语句:只求值,无需保存 + case AssignmentNode assignmentNode -> { // 赋值语句 + VirtualRegister virtualRegister = expr(assignmentNode.value()); + variables.put(assignmentNode.variable(), virtualRegister); } case DeclarationNode d -> { // 变量声明 if (d.getInitializer().isPresent()) { // 有初始化器 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 7ea8faf..3fec94c 100644 --- a/src/main/java/org/jcnc/snow/compiler/cli/SnowCompiler.java +++ b/src/main/java/org/jcnc/snow/compiler/cli/SnowCompiler.java @@ -1,20 +1,14 @@ 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.BasicIRBuilder; -import org.jcnc.snow.compiler.ir.IRProgram; -import org.jcnc.snow.compiler.ir.instr.IRFunction; +import org.jcnc.snow.compiler.builder.BasicIRBuilder; +import org.jcnc.snow.compiler.ir.core.IRProgram; import org.jcnc.snow.compiler.lexer.core.LexerEngine; import org.jcnc.snow.compiler.lexer.token.Token; -import org.jcnc.snow.compiler.lexer.utils.TokenPrinter; import org.jcnc.snow.compiler.parser.ast.base.Node; import org.jcnc.snow.compiler.parser.context.ParserContext; import org.jcnc.snow.compiler.parser.core.ParserEngine; import org.jcnc.snow.compiler.parser.function.ASTPrinter; import org.jcnc.snow.compiler.semantic.core.SemanticAnalyzerRunner; -import org.jcnc.snow.vm.engine.VMMode; -import org.jcnc.snow.vm.engine.VirtualMachineEngine; import java.io.IOException; import java.nio.charset.StandardCharsets; diff --git a/src/main/java/org/jcnc/snow/compiler/ir/instr/IRFunction.java b/src/main/java/org/jcnc/snow/compiler/ir/core/IRFunction.java similarity index 93% rename from src/main/java/org/jcnc/snow/compiler/ir/instr/IRFunction.java rename to src/main/java/org/jcnc/snow/compiler/ir/core/IRFunction.java index bdbbf3b..62eca61 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/instr/IRFunction.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/core/IRFunction.java @@ -1,7 +1,6 @@ -package org.jcnc.snow.compiler.ir.instr; +package org.jcnc.snow.compiler.ir.core; -import org.jcnc.snow.compiler.ir.IRInstruction; -import org.jcnc.snow.compiler.ir.VirtualRegister; +import org.jcnc.snow.compiler.ir.value.VirtualRegister; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/org/jcnc/snow/compiler/ir/IRInstruction.java b/src/main/java/org/jcnc/snow/compiler/ir/core/IRInstruction.java similarity index 93% rename from src/main/java/org/jcnc/snow/compiler/ir/IRInstruction.java rename to src/main/java/org/jcnc/snow/compiler/ir/core/IRInstruction.java index 6d39cae..c79ea3a 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/IRInstruction.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/core/IRInstruction.java @@ -1,4 +1,6 @@ -package org.jcnc.snow.compiler.ir; +package org.jcnc.snow.compiler.ir.core; + +import org.jcnc.snow.compiler.ir.value.VirtualRegister; import java.util.List; diff --git a/src/main/java/org/jcnc/snow/compiler/ir/IROp.java b/src/main/java/org/jcnc/snow/compiler/ir/core/IROp.java similarity index 97% rename from src/main/java/org/jcnc/snow/compiler/ir/IROp.java rename to src/main/java/org/jcnc/snow/compiler/ir/core/IROp.java index 905e60b..8481809 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/IROp.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/core/IROp.java @@ -1,4 +1,4 @@ -package org.jcnc.snow.compiler.ir; +package org.jcnc.snow.compiler.ir.core; /** * IROp —— IR 层支持的操作码(Opcode)枚举类型。 diff --git a/src/main/java/org/jcnc/snow/compiler/ir/IRProgram.java b/src/main/java/org/jcnc/snow/compiler/ir/core/IRProgram.java similarity index 93% rename from src/main/java/org/jcnc/snow/compiler/ir/IRProgram.java rename to src/main/java/org/jcnc/snow/compiler/ir/core/IRProgram.java index 6104c7b..779ea75 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/IRProgram.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/core/IRProgram.java @@ -1,6 +1,4 @@ -package org.jcnc.snow.compiler.ir; - -import org.jcnc.snow.compiler.ir.instr.IRFunction; +package org.jcnc.snow.compiler.ir.core; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/org/jcnc/snow/compiler/ir/IRValue.java b/src/main/java/org/jcnc/snow/compiler/ir/core/IRValue.java similarity index 71% rename from src/main/java/org/jcnc/snow/compiler/ir/IRValue.java rename to src/main/java/org/jcnc/snow/compiler/ir/core/IRValue.java index eec32a2..4129e60 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/IRValue.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/core/IRValue.java @@ -1,4 +1,8 @@ -package org.jcnc.snow.compiler.ir; +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; /** * IRValue —— 表示在中间表示(IR)系统中能作为操作数使用的基本单位。 diff --git a/src/main/java/org/jcnc/snow/compiler/ir/instr/BinOpInstruction.java b/src/main/java/org/jcnc/snow/compiler/ir/instr/BinOpInstruction.java index bf24067..ec3ac89 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/instr/BinOpInstruction.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/instr/BinOpInstruction.java @@ -1,6 +1,9 @@ package org.jcnc.snow.compiler.ir.instr; -import org.jcnc.snow.compiler.ir.*; +import org.jcnc.snow.compiler.ir.core.IRInstruction; +import org.jcnc.snow.compiler.ir.core.IROp; +import org.jcnc.snow.compiler.ir.core.IRValue; +import org.jcnc.snow.compiler.ir.value.VirtualRegister; import java.util.List; diff --git a/src/main/java/org/jcnc/snow/compiler/ir/instr/LoadConstInstruction.java b/src/main/java/org/jcnc/snow/compiler/ir/instr/LoadConstInstruction.java index f70c4bc..a327e0c 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/instr/LoadConstInstruction.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/instr/LoadConstInstruction.java @@ -1,6 +1,10 @@ package org.jcnc.snow.compiler.ir.instr; -import org.jcnc.snow.compiler.ir.*; +import org.jcnc.snow.compiler.ir.core.IRInstruction; +import org.jcnc.snow.compiler.ir.core.IROp; +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 java.util.List; diff --git a/src/main/java/org/jcnc/snow/compiler/ir/instr/ReturnInstruction.java b/src/main/java/org/jcnc/snow/compiler/ir/instr/ReturnInstruction.java index e769b44..9d70e60 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/instr/ReturnInstruction.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/instr/ReturnInstruction.java @@ -1,6 +1,9 @@ package org.jcnc.snow.compiler.ir.instr; -import org.jcnc.snow.compiler.ir.*; +import org.jcnc.snow.compiler.ir.core.IRInstruction; +import org.jcnc.snow.compiler.ir.core.IROp; +import org.jcnc.snow.compiler.ir.core.IRValue; +import org.jcnc.snow.compiler.ir.value.VirtualRegister; import java.util.List; diff --git a/src/main/java/org/jcnc/snow/compiler/ir/instr/UnaryOpInstruction.java b/src/main/java/org/jcnc/snow/compiler/ir/instr/UnaryOpInstruction.java index 68aa446..8045bd5 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/instr/UnaryOpInstruction.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/instr/UnaryOpInstruction.java @@ -1,6 +1,9 @@ package org.jcnc.snow.compiler.ir.instr; -import org.jcnc.snow.compiler.ir.*; +import org.jcnc.snow.compiler.ir.core.IRInstruction; +import org.jcnc.snow.compiler.ir.core.IROp; +import org.jcnc.snow.compiler.ir.core.IRValue; +import org.jcnc.snow.compiler.ir.value.VirtualRegister; import java.util.List; diff --git a/src/main/java/org/jcnc/snow/compiler/ir/Constant.java b/src/main/java/org/jcnc/snow/compiler/ir/value/Constant.java similarity index 85% rename from src/main/java/org/jcnc/snow/compiler/ir/Constant.java rename to src/main/java/org/jcnc/snow/compiler/ir/value/Constant.java index a0fb459..e692d12 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/Constant.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/value/Constant.java @@ -1,4 +1,6 @@ -package org.jcnc.snow.compiler.ir; +package org.jcnc.snow.compiler.ir.value; + +import org.jcnc.snow.compiler.ir.core.IRValue; /** * Constant 类 —— 表示一个常量值(例如整数常量、字符串常量等)。 diff --git a/src/main/java/org/jcnc/snow/compiler/ir/Label.java b/src/main/java/org/jcnc/snow/compiler/ir/value/Label.java similarity index 87% rename from src/main/java/org/jcnc/snow/compiler/ir/Label.java rename to src/main/java/org/jcnc/snow/compiler/ir/value/Label.java index 4dd16cf..f9d7d62 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/Label.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/value/Label.java @@ -1,4 +1,6 @@ -package org.jcnc.snow.compiler.ir; +package org.jcnc.snow.compiler.ir.value; + +import org.jcnc.snow.compiler.ir.core.IRValue; /** * Label —— 表示 IR 中的跳转目标标签。 diff --git a/src/main/java/org/jcnc/snow/compiler/ir/VirtualRegister.java b/src/main/java/org/jcnc/snow/compiler/ir/value/VirtualRegister.java similarity index 89% rename from src/main/java/org/jcnc/snow/compiler/ir/VirtualRegister.java rename to src/main/java/org/jcnc/snow/compiler/ir/value/VirtualRegister.java index ae531fb..e4c8411 100644 --- a/src/main/java/org/jcnc/snow/compiler/ir/VirtualRegister.java +++ b/src/main/java/org/jcnc/snow/compiler/ir/value/VirtualRegister.java @@ -1,4 +1,6 @@ -package org.jcnc.snow.compiler.ir; +package org.jcnc.snow.compiler.ir.value; + +import org.jcnc.snow.compiler.ir.core.IRValue; /** * VirtualRegister —— 表示一个 SSA(静态单赋值)虚拟寄存器。