优化代码架构
This commit is contained in:
parent
6985240b96
commit
303e8aa32b
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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()) { // 有初始化器
|
||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
@ -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;
|
||||||
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package org.jcnc.snow.compiler.ir;
|
package org.jcnc.snow.compiler.ir.core;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IROp —— IR 层支持的操作码(Opcode)枚举类型。
|
* IROp —— IR 层支持的操作码(Opcode)枚举类型。
|
||||||
@ -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;
|
||||||
@ -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)系统中能作为操作数使用的基本单位。
|
||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
@ -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 类 —— 表示一个常量值(例如整数常量、字符串常量等)。
|
||||||
@ -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 中的跳转目标标签。
|
||||||
@ -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(静态单赋值)虚拟寄存器。
|
||||||
Loading…
x
Reference in New Issue
Block a user