优化代码架构

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 // file: compiler/backend/RegisterAllocator.java
package org.jcnc.snow.compiler.backend; 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.instr.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.HashMap;
import java.util.Map; import java.util.Map;

View File

@ -1,7 +1,10 @@
package org.jcnc.snow.compiler.backend; 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.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 org.jcnc.snow.vm.engine.VMOpCode;
import java.lang.reflect.Field; 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.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.LoadConstInstruction;
import org.jcnc.snow.compiler.ir.instr.ReturnInstruction; 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.*;
import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode; import org.jcnc.snow.compiler.parser.ast.base.ExpressionNode;
import org.jcnc.snow.compiler.parser.ast.base.Node; import org.jcnc.snow.compiler.parser.ast.base.Node;
@ -110,10 +114,10 @@ public final class BasicIRBuilder {
*/ */
private void stmt(StatementNode n) { private void stmt(StatementNode n) {
switch (n) { switch (n) {
case ExpressionStatementNode es -> expr(es.expression()); // 表达式语句只求值无需保存 case ExpressionStatementNode expressionStatementNode -> expr(expressionStatementNode.expression()); // 表达式语句只求值无需保存
case AssignmentNode as -> { // 赋值语句 case AssignmentNode assignmentNode -> { // 赋值语句
VirtualRegister rhs = expr(as.value()); VirtualRegister virtualRegister = expr(assignmentNode.value());
variables.put(as.variable(), rhs); variables.put(assignmentNode.variable(), virtualRegister);
} }
case DeclarationNode d -> { // 变量声明 case DeclarationNode d -> { // 变量声明
if (d.getInitializer().isPresent()) { // 有初始化器 if (d.getInitializer().isPresent()) { // 有初始化器

View File

@ -1,20 +1,14 @@
package org.jcnc.snow.compiler.cli; package org.jcnc.snow.compiler.cli;
import org.jcnc.snow.compiler.backend.RegisterAllocator; import org.jcnc.snow.compiler.builder.BasicIRBuilder;
import org.jcnc.snow.compiler.backend.VMCodeGenerator; import org.jcnc.snow.compiler.ir.core.IRProgram;
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.lexer.core.LexerEngine; import org.jcnc.snow.compiler.lexer.core.LexerEngine;
import org.jcnc.snow.compiler.lexer.token.Token; 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.ast.base.Node;
import org.jcnc.snow.compiler.parser.context.ParserContext; import org.jcnc.snow.compiler.parser.context.ParserContext;
import org.jcnc.snow.compiler.parser.core.ParserEngine; import org.jcnc.snow.compiler.parser.core.ParserEngine;
import org.jcnc.snow.compiler.parser.function.ASTPrinter; import org.jcnc.snow.compiler.parser.function.ASTPrinter;
import org.jcnc.snow.compiler.semantic.core.SemanticAnalyzerRunner; 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.io.IOException;
import java.nio.charset.StandardCharsets; 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.value.VirtualRegister;
import org.jcnc.snow.compiler.ir.VirtualRegister;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; 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; 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枚举类型 * IROp IR 层支持的操作码Opcode枚举类型

View File

@ -1,6 +1,4 @@
package org.jcnc.snow.compiler.ir; package org.jcnc.snow.compiler.ir.core;
import org.jcnc.snow.compiler.ir.instr.IRFunction;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; 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系统中能作为操作数使用的基本单位 * IRValue 表示在中间表示IR系统中能作为操作数使用的基本单位

View File

@ -1,6 +1,9 @@
package org.jcnc.snow.compiler.ir.instr; 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; import java.util.List;

View File

@ -1,6 +1,10 @@
package org.jcnc.snow.compiler.ir.instr; 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; import java.util.List;

View File

@ -1,6 +1,9 @@
package org.jcnc.snow.compiler.ir.instr; 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; import java.util.List;

View File

@ -1,6 +1,9 @@
package org.jcnc.snow.compiler.ir.instr; 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; 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 表示一个常量值例如整数常量字符串常量等 * 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 中的跳转目标标签 * 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静态单赋值虚拟寄存器 * VirtualRegister 表示一个 SSA静态单赋值虚拟寄存器