diff --git a/include/compiler/internals/gen.h b/include/compiler/internals/gen.h index b4ea3dd..76d92f0 100644 --- a/include/compiler/internals/gen.h +++ b/include/compiler/internals/gen.h @@ -42,10 +42,11 @@ bool gen_fn(fzl_gen_t *gen, fzl_node_t *node); bool gen_return(fzl_gen_t *gen, fzl_node_t *node); bool gen_not(fzl_gen_t *gen, fzl_node_t *node); bool gen_compare(fzl_gen_t *gen, fzl_node_t *node); -bool gen_or_and(fzl_gen_t *gen, fzl_node_t *node); +bool gen_logical(fzl_gen_t *gen, fzl_node_t *node); +bool gen_unary_logical(fzl_gen_t *gen, fzl_node_t *node); bool gen_condition(fzl_gen_t *gen, fzl_node_t *node); -bool gen_unary_plus(fzl_gen_t *gen, fzl_node_t *node); -bool gen_unary_minus(fzl_gen_t *gen, fzl_node_t *node); +bool gen_unary_math(fzl_gen_t *gen, fzl_node_t *node); +bool gen_declaration(fzl_gen_t *gen, fzl_node_t *node); bool gen_identifier(fzl_gen_t *gen, fzl_node_t *node); bool gen_block(fzl_gen_t *gen, fzl_node_t *node); bool gen_call(fzl_gen_t *gen, fzl_node_t *node); diff --git a/src/compiler/generator/gen_common.c b/src/compiler/generator/gen_common.c new file mode 100644 index 0000000..30ec272 --- /dev/null +++ b/src/compiler/generator/gen_common.c @@ -0,0 +1,143 @@ +#include +#include +#include +#include +#include + +typedef bool (*gen_handle_fn)(fzl_gen_t *, fzl_node_t *); + +// Common generator entry point +bool gen_common(fzl_gen_t *gen, fzl_node_t *node) +{ + if (!gen || !node) + return false; + + 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) + return false; + + return res(gen, node); +}