From 30ac2de73bfaca1e5a5c91d08367303bf498cb91 Mon Sep 17 00:00:00 2001 From: zzy <2450266535@qq.com> Date: Wed, 11 Mar 2026 22:07:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(parser):=20=E6=B7=BB=E5=8A=A0=E8=AF=AD?= =?UTF-8?q?=E4=B9=89=E5=88=86=E6=9E=90=E5=9B=9E=E8=B0=83=E6=B8=85=E7=90=86?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E5=B9=B6=E5=AE=8C=E5=96=84=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加了 scc_sema_drop 函数用于清理语义分析回调结构, 并在主程序中正确初始化和释放语义分析回调, 确保资源得到适当管理。 同时修复了AST转储中的缩进问题,在函数调用括号前添加正确的缩进, 并修正了测试代码中的结构体字段初始化顺序。 --- libs/ast/src/ast_dump.c | 2 ++ libs/parser/include/scc_sema.h | 1 + libs/parser/src/scc_sema.c | 2 ++ libs/parser/tests/test_parser_unit.c | 2 ++ src/main.c | 13 ++++++++----- 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/libs/ast/src/ast_dump.c b/libs/ast/src/ast_dump.c index 5deb39c..c834c13 100644 --- a/libs/ast/src/ast_dump.c +++ b/libs/ast/src/ast_dump.c @@ -355,7 +355,9 @@ static void dump_type_impl(scc_ast_type_t *type, scc_tree_dump_ctx_t *ctx) { dump_type_impl(param->param.type, ctx); } } else { + scc_tree_print_indent(ctx); PRINT_QUOTED_VALUE(ctx, "()"); + scc_tree_dump_printf(ctx, "\n"); } scc_vec_pop(ctx->stack); break; diff --git a/libs/parser/include/scc_sema.h b/libs/parser/include/scc_sema.h index 15a4781..47c4924 100644 --- a/libs/parser/include/scc_sema.h +++ b/libs/parser/include/scc_sema.h @@ -24,5 +24,6 @@ typedef struct scc_sema_callbacks { } scc_sema_callbacks_t; void scc_sema_init(scc_sema_callbacks_t *callbacks); +void scc_sema_drop(scc_sema_callbacks_t *callbacks); #endif /* __SCC_SEMA_H__ */ diff --git a/libs/parser/src/scc_sema.c b/libs/parser/src/scc_sema.c index 97affcc..f1610aa 100644 --- a/libs/parser/src/scc_sema.c +++ b/libs/parser/src/scc_sema.c @@ -14,3 +14,5 @@ void scc_sema_init(scc_sema_callbacks_t *callbacks) { callbacks->on_type = null; callbacks->got_type = null; } + +void scc_sema_drop(scc_sema_callbacks_t *callbacks) {} diff --git a/libs/parser/tests/test_parser_unit.c b/libs/parser/tests/test_parser_unit.c index 3fa8b8d..b38056e 100644 --- a/libs/parser/tests/test_parser_unit.c +++ b/libs/parser/tests/test_parser_unit.c @@ -1123,6 +1123,8 @@ static void test_parser_type(void) { scc_ast_type_t struct_type; scc_ast_type_struct_init(&struct_type, null, &struct_def); SCC_CHECK_AST(&struct_type.base, "struct { int x; }", _scc_parse_type); + scc_vec_init(fields); + scc_vec_push(fields, &field); scc_ast_decl_struct_init(&struct_def, "A", &fields); scc_ast_type_struct_init(&struct_type, "A", &struct_def); SCC_CHECK_AST(&struct_type.base, "struct A { int x; }", diff --git a/src/main.c b/src/main.c index 2af75f2..23d05ef 100644 --- a/src/main.c +++ b/src/main.c @@ -271,14 +271,17 @@ int main(int argc, const char **argv, const char **envp) { scc_lexer_tok_ring_t *tok_ring = scc_pproc_to_ring(&pproc, 8, false, false); scc_parser_t parser; - scc_parser_init(&parser, tok_ring, null); + scc_sema_callbacks_t sema_callbacks; + scc_sema_init(&sema_callbacks); + scc_parser_init(&parser, tok_ring, &sema_callbacks); scc_ast_translation_unit_t *translation_unit = scc_parse_translation_unit(&parser); - // scc_parser_drop(&parser); - // scc_pproc_drop(&pproc); - // scc_lexer_drop(&lexer); - // scc_sstream_drop(&sstream); + scc_sema_drop(&sema_callbacks); + scc_parser_drop(&parser); + scc_pproc_drop(&pproc); + scc_lexer_drop(&lexer); + scc_sstream_drop(&sstream); if (config.emit_ast) { scc_tree_dump_ctx_t tree_dump;