wip: working on extern

- Feat: add new generator scope to replace walker
- Feat: add generators' context functions
- Feat: add generators' ops array functions
- Feat: add generators' utility functions
This commit is contained in:
samsonium
2026-11-04 17:03:48 +03:00
parent 358ede4c8c
commit 26decf2626
6 changed files with 478 additions and 0 deletions
+77
View File
@@ -0,0 +1,77 @@
#ifndef FZL_GENERATOR_H
#define FZL_GENERATOR_H
#include <common/fzl_extern.h>
#include <compiler/fzl_parser.h>
#include <compiler/utils/fzl_const_pool.h>
#include <compiler/utils/fzl_ctable.h>
#include <compiler/utils/fzl_symtable.h>
#include <stdbool.h>
#include <stddef.h>
// Generator context type
typedef enum
{
FZL_GEN_CTX_TYPE_UNECCESSARY,
FZL_GEN_CTX_TYPE_FUNCTION,
FZL_GEN_CTX_TYPE_CLASS,
FZL_GEN_CTX_TYPE_LOOP
} fzl_gen_ctx_type_t;
// Generator context descriptor
typedef struct fzl_gen_ctx
{
fzl_gen_ctx_type_t type;
struct fzl_gen_ctx *parent;
size_t level;
union
{
fzl_node_t *function;
struct
{
size_t breaks[256];
size_t breaks_count;
} loop;
};
} fzl_gen_ctx_t;
// Generator descriptor
typedef struct
{
fzl_node_t *root;
fzl_const_hash_pool_t *consts;
fzl_gen_ctx_t *ctx;
size_t *ops;
size_t ops_count;
size_t ops_remainder;
fzl_symtable_t *syms[256];
size_t syms_top;
fzl_ctable_t *classes[64];
size_t classes_count;
fzl_extern_lib_t extern_libs[64];
size_t extern_libs_count;
fzl_extern_type_t extern_types[256];
size_t extern_types_count;
fzl_extern_fn_t extern_fns[256];
size_t extern_fns_count;
} fzl_gen_t;
// Allocate new generator
fzl_gen_t *fzl_mkgen(fzl_node_t *root);
// Run program generation
bool fzl_gen_run(fzl_gen_t *gen);
// Free generator
void fzl_freegen(fzl_gen_t *gen);
#endif // FZL_GENERATOR_H
+56
View File
@@ -0,0 +1,56 @@
#ifndef INTERNALS_GEN_H
#define INTERNALS_GEN_H
#include <common/fzl_opcodes.h>
#include <common/fzl_types.h>
#include <compiler/fzl_gen.h>
#include <compiler/fzl_parser.h>
#include <compiler/fzl_token.h>
#include <compiler/utils/fzl_const_pool.h>
#include <compiler/utils/fzl_symtable.h>
#include <stdbool.h>
#include <stddef.h>
extern char *null_name;
bool gen_resolve_name(fzl_gen_t *gen, char *name, fzl_sym_t *sym);
bool gen_resolve_type(fzl_gen_t *gen, fzl_token_t *tok, fzl_type_t *t, char *c);
bool gen_is_types_compatible(fzl_type_t t1, fzl_type_t t2, char *c1, char *c2);
size_t gen_add_const(fzl_gen_t *gen, fzl_const_t c);
void gen_op(fzl_gen_t *gen, fzl_opcode_t opcode);
void gen_word(fzl_gen_t *gen, size_t word);
fzl_gen_ctx_t *gen_ctx(fzl_gen_t *gen, fzl_gen_ctx_type_t type,
fzl_node_t *node);
fzl_gen_ctx_t *gen_fin_ctx(fzl_gen_t *gen);
bool gen_common(fzl_gen_t *gen, fzl_node_t *node);
bool gen_extern(fzl_gen_t *gen, fzl_node_t *node);
bool gen_externfn(fzl_gen_t *gen, fzl_node_t *node);
bool gen_reference(fzl_gen_t *gen, fzl_node_t *node);
bool gen_struct(fzl_gen_t *gen, fzl_node_t *node);
bool gen_alias(fzl_gen_t *gen, fzl_node_t *node);
bool gen_handle(fzl_gen_t *gen, fzl_node_t *node);
bool gen_typedef(fzl_gen_t *gen, fzl_node_t *node);
bool gen_fmtstr(fzl_gen_t *gen, fzl_node_t *node);
bool gen_break(fzl_gen_t *gen, fzl_node_t *node);
bool gen_loop(fzl_gen_t *gen, fzl_node_t *node);
bool gen_class(fzl_gen_t *gen, fzl_node_t *node);
bool gen_construct(fzl_gen_t *gen, fzl_node_t *node);
bool gen_field(fzl_gen_t *gen, fzl_node_t *node);
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_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_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);
bool gen_literal(fzl_gen_t *gen, fzl_node_t *node);
bool gen_math(fzl_gen_t *gen, fzl_node_t *node);
bool gen_assign(fzl_gen_t *gen, fzl_node_t *node);
#endif // FZL_INTERNALS_GEN_H