stage1 完整ast 部分ir 定义
This commit is contained in:
131
stage1/spl_ast.h
131
stage1/spl_ast.h
@@ -9,6 +9,7 @@
|
||||
typedef enum {
|
||||
SPL_AST_CONTAINER_MEMBER,
|
||||
SPL_AST_FN_DECL,
|
||||
SPL_AST_FN_DEFINE,
|
||||
SPL_AST_TYPE_DECL,
|
||||
SPL_AST_VAR_DECL,
|
||||
SPL_AST_CONST_DECL,
|
||||
@@ -16,7 +17,6 @@ typedef enum {
|
||||
SPL_AST__COMPTIME_STMT, /*不实现*/
|
||||
SPL_AST__DIRECTIVE_BLOCK, /*不实现*/
|
||||
|
||||
SPL_AST_BLOCK,
|
||||
SPL_AST_BLOCK_ITEM,
|
||||
SPL_AST_EXPR,
|
||||
SPL_AST_TYPE_EXPR,
|
||||
@@ -39,56 +39,57 @@ struct spl_ast_node {
|
||||
union {
|
||||
spl_ast_node_ref_vec_t container_member;
|
||||
|
||||
spl_ast_node_ref_vec_t attr_list;
|
||||
struct {
|
||||
const char *ident;
|
||||
spl_ast_node_ref_vec_t expr_list;
|
||||
} attr_item;
|
||||
|
||||
struct {
|
||||
spl_ast_node_ref_t attr_list;
|
||||
spl_ast_node_ref_vec_t attr_list; /* attr_item */
|
||||
const char *name;
|
||||
spl_ast_node_ref_t param_list;
|
||||
spl_ast_node_ref_vec_t param_list; /* param_decl */
|
||||
spl_ast_node_ref_t type_expr;
|
||||
spl_ast_node_ref_t block;
|
||||
spl_ast_node_ref_vec_t block; /* block_item */
|
||||
} fn_decl;
|
||||
spl_ast_node_ref_vec_t param_list;
|
||||
struct {
|
||||
spl_ast_node_ref_t attr_list;
|
||||
spl_ast_node_ref_vec_t attr_list; /* attr_item */
|
||||
const char *name;
|
||||
spl_ast_node_ref_t type_expr;
|
||||
} param_decl;
|
||||
|
||||
struct {
|
||||
spl_ast_node_ref_t attr_list;
|
||||
spl_ast_node_ref_vec_t attr_list; /* attr_item */
|
||||
const char *name;
|
||||
enum {
|
||||
SPL_AST_TYPE_STRUCT,
|
||||
SPL_AST_TYPE_UNION,
|
||||
SPL_AST_TYPE_ENUM,
|
||||
SPL_AST_TYPE_TYPE_EXPR,
|
||||
};
|
||||
} kind;
|
||||
union {
|
||||
spl_ast_node_ref_t type_expr;
|
||||
spl_ast_node_ref_t aggregate_list;
|
||||
};
|
||||
} type_decl;
|
||||
struct {
|
||||
spl_ast_node_ref_t attr_list;
|
||||
spl_ast_node_ref_vec_t attr_list; /* attr_item */
|
||||
const char *name;
|
||||
spl_ast_node_ref_t type_expr;
|
||||
} member_decl;
|
||||
|
||||
struct {
|
||||
spl_ast_node_ref_t attr_list;
|
||||
spl_ast_node_ref_vec_t attr_list; /* attr_item */
|
||||
const char *name;
|
||||
spl_ast_node_ref_t type_expr;
|
||||
spl_ast_node_ref_t expr;
|
||||
} var_decl;
|
||||
struct {
|
||||
spl_ast_node_ref_t attr_list;
|
||||
spl_ast_node_ref_vec_t attr_list; /* attr_item */
|
||||
spl_ast_node_ref_t type_expr;
|
||||
const char *name;
|
||||
spl_ast_node_ref_t expr;
|
||||
} const_decl;
|
||||
|
||||
spl_ast_node_ref_vec_t block;
|
||||
struct {
|
||||
enum {
|
||||
SPL_AST_IF_STATEMENT,
|
||||
@@ -104,30 +105,29 @@ struct spl_ast_node {
|
||||
SPL_AST_VARDECL,
|
||||
SPL_AST_TYPEDECL,
|
||||
SPL_AST_EXPR_STATEMENT,
|
||||
SPL_PACED_EXPR,
|
||||
} kind;
|
||||
union {
|
||||
struct {
|
||||
spl_ast_node_ref_t expr;
|
||||
spl_ast_node_ref_t if_block;
|
||||
spl_ast_node_ref_t else_block;
|
||||
spl_ast_node_ref_vec_t if_block; /* block_item */
|
||||
spl_ast_node_ref_vec_t else_block; /* block_item */
|
||||
} if_statement;
|
||||
struct {
|
||||
spl_ast_node_ref_t packed_expr;
|
||||
spl_ast_node_ref_t if_block;
|
||||
spl_ast_node_ref_t else_block;
|
||||
spl_ast_node_ref_vec_t if_block; /* block_item */
|
||||
spl_ast_node_ref_vec_t else_block; /* block_item */
|
||||
} ifvar_statement;
|
||||
struct {
|
||||
spl_ast_node_ref_t expr;
|
||||
spl_ast_node_ref_t while_block;
|
||||
spl_ast_node_ref_vec_t while_block; /* block_item */
|
||||
} while_statement;
|
||||
struct {
|
||||
spl_ast_node_ref_t loop_block;
|
||||
spl_ast_node_ref_vec_t loop_block; /* block_item */
|
||||
} loop_statement;
|
||||
struct {
|
||||
spl_ast_node_ref_vec_t expr_vec;
|
||||
VEC(char *) ident_vec;
|
||||
spl_ast_node_ref_t block;
|
||||
spl_ast_node_ref_vec_t block; /* block_item */
|
||||
} for_statement;
|
||||
struct {
|
||||
spl_ast_node_ref_t expr;
|
||||
@@ -142,55 +142,91 @@ struct spl_ast_node {
|
||||
struct {
|
||||
} continue_statement;
|
||||
struct {
|
||||
spl_ast_node_ref_t block_or_statement;
|
||||
spl_ast_node_ref_vec_t block_or_statement; /* block_item/statement */
|
||||
} defer_statement;
|
||||
spl_ast_node_ref_t var_decl;
|
||||
spl_ast_node_ref_t type_decl;
|
||||
spl_ast_node_ref_t expr_statement;
|
||||
|
||||
struct {
|
||||
const char *ident;
|
||||
const char *bind_ident;
|
||||
spl_ast_node_ref_t expr;
|
||||
} packed_expr;
|
||||
};
|
||||
} block_item;
|
||||
struct {
|
||||
const char *ident;
|
||||
const char *bind_ident;
|
||||
spl_ast_node_ref_t expr;
|
||||
} packed_expr;
|
||||
|
||||
struct {
|
||||
enum {
|
||||
SPL_AST_ASSIGN_EXPR,
|
||||
SPL_AST_ASSIGN_ADD_EXPR,
|
||||
SPL_AST_ASSIGN_sUB_EXPR,
|
||||
SPL_AST_ASSIGN_MUL_EXPR,
|
||||
SPL_AST_ASSIGN_DIV_EXPR,
|
||||
SPL_AST_ASSIGN_MOD_EXPR,
|
||||
SPL_AST_ASSIGN_AND_EXPR,
|
||||
SPL_AST_ASSIGN_OR_EXPR,
|
||||
SPL_AST_ASSIGN_XOR_EXPR,
|
||||
SPL_AST_ASSIGN_LSHIFT_EXPR,
|
||||
SPL_AST_ASSIGN_USHIFT_EXPR,
|
||||
|
||||
SPL_AST_BOOLOR_EXPR,
|
||||
SPL_AST_BOOLAND_EXPR,
|
||||
SPL_AST_BITOR_EXPR,
|
||||
SPL_AST_BITXOR_EXPR,
|
||||
SPL_AST_BITAND_EXPR,
|
||||
|
||||
SPL_AST_CMPEQ_EXPR,
|
||||
SPL_AST_CMP_EXPR,
|
||||
SPL_AST_CMPNE_EXPR,
|
||||
|
||||
SPL_AST_CMP_LE_EXPR,
|
||||
SPL_AST_CMP_GE_EXPR,
|
||||
SPL_AST_CMP_LT_EXPR,
|
||||
SPL_AST_CMP_GT_EXPR,
|
||||
|
||||
SPL_AST_RANGE_EXPR,
|
||||
SPL_AST_SHIFT_EXPR,
|
||||
|
||||
SPL_AST_LSHIFT_EXPR,
|
||||
SPL_AST_RSHIFT_EXPR,
|
||||
|
||||
SPL_AST_ADD_EXPR,
|
||||
SPL_AST_SUB_EXPR,
|
||||
|
||||
SPL_AST_MUL_EXPR,
|
||||
SPL_AST_PREFIX_EXPR,
|
||||
SPL_AST_POSTFIX_EXPR, /*left ref node*/
|
||||
SPL_AST_PRIMARY_EXPR, /*left ref node*/
|
||||
SPL_AST_DIV_EXPR,
|
||||
SPL_AST_MOD_EXPR,
|
||||
|
||||
SPL_AST_PREFIX_EXPR, /* left ref node */
|
||||
SPL_AST_POSTFIX_EXPR, /* left ref node */
|
||||
SPL_AST_PRIMARY_EXPR, /* left ref node */
|
||||
} op;
|
||||
struct {
|
||||
spl_ast_node_ref_t left;
|
||||
spl_ast_node_ref_t right;
|
||||
} op_expr;
|
||||
} expr;
|
||||
struct {
|
||||
enum {
|
||||
SPL_AST_MINUS_EXPR,
|
||||
SPL_AST_BANG_EXPR,
|
||||
SPL_AST_TILDE_EXPR,
|
||||
SPL_AST_AMPERSAND_EXPR,
|
||||
SPL_AST_ASTERISK_EXPR,
|
||||
} kind;
|
||||
spl_ast_node_ref_t postfix_expr;
|
||||
} prefix_expr;
|
||||
struct {
|
||||
enum {
|
||||
SPL_AST_CALL_EXPR,
|
||||
SPL_AST_IDENT_EXPR,
|
||||
SPL_AST_FIELD_EXPR,
|
||||
SPL_AST_DEREF_EXPR,
|
||||
SPL_AST_INDEX_EXPR,
|
||||
SPL_AST_SLICE_EXPR,
|
||||
SPL_AST_AS_EXPR,
|
||||
} kind;
|
||||
spl_ast_node_ref_t primary_expr;
|
||||
union {
|
||||
spl_ast_node_ref_vec_t call_expr;
|
||||
const char *indet_expr;
|
||||
const char *field_expr; /* field/method */
|
||||
spl_ast_node_ref_t index_expr;
|
||||
struct {
|
||||
spl_ast_node_ref_t begin;
|
||||
@@ -214,16 +250,15 @@ struct spl_ast_node {
|
||||
SPL_AST_ARRAY_LIT,
|
||||
SPL_AST_BUILTIN_EXPR,
|
||||
SPL_AST_BLOCK_EXPR,
|
||||
};
|
||||
} kind;
|
||||
union {
|
||||
isize integer_expr;
|
||||
double float_expr;
|
||||
char char_lit_expr;
|
||||
const char *string_lit_expr;
|
||||
const char *string_lit_expr; /* parsed c string */
|
||||
const char *ident;
|
||||
|
||||
/*aggregate_init_item*/
|
||||
spl_ast_node_ref_vec_t aggregate_init_expr;
|
||||
spl_ast_node_ref_vec_t aggregate_init_expr; /* aggregate_init_item */
|
||||
|
||||
spl_ast_node_ref_t expr;
|
||||
struct {
|
||||
@@ -235,7 +270,7 @@ struct spl_ast_node {
|
||||
const char *ident;
|
||||
spl_ast_node_ref_vec_t expr_list;
|
||||
} builtin_expr;
|
||||
spl_ast_node_ref_t block_expr;
|
||||
spl_ast_node_ref_vec_t block_expr; /* block_item */
|
||||
};
|
||||
} primary_expr;
|
||||
struct {
|
||||
@@ -244,10 +279,8 @@ struct spl_ast_node {
|
||||
} aggregate_init_item;
|
||||
|
||||
struct {
|
||||
/* ASTERISK = 1, [] = 2, else = 0*/
|
||||
int pointer;
|
||||
/* if array_size != 0 then pointer == 2 */
|
||||
int array_size;
|
||||
spl_ast_node_ref_vec_t type_prefixs; /* prefix_type */
|
||||
|
||||
enum {
|
||||
SPL_AST_BASE_TYPE_FN,
|
||||
SPL_AST_BASE_TYPE_PATH,
|
||||
@@ -255,13 +288,19 @@ struct spl_ast_node {
|
||||
|
||||
const char *spl_base_type;
|
||||
union {
|
||||
spl_ast_node_ref_vec_t type_path;
|
||||
spl_ast_node_ref_vec_t type_path; /* type_atom */
|
||||
struct {
|
||||
spl_ast_node_ref_t param_list;
|
||||
spl_ast_node_ref_vec_t param_list; /* param_decl */
|
||||
spl_ast_node_ref_t type_expr;
|
||||
} fn_type;
|
||||
};
|
||||
} type_expr;
|
||||
struct {
|
||||
/* ASTERISK = 1, [] = 2, else = 0*/
|
||||
int pointer;
|
||||
/* if array_size != 0 then pointer == 2 */
|
||||
int array_size;
|
||||
} prefix_type;
|
||||
struct {
|
||||
enum {
|
||||
SPL_AST_TYPE_VOID,
|
||||
|
||||
Reference in New Issue
Block a user