feat: add generators' main entry
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -0,0 +1,143 @@
|
||||
#include <compiler/fzl_gen.h>
|
||||
#include <compiler/fzl_parser.h>
|
||||
#include <compiler/internals/gen.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
|
||||
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);
|
||||
}
|
||||
Reference in New Issue
Block a user