refactor(ast): 将AST类型系统重构为规范类型系统
- 将scc_ast_type_t替换为scc_ast_qual_type_t,引入规范类型概念 - 添加scc_ast_canonical_type_t联合体用于表示规范类型 - 修改头文件结构,移除大量内联初始化函数,改为使用AST上下文分配器 - 添加SCC_AST_ALLOC宏用于统一节点分配管理 - 更新builtin类型枚举定义,添加类型计数常量 feat(ast): 引入AST上下文管理器 - 创建scc_ast_ctx_t结构体用于管理AST节点生命周期 - 实现类型池化机制,支持内置类型的统一管理 - 添加canonical类型获取和分配接口 refactor(abi): 适配新的AST类型系统 - 更新头文件包含,从<scc_ir.h>改为<scc_hir.h> - 适配函数参数类型,使用qual_type替代原始type - 使用scc_ast_canon_type()函数获取规范类型进行处理 Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
108
libs/parser/include/scc_parse_type.h
Normal file
108
libs/parser/include/scc_parse_type.h
Normal file
@@ -0,0 +1,108 @@
|
||||
#ifndef __SCC_PARSE_TYPE_H__
|
||||
#define __SCC_PARSE_TYPE_H__
|
||||
|
||||
#include <scc_ast.h>
|
||||
#include <scc_ast_utils.h>
|
||||
|
||||
static inline void scc_ast_type_pointer_init(scc_ast_qual_type_t *type,
|
||||
scc_ast_canon_type_t *canon,
|
||||
scc_ast_qual_type_t *pointee,
|
||||
scc_pos_t loc) {
|
||||
Assert(type != nullptr && pointee != nullptr);
|
||||
type->base.loc = loc;
|
||||
type->base.type = SCC_AST_TYPE_POINTER;
|
||||
type->quals = (scc_ast_decl_specifier_t){0};
|
||||
type->type = canon;
|
||||
canon->pointer.pointee = pointee;
|
||||
}
|
||||
|
||||
// size can be nullptr
|
||||
static inline void scc_ast_type_array_init(scc_ast_qual_type_t *type,
|
||||
scc_ast_canon_type_t *canon,
|
||||
scc_ast_qual_type_t *element,
|
||||
scc_ast_expr_t *size,
|
||||
scc_pos_t loc) {
|
||||
Assert(type != nullptr && element != nullptr);
|
||||
type->base.loc = loc;
|
||||
type->base.type = SCC_AST_TYPE_ARRAY;
|
||||
type->quals = (scc_ast_decl_specifier_t){0};
|
||||
type->type = canon;
|
||||
canon->array.element = element;
|
||||
canon->array.size = size;
|
||||
}
|
||||
|
||||
// return_type and params can be nullptr
|
||||
static inline void scc_ast_type_function_init(scc_ast_qual_type_t *type,
|
||||
scc_ast_canon_type_t *canon,
|
||||
scc_ast_qual_type_t *return_type,
|
||||
scc_ast_decl_vec_t *params,
|
||||
scc_pos_t loc) {
|
||||
Assert(type != nullptr);
|
||||
type->base.loc = loc;
|
||||
type->base.type = SCC_AST_TYPE_FUNCTION;
|
||||
type->quals = (scc_ast_decl_specifier_t){0};
|
||||
type->type = canon;
|
||||
canon->function.return_type = return_type;
|
||||
if (params == nullptr) {
|
||||
scc_vec_init(canon->function.params);
|
||||
} else {
|
||||
canon->function.params = *params;
|
||||
scc_vec_init(*params);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void _scc_ast_type_record_init(scc_ast_qual_type_t *type,
|
||||
scc_ast_canon_type_t *canon,
|
||||
scc_ast_node_kind_t type_kind,
|
||||
const char *name,
|
||||
scc_ast_decl_t *decl,
|
||||
scc_pos_t loc) {
|
||||
Assert(type != nullptr);
|
||||
type->base.loc = loc;
|
||||
type->base.type = type_kind;
|
||||
type->quals = (scc_ast_decl_specifier_t){0};
|
||||
type->type = canon;
|
||||
canon->record.name = name;
|
||||
canon->record.decl = decl;
|
||||
}
|
||||
|
||||
// name and decl can be nullptr
|
||||
static inline void scc_ast_type_struct_init(scc_ast_qual_type_t *type,
|
||||
scc_ast_canon_type_t *canon,
|
||||
const char *name,
|
||||
scc_ast_decl_t *decl,
|
||||
scc_pos_t loc) {
|
||||
_scc_ast_type_record_init(type, canon, SCC_AST_TYPE_STRUCT, name, decl,
|
||||
loc);
|
||||
}
|
||||
|
||||
// name and decl can be nullptr
|
||||
static inline void
|
||||
scc_ast_type_union_init(scc_ast_qual_type_t *type, scc_ast_canon_type_t *canon,
|
||||
const char *name, scc_ast_decl_t *decl, scc_pos_t loc) {
|
||||
_scc_ast_type_record_init(type, canon, SCC_AST_TYPE_UNION, name, decl, loc);
|
||||
}
|
||||
|
||||
// name and decl can be nullptr
|
||||
static inline void scc_ast_type_enum_init(scc_ast_qual_type_t *type,
|
||||
scc_ast_canon_type_t *canon,
|
||||
const char *name,
|
||||
scc_ast_decl_t *decl, scc_pos_t loc) {
|
||||
_scc_ast_type_record_init(type, canon, SCC_AST_TYPE_ENUM, name, decl, loc);
|
||||
}
|
||||
|
||||
static inline void scc_ast_type_typedef_init(scc_ast_qual_type_t *type,
|
||||
scc_ast_canon_type_t *canon,
|
||||
const char *name,
|
||||
scc_ast_decl_t *target,
|
||||
scc_pos_t loc) {
|
||||
Assert(type != nullptr && target != nullptr);
|
||||
type->base.loc = loc;
|
||||
type->base.type = SCC_AST_TYPE_TYPEDEF;
|
||||
type->quals = (scc_ast_decl_specifier_t){0};
|
||||
type->type = canon;
|
||||
canon->typedef_type.name = name;
|
||||
canon->typedef_type.decl = target;
|
||||
}
|
||||
|
||||
#endif /* __SCC_PARSE_TYPE_H__ */
|
||||
@@ -14,12 +14,13 @@ typedef struct scc_parser {
|
||||
scc_lexer_tok_ring_t *ring;
|
||||
usize checkpoint;
|
||||
|
||||
scc_sema_callbacks_t sema_callbacks;
|
||||
scc_ast_ctx_t *ast_ctx;
|
||||
scc_sema_ctx_t sema_callbacks;
|
||||
scc_ast_translation_unit_t *translation_unit;
|
||||
int errcode;
|
||||
} scc_parser_t;
|
||||
|
||||
// static inline scc_ast_type_t *scc_parser_
|
||||
// static inline scc_ast_qual_type_t *scc_parser_
|
||||
|
||||
/**
|
||||
* @brief 初始化解析器
|
||||
@@ -28,7 +29,7 @@ typedef struct scc_parser {
|
||||
* @param callbacks 语义分析回调(可为 nullptr)
|
||||
*/
|
||||
void scc_parser_init(scc_parser_t *parser, scc_lexer_tok_ring_t *tok_ring,
|
||||
scc_sema_callbacks_t *callbacks);
|
||||
scc_ast_ctx_t *ast_ctx, scc_sema_ctx_t *callbacks);
|
||||
|
||||
/**
|
||||
* @brief 销毁解析器
|
||||
@@ -74,9 +75,9 @@ scc_ast_expr_t *scc_parse_expression(scc_parser_t *parser);
|
||||
* @return 类型 AST 节点
|
||||
*/
|
||||
scc_ast_decl_t *scc_parse_declarator(scc_parser_t *parser,
|
||||
scc_ast_type_t *type);
|
||||
scc_ast_type_t *scc_parse_declaration_specifiers(scc_parser_t *parser);
|
||||
scc_ast_type_t *scc_parse_type_name(scc_parser_t *parser);
|
||||
scc_ast_qual_type_t *type);
|
||||
scc_ast_qual_type_t *scc_parse_declaration_specifiers(scc_parser_t *parser);
|
||||
scc_ast_qual_type_t *scc_parse_type_name(scc_parser_t *parser);
|
||||
|
||||
static inline void scc_parse_decl_sema(scc_parser_t *parser,
|
||||
scc_ast_decl_t *decl) {
|
||||
@@ -100,14 +101,14 @@ static inline void scc_parse_stmt_sema(scc_parser_t *parser,
|
||||
}
|
||||
|
||||
static inline void scc_parse_type_sema(scc_parser_t *parser,
|
||||
scc_ast_type_t *type) {
|
||||
scc_ast_qual_type_t *type) {
|
||||
parser->sema_callbacks.on_type(parser->sema_callbacks.context,
|
||||
type ? type->base.type : SCC_AST_UNKNOWN,
|
||||
type);
|
||||
}
|
||||
|
||||
static inline scc_ast_type_t *scc_parse_got_type(scc_parser_t *parser,
|
||||
const char *name) {
|
||||
static inline const scc_ast_qual_type_t *
|
||||
scc_parse_got_type(scc_parser_t *parser, const char *name) {
|
||||
return parser->sema_callbacks.got_type(parser->sema_callbacks.context,
|
||||
name);
|
||||
}
|
||||
|
||||
@@ -9,21 +9,23 @@
|
||||
typedef void (*scc_sema_callback_t)(void *context,
|
||||
scc_ast_node_kind_t node_type, void *node);
|
||||
|
||||
typedef scc_ast_type_t *(*scc_sema_got_type_t)(void *context, const char *name);
|
||||
typedef const scc_ast_qual_type_t *(*scc_sema_got_type_t)(void *context,
|
||||
const char *name);
|
||||
|
||||
/**
|
||||
* @brief 语义分析回调集合
|
||||
*/
|
||||
typedef struct scc_sema_callbacks {
|
||||
typedef struct scc_sema_ctx {
|
||||
scc_sema_callback_t on_decl;
|
||||
scc_sema_callback_t on_stmt;
|
||||
scc_sema_callback_t on_expr;
|
||||
scc_sema_callback_t on_type;
|
||||
scc_sema_got_type_t got_type;
|
||||
scc_ast_ctx_t *ast_ctx;
|
||||
void *context;
|
||||
} scc_sema_callbacks_t;
|
||||
} scc_sema_ctx_t;
|
||||
|
||||
void scc_sema_init(scc_sema_callbacks_t *callbacks);
|
||||
void scc_sema_drop(scc_sema_callbacks_t *callbacks);
|
||||
void scc_sema_init(scc_sema_ctx_t *sema_ctx, scc_ast_ctx_t *ast_ctx);
|
||||
void scc_sema_drop(scc_sema_ctx_t *sema_ctx);
|
||||
|
||||
#endif /* __SCC_SEMA_H__ */
|
||||
|
||||
Reference in New Issue
Block a user