155 lines
2.9 KiB
C
155 lines
2.9 KiB
C
#include <common/fzl_types.h>
|
|
#include <compiler/fzl_gen.h>
|
|
#include <compiler/fzl_parser.h>
|
|
#include <compiler/internals/gen.h>
|
|
#include <stdbool.h>
|
|
#include <stdio.h>
|
|
|
|
typedef gen_res_t (*gen_handle_fn)(fzl_gen_t *, fzl_node_t *);
|
|
|
|
char *null_name = "<null>";
|
|
|
|
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);
|
|
}
|