lang: codegen: redesign again to use purely pre-order ast traversal
This commit is contained in:
@@ -23,10 +23,30 @@ struct ivy_ast_node;
|
||||
struct mie_value;
|
||||
struct mie_func;
|
||||
|
||||
struct codegen_value {
|
||||
b_queue_entry v_entry;
|
||||
struct ivy_ast_node *v_node;
|
||||
struct mie_value *v_value;
|
||||
};
|
||||
|
||||
struct codegen_var {
|
||||
b_queue_entry v_entry;
|
||||
struct ivy_ast_ident_node *v_ident;
|
||||
struct mie_value *v_ptr;
|
||||
};
|
||||
|
||||
enum code_generator_type {
|
||||
CODE_GENERATOR_NONE = 0,
|
||||
CODE_GENERATOR_UNIT,
|
||||
CODE_GENERATOR_EXPR,
|
||||
CODE_GENERATOR_VAR,
|
||||
};
|
||||
|
||||
enum code_generator_scope_type {
|
||||
CODE_GENERATOR_SCOPE_NONE = 0,
|
||||
CODE_GENERATOR_SCOPE_UNIT,
|
||||
CODE_GENERATOR_SCOPE_FUNC,
|
||||
CODE_GENERATOR_SCOPE_BLOCK,
|
||||
};
|
||||
|
||||
struct code_generator_result {
|
||||
@@ -34,6 +54,7 @@ struct code_generator_result {
|
||||
|
||||
enum code_generator_result_flags {
|
||||
CODEGEN_REPEAT_NODE = 0x01u,
|
||||
CODEGEN_POP_GENERATOR = 0x02u,
|
||||
} r_flags;
|
||||
};
|
||||
|
||||
@@ -42,11 +63,14 @@ struct code_generator_state;
|
||||
typedef enum ivy_status (*code_generator_state_init_callback)(
|
||||
struct ivy_codegen *, struct code_generator_state *);
|
||||
typedef enum ivy_status (*code_generator_state_fini_callback)(
|
||||
struct ivy_codegen *, struct code_generator_state *);
|
||||
struct ivy_codegen *, struct code_generator_state *, struct mie_value **);
|
||||
typedef struct code_generator_result (*code_generator_callback)(
|
||||
struct ivy_codegen *);
|
||||
typedef struct code_generator_result (*code_generator_node_callback)(
|
||||
struct ivy_codegen *, struct code_generator_state *, struct ivy_ast_node *);
|
||||
struct ivy_codegen *, struct code_generator_state *,
|
||||
struct ivy_ast_node *, size_t);
|
||||
typedef struct code_generator_result (*code_generator_value_received_callback)(
|
||||
struct ivy_codegen *, struct code_generator_state *, struct mie_value *);
|
||||
|
||||
struct code_generator {
|
||||
enum code_generator_type g_type;
|
||||
@@ -54,19 +78,29 @@ struct code_generator {
|
||||
|
||||
code_generator_state_init_callback g_state_init;
|
||||
code_generator_state_fini_callback g_state_fini;
|
||||
code_generator_node_callback g_node_generators_pre[IVY_AST_TYPE_COUNT];
|
||||
code_generator_node_callback g_node_generators_post[IVY_AST_TYPE_COUNT];
|
||||
code_generator_node_callback g_node_generators[IVY_AST_TYPE_COUNT];
|
||||
code_generator_value_received_callback g_value_received;
|
||||
};
|
||||
|
||||
struct code_generator_state {
|
||||
b_queue_entry s_entry;
|
||||
void *s_arg;
|
||||
const struct code_generator *s_gen;
|
||||
struct ivy_ast_node *s_root;
|
||||
size_t s_depth;
|
||||
};
|
||||
|
||||
struct code_generator_scope {
|
||||
enum code_generator_scope_type s_type;
|
||||
b_queue_entry s_entry;
|
||||
/* TODO turn this into a bst */
|
||||
b_queue s_vars;
|
||||
};
|
||||
|
||||
struct ivy_codegen {
|
||||
b_queue c_ir_values;
|
||||
b_queue c_values;
|
||||
b_queue c_state;
|
||||
b_queue c_scope;
|
||||
struct mie_builder *c_builder;
|
||||
struct mie_ctx *c_ctx;
|
||||
struct mie_module *c_module;
|
||||
@@ -74,12 +108,31 @@ struct ivy_codegen {
|
||||
|
||||
extern const struct code_generator *get_code_generator(
|
||||
enum code_generator_type type);
|
||||
extern const struct code_generator *get_root_code_generator(
|
||||
enum ivy_ast_node_type type);
|
||||
|
||||
extern enum ivy_status codegen_push_generator(
|
||||
struct ivy_codegen *gen, enum code_generator_type gen_type, void *arg);
|
||||
extern enum ivy_status codegen_pop_generator(struct ivy_codegen *gen);
|
||||
extern enum ivy_status codegen_pop_generator(
|
||||
struct ivy_codegen *gen, struct mie_value **result);
|
||||
|
||||
extern void codegen_push_value(struct ivy_codegen *gen, struct mie_value *value);
|
||||
extern struct mie_value *codegen_pop_value(struct ivy_codegen *gen);
|
||||
extern struct code_generator_scope *codegen_push_scope(struct ivy_codegen *gen);
|
||||
extern void codegen_pop_scope(struct ivy_codegen *gen);
|
||||
extern struct code_generator_scope *codegen_get_current_scope(
|
||||
struct ivy_codegen *gen);
|
||||
|
||||
extern struct codegen_value *codegen_value_create(
|
||||
struct ivy_ast_node *node, struct mie_value *val);
|
||||
extern void codegen_value_destroy(struct codegen_value *val);
|
||||
|
||||
extern void codegen_push_value(struct ivy_codegen *gen, struct codegen_value *val);
|
||||
extern struct codegen_value *codegen_pop_value(struct ivy_codegen *gen);
|
||||
|
||||
extern struct codegen_var *codegen_resolve_variable(
|
||||
struct ivy_codegen *gen, const char *ident);
|
||||
|
||||
extern enum ivy_status code_generator_scope_put_variable(
|
||||
struct code_generator_scope *scope, struct ivy_ast_ident_node *ident,
|
||||
struct mie_value *ptr);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user