From 17c19fd9b9c2778d5f67930ffa5b52c76ad73de3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E8=88=AA=E5=AE=87?= <3364451258@qq.com> Date: Sat, 6 Jun 2026 16:54:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20P0=E5=AE=A1=E6=9F=A5=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=20=E2=80=94=20CLAUDE.md=E6=95=B0=E6=8D=AE=E6=9B=B4=E6=96=B0=20?= =?UTF-8?q?+=20load=5Fmodule=20malloc=E2=86=92arena?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLAUDE.md | 10 +++++----- src/parser/parser.c | 3 +-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 01ac88b..2acb9c0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -132,14 +132,14 @@ L Language/ ├── src/ │ ├── lexer/ │ │ ├── token.h/c Token {kind, start, length, line, col} -│ │ └── lexer.h/c 手写状态机,67 种 Token 类型 +│ │ └── lexer.h/c 手写状态机,72 种 Token 类型 │ ├── parser/ │ │ └── parser.h/c Pratt 表达式 (9 级优先级) + 递归下降语句 │ ├── ast/ -│ │ └── ast.h/c 14 种节点 (PROGRAM..IDENT_EXPR) + 工厂函数 +│ │ └── ast.h/c 27 种 AST 节点 + 工厂函数 │ ├── sema/ │ │ ├── symbol.h/c 作用域链 (Scope* parent 链表) -│ │ └── sema.h/c 类型推断 + 类型检查 + 3 个内建函数注册 +│ │ └── sema.h/c 类型推断 + 类型检查 + 5 个内建函数注册 │ ├── codegen/ │ │ └── codegen.h/c AST → LLVM-C API → LLVMModuleRef │ ├── driver/ @@ -151,8 +151,8 @@ L Language/ │ ├── test_utils.h 断言宏 (ASSERT / TEST_RUN / test_summary) │ ├── test_lexer.c 词法测试 (41 tests) │ ├── test_parser.c 语法测试 (15 tests) -│ ├── test_sema.c 语义测试 (9 tests) -│ └── programs/ .l 集成测试 (5 个程序) +│ ├── test_sema.c 语义测试 (74 tests) +│ └── programs/ .l 集成测试 (34 个程序) ├── docs/ │ ├── PRD.md 产品需求文档 │ └── superpowers/plans/ 实现计划 diff --git a/src/parser/parser.c b/src/parser/parser.c index 642e575..73004f6 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -1008,14 +1008,13 @@ static AstNode* load_module(Arena* a, const char* parent_file, } fseek(f, 0, SEEK_END); size_t sz = ftell(f); fseek(f, 0, SEEK_SET); - char* src = malloc(sz + 1); + char* src = arena_alloc_impl(a, sz + 1); if (!src) { fclose(f); return NULL; } fread(src, 1, sz, f); src[sz] = '\0'; fclose(f); size_t tc; ErrorInfo lex_err = {0}; Token* toks = lex(a, src, mod_path, &tc, &lex_err); - free(src); if (!toks) { *error = lex_err; return NULL; } AstNode* ast = parse(a, toks, tc, mod_path, error);