feat(ast): 更新AST dump功能以使用新的树转储接口
- 将头文件中的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 - 更新初始化函数签名以使用新的转储接口类型
This commit is contained in:
@@ -18,8 +18,8 @@ static inline scc_lexer_tok_t scc_pproc_tok_copy(scc_pproc_expand_t *ctx,
|
||||
static scc_lexer_tok_t stringify_argument(scc_pproc_expand_t *ctx,
|
||||
scc_lexer_tok_vec_t *arg_tokens) {
|
||||
// WRITE BY AI
|
||||
scc_cstring_t str = scc_cstring_create();
|
||||
scc_cstring_append_ch(&str, '\"'); // 左引号
|
||||
scc_str_t str = scc_str_empty();
|
||||
scc_str_append_ch(&str, '\"'); // 左引号
|
||||
|
||||
int need_space = 0; // 是否需要插入空格
|
||||
scc_lexer_tok_t *tok = null;
|
||||
@@ -32,7 +32,7 @@ static scc_lexer_tok_t stringify_argument(scc_pproc_expand_t *ctx,
|
||||
|
||||
// 需要空格且当前不是第一个有效token,插入一个空格
|
||||
if (need_space && i > 0) {
|
||||
scc_cstring_append_ch(&str, ' ');
|
||||
scc_str_append_ch(&str, ' ');
|
||||
}
|
||||
|
||||
// 对字符串/字符常量内的 " 和 \ 进行转义
|
||||
@@ -41,10 +41,10 @@ static scc_lexer_tok_t stringify_argument(scc_pproc_expand_t *ctx,
|
||||
// 注意:lex包含两端的引号,需要跳过首尾,转义内部字符
|
||||
// 简化:暂不处理内部转义,直接追加
|
||||
}
|
||||
scc_cstring_append(&str, &tok->lexeme);
|
||||
scc_str_append(&str, &tok->lexeme);
|
||||
need_space = 0;
|
||||
}
|
||||
scc_cstring_append_ch(&str, '\"'); // 右引号
|
||||
scc_str_append_ch(&str, '\"'); // 右引号
|
||||
|
||||
scc_lexer_tok_t result;
|
||||
result.type = SCC_TOK_STRING_LITERAL;
|
||||
@@ -60,19 +60,19 @@ static scc_lexer_tok_t stringify_argument(scc_pproc_expand_t *ctx,
|
||||
static scc_lexer_tok_t concatenate_tokens(scc_pproc_expand_t *ctx,
|
||||
const scc_lexer_tok_t *left,
|
||||
const scc_lexer_tok_t *right) {
|
||||
scc_cstring_t new_lex = scc_cstring_from_cstr("");
|
||||
scc_str_t new_lex = scc_str_from_cstr("");
|
||||
if (left != null) {
|
||||
scc_cstring_append(&new_lex, &left->lexeme);
|
||||
scc_str_append(&new_lex, &left->lexeme);
|
||||
}
|
||||
if (right != null) {
|
||||
scc_cstring_append(&new_lex, &right->lexeme);
|
||||
scc_str_append(&new_lex, &right->lexeme);
|
||||
}
|
||||
|
||||
scc_lexer_t lexer;
|
||||
scc_sstream_t sstream;
|
||||
// new_lex 所有权转移
|
||||
scc_sstream_init_by_buffer(&sstream, scc_cstring_as_cstr(&new_lex),
|
||||
scc_cstring_len(&new_lex), true, 8);
|
||||
scc_sstream_init_by_buffer(&sstream, scc_str_as_cstr(&new_lex),
|
||||
scc_str_len(&new_lex), true, 8);
|
||||
scc_lexer_init(&lexer, scc_sstream_to_ring(&sstream));
|
||||
scc_lexer_tok_ring_t *ring = scc_lexer_to_ring(&lexer, 8, true);
|
||||
|
||||
@@ -269,7 +269,7 @@ expand_arguments(scc_pproc_macro_extened_params_t *expanded_params,
|
||||
scc_vec_init(expanded_param);
|
||||
scc_vec_foreach(splite_param, j) {
|
||||
scc_lexer_tok_t tok = scc_vec_at(splite_param, j);
|
||||
tok.lexeme = scc_cstring_copy(&tok.lexeme);
|
||||
tok.lexeme = scc_str_copy(&tok.lexeme);
|
||||
scc_vec_push(expanded_param, tok);
|
||||
}
|
||||
scc_lexer_tok_ring_t ring = scc_lexer_array_to_ring(&expanded_param);
|
||||
@@ -353,8 +353,8 @@ RETURN:
|
||||
static int find_params(const scc_lexer_tok_t *tok,
|
||||
const scc_pproc_macro_t *macro) {
|
||||
scc_vec_foreach(macro->params, j) {
|
||||
if (scc_cstring_cmp(&(tok->lexeme),
|
||||
&(scc_vec_at(macro->params, j).lexeme)) == 0) {
|
||||
if (scc_str_equal(&(tok->lexeme),
|
||||
&(scc_vec_at(macro->params, j).lexeme)) == 0) {
|
||||
return j;
|
||||
}
|
||||
}
|
||||
@@ -437,8 +437,8 @@ static inline void expand_function_macro(scc_pproc_expand_t *ctx,
|
||||
scc_lexer_tok_t tok =
|
||||
scc_pproc_tok_copy(ctx, &scc_vec_at(macro->replaces, i));
|
||||
if (tok.type == SCC_TOK_BLANK) {
|
||||
scc_cstring_free(&tok.lexeme);
|
||||
tok.lexeme = scc_cstring_from_cstr(" ");
|
||||
scc_str_drop(&tok.lexeme);
|
||||
tok.lexeme = scc_str_from_cstr(" ");
|
||||
scc_vec_push(tok_buffer, tok);
|
||||
continue;
|
||||
}
|
||||
@@ -449,8 +449,8 @@ static inline void expand_function_macro(scc_pproc_expand_t *ctx,
|
||||
int right_idx = got_right_non_blank(i, ¯o->replaces);
|
||||
if (right_idx >= (int)macro->replaces.size) {
|
||||
LOG_WARN("generate empty stringify");
|
||||
scc_cstring_free(&tok.lexeme);
|
||||
tok.lexeme = scc_cstring_from_cstr("");
|
||||
scc_str_drop(&tok.lexeme);
|
||||
tok.lexeme = scc_str_from_cstr("");
|
||||
scc_vec_push(tok_buffer, tok);
|
||||
break;
|
||||
}
|
||||
@@ -491,7 +491,7 @@ static inline void expand_function_macro(scc_pproc_expand_t *ctx,
|
||||
scc_vec_size(right_vec) ? &scc_vec_at(right_vec, 0) : null;
|
||||
|
||||
// GNU ## extention
|
||||
if (scc_strcmp(scc_cstring_as_cstr(&(right_tok->lexeme)),
|
||||
if (scc_strcmp(scc_str_as_cstr(&(right_tok->lexeme)),
|
||||
"__VA_ARGS__") == 0) {
|
||||
if (scc_vec_size(right_vec) == 0) {
|
||||
concact(ctx, &tok_buffer, right, true);
|
||||
@@ -550,8 +550,8 @@ static inline void expand_object_macro(scc_pproc_expand_t *ctx,
|
||||
scc_pproc_tok_copy(ctx, &scc_vec_at(macro->replaces, i));
|
||||
if (tok.type == SCC_TOK_BLANK) {
|
||||
// FIXME using function to warpper it
|
||||
scc_cstring_free(&tok.lexeme);
|
||||
tok.lexeme = scc_cstring_from_cstr(" ");
|
||||
scc_str_drop(&tok.lexeme);
|
||||
tok.lexeme = scc_str_from_cstr(" ");
|
||||
} else if (tok.type == SCC_TOK_SHARP_SHARP) {
|
||||
// ## contact
|
||||
scc_lexer_tok_drop(&tok);
|
||||
@@ -635,7 +635,7 @@ void scc_pproc_expand_macro(scc_pproc_expand_t *expand_ctx) {
|
||||
}
|
||||
|
||||
if (expand_ctx->need_parse_defined &&
|
||||
scc_strcmp(scc_cstring_as_cstr(&tok.lexeme), "defined") == 0) {
|
||||
scc_strcmp(scc_str_as_cstr(&tok.lexeme), "defined") == 0) {
|
||||
scc_pos_t pos = tok.loc;
|
||||
scc_lexer_tok_drop(&tok);
|
||||
if (parse_defined(expand_ctx, &pos)) {
|
||||
@@ -679,19 +679,19 @@ void scc_pproc_expand_macro(scc_pproc_expand_t *expand_ctx) {
|
||||
}
|
||||
// FIXME 这可能不符合c语义
|
||||
case SCC_PP_MACRO_BUILTIN__FILE__:
|
||||
scc_cstring_free(&tok.lexeme);
|
||||
scc_cstring_append_ch(&tok.lexeme, '"');
|
||||
scc_cstring_append_cstr(&tok.lexeme, tok.loc.name,
|
||||
scc_strlen(tok.loc.name));
|
||||
scc_cstring_append_ch(&tok.lexeme, '"');
|
||||
scc_str_drop(&tok.lexeme);
|
||||
scc_str_append_ch(&tok.lexeme, '"');
|
||||
scc_str_append_cstr(&tok.lexeme, tok.loc.name,
|
||||
scc_strlen(tok.loc.name));
|
||||
scc_str_append_ch(&tok.lexeme, '"');
|
||||
tok.type = SCC_TOK_STRING_LITERAL;
|
||||
scc_vec_push(expand_ctx->output, tok);
|
||||
break;
|
||||
case SCC_PP_MACRO_BUILTIN__LINE__:
|
||||
scc_cstring_free(&tok.lexeme);
|
||||
scc_str_drop(&tok.lexeme);
|
||||
char *buff = scc_malloc(32);
|
||||
scc_snprintf(buff, 32, "%zu", tok.loc.line);
|
||||
tok.lexeme = scc_cstring_from_cstr(buff);
|
||||
tok.lexeme = scc_str_from_cstr(buff);
|
||||
scc_free(buff);
|
||||
tok.type = SCC_TOK_INT_LITERAL;
|
||||
scc_vec_push(expand_ctx->output, tok);
|
||||
|
||||
Reference in New Issue
Block a user