bind-stack allocate CST iterate

This commit is contained in:
John Kerl 2016-10-14 08:45:24 -04:00
parent 97d6eecda8
commit bc98f13ee5
2 changed files with 53 additions and 0 deletions

View file

@ -71,17 +71,26 @@ typedef struct _cst_outputs_t {
cli_writer_opts_t* pwriter_opts;
} cst_outputs_t;
// ----------------------------------------------------------------
typedef struct _cst_top_level_statement_block_t {
local_stack_t* pstack;
int max_var_depth;
sllv_t* pstatements;
} cst_top_level_statement_block_t;
cst_top_level_statement_block_t* cst_top_level_statement_block_alloc(int max_var_depth);
void cst_top_level_statement_block_free(cst_top_level_statement_block_t* pblock);
// ----------------------------------------------------------------
typedef struct _cst_statement_block_t {
int frame_var_count;
sllv_t* pstatements;
} cst_statement_block_t;
cst_statement_block_t* cst_statement_block_alloc(int frame_var_count);
void cst_statement_block_free(cst_statement_block_t* pblock);
// ----------------------------------------------------------------
// Generic handler for a statement.
typedef void mlr_dsl_cst_node_handler_func_t(
struct _mlr_dsl_cst_statement_t* pnode,

View file

@ -222,7 +222,51 @@ static cst_statement_handler_t handle_dump;
static cst_statement_handler_t handle_dump_to_file;
static cst_statement_handler_t handle_print;
// ================================================================
cst_top_level_statement_block_t* cst_top_level_statement_block_alloc(int max_var_depth) {
cst_top_level_statement_block_t* pblock = mlr_malloc_or_die(sizeof(cst_top_level_statement_block_t));
pblock->max_var_depth = max_var_depth;
pblock->pstack = local_stack_alloc(max_var_depth);
pblock->pstatements = sllv_alloc();
return pblock;
}
// ----------------------------------------------------------------
void cst_top_level_statement_block_free(cst_top_level_statement_block_t* pblock) {
if (pblock == NULL)
return;
local_stack_free(pblock->pstack);
for (sllve_t* pe = pblock->pstatements->phead; pe != NULL; pe = pe->pnext) {
mlr_dsl_cst_statement_free(pe->pvvalue);
}
sllv_free(pblock->pstatements);
free(pblock);
}
// ----------------------------------------------------------------
cst_statement_block_t* cst_statement_block_alloc(int frame_var_count) {
cst_statement_block_t* pblock = mlr_malloc_or_die(sizeof(cst_statement_block_t));
pblock->frame_var_count = frame_var_count;
pblock->pstatements = sllv_alloc();
return pblock;
}
// ----------------------------------------------------------------
void cst_statement_block_free(cst_statement_block_t* pblock) {
if (pblock == NULL)
return;
for (sllve_t* pe = pblock->pstatements->phead; pe != NULL; pe = pe->pnext) {
mlr_dsl_cst_statement_free(pe->pvvalue);
}
sllv_free(pblock->pstatements);
free(pblock);
}
// ================================================================
// The parser accepts many things that are invalid, e.g.
// * begin{end{}} -- begin/end not at top level
// * begin{$x=1} -- references to stream records at begin/end