feat(ast): 添加内置类型定义和AST节点初始化函数
添加了完整的内置类型支持,包括整数、浮点数、字符、布尔等基本类型, 以及它们的有符号/无符号变体。同时添加了大量的AST节点初始化函数, 简化了AST节点的创建过程。 BREAKING CHANGE: 重构了AST表达式和声明结构,移除了冗余字段, 统一了命名规范,并修改了函数调用和成员访问的表示方式。
This commit is contained in:
70
libs/ast/src/ast_builtin.c
Normal file
70
libs/ast/src/ast_builtin.c
Normal file
@@ -0,0 +1,70 @@
|
||||
#include <ast_builtin.h>
|
||||
|
||||
#define SCC_AST_BUILTIN_TYPE_HEADER \
|
||||
.base.type = SCC_AST_TYPE_BUILTIN, .base.loc.col = 0, .base.loc.line = 0, \
|
||||
.base.loc.name = "__scc_ast_builtin_type", .base.loc.offset = 0
|
||||
|
||||
scc_ast_type_t scc_ast_builtin_type_int = {
|
||||
SCC_AST_BUILTIN_TYPE_HEADER,
|
||||
.builtin.type = SCC_AST_BUILTIN_TYPE_INT,
|
||||
};
|
||||
|
||||
scc_ast_type_t scc_ast_builtin_type_long = {
|
||||
SCC_AST_BUILTIN_TYPE_HEADER,
|
||||
.builtin.type = SCC_AST_BUILTIN_TYPE_LONG,
|
||||
};
|
||||
|
||||
scc_ast_type_t scc_ast_builtin_type_long_long = {
|
||||
SCC_AST_BUILTIN_TYPE_HEADER,
|
||||
.builtin.type = SCC_AST_BUILTIN_TYPE_LONG_LONG,
|
||||
};
|
||||
|
||||
scc_ast_type_t scc_ast_builtin_type_short = {
|
||||
SCC_AST_BUILTIN_TYPE_HEADER,
|
||||
.builtin.type = SCC_AST_BUILTIN_TYPE_SHORT,
|
||||
};
|
||||
|
||||
scc_ast_type_t scc_ast_builtin_type_char = {
|
||||
SCC_AST_BUILTIN_TYPE_HEADER,
|
||||
.builtin.type = SCC_AST_BUILTIN_TYPE_CHAR,
|
||||
};
|
||||
|
||||
scc_ast_type_t scc_ast_builtin_type_void = {
|
||||
SCC_AST_BUILTIN_TYPE_HEADER,
|
||||
.builtin.type = SCC_AST_BUILTIN_TYPE_VOID,
|
||||
};
|
||||
|
||||
scc_ast_type_t scc_ast_builtin_type_bool = {
|
||||
SCC_AST_BUILTIN_TYPE_HEADER,
|
||||
.builtin.type = SCC_AST_BUILTIN_TYPE_BOOL,
|
||||
};
|
||||
|
||||
scc_ast_type_t scc_ast_builtin_type_float = {
|
||||
SCC_AST_BUILTIN_TYPE_HEADER,
|
||||
.builtin.type = SCC_AST_BUILTIN_TYPE_FLOAT,
|
||||
};
|
||||
|
||||
scc_ast_type_t scc_ast_builtin_type_double = {
|
||||
SCC_AST_BUILTIN_TYPE_HEADER,
|
||||
.builtin.type = SCC_AST_BUILTIN_TYPE_DOUBLE,
|
||||
};
|
||||
|
||||
scc_ast_type_t scc_ast_builtin_type_long_double = {
|
||||
SCC_AST_BUILTIN_TYPE_HEADER,
|
||||
.builtin.type = SCC_AST_BUILTIN_TYPE_LONG_DOUBLE,
|
||||
};
|
||||
|
||||
scc_ast_type_t scc_ast_builtin_type_complex_float = {
|
||||
SCC_AST_BUILTIN_TYPE_HEADER,
|
||||
.builtin.type = SCC_AST_BUILTIN_TYPE_COMPLEX_FLOAT,
|
||||
};
|
||||
|
||||
scc_ast_type_t scc_ast_builtin_type_complex_double = {
|
||||
SCC_AST_BUILTIN_TYPE_HEADER,
|
||||
.builtin.type = SCC_AST_BUILTIN_TYPE_COMPLEX_DOUBLE,
|
||||
};
|
||||
|
||||
scc_ast_type_t scc_ast_builtin_type_complex_long_double = {
|
||||
SCC_AST_BUILTIN_TYPE_HEADER,
|
||||
.builtin.type = SCC_AST_BUILTIN_TYPE_COMPLEX_LONG_DOUBLE,
|
||||
};
|
||||
@@ -324,7 +324,12 @@ static void dump_type_impl(scc_ast_type_t *type, scc_tree_dump_ctx_t *ctx) {
|
||||
}
|
||||
if (scc_vec_size(type->function.param_types) != 0) {
|
||||
scc_vec_foreach(type->function.param_types, i) {
|
||||
dump_type_impl(scc_vec_at(type->function.param_types, i), ctx);
|
||||
scc_ast_decl_t *param =
|
||||
scc_vec_at(type->function.param_types, i);
|
||||
if (param->name) {
|
||||
// FIXME param name
|
||||
}
|
||||
dump_type_impl(param->param.type, ctx);
|
||||
}
|
||||
} else {
|
||||
start_node_dump(&type->base, ctx);
|
||||
@@ -435,7 +440,8 @@ static void dump_expr_impl(scc_ast_expr_t *expr, scc_tree_dump_ctx_t *ctx) {
|
||||
break;
|
||||
|
||||
case SCC_AST_EXPR_CALL:
|
||||
dump_child_node((scc_ast_node_t *)expr->call.callee, ctx, false);
|
||||
// dump_child_node((scc_ast_node_t *)expr->call._target, ctx, false);
|
||||
PRINT_NODE(ctx, "%s", expr->call.name);
|
||||
// 转储参数
|
||||
for (size_t i = 0; i < expr->call.args.size; i++) {
|
||||
dump_child_node((scc_ast_node_t *)expr->call.args.data[i], ctx,
|
||||
@@ -453,7 +459,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_NODE(ctx, "Member [\"%s\"]", expr->member.member_name);
|
||||
PRINT_NODE(ctx, "Member [\"%s\"]", expr->member.name);
|
||||
scc_tree_dump_printf(ctx, "\n");
|
||||
break;
|
||||
|
||||
@@ -512,8 +518,8 @@ static void dump_stmt_impl(scc_ast_stmt_t *stmt, scc_tree_dump_ctx_t *ctx) {
|
||||
return;
|
||||
case SCC_AST_STMT_DO_WHILE:
|
||||
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);
|
||||
dump_child_node((scc_ast_node_t *)stmt->while_stmt.body, ctx, false);
|
||||
dump_child_node((scc_ast_node_t *)stmt->while_stmt.cond, ctx, true);
|
||||
return;
|
||||
case SCC_AST_STMT_SWITCH:
|
||||
end_node_dump(ctx);
|
||||
@@ -528,8 +534,8 @@ static void dump_stmt_impl(scc_ast_stmt_t *stmt, scc_tree_dump_ctx_t *ctx) {
|
||||
if (stmt->for_stmt.cond) {
|
||||
dump_child_node((scc_ast_node_t *)stmt->for_stmt.cond, ctx, false);
|
||||
}
|
||||
if (stmt->for_stmt.iter) {
|
||||
dump_child_node((scc_ast_node_t *)stmt->for_stmt.iter, ctx, false);
|
||||
if (stmt->for_stmt.incr) {
|
||||
dump_child_node((scc_ast_node_t *)stmt->for_stmt.incr, ctx, false);
|
||||
}
|
||||
dump_child_node((scc_ast_node_t *)stmt->for_stmt.body, ctx, true);
|
||||
return;
|
||||
@@ -594,46 +600,8 @@ static void dump_decl_impl(scc_ast_decl_t *decl, scc_tree_dump_ctx_t *ctx) {
|
||||
return;
|
||||
|
||||
start_node_dump(&decl->base, ctx);
|
||||
|
||||
// 根据声明类型输出特定信息
|
||||
switch (decl->base.type) {
|
||||
case SCC_AST_DECL_VAR:
|
||||
if (decl->var.name) {
|
||||
PRINT_QUOTED_VALUE(ctx, decl->var.name);
|
||||
}
|
||||
break;
|
||||
case SCC_AST_DECL_FUNC:
|
||||
if (decl->func.name) {
|
||||
PRINT_QUOTED_VALUE(ctx, decl->func.name);
|
||||
}
|
||||
break;
|
||||
case SCC_AST_DECL_PARAM:
|
||||
if (decl->param.name) {
|
||||
PRINT_QUOTED_VALUE(ctx, decl->param.name);
|
||||
}
|
||||
break;
|
||||
case SCC_AST_DECL_STRUCT:
|
||||
if (decl->record.name) {
|
||||
PRINT_QUOTED_VALUE(ctx, decl->record.name);
|
||||
}
|
||||
break;
|
||||
case SCC_AST_DECL_UNION:
|
||||
if (decl->record.name) {
|
||||
PRINT_QUOTED_VALUE(ctx, decl->record.name);
|
||||
}
|
||||
break;
|
||||
case SCC_AST_DECL_ENUM:
|
||||
if (decl->enumeration.name) {
|
||||
PRINT_QUOTED_VALUE(ctx, decl->enumeration.name);
|
||||
}
|
||||
break;
|
||||
case SCC_AST_DECL_TYPEDEF:
|
||||
if (decl->typedef_decl.name) {
|
||||
PRINT_QUOTED_VALUE(ctx, decl->typedef_decl.name);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if (decl->name) {
|
||||
PRINT_QUOTED_VALUE(ctx, decl->name);
|
||||
}
|
||||
|
||||
end_node_dump(ctx);
|
||||
|
||||
Reference in New Issue
Block a user