优化代码架构

This commit is contained in:
Luke 2025-04-30 15:17:23 +08:00
parent 6985240b96
commit 303e8aa32b
16 changed files with 58 additions and 33 deletions

View File

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

View File

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

View File

@ -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()) { // 有初始化器

View File

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

View File

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

View File

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

View File

@ -1,4 +1,4 @@
package org.jcnc.snow.compiler.ir;
package org.jcnc.snow.compiler.ir.core;
/**
* IROp IR 层支持的操作码Opcode枚举类型

View File

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

View File

@ -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系统中能作为操作数使用的基本单位

View File

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

View File

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

View File

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

View File

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

View File

@ -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 表示一个常量值例如整数常量字符串常量等

View File

@ -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 中的跳转目标标签

View File

@ -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静态单赋值虚拟寄存器