feat(ast): 重构AST转储功能并创建AST到IR转换器

- 重构ast_dump.c中的宏定义,简化PRINT_VALUE、PRINT_NODE、
  PRINT_QUOTED_VALUE等宏的实现
- 移除冗余的PRINT_COLORED宏定义
- 统一使用SCC_TREE_DUMP_PRINT_PURE和SCC_TREE_DUMP_PRINT_AROUND
  宏进行转储输出
- 在dump_stmt_impl函数中优化节点转储逻辑,统一使用end_node_dump
  替代手动换行
- 添加对未知节点类型的警告日志输出
- 创建新的ast2ir模块,包含AST到IR的基本转换功能
- 实现ast_type_to_ir_type、ast_expr_to_ir、ast_stmt_to_ir、
  ast_decl_to_ir等核心转换函数
- 更新IR库依赖配置,添加scc_utils和tree_dump依赖
- 新增IR基础接口定义文件ir_base.h和IR构建器接口ir_builder.h
This commit is contained in:
zzy
2026-01-30 23:01:55 +08:00
parent c8bf98525d
commit 2a90e165a5
17 changed files with 2341 additions and 172 deletions

View File

@@ -5,27 +5,14 @@
#include <ast_dump.h>
// 通用宏定义
#define PRINT_COLORED(ctx, color_field, fmt, ...) \
do { \
if (ctx->use_color) { \
scc_printf("%s" fmt "%s", ctx->color_field, ##__VA_ARGS__, \
ctx->reset_color); \
} else { \
scc_printf(fmt, ##__VA_ARGS__); \
} \
} while (0)
#define PRINT_VALUE(ctx, fmt, value) \
SCC_TREE_DUMP_PRINT_PURE(ctx, ctx->value_color, fmt, value)
#define PRINT_VALUE(ctx, fmt, ...) \
PRINT_COLORED(ctx, value_color, fmt, ##__VA_ARGS__)
#define PRINT_NODE(ctx, name, value) \
SCC_TREE_DUMP_PRINT_PURE(ctx, ctx->node_color, "%s", name)
#define PRINT_NODE_TYPE(ctx, node) \
PRINT_COLORED(ctx, node_color, "%s", get_node_type_str(node->type))
#define PRINT_QUOTED_VALUE(ctx, value) \
do { \
PRINT_VALUE(ctx, "'%s'", value); \
} while (0)
#define PRINT_QUOTED_VALUE(ctx, str) \
SCC_TREE_DUMP_PRINT_AROUND(ctx, ctx->value_color, "'", "%s", str)
// 获取节点类型的字符串表示
static const char *get_node_type_str(scc_ast_node_type_t type) {
@@ -267,7 +254,8 @@ static const char *get_op_str(scc_ast_expr_op_t op) {
static inline void start_node_dump(scc_ast_node_t *node,
scc_tree_dump_ctx_t *ctx) {
scc_tree_print_indent(ctx);
PRINT_NODE_TYPE(ctx, node);
SCC_TREE_DUMP_PRINT_PURE(ctx, ctx->node_color, "%s",
get_node_type_str(node->type));
}
// 通用的结束节点打印函数
@@ -455,8 +443,7 @@ static void dump_expr_impl(scc_ast_expr_t *expr, scc_tree_dump_ctx_t *ctx) {
dump_child_node((scc_ast_node_t *)expr->member.base, ctx, false);
// 打印成员访问信息
scc_tree_print_indent(ctx);
PRINT_COLORED(ctx, node_color, "Member [\"%s\"]",
expr->member.member_name);
PRINT_NODE(ctx, "Member [\"%s\"]", expr->member.member_name);
scc_printf("\n");
break;
@@ -496,11 +483,10 @@ static void dump_stmt_impl(scc_ast_stmt_t *stmt, scc_tree_dump_ctx_t *ctx) {
return;
start_node_dump(&stmt->base, ctx);
// 根据语句类型输出特定信息
switch (stmt->base.type) {
case SCC_AST_STMT_IF:
scc_printf("\n"); // if语句总是换行显示子节点
end_node_dump(ctx);
dump_child_node((scc_ast_node_t *)stmt->if_stmt.cond, ctx, false);
dump_child_node((scc_ast_node_t *)stmt->if_stmt.then_stmt, ctx,
!stmt->if_stmt.opt_else_stmt);
@@ -510,22 +496,22 @@ static void dump_stmt_impl(scc_ast_stmt_t *stmt, scc_tree_dump_ctx_t *ctx) {
}
return;
case SCC_AST_STMT_WHILE:
scc_printf("\n"); // 循环和switch语句换行显示子节点
end_node_dump(ctx);
dump_child_node((scc_ast_node_t *)stmt->while_stmt.cond, ctx, false);
dump_child_node((scc_ast_node_t *)stmt->while_stmt.body, ctx, true);
return;
case SCC_AST_STMT_DO_WHILE:
scc_printf("\n"); // 循环和switch语句换行显示子节点
end_node_dump(ctx);
dump_child_node((scc_ast_node_t *)stmt->do_while_stmt.body, ctx, false);
dump_child_node((scc_ast_node_t *)stmt->do_while_stmt.cond, ctx, true);
return;
case SCC_AST_STMT_SWITCH:
scc_printf("\n"); // 循环和switch语句换行显示子节点
end_node_dump(ctx);
dump_child_node((scc_ast_node_t *)stmt->switch_stmt.cond, ctx, false);
dump_child_node((scc_ast_node_t *)stmt->switch_stmt.body, ctx, true);
return;
case SCC_AST_STMT_FOR:
scc_printf("\n"); // for语句换行显示子节点
end_node_dump(ctx);
if (stmt->for_stmt.init) {
dump_child_node((scc_ast_node_t *)stmt->for_stmt.init, ctx, false);
}
@@ -539,31 +525,27 @@ static void dump_stmt_impl(scc_ast_stmt_t *stmt, scc_tree_dump_ctx_t *ctx) {
return;
case SCC_AST_STMT_RETURN:
if (stmt->return_stmt.expr) {
scc_printf("\n");
end_node_dump(ctx);
dump_child_node((scc_ast_node_t *)stmt->return_stmt.expr, ctx,
true);
return;
} else {
end_node_dump(ctx);
}
break;
case SCC_AST_STMT_GOTO:
if (stmt->goto_stmt.label) {
PRINT_VALUE(ctx, " Label: %s", stmt->goto_stmt.label);
}
end_node_dump(ctx);
break;
case SCC_AST_STMT_LABEL:
if (stmt->label_stmt.label) {
PRINT_VALUE(ctx, " %s", stmt->label_stmt.label);
}
end_node_dump(ctx);
break;
default:
break;
}
end_node_dump(ctx);
// 递归转储其他子节点
switch (stmt->base.type) {
case SCC_AST_STMT_COMPOUND:
end_node_dump(ctx);
for (size_t i = 0; i < stmt->compound.block_items.size; i++) {
scc_ast_node_t *item =
(scc_ast_node_t *)stmt->compound.block_items.data[i];
@@ -573,21 +555,25 @@ static void dump_stmt_impl(scc_ast_stmt_t *stmt, scc_tree_dump_ctx_t *ctx) {
break;
case SCC_AST_STMT_EXPR:
end_node_dump(ctx);
if (stmt->expr.expr) {
dump_child_node((scc_ast_node_t *)stmt->expr.expr, ctx, true);
}
break;
case SCC_AST_STMT_CASE:
end_node_dump(ctx);
dump_child_node((scc_ast_node_t *)stmt->case_stmt.expr, ctx, false);
dump_child_node((scc_ast_node_t *)stmt->case_stmt.stmt, ctx, true);
break;
case SCC_AST_STMT_DEFAULT:
end_node_dump(ctx);
dump_child_node((scc_ast_node_t *)stmt->default_stmt.stmt, ctx, true);
break;
default:
LOG_WARN("unknown node type %d", stmt->base.type);
break;
}
}
@@ -705,8 +691,7 @@ static void dump_unit_impl(scc_ast_translation_unit_t *unit,
return;
start_node_dump(&unit->base, ctx);
scc_printf("\n");
end_node_dump(ctx);
for (size_t i = 0; i < unit->declarations.size; i++) {
dump_child_node((scc_ast_node_t *)unit->declarations.data[i], ctx,
i == unit->declarations.size - 1);
@@ -728,4 +713,4 @@ void scc_ast_dump_node(scc_tree_dump_ctx_t *ctx, const scc_ast_node_t *node) {
} else if (SCC_AST_IS_A(scc_ast_translation_unit_t, node)) {
dump_unit_impl(SCC_AST_CAST_TO(scc_ast_translation_unit_t, node), ctx);
}
}
}