修改名词

This commit is contained in:
Luke 2025-05-07 17:24:41 +08:00
parent 11159d783d
commit f741bdaa3a
20 changed files with 147 additions and 148 deletions

View File

@ -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.IRFunction;
import org.jcnc.snow.compiler.ir.core.IRInstruction; import org.jcnc.snow.compiler.ir.core.IRInstruction;
import org.jcnc.snow.compiler.ir.core.IRValue; 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.HashMap;
import java.util.Map; import java.util.Map;
/** 线性扫描寄存器分配(演示级) */ /** 线性扫描寄存器分配(演示级) */
public final class RegisterAllocator { public final class RegisterAllocator {
private final Map<VirtualRegister,Integer> map = new HashMap<>(); private final Map<IRVirtualRegister,Integer> map = new HashMap<>();
public Map<VirtualRegister,Integer> allocate(IRFunction fn){ public Map<IRVirtualRegister,Integer> allocate(IRFunction fn){
int next = 0; int next = 0;
for (IRInstruction i : fn.body()){ for (IRInstruction i : fn.body()){
if(i.dest()!=null && !map.containsKey(i.dest())) map.put(i.dest(), next++); if(i.dest()!=null && !map.containsKey(i.dest())) map.put(i.dest(), next++);
for(IRValue v : i.operands()) 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; return map;
} }

View File

@ -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.IRFunction;
import org.jcnc.snow.compiler.ir.core.IRInstruction; import org.jcnc.snow.compiler.ir.core.IRInstruction;
import org.jcnc.snow.compiler.ir.instr.*; import org.jcnc.snow.compiler.ir.instruction.*;
import org.jcnc.snow.compiler.ir.value.Constant; import org.jcnc.snow.compiler.ir.value.IRConstant;
import org.jcnc.snow.compiler.ir.value.VirtualRegister; import org.jcnc.snow.compiler.ir.value.IRVirtualRegister;
import org.jcnc.snow.vm.engine.VMOpCode; import org.jcnc.snow.vm.engine.VMOpCode;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -18,12 +18,12 @@ import java.util.Map;
*/ */
public final class VMCodeGenerator { public final class VMCodeGenerator {
private final Map<VirtualRegister,Integer> slotMap; private final Map<IRVirtualRegister,Integer> slotMap;
private final List<String> code = new ArrayList<>(); private final List<String> code = new ArrayList<>();
private String currentFnName; // 当前正在生成的函数名 private String currentFnName; // 当前正在生成的函数名
public VMCodeGenerator(Map<VirtualRegister,Integer> slotMap){ public VMCodeGenerator(Map<IRVirtualRegister,Integer> slotMap){
this.slotMap = slotMap; this.slotMap = slotMap;
} }
@ -34,8 +34,8 @@ public final class VMCodeGenerator {
for (IRInstruction inst : fn.body()) { for (IRInstruction inst : fn.body()) {
switch (inst) { switch (inst) {
case LoadConstInstruction c -> genLoadConst(c); case LoadConstInstruction c -> genLoadConst(c);
case BinOpInstruction b -> genBinOp(b); case BinaryOperationInstruction b -> genBinOp(b);
case UnaryOpInstruction u -> genUnary(u); case UnaryOperationInstruction u -> genUnary(u);
case ReturnInstruction r -> genRet(r); case ReturnInstruction r -> genRet(r);
default -> throw new IllegalStateException("Unsupported IR: "+inst); default -> throw new IllegalStateException("Unsupported IR: "+inst);
} }
@ -47,14 +47,14 @@ public final class VMCodeGenerator {
/* ───────────── 指令生成 ───────────── */ /* ───────────── 指令生成 ───────────── */
private void genLoadConst(LoadConstInstruction c){ 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_PUSH"), k.value().toString());
emit(op("I_STORE"), slot(c.dest())+""); emit(op("I_STORE"), slot(c.dest())+"");
} }
private void genBinOp(BinOpInstruction b){ private void genBinOp(BinaryOperationInstruction b){
emit(op("I_LOAD"), slot((VirtualRegister)b.operands().get(0))+""); emit(op("I_LOAD"), slot((IRVirtualRegister)b.operands().get(0))+"");
emit(op("I_LOAD"), slot((VirtualRegister)b.operands().get(1))+""); emit(op("I_LOAD"), slot((IRVirtualRegister)b.operands().get(1))+"");
String opcode = switch (b.op()){ String opcode = switch (b.op()){
case ADD_I32 -> "I_ADD"; case ADD_I32 -> "I_ADD";
@ -67,8 +67,8 @@ public final class VMCodeGenerator {
emit(op("I_STORE"), slot(b.dest())+""); emit(op("I_STORE"), slot(b.dest())+"");
} }
private void genUnary(UnaryOpInstruction u){ private void genUnary(UnaryOperationInstruction u){
emit(op("I_LOAD"), slot((VirtualRegister)u.operands().get(0))+""); emit(op("I_LOAD"), slot((IRVirtualRegister)u.operands().get(0))+"");
String opcode = switch (u.op()){ String opcode = switch (u.op()){
case NEG_I32 -> "I_NEG"; 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); Integer s = slotMap.get(r);
if (s == null) throw new IllegalStateException("Register "+r+" 未映射槽位"); if (s == null) throw new IllegalStateException("Register "+r+" 未映射槽位");
return s; return s;

View File

@ -2,7 +2,7 @@ package org.jcnc.snow.compiler.cli;
import org.jcnc.snow.compiler.backend.RegisterAllocator; import org.jcnc.snow.compiler.backend.RegisterAllocator;
import org.jcnc.snow.compiler.backend.VMCodeGenerator; 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.IRFunction;
import org.jcnc.snow.compiler.ir.core.IRProgram; import org.jcnc.snow.compiler.ir.core.IRProgram;
import org.jcnc.snow.compiler.lexer.core.LexerEngine; import org.jcnc.snow.compiler.lexer.core.LexerEngine;
@ -55,7 +55,7 @@ public class SnowCompiler {
SemanticAnalyzerRunner.runSemanticAnalysis(ast, false); SemanticAnalyzerRunner.runSemanticAnalysis(ast, false);
/* 4. AST → IRProgram */ /* 4. AST → IRProgram */
IRProgram program = new ProgramBuilder().buildProgram(ast); IRProgram program = new IRProgramBuilder().buildProgram(ast);
System.out.println("=== IR ==="); System.out.println("=== IR ===");
System.out.println(program); System.out.println(program);

View File

@ -1,7 +1,7 @@
package org.jcnc.snow.compiler.ir.builder; package org.jcnc.snow.compiler.ir.builder;
import org.jcnc.snow.compiler.ir.core.IROp; import org.jcnc.snow.compiler.ir.core.IROpCode;
import org.jcnc.snow.compiler.ir.value.VirtualRegister; import org.jcnc.snow.compiler.ir.value.IRVirtualRegister;
import org.jcnc.snow.compiler.parser.ast.BinaryExpressionNode; import org.jcnc.snow.compiler.parser.ast.BinaryExpressionNode;
import org.jcnc.snow.compiler.parser.ast.IdentifierNode; import org.jcnc.snow.compiler.parser.ast.IdentifierNode;
import org.jcnc.snow.compiler.parser.ast.NumberLiteralNode; import org.jcnc.snow.compiler.parser.ast.NumberLiteralNode;
@ -23,15 +23,15 @@ public class ExpressionBuilder {
/** /**
* 操作符到 IR 操作码的映射表 * 操作符到 IR 操作码的映射表
*/ */
private static final Map<String, IROp> OP_MAP = Map.of( private static final Map<String, IROpCode> OP_MAP = Map.of(
"+", IROp.ADD_I32, "+", IROpCode.ADD_I32,
"-", IROp.SUB_I32, "-", IROpCode.SUB_I32,
"*", IROp.MUL_I32, "*", IROpCode.MUL_I32,
"/", IROp.DIV_I32 "/", IROpCode.DIV_I32
); );
/** /**
* 当前 IR 构建上下文包含 IRFunction Scope * 当前 IR 构建上下文包含 IRFunction IRBuilderScope
*/ */
private final IRContext ctx; private final IRContext ctx;
@ -51,17 +51,17 @@ public class ExpressionBuilder {
* @return 存放表达式计算结果的虚拟寄存器 * @return 存放表达式计算结果的虚拟寄存器
* @throws IllegalStateException 若遇到不支持的表达式节点或未定义变量 * @throws IllegalStateException 若遇到不支持的表达式节点或未定义变量
*/ */
public VirtualRegister build(ExpressionNode expr) { public IRVirtualRegister build(ExpressionNode expr) {
// 处理数字常量 // 处理数字常量
if (expr instanceof NumberLiteralNode(String value)) { if (expr instanceof NumberLiteralNode(String value)) {
int v = Integer.parseInt(value); int v = Integer.parseInt(value);
// 生成加载常量指令并返回结果寄存器 // 生成加载常量指令并返回结果寄存器
return InstrFactory.loadConst(ctx, v); return InstructionFactory.loadConst(ctx, v);
} }
// 处理变量引用 // 处理变量引用
if (expr instanceof IdentifierNode(String name)) { if (expr instanceof IdentifierNode(String name)) {
// 从作用域查找已声明的寄存器 // 从作用域查找已声明的寄存器
VirtualRegister vr = ctx.getScope().lookup(name); IRVirtualRegister vr = ctx.getScope().lookup(name);
if (vr == null) { if (vr == null) {
throw new IllegalStateException("未定义的变量: " + name); throw new IllegalStateException("未定义的变量: " + name);
} }
@ -70,15 +70,15 @@ public class ExpressionBuilder {
// 处理二元表达式 // 处理二元表达式
if (expr instanceof BinaryExpressionNode(ExpressionNode left, String operator, ExpressionNode right)) { if (expr instanceof BinaryExpressionNode(ExpressionNode left, String operator, ExpressionNode right)) {
// 递归构建左右子表达式 // 递归构建左右子表达式
VirtualRegister l = build(left); IRVirtualRegister l = build(left);
VirtualRegister r = build(right); IRVirtualRegister r = build(right);
// 根据操作符获取 IR 操作码 // 根据操作符获取 IR 操作码
IROp op = OP_MAP.get(operator); IROpCode op = OP_MAP.get(operator);
if (op == null) { if (op == null) {
throw new IllegalStateException("不支持的运算符: " + operator); throw new IllegalStateException("不支持的运算符: " + operator);
} }
// 生成二元运算指令并返回结果寄存器 // 生成二元运算指令并返回结果寄存器
return InstrFactory.binOp(ctx, op, l, r); return InstructionFactory.binOp(ctx, op, l, r);
} }
// 其他表达式类型暂不支持 // 其他表达式类型暂不支持
throw new IllegalStateException( throw new IllegalStateException(

View File

@ -1,13 +1,13 @@
package org.jcnc.snow.compiler.ir.builder; package org.jcnc.snow.compiler.ir.builder;
import org.jcnc.snow.compiler.ir.core.IRFunction; 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.HashMap;
import java.util.Map; import java.util.Map;
/** /**
* Scope 用于管理单个函数的变量名与虚拟寄存器的映射 * IRBuilderScope 用于管理单个函数的变量名与虚拟寄存器的映射
* *
* <p>功能 * <p>功能
* <ul> * <ul>
@ -16,10 +16,10 @@ import java.util.Map;
* <li>根据变量名查找对应的虚拟寄存器</li> * <li>根据变量名查找对应的虚拟寄存器</li>
* </ul> * </ul>
*/ */
final class Scope { final class IRBuilderScope {
/** 存储变量名到 VirtualRegister 的映射 */ /** 存储变量名到 IRVirtualRegister 的映射 */
private final Map<String, VirtualRegister> vars = new HashMap<>(); private final Map<String, IRVirtualRegister> vars = new HashMap<>();
/** /**
* 当前作用域所属的 IRFunction用于分配新的寄存器 * 当前作用域所属的 IRFunction用于分配新的寄存器
@ -41,7 +41,7 @@ final class Scope {
* @param name 变量名 * @param name 变量名
*/ */
void declare(String name) { void declare(String name) {
VirtualRegister reg = fn.newRegister(); IRVirtualRegister reg = fn.newRegister();
vars.put(name, reg); vars.put(name, reg);
} }
@ -51,7 +51,7 @@ final class Scope {
* @param name 变量名 * @param name 变量名
* @param reg 对应的虚拟寄存器 * @param reg 对应的虚拟寄存器
*/ */
void declare(String name, VirtualRegister reg) { void declare(String name, IRVirtualRegister reg) {
vars.put(name, reg); vars.put(name, reg);
} }
@ -61,7 +61,7 @@ final class Scope {
* @param name 变量名 * @param name 变量名
* @param reg 新的虚拟寄存器 * @param reg 新的虚拟寄存器
*/ */
void put(String name, VirtualRegister reg) { void put(String name, IRVirtualRegister reg) {
vars.put(name, reg); vars.put(name, reg);
} }
@ -69,9 +69,9 @@ final class Scope {
* 根据变量名查找其对应的虚拟寄存器 * 根据变量名查找其对应的虚拟寄存器
* *
* @param name 变量名 * @param name 变量名
* @return 对应的 VirtualRegister若未声明则返回 null * @return 对应的 IRVirtualRegister若未声明则返回 null
*/ */
VirtualRegister lookup(String name) { IRVirtualRegister lookup(String name) {
return vars.get(name); return vars.get(name);
} }
} }

View File

@ -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.IRFunction;
import org.jcnc.snow.compiler.ir.core.IRInstruction; import org.jcnc.snow.compiler.ir.core.IRInstruction;
import org.jcnc.snow.compiler.parser.ast.*; import org.jcnc.snow.compiler.ir.value.IRVirtualRegister;
import org.jcnc.snow.compiler.ir.value.VirtualRegister;
/** /**
* IRContext 封装了当前函数的 IRFunction 实例和作用域管理Scope * IRContext 封装了当前函数的 IRFunction 实例和作用域管理IRBuilderScope
* 并提供分配寄存器和添加 IR 指令的便利方法 * 并提供分配寄存器和添加 IR 指令的便利方法
* *
* <p>主要功能 * <p>主要功能
@ -25,7 +24,7 @@ public class IRContext {
/** /**
* 管理变量和寄存器映射的作用域 * 管理变量和寄存器映射的作用域
*/ */
private final Scope scope; private final IRBuilderScope IRBuilderScope;
/** /**
* 构造 IRContext并绑定要构建的 IRFunction * 构造 IRContext并绑定要构建的 IRFunction
@ -34,9 +33,9 @@ public class IRContext {
*/ */
public IRContext(IRFunction function) { public IRContext(IRFunction function) {
this.function = function; this.function = function;
this.scope = new Scope(); this.IRBuilderScope = new IRBuilderScope();
// IRFunction 与作用域关联以便指令生成时使用 // IRFunction 与作用域关联以便指令生成时使用
this.scope.attachFunction(function); this.IRBuilderScope.attachFunction(function);
} }
/** /**
@ -51,19 +50,19 @@ public class IRContext {
/** /**
* 获取当前作用域用于变量声明和查找 * 获取当前作用域用于变量声明和查找
* *
* @return 作用域对象 Scope * @return 作用域对象 IRBuilderScope
*/ */
/* 包内可见:仅在 builder 包内部使用 Scope */ /* 包内可见:仅在 builder 包内部使用 IRBuilderScope */
Scope getScope() { IRBuilderScope getScope() {
return scope; return IRBuilderScope;
} }
/** /**
* 分配一个新的虚拟寄存器 * 分配一个新的虚拟寄存器
* *
* @return 新分配的 VirtualRegister 对象 * @return 新分配的 IRVirtualRegister 对象
*/ */
public VirtualRegister newRegister() { public IRVirtualRegister newRegister() {
return function.newRegister(); return function.newRegister();
} }

View File

@ -10,7 +10,7 @@ import org.jcnc.snow.compiler.parser.ast.base.StatementNode;
import java.util.List; import java.util.List;
/** /**
* ProgramBuilder 用于将 AST 根节点列表构建为 IRProgram * IRProgramBuilder 用于将 AST 根节点列表构建为 IRProgram
* *
* <p>功能 * <p>功能
* <ul> * <ul>
@ -19,7 +19,7 @@ import java.util.List;
* <li>对脚本式顶层语句自动包装为特殊的 _start 函数</li> * <li>对脚本式顶层语句自动包装为特殊的 _start 函数</li>
* </ul> * </ul>
*/ */
public final class ProgramBuilder { public final class IRProgramBuilder {
/** /**
* 构建一个完整的 IRProgram * 构建一个完整的 IRProgram

View File

@ -1,23 +1,23 @@
package org.jcnc.snow.compiler.ir.builder; package org.jcnc.snow.compiler.ir.builder;
import org.jcnc.snow.compiler.ir.core.IROp; import org.jcnc.snow.compiler.ir.core.IROpCode;
import org.jcnc.snow.compiler.ir.instr.BinOpInstruction; import org.jcnc.snow.compiler.ir.instruction.BinaryOperationInstruction;
import org.jcnc.snow.compiler.ir.instr.LoadConstInstruction; import org.jcnc.snow.compiler.ir.instruction.LoadConstInstruction;
import org.jcnc.snow.compiler.ir.instr.ReturnInstruction; import org.jcnc.snow.compiler.ir.instruction.ReturnInstruction;
import org.jcnc.snow.compiler.ir.value.Constant; import org.jcnc.snow.compiler.ir.value.IRConstant;
import org.jcnc.snow.compiler.ir.value.VirtualRegister; import org.jcnc.snow.compiler.ir.value.IRVirtualRegister;
/** /**
* InstrFactory 统一管理 IR 指令的创建并自动将生成的指令添加到上下文中 * InstructionFactory 统一管理 IR 指令的创建并自动将生成的指令添加到上下文中
* *
* <p>提供的功能包括 * <p>提供的功能包括
* <ul> * <ul>
* <li>生成加载常量指令LoadConstInstruction</li> * <li>生成加载常量指令LoadConstInstruction</li>
* <li>生成二元运算指令BinOpInstruction</li> * <li>生成二元运算指令BinaryOperationInstruction</li>
* <li>生成返回指令ReturnInstruction支持有返回值和无返回值两种情况</li> * <li>生成返回指令ReturnInstruction支持有返回值和无返回值两种情况</li>
* </ul> * </ul>
*/ */
public class InstrFactory { public class InstructionFactory {
/** /**
* 生成加载整数常量的指令并返回对应的结果寄存器 * 生成加载整数常量的指令并返回对应的结果寄存器
@ -26,9 +26,9 @@ public class InstrFactory {
* @param value 要加载的整数值 * @param value 要加载的整数值
* @return 存放常量的虚拟寄存器 * @return 存放常量的虚拟寄存器
*/ */
public static VirtualRegister loadConst(IRContext ctx, int value) { public static IRVirtualRegister loadConst(IRContext ctx, int value) {
VirtualRegister vr = ctx.newRegister(); IRVirtualRegister vr = ctx.newRegister();
LoadConstInstruction instr = new LoadConstInstruction(vr, new Constant(value)); LoadConstInstruction instr = new LoadConstInstruction(vr, new IRConstant(value));
ctx.addInstruction(instr); ctx.addInstruction(instr);
return vr; return vr;
} }
@ -42,11 +42,11 @@ public class InstrFactory {
* @param right 右操作数寄存器 * @param right 右操作数寄存器
* @return 存放运算结果的虚拟寄存器 * @return 存放运算结果的虚拟寄存器
*/ */
public static VirtualRegister binOp(IRContext ctx, IROp op, public static IRVirtualRegister binOp(IRContext ctx, IROpCode op,
VirtualRegister left, IRVirtualRegister left,
VirtualRegister right) { IRVirtualRegister right) {
VirtualRegister dest = ctx.newRegister(); IRVirtualRegister dest = ctx.newRegister();
BinOpInstruction instr = new BinOpInstruction(op, dest, left, right); BinaryOperationInstruction instr = new BinaryOperationInstruction(op, dest, left, right);
ctx.addInstruction(instr); ctx.addInstruction(instr);
return dest; return dest;
} }
@ -57,7 +57,7 @@ public class InstrFactory {
* @param ctx 当前 IR 构建上下文 * @param ctx 当前 IR 构建上下文
* @param value 需要返回的虚拟寄存器 * @param value 需要返回的虚拟寄存器
*/ */
public static void ret(IRContext ctx, VirtualRegister value) { public static void ret(IRContext ctx, IRVirtualRegister value) {
ctx.addInstruction(new ReturnInstruction(value)); ctx.addInstruction(new ReturnInstruction(value));
} }

View File

@ -1,6 +1,6 @@
package org.jcnc.snow.compiler.ir.builder; 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.AssignmentNode;
import org.jcnc.snow.compiler.parser.ast.DeclarationNode; import org.jcnc.snow.compiler.parser.ast.DeclarationNode;
import org.jcnc.snow.compiler.parser.ast.ExpressionStatementNode; import org.jcnc.snow.compiler.parser.ast.ExpressionStatementNode;
@ -26,7 +26,7 @@ public class StatementBuilder {
return; return;
} }
if (stmt instanceof AssignmentNode an) { if (stmt instanceof AssignmentNode an) {
VirtualRegister vr = exprBuilder.build(an.value()); IRVirtualRegister vr = exprBuilder.build(an.value());
if (ctx.getScope().lookup(an.variable()) == null) { if (ctx.getScope().lookup(an.variable()) == null) {
ctx.getScope().declare(an.variable(), vr); ctx.getScope().declare(an.variable(), vr);
} else { } else {
@ -36,7 +36,7 @@ public class StatementBuilder {
} }
if (stmt instanceof DeclarationNode dn) { if (stmt instanceof DeclarationNode dn) {
if (dn.getInitializer().isPresent()) { if (dn.getInitializer().isPresent()) {
VirtualRegister init = exprBuilder.build(dn.getInitializer().get()); IRVirtualRegister init = exprBuilder.build(dn.getInitializer().get());
ctx.getScope().declare(dn.getName(), init); ctx.getScope().declare(dn.getName(), init);
} else { } else {
ctx.getScope().declare(dn.getName()); ctx.getScope().declare(dn.getName());
@ -45,10 +45,10 @@ public class StatementBuilder {
} }
if (stmt instanceof ReturnNode rn) { if (stmt instanceof ReturnNode rn) {
if (rn.getExpression().isPresent()) { if (rn.getExpression().isPresent()) {
VirtualRegister vr = exprBuilder.build(rn.getExpression().get()); IRVirtualRegister vr = exprBuilder.build(rn.getExpression().get());
InstrFactory.ret(ctx, vr); InstructionFactory.ret(ctx, vr);
} else { } else {
InstrFactory.retVoid(ctx); InstructionFactory.retVoid(ctx);
} }
return; return;
} }

View File

@ -1,6 +1,6 @@
package org.jcnc.snow.compiler.ir.core; 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.ArrayList;
import java.util.List; import java.util.List;
@ -35,8 +35,8 @@ public class IRFunction {
* *
* @return 新建的虚拟寄存器 * @return 新建的虚拟寄存器
*/ */
public VirtualRegister newRegister() { public IRVirtualRegister newRegister() {
return new VirtualRegister(regCounter++); return new IRVirtualRegister(regCounter++);
} }
/** /**

View File

@ -1,6 +1,6 @@
package org.jcnc.snow.compiler.ir.core; 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; import java.util.List;
@ -23,9 +23,9 @@ public abstract class IRInstruction {
* 获取指令的操作符 * 获取指令的操作符
* 例如ADD_I32CONSTRET * 例如ADD_I32CONSTRET
* *
* @return 操作符枚举值IROp * @return 操作符枚举值IROpCode
*/ */
public abstract IROp op(); public abstract IROpCode op();
/** /**
* 获取指令的目标寄存器若有的话 * 获取指令的目标寄存器若有的话
@ -35,7 +35,7 @@ public abstract class IRInstruction {
* *
* @return 目标寄存器或 null * @return 目标寄存器或 null
*/ */
public VirtualRegister dest() { public IRVirtualRegister dest() {
return null; return null;
} }

View File

@ -1,12 +1,12 @@
package org.jcnc.snow.compiler.ir.core; package org.jcnc.snow.compiler.ir.core;
/** /**
* IROp IR 层支持的操作码Opcode枚举类型 * IROpCode IR 层支持的操作码Opcode枚举类型
* <p> * <p>
* 每种操作码代表一条基本指令的种类 IRInstruction 使用 * 每种操作码代表一条基本指令的种类 IRInstruction 使用
* 可以根据编译器需求继续扩展 * 可以根据编译器需求继续扩展
*/ */
public enum IROp { public enum IROpCode {
/* ───── 算术运算 ───── */ /* ───── 算术运算 ───── */
/** 整型加法32位 */ /** 整型加法32位 */
@ -52,7 +52,7 @@ public enum IROp {
/** 存储到内存Store */ /** 存储到内存Store */
STORE, STORE,
/** 加载常量(Constant */ /** 加载常量(IRConstant */
CONST, CONST,
/* ───── 控制流 ───── */ /* ───── 控制流 ───── */
@ -63,7 +63,7 @@ public enum IROp {
/** 条件跳转Jump if zero若条件为 0 则跳转 */ /** 条件跳转Jump if zero若条件为 0 则跳转 */
JUMP_IF_ZERO, JUMP_IF_ZERO,
/** 标签(Label跳转目标位置 */ /** 标签(IRLabel跳转目标位置 */
LABEL, LABEL,
/* ───── 函数调用相关 ───── */ /* ───── 函数调用相关 ───── */

View File

@ -1,20 +1,20 @@
package org.jcnc.snow.compiler.ir.core; package org.jcnc.snow.compiler.ir.core;
import org.jcnc.snow.compiler.ir.value.Constant; import org.jcnc.snow.compiler.ir.value.IRConstant;
import org.jcnc.snow.compiler.ir.value.Label; import org.jcnc.snow.compiler.ir.value.IRLabel;
import org.jcnc.snow.compiler.ir.value.VirtualRegister; import org.jcnc.snow.compiler.ir.value.IRVirtualRegister;
/** /**
* IRValue 表示在中间表示IR系统中能作为操作数使用的基本单位 * IRValue 表示在中间表示IR系统中能作为操作数使用的基本单位
* <p> * <p>
* 包括 * 包括
* VirtualRegister虚拟寄存器 * IRVirtualRegister虚拟寄存器
* Constant常量 * IRConstant常量
* Label跳转标签 * IRLabel跳转标签
* <p> * <p>
* 本接口使用 sealed 限定明确列出所有允许实现它的子类型 * 本接口使用 sealed 限定明确列出所有允许实现它的子类型
* 保证类型安全并便于在编译时做穷尽检查 * 保证类型安全并便于在编译时做穷尽检查
*/ */
public sealed interface IRValue public sealed interface IRValue
permits VirtualRegister, Constant, Label { permits IRVirtualRegister, IRConstant, IRLabel {
} }

View File

@ -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.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.core.IRValue;
import org.jcnc.snow.compiler.ir.value.VirtualRegister; import org.jcnc.snow.compiler.ir.value.IRVirtualRegister;
import java.util.List; import java.util.List;
@ -12,12 +12,12 @@ import java.util.List;
* 格式为dest = lhs (OP) rhs * 格式为dest = lhs (OP) rhs
* 其中 dest 是结果寄存器lhs rhs 是操作数OP 是操作符如加法减法等 * 其中 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; private final IRValue lhs;
@ -33,7 +33,7 @@ public final class BinOpInstruction extends IRInstruction {
* @param lhs 左侧操作数 * @param lhs 左侧操作数
* @param rhs 右侧操作数 * @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.op = op;
this.dest = dest; this.dest = dest;
this.lhs = lhs; this.lhs = lhs;
@ -46,7 +46,7 @@ public final class BinOpInstruction extends IRInstruction {
* @return 操作符 * @return 操作符
*/ */
@Override @Override
public IROp op() { public IROpCode op() {
return op; return op;
} }
@ -56,7 +56,7 @@ public final class BinOpInstruction extends IRInstruction {
* @return 目标寄存器 * @return 目标寄存器
*/ */
@Override @Override
public VirtualRegister dest() { public IRVirtualRegister dest() {
return dest; return dest;
} }

View File

@ -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.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.core.IRValue;
import org.jcnc.snow.compiler.ir.value.Constant; import org.jcnc.snow.compiler.ir.value.IRConstant;
import org.jcnc.snow.compiler.ir.value.VirtualRegister; import org.jcnc.snow.compiler.ir.value.IRVirtualRegister;
import java.util.List; import java.util.List;
/** /**
* 表示常量加载指令Load Constant Instruction * 表示常量加载指令Load IRConstant Instruction
* 格式为dest = CONST k * 格式为dest = CONST k
* 其中 dest 是结果寄存器k 是要加载的常量值 * 其中 dest 是结果寄存器k 是要加载的常量值
*/ */
public final class LoadConstInstruction extends IRInstruction { 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 dest 目标寄存器用于存放常量
* @param k 要加载的常量值 * @param k 要加载的常量值
*/ */
public LoadConstInstruction(VirtualRegister dest, Constant k) { public LoadConstInstruction(IRVirtualRegister dest, IRConstant k) {
this.dest = dest; this.dest = dest;
this.k = k; this.k = k;
} }
@ -34,11 +34,11 @@ public final class LoadConstInstruction extends IRInstruction {
/** /**
* 获取此指令的操作符恒为 CONST * 获取此指令的操作符恒为 CONST
* *
* @return 操作符 IROp.CONST * @return 操作符 IROpCode.CONST
*/ */
@Override @Override
public IROp op() { public IROpCode op() {
return IROp.CONST; return IROpCode.CONST;
} }
/** /**
@ -47,7 +47,7 @@ public final class LoadConstInstruction extends IRInstruction {
* @return 目标虚拟寄存器 * @return 目标虚拟寄存器
*/ */
@Override @Override
public VirtualRegister dest() { public IRVirtualRegister dest() {
return dest; return dest;
} }

View File

@ -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.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.core.IRValue;
import org.jcnc.snow.compiler.ir.value.VirtualRegister; import org.jcnc.snow.compiler.ir.value.IRVirtualRegister;
import java.util.List; import java.util.List;
@ -16,25 +16,25 @@ import java.util.List;
*/ */
public final class ReturnInstruction extends IRInstruction { public final class ReturnInstruction extends IRInstruction {
// 返回值对应的虚拟寄存器如果是 void 返回则为 null // 返回值对应的虚拟寄存器如果是 void 返回则为 null
private final VirtualRegister value; private final IRVirtualRegister value;
/** /**
* 构造函数创建一个返回指令实例 * 构造函数创建一个返回指令实例
* *
* @param value 要返回的虚拟寄存器如果是 void 返回则传入 null * @param value 要返回的虚拟寄存器如果是 void 返回则传入 null
*/ */
public ReturnInstruction(VirtualRegister value) { public ReturnInstruction(IRVirtualRegister value) {
this.value = value; this.value = value;
} }
/** /**
* 获取此指令的操作符恒为 RET * 获取此指令的操作符恒为 RET
* *
* @return 操作符 IROp.RET * @return 操作符 IROpCode.RET
*/ */
@Override @Override
public IROp op() { public IROpCode op() {
return IROp.RET; return IROpCode.RET;
} }
/** /**
@ -54,7 +54,7 @@ public final class ReturnInstruction extends IRInstruction {
* *
* @return 返回值寄存器 null表示 void 返回 * @return 返回值寄存器 null表示 void 返回
*/ */
public VirtualRegister value() { public IRVirtualRegister value() {
return value; return value;
} }

View File

@ -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.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.core.IRValue;
import org.jcnc.snow.compiler.ir.value.VirtualRegister; import org.jcnc.snow.compiler.ir.value.IRVirtualRegister;
import java.util.List; import java.util.List;
@ -15,12 +15,12 @@ import java.util.List;
* - OP一元操作符如取负按位取反等 * - OP一元操作符如取负按位取反等
* - val操作数 * - val操作数
*/ */
public final class UnaryOpInstruction extends IRInstruction { public final class UnaryOperationInstruction extends IRInstruction {
// 一元操作符例如 NEG取负NOT逻辑非 // 一元操作符例如 NEG取负NOT逻辑非
private final IROp op; private final IROpCode op;
// 运算结果存放的目标虚拟寄存器 // 运算结果存放的目标虚拟寄存器
private final VirtualRegister dest; private final IRVirtualRegister dest;
// 一元运算的操作数 // 一元运算的操作数
private final IRValue val; private final IRValue val;
@ -32,7 +32,7 @@ public final class UnaryOpInstruction extends IRInstruction {
* @param dest 结果存放的目标寄存器 * @param dest 结果存放的目标寄存器
* @param val 操作数 * @param val 操作数
*/ */
public UnaryOpInstruction(IROp op, VirtualRegister dest, IRValue val) { public UnaryOperationInstruction(IROpCode op, IRVirtualRegister dest, IRValue val) {
this.op = op; this.op = op;
this.dest = dest; this.dest = dest;
this.val = val; this.val = val;
@ -44,7 +44,7 @@ public final class UnaryOpInstruction extends IRInstruction {
* @return 一元操作符 * @return 一元操作符
*/ */
@Override @Override
public IROp op() { public IROpCode op() {
return op; return op;
} }
@ -54,7 +54,7 @@ public final class UnaryOpInstruction extends IRInstruction {
* @return 目标虚拟寄存器 * @return 目标虚拟寄存器
*/ */
@Override @Override
public VirtualRegister dest() { public IRVirtualRegister dest() {
return dest; return dest;
} }

View File

@ -3,11 +3,11 @@ package org.jcnc.snow.compiler.ir.value;
import org.jcnc.snow.compiler.ir.core.IRValue; import org.jcnc.snow.compiler.ir.core.IRValue;
/** /**
* Constant 表示一个常量值例如整数常量字符串常量等 * IRConstant 表示一个常量值例如整数常量字符串常量等
* <p> * <p>
* 在中间表示IR常量通常是不可变的直接使用的值而不是寄存器或临时变量 * 在中间表示IR常量通常是不可变的直接使用的值而不是寄存器或临时变量
*/ */
public record Constant(Object value) implements IRValue { public record IRConstant(Object value) implements IRValue {
/** /**
* 将常量值转换为字符串表示 * 将常量值转换为字符串表示

View File

@ -3,14 +3,14 @@ package org.jcnc.snow.compiler.ir.value;
import org.jcnc.snow.compiler.ir.core.IRValue; import org.jcnc.snow.compiler.ir.core.IRValue;
/** /**
* Label 表示 IR 中的跳转目标标签 * IRLabel 表示 IR 中的跳转目标标签
* *
* 在中间表示IR控制流指令 JUMPJUMP_IF_ZERO需要依赖标签来指定跳转位置 * 在中间表示IR控制流指令 JUMPJUMP_IF_ZERO需要依赖标签来指定跳转位置
* 本类通过名字字符串唯一标识一个标签 * 本类通过名字字符串唯一标识一个标签
* *
* Label 也是一种 IRValue因此可以作为指令的操作数 * IRLabel 也是一种 IRValue因此可以作为指令的操作数
*/ */
public record Label(String name) implements IRValue { public record IRLabel(String name) implements IRValue {
/** /**
* 将标签转换为字符串形式 * 将标签转换为字符串形式

View File

@ -3,7 +3,7 @@ package org.jcnc.snow.compiler.ir.value;
import org.jcnc.snow.compiler.ir.core.IRValue; import org.jcnc.snow.compiler.ir.core.IRValue;
/** /**
* VirtualRegister 表示一个 SSA静态单赋值虚拟寄存器 * IRVirtualRegister 表示一个 SSA静态单赋值虚拟寄存器
* <p> * <p>
* 在中间表示IR每个中间值都存储在一个虚拟寄存器中 * 在中间表示IR每个中间值都存储在一个虚拟寄存器中
* <p> * <p>
@ -11,9 +11,9 @@ import org.jcnc.snow.compiler.ir.core.IRValue;
* - 每个寄存器都有唯一的 id通常由 IRBuilder 自动分配 * - 每个寄存器都有唯一的 id通常由 IRBuilder 自动分配
* - 遵循 SSA 形式即每个寄存器只被赋值一次 * - 遵循 SSA 形式即每个寄存器只被赋值一次
* <p> * <p>
* VirtualRegister 也是一种 IRValue可以作为指令的操作数 * IRVirtualRegister 也是一种 IRValue可以作为指令的操作数
*/ */
public record VirtualRegister(int id) implements IRValue { public record IRVirtualRegister(int id) implements IRValue {
/** /**
* 将虚拟寄存器转换为字符串形式 * 将虚拟寄存器转换为字符串形式