stage1 使用切片表达字符串而非C字符串 提供属性系统
This commit is contained in:
1 parent
a64a96f9a4
commit
72ae6d6994
14 files changed
+685
-1256
No files matched your search
@@ -0,0 +1,84 @@
|
||||
#ifndef __SPL_ATTR_H__
|
||||
#define __SPL_ATTR_H__
|
||||
|
||||
#include "../stage0/include/utils.h"
|
||||
|
||||
typedef enum {
|
||||
SPL_ATTR_STAGE_SEMA,
|
||||
SPL_ATTR_STAGE_LAYOUT,
|
||||
SPL_ATTR_STAGE_IR,
|
||||
SPL_ATTR_STAGE_OPT,
|
||||
SPL_ATTR_STAGE_BACKEND,
|
||||
} spl_attr_stage_t;
|
||||
|
||||
typedef enum {
|
||||
SPL_ATTR_TARGET_DECL,
|
||||
SPL_ATTR_TARGET_TYPE,
|
||||
SPL_ATTR_TARGET_EXPR,
|
||||
SPL_ATTR_TARGET_STMT,
|
||||
} spl_attr_target_t;
|
||||
|
||||
typedef enum {
|
||||
SPL_ATTR_OPTIONAL,
|
||||
SPL_ATTR_REQUIRED,
|
||||
} spl_attr_demand_t;
|
||||
|
||||
typedef struct {
|
||||
const char *ns;
|
||||
const char *name;
|
||||
spl_attr_stage_t stage;
|
||||
spl_attr_target_t target;
|
||||
spl_attr_demand_t demand;
|
||||
int min_args;
|
||||
int max_args;
|
||||
} spl_attr_info_t;
|
||||
|
||||
typedef enum {
|
||||
SPL_ATTR_ARG_INT,
|
||||
SPL_ATTR_ARG_STR,
|
||||
SPL_ATTR_ARG_DEF,
|
||||
SPL_ATTR_ARG_TYPE,
|
||||
} spl_attr_arg_kind_t;
|
||||
|
||||
typedef struct {
|
||||
spl_attr_arg_kind_t kind;
|
||||
union {
|
||||
isize i;
|
||||
const char *s;
|
||||
usize d;
|
||||
usize t;
|
||||
} value;
|
||||
} spl_attr_arg_t;
|
||||
typedef VEC(spl_attr_arg_t) spl_attr_arg_vec_t;
|
||||
|
||||
typedef usize spl_attr_id_t;
|
||||
|
||||
typedef struct {
|
||||
spl_attr_info_t *info;
|
||||
spl_attr_arg_vec_t args;
|
||||
uint32_t consumed_mask;
|
||||
} spl_attr_node_t;
|
||||
typedef VEC(spl_attr_node_t) spl_attr_node_vec_t;
|
||||
typedef VEC(spl_attr_id_t) spl_attr_id_vec_t;
|
||||
|
||||
typedef VEC(spl_attr_info_t *) spl_attr_registry_t;
|
||||
|
||||
typedef struct {
|
||||
spl_attr_node_vec_t table;
|
||||
spl_attr_registry_t registry;
|
||||
} spl_attr_t;
|
||||
|
||||
void spl_attr_init(spl_attr_t *ctx);
|
||||
void spl_attr_drop(spl_attr_t *ctx);
|
||||
|
||||
spl_attr_id_t spl_attr_alloc(spl_attr_t *ctx, spl_attr_info_t *info, spl_attr_arg_vec_t args);
|
||||
spl_attr_node_t *spl_attr_node(const spl_attr_t *ctx, spl_attr_id_t id);
|
||||
|
||||
void spl_attr_registry_add(spl_attr_t *ctx, spl_attr_info_t *info);
|
||||
spl_attr_info_t *spl_attr_lookup(spl_attr_t *ctx, const char *ns, const char *name);
|
||||
void spl_attr_register_builtins(spl_attr_t *ctx);
|
||||
|
||||
void spl_attr_dump(const spl_attr_t *ctx);
|
||||
void spl_attr_dump_id(const spl_attr_t *ctx, spl_attr_id_t id);
|
||||
|
||||
#endif /* __SPL_ATTR_H__ */
|
||||
Reference in new issue
Block a user