#ifndef __SPL_AST_H__ #define __SPL_AST_H__ #include "../stage0/include/utils.h" #include "spl_lexer.h" #include "spl_tok.h" typedef enum { SPL_AST_CONTAINER_ITEM, SPL_AST_FN_DECL, SPL_AST_FN_DEFINE, SPL_AST_TYPE_DECL, SPL_AST_VAR_DECL, SPL_AST_CONST_DECL, SPL_AST_MEMBER_DECL, SPL_AST__COMPTIME_STMT, /*不实现*/ SPL_AST__DIRECTIVE_BLOCK, /*不实现*/ SPL_AST_BLOCK_ITEM, SPL_AST_EXPR, SPL_AST_TYPE_EXPR, SPL_AST_ATTR_LIST, } spl_ast_node_kind_t; typedef struct { const char *fname; int line; int col; } spl_ast_loc_t; struct spl_ast_node; typedef struct spl_ast_node spl_ast_node_t; typedef usize spl_ast_node_ref_t; typedef VEC(spl_ast_node_ref_t) spl_ast_node_ref_vec_t; struct spl_ast_node { spl_ast_node_kind_t kind; spl_ast_loc_t loc; usize resolved_def_id; union { struct { spl_ast_node_ref_vec_t attr_list; /* attr_item */ spl_ast_node_ref_t self; /* self */ spl_ast_node_ref_vec_t members; /* container_decl 列表 */ } container_item; struct { const char *ident; spl_ast_node_ref_vec_t expr_list; } attr_item; struct { spl_ast_node_ref_vec_t attr_list; /* attr_item */ const char *name; spl_ast_node_ref_vec_t param_list; /* param_decl */ spl_ast_node_ref_t type_expr; spl_ast_node_ref_vec_t block; /* block_item */ } fn_decl; struct { spl_ast_node_ref_vec_t attr_list; /* attr_item */ const char *name; spl_ast_node_ref_t type_expr; } param_decl; struct { const char *name; spl_ast_node_ref_t type_expr; } type_decl; struct { 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_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_vec_t attr_list; /* attr_item */ spl_ast_node_ref_t type_expr; const char *name; spl_ast_node_ref_t expr; } const_decl; struct { enum { SPL_AST_IF_STATEMENT, SPL_AST_IFVAR_STATEMENT, SPL_AST_WHILE_STATEMENT, SPL_AST_LOOP_STATEMENT, SPL_AST_FOR_STATEMENT, SPL_AST_MATCH_STATEMENT, SPL_AST_RET_STATEMENT, SPL_AST_BREAK_STATEMENT, SPL_AST_CONTINUE_STATEMENT, SPL_AST_DEFER_STATEMENT, SPL_AST_VARDECL, SPL_AST_CONSTDECL, SPL_AST_TYPEDECL, SPL_AST_EXPR_STATEMENT, } kind; union { struct { spl_ast_node_ref_t expr; 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_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_vec_t while_block; /* block_item */ } while_statement; struct { 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_vec_t block; /* block_item */ } for_statement; struct { spl_ast_node_ref_t expr; spl_ast_node_ref_vec_t paced_exprs; /* packed_expr */ spl_ast_node_ref_vec_t match_block; /* block_item */ } match_statement; struct { spl_ast_node_ref_t expr; } ret_statement; struct { } break_statement; struct { } continue_statement; struct { 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 const_decl; spl_ast_node_ref_t type_decl; spl_ast_node_ref_t expr_statement; }; } 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_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_LSHIFT_EXPR, SPL_AST_RSHIFT_EXPR, SPL_AST_ADD_EXPR, SPL_AST_SUB_EXPR, SPL_AST_MUL_EXPR, 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_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 *field_expr; /* field/method */ spl_ast_node_ref_t index_expr; struct { spl_ast_node_ref_t begin; spl_ast_node_ref_t end; } slice_expr; spl_ast_node_ref_t type_expr; }; } postfix_expr; struct { enum { SPL_AST_INTEGER, SPL_AST_FLOAT, SPL_AST_CHAR_LIT, SPL_AST_STRING_LIT, SPL_AST_TRUE, SPL_AST_FALSE, SPL_AST_NULL, SPL_AST_IDENT, SPL_AST_ARGGREGATE_INIT, SPL_AST_EXPR_EXPR, 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; /* parsed c string */ const char *ident; struct { const char *name; spl_ast_node_ref_vec_t expr; /* aggregate_init_item */ } aggregate_init; spl_ast_node_ref_t expr; struct { isize integer; spl_ast_node_ref_t type_expr; spl_ast_node_ref_vec_t expr_list; } array_lit_expr; struct { const char *ident; spl_ast_node_ref_vec_t expr_list; } builtin_expr; spl_ast_node_ref_vec_t block_expr; /* block_item */ }; } primary_expr; struct { const char *ident; spl_ast_node_ref_t expr; } aggregate_init_item; struct { spl_ast_node_ref_vec_t type_prefixs; /* prefix_type */ spl_ast_node_ref_vec_t attr_list; /* attr_item */ enum { SPL_AST_BASE_TYPE_FN, SPL_AST_BASE_TYPE_PATH, SPL_AST_TYPE_STRUCT, SPL_AST_TYPE_UNION, SPL_AST_TYPE_ENUM, } kind; const char *spl_base_type; union { spl_ast_node_ref_vec_t type_path; /* type_atom */ struct { spl_ast_node_ref_vec_t param_list; /* param_decl */ spl_ast_node_ref_t type_expr; } fn_type; spl_ast_node_ref_vec_t aggregate_list; /* container_decl */ }; } 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, SPL_AST_TYPE_BOOL, SPL_AST_TYPE_I8, SPL_AST_TYPE_U8, SPL_AST_TYPE_I16, SPL_AST_TYPE_U16, SPL_AST_TYPE_I32, SPL_AST_TYPE_U32, SPL_AST_TYPE_I64, SPL_AST_TYPE_U64, SPL_AST_TYPE_ISIZE, SPL_AST_TYPE_USIZE, SPL_AST_TYPE__F32, /*不实现*/ SPL_AST_TYPE__F64, /*不实现*/ SPL_AST_TYPE_PTR, SPL_AST_TYPE_ANY, SPL_AST_TYPE_IDENT, } kind; const char *ident; } type_atom; }; }; typedef VEC(spl_ast_node_t) spl_ast_node_vec_t; typedef struct { int parsed; spl_tok_vec_t input; spl_ast_node_vec_t buckets; spl_ast_node_ref_t root; } spl_ast_t; void spl_ast_init(spl_ast_t *ast, const spl_tok_vec_t *tok_vec /*move*/); void spl_ast_drop(spl_ast_t *ast); void spl_ast_prase(spl_ast_t *ast); void spl_ast_valid(spl_ast_t *ast); void spl_ast_dump(spl_ast_t *ast, spl_ast_node_ref_t node); #endif /* __SPL_AST_H__ */