parser.h (1978B)
1 #ifndef DC_PARSER_H 2 #define DC_PARSER_H 3 4 typedef enum { 5 BINOP_INVALID, 6 7 BINOP_ADD, 8 BINOP_SUB, 9 BINOP_MUL, 10 BINOP_DIV, 11 BINOP_MOD, 12 BINOP_BAND, 13 BINOP_BOR, 14 BINOP_BXOR, 15 BINOP_LSHIFT, 16 BINOP_RSHIFT, 17 18 BINOP_ASSIGN, 19 20 BINOP_ADD_ASSIGN, 21 BINOP_SUB_ASSIGN, 22 BINOP_MUL_ASSIGN, 23 BINOP_DIV_ASSIGN, 24 BINOP_MOD_ASSIGN, 25 BINOP_BAND_ASSIGN, 26 BINOP_BOR_ASSIGN, 27 BINOP_BXOR_ASSIGN, 28 BINOP_LSHIFT_ASSIGN, 29 BINOP_RSHIFT_ASSIGN, 30 31 BINOP_LAND, 32 BINOP_LOR, 33 BINOP_LXOR, 34 BINOP_LT, 35 BINOP_LE, 36 BINOP_EQ, 37 BINOP_NEQ, 38 BINOP_GE, 39 BINOP_GT, 40 41 BINOP_COMMA, 42 BINOP_ALL_, 43 } Binop_kind; 44 45 typedef struct { 46 Binop_kind kind; 47 Token tok; 48 } Binop; 49 50 typedef enum { 51 AST_ERROR = 0, 52 AST_TYPE, 53 AST_VAR_DECL, 54 AST_FUNC_DECL, 55 AST_TYPE_DECL, 56 AST_BLOCK, 57 AST_BINOP, 58 AST_NUMBER, 59 AST_IDENT, 60 } Ast_kind; 61 62 typedef struct Ast_node Ast_node; 63 64 typedef struct { 65 Ast_node **items; 66 int count; 67 int capacity; 68 } Ast_node_list; 69 70 struct Ast_node { 71 Ast_kind kind; 72 Token start_tok; 73 union { 74 struct { 75 Binop op; 76 Ast_node *left; 77 Ast_node *right; 78 } binop; 79 struct { 80 Token name; 81 Ast_node *type; 82 Ast_node *value; 83 } var; 84 struct { 85 Token name; 86 Ast_node_list arg_list; 87 Ast_node *ret_type; 88 Ast_node *body; 89 } func; 90 struct { 91 Ast_node_list list; 92 Token end_tok; 93 } block; 94 }; 95 }; 96 97 typedef Ast_node *(*Ast_alloc_fn)(); 98 typedef void (*Ast_free_fn)(Ast_node *); 99 100 typedef struct { 101 Lexer lexer; 102 Ast_alloc_fn ast_alloc; 103 Ast_free_fn ast_free; 104 } Parser; 105 106 Ast_node *parse_postfix(Parser *p, Ast_node *child); 107 Ast_node *parse_primitive(Parser *p); 108 Ast_node *parse_prefix(Parser *p); 109 Ast_node *parse_binop(Parser *p, int precedence, Ast_node *left_child); 110 Ast_node *parse_expression(Parser *p); 111 Ast_node *parse_type(Parser *p); 112 Ast_node *parse_var_declaration(Parser *p); 113 114 Ast_node_list parse(Parser *p); 115 116 void debug_print_ast_node(Ast_node *node, int indent); 117 118 #endif /* DC_PARSER_H */