feat: 支持结构体多个 init 构造函数

- 修改 StructParser 类,支持解析多个 init 构造函数
- 使用列表 inits 替代单个 init 函数节点
- 增加按参数个数去重的逻辑,避免重复定义 init构造函数
- 更新 StructNode 构造方法,接收 inits 列表作为参数
This commit is contained in:
Luke 2025-09-01 16:54:20 +08:00
parent 94b4bf94cf
commit ba436cb91c

View File

@ -65,7 +65,7 @@ public class StructParser implements TopLevelParser {
/* -------- 初始化容器 -------- */
List<DeclarationNode> fields = new ArrayList<>();
FunctionNode init = null;
List<FunctionNode> inits = new ArrayList<>();
List<FunctionNode> methods = new ArrayList<>();
DeclarationStatementParser declParser = new DeclarationStatementParser();
@ -104,12 +104,17 @@ public class StructParser implements TopLevelParser {
/* ---------- 构造函数 init ---------- */
case "init" -> {
if (init != null) {
throw new UnexpectedToken(
"重复定义 init 构造函数",
ts.peek().getLine(), ts.peek().getCol());
FunctionNode ctor = parseInit(ctx, structName);
// 按参数个数去重
for (FunctionNode ex : inits) {
if (ex.parameters().size() == ctor.parameters().size()) {
throw new UnexpectedToken(
"重复定义 init 构造函数 (参数数量冲突)",
ts.peek().getLine(), ts.peek().getCol());
}
}
init = parseInit(ctx, structName);
inits.add(ctor);
}
/* ---------- 普通方法 function ---------- */
@ -119,8 +124,8 @@ public class StructParser implements TopLevelParser {
case "end" -> {
ts.expect("end");
ts.expect("struct");
// 返回完整结构体 AST 节点
return new StructNode(structName, parentName, fields, init, methods,
return new StructNode(structName, parentName,
fields, inits, methods,
new NodeContext(line, col, file));
}