修改标识符

This commit is contained in:
Luke 2025-05-07 18:05:56 +08:00
parent 919f68550f
commit 375a62dc0b
7 changed files with 56 additions and 56 deletions

View File

@ -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;
}
}

View File

@ -30,18 +30,18 @@ public final class IRProgramBuilder {
*/
public IRProgram buildProgram(List<Node> 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);
}
/**

View File

@ -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));
}
/**

View File

@ -45,44 +45,44 @@ public class StatementBuilder {
* <li>ReturnNode如带返回表达式则生成带返回值的指令否则生成无返回值指令</li>
* </ul>
*
* @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());
}
}

View File

@ -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);
}
/**

View File

@ -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);
}
/**

View File

@ -13,7 +13,7 @@ import org.jcnc.snow.compiler.ir.value.IRVirtualRegister;
* <li>{@link IRConstant} 常量值表示字面量或计算常量</li>
* <li>{@link IRLabel} 跳转标签用于控制流跳转目标</li>
* </ul>
*
* <p>
* 本接口使用 sealed 限定明确列出了所有允许的实现子类型
* 有助于在编译期进行穷尽性对齐和类型安全检查
*/