- 将头文件中的tree_dump.h替换为scc_tree_dump.h - 修改函数签名将scc_tree_dump_ctx_t改为scc_tree_dump_t - 移除过时的宏定义和内联函数实现 - 使用新的scc_tree_dump_* API替代旧的PRINT_*宏 - 简化类型、表达式、语句和声明的转储逻辑 - 统一使用新的树转储接口进行节点和值的输出 feat(ast2ir): 实现逻辑运算符和一元运算符的IR转换 - 添加scc_ast2ir_logical_expr函数处理&&和||运算符 - 实现短路求值逻辑,包含分支控制流 - 添加对一元正号运算符的支持 - 实现取地址和间接寻址运算符 - 添加字符字面量解析支持转义序列 fix(ir): 修复字符串常量构建中的长度计算错误 - 修正数组长度计算从len+1改为len-1 - 调整字符串内容复制逻辑跳过引号边界 - 修正内存分配大小与实际数据长度匹配 refactor(ir): 更新IR转储模块使用统一的树转储接口 - 将IR转储上下文中的tree_dump_ctx_t替换为scc_tree_dump_t - 更新初始化函数签名以使用新的转储接口类型
100 lines
3.0 KiB
C
100 lines
3.0 KiB
C
#ifndef SCC_TREE_DUMP_H
|
||
#define SCC_TREE_DUMP_H
|
||
|
||
#include "scc_core_str.h"
|
||
#include "scc_core_vec.h"
|
||
|
||
typedef struct scc_tree_dump {
|
||
scc_str_t buf; // 字符串缓冲区
|
||
SCC_VEC(cbool) stack; // 缩进栈:每个元素表示该层是否为最后一个子节点
|
||
cbool use_color; // 是否启用颜色
|
||
cbool line_start; // 当前是否在行首(需要输出缩进)
|
||
|
||
// 可配置的缩进字符串
|
||
const char *vertical; // "| "
|
||
const char *branch; // "|-"
|
||
const char *last_branch; // "`-"
|
||
const char *space; // " "
|
||
|
||
// 颜色字符串(当 use_color 为 false 时为空字符串)
|
||
const char *node_color; // 节点名称颜色
|
||
const char *value_color; // 值颜色
|
||
const char *branch_color; // 分支符号颜色
|
||
const char *reset_color; // 重置颜色
|
||
} scc_tree_dump_t;
|
||
|
||
/**
|
||
* @brief 初始化树形输出器
|
||
* @param td 输出器指针
|
||
* @param use_color 是否使用 ANSI 颜色
|
||
*/
|
||
void scc_tree_dump_init(scc_tree_dump_t *td, cbool use_color);
|
||
|
||
/**
|
||
* @brief 释放输出器占用的资源
|
||
*/
|
||
void scc_tree_dump_drop(scc_tree_dump_t *td);
|
||
|
||
/**
|
||
* @brief 清空当前缓冲区,但保留已分配内存
|
||
*/
|
||
void scc_tree_dump_clear(scc_tree_dump_t *td);
|
||
|
||
/**
|
||
* @brief 获取当前构建的字符串(以 '\0' 结尾)
|
||
* @return 内部缓冲区指针,不可 free
|
||
*/
|
||
const char *scc_tree_dump_cstr(scc_tree_dump_t *td);
|
||
|
||
/**
|
||
* @brief 将缓冲区内容通过回调输出,并清空缓冲区
|
||
* @param output 输出回调函数,接收字符串指针、长度、用户数据
|
||
* @param user 用户数据
|
||
*/
|
||
void scc_tree_dump_flush(scc_tree_dump_t *td,
|
||
void (*output)(const char *str, usize len, void *user),
|
||
void *user);
|
||
|
||
/**
|
||
* @brief 开始一个新行(自动输出缩进)
|
||
* @note 通常不需要手动调用,因为 append 系列函数会自动处理
|
||
*/
|
||
void scc_tree_dump_begin_line(scc_tree_dump_t *td);
|
||
|
||
/**
|
||
* @brief 追加普通字符串(自动处理行首缩进)
|
||
*/
|
||
void scc_tree_dump_append(scc_tree_dump_t *td, const char *s);
|
||
|
||
/**
|
||
* @brief 格式化追加(printf 风格)
|
||
*/
|
||
void scc_tree_dump_append_fmt(scc_tree_dump_t *td, const char *fmt, ...);
|
||
|
||
/**
|
||
* @brief 追加带节点颜色的文本
|
||
*/
|
||
#define scc_tree_dump_node(td, fmt, ...) \
|
||
scc_tree_dump_append_fmt(td, "%s" fmt "%s", (td)->node_color, \
|
||
##__VA_ARGS__, (td)->reset_color)
|
||
|
||
/**
|
||
* @brief 追加带值颜色的格式化文本
|
||
*/
|
||
#define scc_tree_dump_value(td, fmt, ...) \
|
||
scc_tree_dump_append_fmt(td, "%s" fmt "%s", (td)->value_color, \
|
||
##__VA_ARGS__, (td)->reset_color)
|
||
|
||
/**
|
||
* @brief 推入新层级
|
||
* @param is_last 该层级是否是父节点的最后一个子节点
|
||
*/
|
||
void scc_tree_dump_push(scc_tree_dump_t *td, cbool is_last);
|
||
|
||
/**
|
||
* @brief 弹出当前层级
|
||
*/
|
||
void scc_tree_dump_pop(scc_tree_dump_t *td);
|
||
|
||
#endif // SCC_TREE_DUMP_H
|