feat: implement loops
This commit is contained in:
@@ -18,6 +18,7 @@ typedef enum
|
||||
FZL_NODETYPE_CLASS,
|
||||
FZL_NODETYPE_FIELD,
|
||||
FZL_NODETYPE_CONSTRUCT,
|
||||
FZL_NODETYPE_LOOP,
|
||||
|
||||
FZL_NODETYPE_ADD,
|
||||
FZL_NODETYPE_SUB,
|
||||
@@ -140,6 +141,16 @@ typedef struct fzl_node
|
||||
{
|
||||
struct fzl_node *name;
|
||||
} construct;
|
||||
|
||||
// Loop
|
||||
struct
|
||||
{
|
||||
struct fzl_node *init;
|
||||
struct fzl_node *cond;
|
||||
struct fzl_node *step;
|
||||
|
||||
struct fzl_node *body;
|
||||
} loop;
|
||||
};
|
||||
} fzl_node_t;
|
||||
|
||||
|
||||
@@ -14,6 +14,9 @@ typedef enum
|
||||
FZL_TOKTYPE_FUNCTION, // fn
|
||||
FZL_TOKTYPE_RETURN, // return
|
||||
|
||||
FZL_TOKTYPE_FOR, // for
|
||||
FZL_TOKTYPE_WHILE, // while
|
||||
|
||||
FZL_TOKTYPE_IF, // if
|
||||
FZL_TOKTYPE_ELSE, // else
|
||||
|
||||
|
||||
@@ -16,7 +16,8 @@ typedef enum
|
||||
FZL_WALK_CTX_TYPE_GLOBAL,
|
||||
FZL_WALK_CTX_TYPE_FN,
|
||||
FZL_WALK_CTX_TYPE_CLASS,
|
||||
FZL_WALK_CTX_TYPE_ASSIGN
|
||||
FZL_WALK_CTX_TYPE_ASSIGN,
|
||||
FZL_WALK_CTX_TYPE_LOOP,
|
||||
} fzl_walk_ctx_type_t;
|
||||
|
||||
// Internal walk function result
|
||||
@@ -36,8 +37,23 @@ typedef struct fzl_walk_ctx
|
||||
fzl_walk_ctx_type_t type;
|
||||
struct fzl_walk_ctx *parent;
|
||||
|
||||
fzl_node_t *fn;
|
||||
size_t initial_env_lvl;
|
||||
union
|
||||
{
|
||||
// function info
|
||||
struct
|
||||
{
|
||||
fzl_node_t *fn;
|
||||
};
|
||||
|
||||
// loops `break`s writeback addrs
|
||||
struct
|
||||
{
|
||||
size_t *breaks;
|
||||
size_t breaks_count;
|
||||
size_t breaks_remainder;
|
||||
};
|
||||
};
|
||||
} fzl_walk_ctx_t;
|
||||
|
||||
// Walker descriptor
|
||||
|
||||
Reference in New Issue
Block a user