#include #include #include #include #include #include typedef gen_res_t (*gen_handle_fn)(fzl_gen_t *, fzl_node_t *); char *null_name = ""; gen_res_t gen_error = (gen_res_t){.error = true}; gen_res_t gen_ok_null = (gen_res_t){.error = false, .type = FZL_TYPE_NULL, .classname = NULL}; // Common generator entry point gen_res_t gen_common(fzl_gen_t *gen, fzl_node_t *node) { if (!gen || !node) return gen_error; gen_handle_fn res = NULL; switch (node->type) { case FZL_NODETYPE_ASSIGN: res = gen_assign; break; case FZL_NODETYPE_DECLARATION: res = gen_declaration; break; case FZL_NODETYPE_NOT: res = gen_unary_logical; break; case FZL_NODETYPE_EQUAL: case FZL_NODETYPE_NEQUAL: case FZL_NODETYPE_LESS: case FZL_NODETYPE_LESS_EQUAL: case FZL_NODETYPE_GREATER: case FZL_NODETYPE_GREATER_EQUAL: res = gen_compare; break; case FZL_NODETYPE_OR: case FZL_NODETYPE_AND: res = gen_logical; break; case FZL_NODETYPE_UNARY_PLUS: case FZL_NODETYPE_UNARY_MINUS: res = gen_unary_math; break; case FZL_NODETYPE_ADD: case FZL_NODETYPE_SUB: case FZL_NODETYPE_MUL: case FZL_NODETYPE_DIV: case FZL_NODETYPE_POW: case FZL_NODETYPE_MOD: res = gen_math; break; case FZL_NODETYPE_BREAK: res = gen_break; break; case FZL_NODETYPE_LOOP: res = gen_loop; break; case FZL_NODETYPE_CONSTRUCT: res = gen_construct; break; case FZL_NODETYPE_FIELD: res = gen_field; break; case FZL_NODETYPE_CLASS: res = gen_class; break; case FZL_NODETYPE_CALL: res = gen_call; break; case FZL_NODETYPE_RETURN: res = gen_return; break; case FZL_NODETYPE_FUNCTION: res = gen_fn; break; case FZL_NODETYPE_CONDITIONAL: res = gen_condition; break; case FZL_NODETYPE_IDENTIFIER: res = gen_identifier; break; case FZL_NODETYPE_FMT_STRING: res = gen_fmtstr; break; case FZL_NODETYPE_LITERAL: res = gen_literal; break; case FZL_NODETYPE_BLOCK: res = gen_block; break; case FZL_NODETYPE_EXTERN: res = gen_extern; break; case FZL_NODETYPE_TYPEDEF: res = gen_typedef; break; case FZL_NODETYPE_HANDLE: res = gen_handle; break; case FZL_NODETYPE_ALIAS: res = gen_alias; break; case FZL_NODETYPE_STRUCT: res = gen_struct; break; case FZL_NODETYPE_REFERENCE: res = gen_reference; break; case FZL_NODETYPE_EXTERN_FN: res = gen_externfn; break; } if (!res) { printf("Bruh, you, suka, go fix the generator blyat (%s:%d)\n", __FILE__, __LINE__); return gen_error; } return res(gen, node); }