stage1 实现部分sema 解析数组

This commit is contained in:
zzy committed 2026-09-09 20:21:49 +08:00
1 parent 8aa7a89c7e
commit bcd26d3021
6 files changed
+1049 -593

No files matched your search

+21 -10
View File
@@ -349,13 +349,13 @@ static void parse_param_list(parser_t *p, spl_ast_node_ref_vec_t *out) {
if (peek(p) && peek(p)->type == TOK_COMMA)
advance(p);
break;
} else if (t->type == KW_VOID) {
advance(p);
t = peek(p);
if (!t || t->type != TOK_R_PAREN) {
SPL_FATAL(t, "expected ')' after void");
}
break;
// } else if (t->type == KW_VOID) {
// advance(p);
// t = peek(p);
// if (!t || t->type != TOK_R_PAREN) {
// SPL_FATAL(t, "expected ')' after void");
// }
// break;
} else {
SPL_FATAL(t, "unexpected token in parameter list");
break;
@@ -849,9 +849,10 @@ static spl_ast_node_ref_t parse_type_base(parser_t *p) {
(len == 5 && strncmp(name, "usize", 5) == 0) ||
(len == 3 && strncmp(name, "f32", 3) == 0) ||
(len == 3 && strncmp(name, "f64", 3) == 0) ||
(len == 4 && strncmp(name, "bool", 4) == 0) ||
(len == 4 && strncmp(name, "void", 4) == 0) ||
(len == 3 && strncmp(name, "ptr", 3) == 0)) {
(len == 4 && strncmp(name, "bool", 4) == 0)
// (len == 4 && strncmp(name, "void", 4) == 0) ||
// (len == 3 && strncmp(name, "any", 3) == 0)
) {
advance(p);
spl_ast_node_ref_t ref = new_node(p, SPL_AST_TYPE_PATH, bt);
spl_ast_node_t *tp = node_at(p->ast, ref);
@@ -886,6 +887,16 @@ static spl_ast_node_ref_t parse_type_base(parser_t *p) {
return parse_type_comptime_call(p);
}
if (bt->type == KW_ANY) {
advance(p);
spl_ast_node_ref_t ref = new_node(p, SPL_AST_TYPE_PATH, bt);
spl_ast_node_t *tp = node_at(p->ast, ref);
SET_STR_FIELD(p->ast, tp->type_path.name, bt);
vec_init(tp->type_path.generic_args);
vec_free(tag_list);
return ref;
}
vec_free(tag_list);
SPL_FATAL(bt, "unrecognized type");
return 0;
+1 -1
View File
@@ -354,7 +354,7 @@ struct spl_ast_node {
struct {
bool has_len;
isize len;
usize len;
bool is_underscore_len;
spl_ast_node_ref_t elem_type;
spl_ast_node_ref_vec_t elems;
+349 -256
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -6,6 +6,7 @@
/* clang-format off */
#define KEYWORD_TABLE \
X(any , KW_ANY , SPL_V0) \
X(as , KW_AS , SPL_V0) \
X(bool , KW_BOOL , SPL_V0) \
X(break , KW_BREAK , SPL_V0) \
@@ -33,7 +34,6 @@
X(undefined , KW_UNDEFINED , SPL_V0) \
X(union , KW_UNION , SPL_V0) \
X(var , KW_VAR , SPL_V0) \
X(void , KW_VOID , SPL_V0) \
X(while , KW_WHILE , SPL_V0) \
X(_ , KW_UNDERSCORE , SPL_V0) \
// KEYWORD_TABLE
+603 -288
View File
File diff suppressed because it is too large. Load diff
+74 -37
View File
@@ -6,6 +6,8 @@
typedef usize spl_type_id_t; /* 0 is error */
typedef VEC(spl_type_id_t) spl_type_id_vec_t;
typedef usize spl_lang_type_id_t; /* 0 is error */
typedef VEC(spl_lang_type_id_t) spl_lang_type_id_vec_t;
typedef usize spl_def_id_t; /* 0 is error */
typedef VEC(spl_def_id_t) spl_def_id_vec_t;
@@ -13,8 +15,8 @@ typedef enum {
SPL_TYPE_ERROR,
SPL_TYPE_NEVER, // bottom type
SPL_TYPE_ANY, // top type
SPL_TYPE_INFER, // auto type
SPL_TYPE_UNIT,
SPL_TYPE_INFER,
SPL_TYPE_BOOL,
SPL_TYPE_INT,
SPL_TYPE_FLOAT,
@@ -29,14 +31,6 @@ typedef enum {
SPL_TYPE_SHAPE,
} spl_type_node_kind_t;
typedef enum {
SPL_LANG_TYPE_NONE, // 普通底层类型(如 int, ptr 等)
SPL_LANG_TYPE_INFER, // 类型推断占位符
SPL_LANG_TYPE_SLICE, // 切片(底层 struct {ptr, len})
SPL_LANG_TYPE_TUPLE, // 元组(底层 struct,字段名为数字)
SPL_LANG_TYPE_RANGE, // 范围(可选)
} spl_lang_type_node_kind_t;
typedef enum {
SPL_TYPE_LAYOUT_AUTO,
SPL_TYPE_LAYOUT_EXTERN_C,
@@ -57,7 +51,6 @@ typedef VEC(spl_type_member_t) spl_type_member_vec_t;
typedef struct {
spl_type_node_kind_t kind;
spl_lang_type_node_kind_t lang_kind;
spl_type_layout_t layout; // attribute
union {
struct {
@@ -89,6 +82,43 @@ typedef struct {
} spl_type_node_t;
typedef VEC(spl_type_node_t) spl_type_node_vec_t;
typedef enum {
SPL_LANG_TYPE_ERROR,
SPL_LANG_TYPE_INFER,
SPL_LANG_TYPE_NEVER,
SPL_LANG_TYPE_ANY,
SPL_LANG_TYPE_UNIT,
SPL_LANG_TYPE_BOOL,
SPL_LANG_TYPE_INT,
SPL_LANG_TYPE_FLOAT,
SPL_LANG_TYPE_PTR,
SPL_LANG_TYPE_ARRAY,
SPL_LANG_TYPE_SLICE,
SPL_LANG_TYPE_TUPLE,
SPL_LANG_TYPE_RANGE,
SPL_LANG_TYPE_FN,
SPL_LANG_TYPE_STRUCT,
SPL_LANG_TYPE_UNION,
SPL_LANG_TYPE_ENUM,
SPL_LANG_TYPE_SHAPE,
SPL_LANG_TYPE_VARARGS,
} spl_lang_type_kind_t;
typedef struct {
spl_lang_type_kind_t kind;
spl_type_id_t ir_type_id;
union {
spl_lang_type_id_t elem;
spl_lang_type_id_vec_t elems;
struct {
spl_lang_type_id_vec_t params;
spl_lang_type_id_t ret;
} fn;
} extra;
} spl_lang_type_node_t;
typedef VEC(spl_lang_type_node_t) spl_lang_type_vec_t;
typedef MAP(usize, spl_lang_type_id_t) spl_lang_type_map_t;
typedef enum {
SPL_DEF_ERROR,
SPL_DEF_SCALAR,
@@ -110,7 +140,7 @@ typedef struct {
} builtin_kind;
const char *name;
spl_dbg_node_t dbg_node;
spl_type_id_t type_id;
spl_lang_type_id_t lang_id;
usize ast_node_ref;
} spl_def_node_t;
typedef VEC(spl_def_node_t) spl_def_node_vec_t;
@@ -119,6 +149,8 @@ typedef MAP(usize, spl_type_id_t) spl_type_node_map_t;
typedef struct {
spl_type_node_vec_t type_table;
spl_type_node_map_t type_map;
spl_lang_type_vec_t lang_table;
spl_lang_type_map_t lang_map;
spl_def_node_vec_t def_table;
} spl_type_t;
@@ -127,16 +159,23 @@ void spl_type_drop(spl_type_t *type);
void spl_type_def_dump(spl_type_t *type, spl_def_id_t id);
void spl_type_pure_dump(spl_type_t *type, spl_type_id_t id);
void spl_lang_type_dump(spl_type_t *type, spl_lang_type_id_t id);
spl_type_node_t *spl_type_node(const spl_type_t *type, spl_type_id_t id);
spl_lang_type_node_t *spl_lang_type_node(const spl_type_t *type, spl_lang_type_id_t id);
spl_def_node_t *spl_def_node(const spl_type_t *type, spl_def_id_t id);
/* 判断 sub 是否是 super 的子类型 值域包含关系 */
bool spl_lang_type_is_subtype(const spl_type_t *type, spl_lang_type_id_t sub,
spl_lang_type_id_t super);
bool spl_type_is_subtype(const spl_type_t *type, spl_type_id_t sub, spl_type_id_t super);
spl_type_id_t spl_def_alloc(spl_type_t *type, spl_def_node_kind_t kind, const char *name,
spl_def_id_t spl_def_alloc(spl_type_t *type, spl_def_node_kind_t kind, const char *name,
spl_dbg_node_t dbg, usize ast_node_ref);
void spl_def_resolve(spl_type_t *type, spl_def_id_t id, spl_type_id_t tid);
void spl_def_resolve(spl_type_t *type, spl_def_id_t id, spl_lang_type_id_t lang_id);
spl_type_id_t spl_lang_type_get_ir_type(spl_type_t *type, spl_lang_type_id_t lang_id);
spl_lang_type_id_t spl_def_get_lang_id(spl_type_t *type, spl_def_id_t def_id);
spl_type_id_t spl_def_get_type_id(spl_type_t *type, spl_def_id_t def_id);
spl_type_id_t spl_type_fn_param_tid(spl_type_t *type, spl_type_id_t fn_tid, usize idx);
const spl_type_member_t *spl_type_agg_member(spl_type_t *type, spl_type_id_t tid, const char *name);
@@ -154,29 +193,27 @@ spl_type_id_t spl_type_builder_agg(spl_type_t *type, spl_type_node_kind_t tk,
spl_type_member_vec_t *variants, spl_type_id_t tag_type,
spl_type_layout_t layout);
spl_type_id_t spl_type_make_unit(spl_type_t *type);
spl_type_id_t spl_type_make_never(spl_type_t *type);
spl_type_id_t spl_type_make_any(spl_type_t *type);
spl_type_id_t spl_type_make_bool(spl_type_t *type);
spl_type_id_t spl_type_make_int(spl_type_t *type, usize bits, int is_signed);
spl_type_id_t spl_type_make_float(spl_type_t *type, usize bits);
spl_type_id_t spl_type_make_ptr(spl_type_t *type, spl_type_id_t pointee);
spl_type_id_t spl_type_make_array(spl_type_t *type, spl_type_id_t elem, usize len);
spl_type_id_t spl_type_make_slice(spl_type_t *type, spl_type_id_t elem);
spl_type_id_t spl_type_make_tuple(spl_type_t *type, spl_type_member_vec_t *variants);
spl_type_id_t spl_type_make_range(spl_type_t *type, spl_type_id_t elem);
spl_type_id_t spl_type_make_fn(spl_type_t *type, spl_type_id_t ret, const spl_type_id_t *params,
usize nparams);
spl_type_id_t spl_type_make_agg(spl_type_t *type, spl_type_node_kind_t tk,
spl_type_member_vec_t *variants, spl_type_id_t tag_type,
spl_type_layout_t layout);
spl_type_id_t spl_type_make_infer(spl_type_t *type);
spl_type_id_t spl_type_make_slice(spl_type_t *type, spl_type_id_t elem_tid);
spl_type_id_t spl_type_make_tuple(spl_type_t *type, spl_type_member_vec_t *variants);
spl_type_id_t spl_type_make_range(spl_type_t *type, spl_type_id_t elem_tid);
spl_lang_type_id_t spl_lang_make_error(spl_type_t *type);
spl_lang_type_id_t spl_lang_make_infer(spl_type_t *type);
spl_lang_type_id_t spl_lang_make_never(spl_type_t *type);
spl_lang_type_id_t spl_lang_make_any(spl_type_t *type);
spl_lang_type_id_t spl_lang_make_unit(spl_type_t *type);
spl_lang_type_id_t spl_lang_make_bool(spl_type_t *type);
spl_lang_type_id_t spl_lang_make_int(spl_type_t *type, usize bits, int is_signed);
spl_lang_type_id_t spl_lang_make_float(spl_type_t *type, usize bits);
spl_lang_type_id_t spl_lang_make_ptr(spl_type_t *type, spl_lang_type_id_t pointee);
spl_lang_type_id_t spl_lang_make_array(spl_type_t *type, spl_lang_type_id_t elem, usize len);
spl_lang_type_id_t spl_lang_make_slice(spl_type_t *type, spl_lang_type_id_t elem);
spl_lang_type_id_t spl_lang_make_tuple(spl_type_t *type, const spl_lang_type_id_t *elems,
usize count);
spl_lang_type_id_t spl_lang_make_range(spl_type_t *type, spl_lang_type_id_t elem);
spl_lang_type_id_t spl_lang_make_fn(spl_type_t *type, spl_lang_type_id_t ret,
const spl_lang_type_id_t *params, usize nparams);
spl_lang_type_id_t spl_lang_make_aggregate(spl_type_t *type, spl_lang_type_kind_t kind,
const char *name, const spl_lang_type_id_t *members,
usize nmembers);
spl_lang_type_id_t spl_lang_make_varargs(spl_type_t *type);
spl_type_id_t spl_type_lookup_builtin(spl_type_t *type, const char *name);
spl_type_id_t spl_def_get_type_id(spl_type_t *type, spl_def_id_t def_id);
spl_lang_type_id_t spl_type_lookup_builtin(spl_type_t *type, const char *name);
#endif /* __SPL_TYPE_H__ */