Merge branch 'dev' into feat/refactor-opcode

This commit is contained in:
Luke 2025-06-27 22:06:19 +08:00
commit ba37db19f4
3 changed files with 29 additions and 18 deletions

View File

@ -62,7 +62,7 @@ public class CallGenerator implements InstructionGenerator<CallInstruction> {
char t = out.getSlotType(slotId); // 获取参数类型 char t = out.getSlotType(slotId); // 获取参数类型
if (t == '\0') t = 'I'; // 类型未知时默认整型 if (t == '\0') t = 'I'; // 类型未知时默认整型
// 生成类型相关的加载指令 I_LOADF_LOAD // 生成类型相关的加载指令 I_LOADF_LOAD
out.emit(OpHelper.opcode(String.valueOf(t) + "_LOAD") + " " + slotId); out.emit(OpHelper.opcode(t + "_LOAD") + " " + slotId);
} }
// 3. 生成 CALL 调用指令 // 3. 生成 CALL 调用指令
@ -70,7 +70,7 @@ public class CallGenerator implements InstructionGenerator<CallInstruction> {
// 4. 将返回值存入目标槽并记录槽的类型 // 4. 将返回值存入目标槽并记录槽的类型
int destSlot = slotMap.get(ins.getDest()); // 目标寄存器槽 int destSlot = slotMap.get(ins.getDest()); // 目标寄存器槽
out.emit(OpHelper.opcode(String.valueOf(retType) + "_STORE") + " " + destSlot); out.emit(OpHelper.opcode(retType + "_STORE") + " " + destSlot);
out.setSlotType(destSlot, retType); // 标记返回值类型 out.setSlotType(destSlot, retType); // 标记返回值类型
} }
} }

View File

@ -67,6 +67,7 @@ public class ASTPrinter {
} }
case FunctionNode( case FunctionNode(
String name, List<ParameterNode> parameters, String returnType, List<StatementNode> body String name, List<ParameterNode> parameters, String returnType, List<StatementNode> body
, _, _, _
) -> { ) -> {
System.out.println(pad + "function " + name System.out.println(pad + "function " + name
+ "(params=" + parameters + ", return=" + returnType + ")"); + "(params=" + parameters + ", return=" + returnType + ")");
@ -81,9 +82,12 @@ public class ASTPrinter {
.orElse(""); .orElse("");
System.out.println(pad + "declare " + d.getName() + ":" + d.getType() + init); System.out.println(pad + "declare " + d.getName() + ":" + d.getType() + init);
} }
case AssignmentNode(String variable, ExpressionNode value) -> case AssignmentNode(String variable, ExpressionNode value, _, int _, String _) ->
System.out.println(pad + variable + " = " + value); System.out.println(pad + variable + " = " + value);
case IfNode(ExpressionNode condition, List<StatementNode> thenBranch, List<StatementNode> elseBranch) -> { case IfNode(
ExpressionNode condition, List<StatementNode> thenBranch, List<StatementNode> elseBranch, int _,
int _, String _
) -> {
System.out.println(pad + "if " + condition); System.out.println(pad + "if " + condition);
for (StatementNode stmt : thenBranch) { for (StatementNode stmt : thenBranch) {
print(stmt, indent + 1); print(stmt, indent + 1);
@ -97,6 +101,7 @@ public class ASTPrinter {
} }
case LoopNode( case LoopNode(
StatementNode initializer, ExpressionNode condition, StatementNode update, List<StatementNode> body StatementNode initializer, ExpressionNode condition, StatementNode update, List<StatementNode> body
, int _, int _, String _
) -> { ) -> {
System.out.println(pad + "loop {"); System.out.println(pad + "loop {");
print(initializer, indent + 1); print(initializer, indent + 1);
@ -111,10 +116,9 @@ public class ASTPrinter {
} }
case ReturnNode r -> System.out.println(pad + "return" + case ReturnNode r -> System.out.println(pad + "return" +
r.getExpression().map(e -> " " + e).orElse("")); r.getExpression().map(e -> " " + e).orElse(""));
case ExpressionStatementNode(ExpressionNode expression) -> case ExpressionStatementNode(ExpressionNode expression, int _, int _, String _) ->
System.out.println(pad + expression); System.out.println(pad + expression);
case null, default -> case null, default -> System.out.println(pad + n); // 回退处理
System.out.println(pad + n); // 回退处理
} }
} }

View File

@ -81,7 +81,10 @@ public class ASTJsonSerializer {
private static Object nodeToMap(Node n) { private static Object nodeToMap(Node n) {
return switch (n) { return switch (n) {
// 模块节点 // 模块节点
case ModuleNode(String name, List<ImportNode> imports, List<FunctionNode> functions) -> { case ModuleNode(
String name, List<ImportNode> imports, List<FunctionNode> functions, _, int _,
String _
) -> {
Map<String, Object> map = newNodeMap("Module"); Map<String, Object> map = newNodeMap("Module");
map.put("name", name); map.put("name", name);
List<Object> imps = new ArrayList<>(imports.size()); List<Object> imps = new ArrayList<>(imports.size());
@ -177,20 +180,23 @@ public class ASTJsonSerializer {
private static Object exprToMap(ExpressionNode expr) { private static Object exprToMap(ExpressionNode expr) {
return switch (expr) { return switch (expr) {
// 二元表达式 // 二元表达式
case BinaryExpressionNode(ExpressionNode left, String operator, ExpressionNode right) -> exprMap("BinaryExpression", case BinaryExpressionNode(
ExpressionNode left, String operator, ExpressionNode right, int _, int _, String _
) -> exprMap("BinaryExpression",
"left", exprToMap(left), "left", exprToMap(left),
"operator", operator, "operator", operator,
"right", exprToMap(right) "right", exprToMap(right)
); );
// 一元表达式 // 一元表达式
case UnaryExpressionNode(String operator, ExpressionNode operand) -> exprMap("UnaryExpression", case UnaryExpressionNode(String operator, ExpressionNode operand, int _, int _, String _) ->
"operator", operator, exprMap("UnaryExpression",
"operand", exprToMap(operand) "operator", operator,
); "operand", exprToMap(operand)
);
// 布尔字面量 // 布尔字面量
case BoolLiteralNode(boolean value) -> exprMap("BoolLiteral", "value", value); case BoolLiteralNode(boolean value) -> exprMap("BoolLiteral", "value", value);
// 标识符 // 标识符
case IdentifierNode(String name) -> exprMap("Identifier", "name", name); case IdentifierNode(String name, int _, int _, String _) -> exprMap("Identifier", "name", name);
// 数字字面量 // 数字字面量
case NumberLiteralNode(String value) -> exprMap("NumberLiteral", "value", value); case NumberLiteralNode(String value) -> exprMap("NumberLiteral", "value", value);
// 字符串字面量 // 字符串字面量
@ -202,10 +208,11 @@ public class ASTJsonSerializer {
yield exprMap("CallExpression", "callee", exprToMap(callee), "arguments", args); yield exprMap("CallExpression", "callee", exprToMap(callee), "arguments", args);
} }
// 成员访问表达式 // 成员访问表达式
case MemberExpressionNode(ExpressionNode object, String member) -> exprMap("MemberExpression", case MemberExpressionNode(ExpressionNode object, String member, int _, int _, String _) ->
"object", exprToMap(object), exprMap("MemberExpression",
"member", member "object", exprToMap(object),
); "member", member
);
// 默认兜底处理只写类型 // 默认兜底处理只写类型
default -> Map.of("type", expr.getClass().getSimpleName()); default -> Map.of("type", expr.getClass().getSimpleName());
}; };