优化标识符
This commit is contained in:
parent
1b13c55b0d
commit
f886933d7c
@ -1,6 +1,6 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="SnowCompiler" type="Application" factoryName="Application" activateToolWindowBeforeRun="false" nameIsGenerated="true">
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="graalvm-ce-23" />
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="D:/Downloads/DevDownloads/JDK/graalvm-jdk-23" />
|
||||
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="true" />
|
||||
<option name="MAIN_CLASS_NAME" value="org.jcnc.snow.compiler.cli.SnowCompiler" />
|
||||
<module name="SCompiler" />
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
package org.jcnc.snow.compiler.builder;
|
||||
|
||||
import org.jcnc.snow.compiler.ir.core.IRFunction;
|
||||
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.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;
|
||||
@ -98,10 +98,6 @@ public final class BasicIRBuilder {
|
||||
// 编译函数体中的每条语句
|
||||
for (StatementNode statementNode : functionNode.body()) stmt(statementNode);
|
||||
|
||||
// 如果函数末尾没有 return,自动添加一个 return(无返回值)
|
||||
if (currentFn.body().isEmpty() || !(currentFn.body().getLast() instanceof ReturnInstruction))
|
||||
currentFn.add(new ReturnInstruction(null));
|
||||
|
||||
return currentFn;
|
||||
}
|
||||
|
||||
@ -110,28 +106,30 @@ public final class BasicIRBuilder {
|
||||
/**
|
||||
* 编译单个语句节点为 IR 指令。
|
||||
*
|
||||
* @param n 语句 AST 节点
|
||||
* @param statementNode 语句 AST 节点
|
||||
*/
|
||||
private void stmt(StatementNode n) {
|
||||
switch (n) {
|
||||
case ExpressionStatementNode expressionStatementNode -> expr(expressionStatementNode.expression()); // 表达式语句:只求值,无需保存
|
||||
private void stmt(StatementNode statementNode) {
|
||||
switch (statementNode) {
|
||||
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()) { // 有初始化器
|
||||
VirtualRegister init = expr(d.getInitializer().get());
|
||||
variables.put(d.getName(), init);
|
||||
case DeclarationNode declarationNode -> { // 变量声明
|
||||
if (declarationNode.getInitializer().isPresent()) { // 有初始化器
|
||||
VirtualRegister virtualRegister = expr(declarationNode.getInitializer().get());
|
||||
variables.put(declarationNode.getName(), virtualRegister);
|
||||
} else { // 无初始化器,分配空寄存器
|
||||
variables.put(d.getName(), currentFn.newRegister());
|
||||
variables.put(declarationNode.getName(), currentFn.newRegister());
|
||||
}
|
||||
}
|
||||
case ReturnNode r -> { // 返回语句
|
||||
if (r.getExpression().isPresent()) currentFn.add(new ReturnInstruction(expr(r.getExpression().get())));
|
||||
case ReturnNode returnNode -> { // 返回语句
|
||||
if (returnNode.getExpression().isPresent())
|
||||
currentFn.add(new ReturnInstruction(expr(returnNode.getExpression().get())));
|
||||
else currentFn.add(new ReturnInstruction(null));
|
||||
}
|
||||
default -> throw new IllegalStateException("不支持的语句: " + n);
|
||||
default -> throw new IllegalStateException("不支持的语句: " + statementNode);
|
||||
}
|
||||
}
|
||||
|
||||
@ -140,24 +138,25 @@ public final class BasicIRBuilder {
|
||||
/**
|
||||
* 编译单个表达式节点,结果保存在一个新的寄存器中。
|
||||
*
|
||||
* @param e 表达式 AST 节点
|
||||
* @param expressionNode 表达式 AST 节点
|
||||
* @return 保存结果的虚拟寄存器
|
||||
*/
|
||||
private VirtualRegister expr(ExpressionNode e) {
|
||||
return switch (e) {
|
||||
case BinaryExpressionNode b -> bin(b); // 二元运算
|
||||
case NumberLiteralNode n -> number(n); // 数字字面量
|
||||
case IdentifierNode id -> { // 变量引用
|
||||
VirtualRegister v = variables.get(id.name());
|
||||
if (v == null) throw new IllegalStateException("变量 " + id.name() + " 未定义");
|
||||
yield v;
|
||||
private VirtualRegister expr(ExpressionNode expressionNode) {
|
||||
return switch (expressionNode) {
|
||||
case BinaryExpressionNode binaryExpressionNode -> bin(binaryExpressionNode); // 二元运算
|
||||
case NumberLiteralNode numberLiteralNode -> number(numberLiteralNode); // 数字字面量
|
||||
case IdentifierNode identifierNode -> { // 变量引用
|
||||
VirtualRegister virtualRegister = variables.get(identifierNode.name());
|
||||
if (virtualRegister == null)
|
||||
throw new IllegalStateException("变量 " + identifierNode.name() + " 未定义");
|
||||
yield virtualRegister;
|
||||
}
|
||||
default -> throw new IllegalStateException("不支持的表达式: " + e);
|
||||
default -> throw new IllegalStateException("不支持的表达式: " + expressionNode);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 编译一个二元运算表达式(如加减乘除)。
|
||||
* 二元运算表达式(如加减乘除)。
|
||||
*
|
||||
* @param b 二元表达式节点
|
||||
* @return 保存结果的寄存器
|
||||
@ -183,12 +182,12 @@ public final class BasicIRBuilder {
|
||||
/**
|
||||
* 编译一个整数字面量。
|
||||
*
|
||||
* @param n 数字字面量节点
|
||||
* @param numberLiteralNode 数字字面量节点
|
||||
* @return 保存常量的寄存器
|
||||
*/
|
||||
private VirtualRegister number(NumberLiteralNode n) {
|
||||
VirtualRegister d = currentFn.newRegister(); // 分配一个新的寄存器
|
||||
currentFn.add(new LoadConstInstruction(d, new Constant(Integer.parseInt(n.value())))); // 加载常量指令
|
||||
return d;
|
||||
private VirtualRegister number(NumberLiteralNode numberLiteralNode) {
|
||||
VirtualRegister virtualRegister = currentFn.newRegister(); // 分配一个新的寄存器
|
||||
currentFn.add(new LoadConstInstruction(virtualRegister, new Constant(Integer.parseInt(numberLiteralNode.value())))); // 加载常量指令
|
||||
return virtualRegister;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user