#pragma once #include #include #include typedef struct { long long *_data; size_t _cap; size_t len; } ivec; typedef struct { char *data; size_t length; size_t capacity; } str; typedef struct ast_node ast_node_t; typedef struct { ast_node_t **_data; size_t _cap; size_t len; } node_vec; // Parser/AST typedef struct ast_node ast_node_t; typedef enum { AST_INC, AST_DEC, AST_PTR_INC, AST_PTR_DEC, AST_OUT, AST_IN, AST_LOOP, AST_CLEAR } ast_type_e; struct ast_node { ast_type_e type; int val; node_vec children; // vec ast_node_t *next; }; ast_node_t *parse(const char *src); ast_node_t *optimize_ast(ast_node_t *ast); void ast_free(ast_node_t *node); void ast_dump(ast_node_t *node, int depth); // codegen str gen_code(ast_node_t *ast); void iv_free(ivec *v); size_t iv_push(ivec *v, long long data); long long iv_get(ivec *v, size_t idx); long long iv_rem_shift(ivec *v, size_t idx); long long iv_rem(ivec *v, size_t idx); long long iv_has(ivec *v, long long x, int (*comp)(const long long, const long long)); void iv_shrink(ivec *v); void node_vec_free(node_vec *v); size_t node_vec_push(node_vec *v, ast_node_t *data); ast_node_t *node_vec_get(node_vec *v, size_t idx); ast_node_t *node_vec_rem_shift(node_vec *v, size_t idx); ast_node_t *node_vec_rem(node_vec *v, size_t idx); ast_node_t *node_vec_has(node_vec *v, ast_node_t *x, int (*comp)(const ast_node_t *, const ast_node_t *)); void node_vec_shrink(node_vec *v); void free_str(str *s); void str_append(str *s, const char *from); void str_append_c(str *s, char c); void str_append_len(str *s, const char *from, size_t len); void str_append_read(str *s, int fd); void str_append_fread(str *s, FILE *file); void str_append_fread_len(str *s, size_t size, FILE *file); void str_appendf(str *s, const char *fmt, ...);