compiler_experiment

Unnamed repository; edit this file 'description' to name the repository.
git clone https://git.deepztream.com/compiler_experiment
Log | Files | Refs

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 */