59 lines
1.0 KiB
C
59 lines
1.0 KiB
C
#ifndef FZL_WALKER_H
|
|
#define FZL_WALKER_H
|
|
|
|
#include <common/fzl_opcodes.h>
|
|
#include <common/fzl_types.h>
|
|
#include <compiler/fzl_parser.h>
|
|
#include <compiler/utils/fzl_const_pool.h>
|
|
#include <compiler/utils/fzl_symtable.h>
|
|
#include <stdbool.h>
|
|
#include <stddef.h>
|
|
|
|
// Internal walk function result
|
|
typedef struct
|
|
{
|
|
fzl_type_t type;
|
|
|
|
char *error_msg;
|
|
bool error;
|
|
} fzl_walk_res_t;
|
|
|
|
// Function context descriptor
|
|
typedef struct
|
|
{
|
|
fzl_node_t *fn;
|
|
size_t initial_env_lvl;
|
|
} fzl_walk_ctx_t;
|
|
|
|
// Walker descriptor
|
|
typedef struct
|
|
{
|
|
fzl_node_t *root;
|
|
fzl_const_hash_pool_t *consts;
|
|
|
|
uint64_t *ops;
|
|
size_t op_count;
|
|
size_t op_remainder;
|
|
|
|
fzl_symtable_t *syms[64];
|
|
size_t sym_top;
|
|
|
|
fzl_walk_ctx_t *ctx;
|
|
} fzl_walker_t;
|
|
|
|
// Allocate new walker
|
|
fzl_walker_t *fzl_mkwalker(fzl_node_t *root);
|
|
|
|
// Walk throught the entire AST and build:
|
|
// 1. Constants table
|
|
// 2. Operations
|
|
int fzl_walk(fzl_walker_t *walker);
|
|
|
|
// Get last error message
|
|
char *fzl_walker_geterror();
|
|
|
|
// Free walker
|
|
void fzl_freewalker(fzl_walker_t *walker);
|
|
|
|
#endif // FZL_WALKER_H
|