50 lines
1.4 KiB
C
50 lines
1.4 KiB
C
#ifndef FE_AST_H
|
|
#define FE_AST_H
|
|
|
|
#include "arena.h"
|
|
#include "lexer.h"
|
|
#include <stdio.h>
|
|
|
|
typedef enum FeNodeKind {
|
|
FE_N_UNIT, FE_N_IMPORT, FE_N_FN, FE_N_STRUCT, FE_N_ENUM, FE_N_ERROR_DECL, FE_N_CONST,
|
|
FE_N_GLOBAL, FE_N_FIELD, FE_N_PARAM, FE_N_VARIANT, FE_N_BLOCK, FE_N_LET, FE_N_VAR,
|
|
FE_N_EXPR_STMT, FE_N_ASSIGN, FE_N_IF, FE_N_WHILE, FE_N_FOR, FE_N_MATCH, FE_N_ARM,
|
|
FE_N_RETURN, FE_N_BREAK, FE_N_CONTINUE, FE_N_DEFER, FE_N_UNSAFE, FE_N_ASM,
|
|
FE_N_TYPE, FE_N_EXPR, FE_N_BINARY, FE_N_UNARY, FE_N_CALL, FE_N_INDEX, FE_N_MEMBER,
|
|
FE_N_LITERAL, FE_N_IDENT, FE_N_STRUCT_INIT, FE_N_ARRAY_INIT, FE_N_ERROR_NODE
|
|
} FeNodeKind;
|
|
|
|
typedef struct FeNode FeNode;
|
|
typedef struct FeType FeType;
|
|
struct FeNode {
|
|
FeNodeKind kind;
|
|
FeLoc loc;
|
|
char *text;
|
|
FeNode *a;
|
|
FeNode *b;
|
|
FeNode *c;
|
|
FeNode *children;
|
|
FeNode *next;
|
|
/* Semantic information filled by checking; kept out of AST dumps. */
|
|
char *cname;
|
|
char *aux_text;
|
|
char *aux_cname;
|
|
FeType *sem_type;
|
|
FeNode *sem_decl;
|
|
unsigned flags;
|
|
};
|
|
|
|
typedef struct FeAst {
|
|
FeArena arena;
|
|
FeNode *root;
|
|
} FeAst;
|
|
|
|
void fe_ast_init(FeAst *a);
|
|
void fe_ast_destroy(FeAst *a);
|
|
FeNode *fe_node(FeAst *a, FeNodeKind k, FeLoc loc, const char *text, unsigned long len);
|
|
void fe_node_add(FeNode *parent, FeNode *child);
|
|
void fe_ast_dump(const FeNode *n, int indent, FILE *out);
|
|
const char *fe_node_name(FeNodeKind k);
|
|
|
|
#endif
|