mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-25 00:48:56 +00:00
iterate on for/while/if language features: CST prep
This commit is contained in:
parent
ac21a61dd2
commit
79ac36347e
2 changed files with 36 additions and 26 deletions
|
|
@ -27,7 +27,7 @@ static mlr_dsl_cst_statement_item_t* mlr_dsl_cst_statement_item_alloc(
|
|||
char* emitf_or_unset_srec_field_name,
|
||||
sllv_t* poosvar_lhs_keylist_evaluators,
|
||||
sllv_t* poosvar_lhs_namelist_evaluators,
|
||||
rval_evaluator_t* prhs_evaluator,
|
||||
rval_evaluator_t* pemitf_arg_evaluator,
|
||||
sllv_t* poosvar_rhs_keylist_evaluators);
|
||||
|
||||
static void cst_statement_item_free(mlr_dsl_cst_statement_item_t* pitem);
|
||||
|
|
@ -375,10 +375,13 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc(mlr_dsl_ast_node_t* past, in
|
|||
// ----------------------------------------------------------------
|
||||
static mlr_dsl_cst_statement_t* cst_statement_alloc_blank() {
|
||||
mlr_dsl_cst_statement_t* pstatement = mlr_malloc_or_die(sizeof(mlr_dsl_cst_statement_t));
|
||||
pstatement->pevaluator = NULL;
|
||||
|
||||
pstatement->pevaluator = NULL;
|
||||
pstatement->srec_lhs_field_name = NULL;
|
||||
pstatement->pitems = sllv_alloc();
|
||||
pstatement->pblock_statements = NULL;
|
||||
pstatement->prhs_evaluator = NULL;
|
||||
pstatement->pitems = sllv_alloc();
|
||||
pstatement->pblock_statements = NULL;
|
||||
|
||||
return pstatement;
|
||||
}
|
||||
|
||||
|
|
@ -409,10 +412,11 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc_srec_assignment(mlr_dsl_ast_
|
|||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
rval_evaluator_alloc_from_ast(pright, type_inferencing),
|
||||
NULL,
|
||||
NULL));
|
||||
pstatement->pevaluator = mlr_dsl_cst_node_evaluate_srec_assignment;
|
||||
pstatement->srec_lhs_field_name = pleft->text;
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, type_inferencing);
|
||||
return pstatement;
|
||||
}
|
||||
|
||||
|
|
@ -443,7 +447,7 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc_oosvar_assignment(mlr_dsl_as
|
|||
NULL,
|
||||
poosvar_lhs_keylist_evaluators,
|
||||
NULL,
|
||||
rval_evaluator_alloc_from_ast(pright, type_inferencing),
|
||||
NULL,
|
||||
allocate_keylist_evaluators_from_oosvar_node(pright, type_inferencing)));
|
||||
pstatement->pevaluator = mlr_dsl_cst_node_evaluate_oosvar_to_oosvar_assignment;
|
||||
} else {
|
||||
|
|
@ -451,11 +455,13 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc_oosvar_assignment(mlr_dsl_as
|
|||
NULL,
|
||||
poosvar_lhs_keylist_evaluators,
|
||||
NULL,
|
||||
rval_evaluator_alloc_from_ast(pright, type_inferencing),
|
||||
NULL,
|
||||
NULL));
|
||||
pstatement->pevaluator = mlr_dsl_cst_node_evaluate_oosvar_assignment;
|
||||
}
|
||||
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, type_inferencing);
|
||||
|
||||
return pstatement;
|
||||
}
|
||||
|
||||
|
|
@ -656,10 +662,11 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc_conditional_block(mlr_dsl_as
|
|||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
rval_evaluator_alloc_from_ast(pfirst, type_inferencing),
|
||||
NULL,
|
||||
NULL));
|
||||
|
||||
pstatement->pevaluator = mlr_dsl_cst_node_evaluate_conditional_block;
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pfirst, type_inferencing);
|
||||
pstatement->pblock_statements = pblock_statements;
|
||||
return pstatement;
|
||||
}
|
||||
|
|
@ -672,10 +679,11 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc_filter(mlr_dsl_ast_node_t* p
|
|||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
rval_evaluator_alloc_from_ast(pnode, type_inferencing),
|
||||
NULL,
|
||||
NULL));
|
||||
|
||||
pstatement->pevaluator = mlr_dsl_cst_node_evaluate_filter;
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pnode, type_inferencing);
|
||||
return pstatement;
|
||||
}
|
||||
|
||||
|
|
@ -700,10 +708,11 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc_bare_boolean(mlr_dsl_ast_nod
|
|||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
rval_evaluator_alloc_from_ast(past, type_inferencing),
|
||||
NULL,
|
||||
NULL));
|
||||
|
||||
pstatement->pevaluator = mlr_dsl_cst_node_evaluate_bare_boolean;
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(past, type_inferencing);
|
||||
return pstatement;
|
||||
}
|
||||
|
||||
|
|
@ -717,6 +726,8 @@ static void cst_statement_free(mlr_dsl_cst_statement_t* pstatement) {
|
|||
cst_statement_free(pe->pvvalue);
|
||||
sllv_free(pstatement->pblock_statements);
|
||||
}
|
||||
if (pstatement->prhs_evaluator != NULL)
|
||||
pstatement->prhs_evaluator->pfree_func(pstatement->prhs_evaluator);
|
||||
free(pstatement);
|
||||
}
|
||||
|
||||
|
|
@ -725,14 +736,14 @@ static mlr_dsl_cst_statement_item_t* mlr_dsl_cst_statement_item_alloc(
|
|||
char* emitf_or_unset_srec_field_name,
|
||||
sllv_t* poosvar_lhs_keylist_evaluators,
|
||||
sllv_t* poosvar_lhs_namelist_evaluators,
|
||||
rval_evaluator_t* prhs_evaluator,
|
||||
rval_evaluator_t* pemitf_arg_evaluator,
|
||||
sllv_t* poosvar_rhs_keylist_evaluators)
|
||||
{
|
||||
mlr_dsl_cst_statement_item_t* pitem = mlr_malloc_or_die(sizeof(mlr_dsl_cst_statement_item_t));
|
||||
pitem->emitf_or_unset_srec_field_name = emitf_or_unset_srec_field_name == NULL ? NULL : mlr_strdup_or_die(emitf_or_unset_srec_field_name);
|
||||
pitem->poosvar_lhs_keylist_evaluators = poosvar_lhs_keylist_evaluators;
|
||||
pitem->poosvar_lhs_namelist_evaluators = poosvar_lhs_namelist_evaluators;
|
||||
pitem->prhs_evaluator = prhs_evaluator;
|
||||
pitem->pemitf_arg_evaluator = pemitf_arg_evaluator;
|
||||
pitem->poosvar_rhs_keylist_evaluators = poosvar_rhs_keylist_evaluators;
|
||||
return pitem;
|
||||
}
|
||||
|
|
@ -758,8 +769,8 @@ static void cst_statement_item_free(mlr_dsl_cst_statement_item_t* pitem) {
|
|||
sllv_free(pitem->poosvar_lhs_namelist_evaluators);
|
||||
}
|
||||
|
||||
if (pitem->prhs_evaluator != NULL)
|
||||
pitem->prhs_evaluator->pfree_func(pitem->prhs_evaluator);
|
||||
if (pitem->pemitf_arg_evaluator != NULL)
|
||||
pitem->pemitf_arg_evaluator->pfree_func(pitem->pemitf_arg_evaluator);
|
||||
|
||||
if (pitem->poosvar_rhs_keylist_evaluators != NULL) {
|
||||
for (sllve_t* pe = pitem->poosvar_rhs_keylist_evaluators->phead; pe != NULL; pe = pe->pnext) {
|
||||
|
|
@ -803,9 +814,8 @@ static void mlr_dsl_cst_node_evaluate_srec_assignment(
|
|||
sllv_t* poutrecs,
|
||||
char* oosvar_flatten_separator)
|
||||
{
|
||||
mlr_dsl_cst_statement_item_t* pitem = pnode->pitems->phead->pvvalue;
|
||||
char* srec_lhs_field_name = pnode->srec_lhs_field_name;
|
||||
rval_evaluator_t* prhs_evaluator = pitem->prhs_evaluator;
|
||||
rval_evaluator_t* prhs_evaluator = pnode->prhs_evaluator;
|
||||
|
||||
mv_t val = prhs_evaluator->pprocess_func(pinrec, ptyped_overlay, poosvars,
|
||||
ppregex_captures, pctx, prhs_evaluator->pvstate);
|
||||
|
|
@ -852,7 +862,7 @@ static void mlr_dsl_cst_node_evaluate_oosvar_assignment(
|
|||
{
|
||||
mlr_dsl_cst_statement_item_t* pitem = pnode->pitems->phead->pvvalue;
|
||||
|
||||
rval_evaluator_t* prhs_evaluator = pitem->prhs_evaluator;
|
||||
rval_evaluator_t* prhs_evaluator = pnode->prhs_evaluator;
|
||||
mv_t rhs_value = prhs_evaluator->pprocess_func(pinrec, ptyped_overlay,
|
||||
poosvars, ppregex_captures, pctx, prhs_evaluator->pvstate);
|
||||
|
||||
|
|
@ -1063,12 +1073,12 @@ static void mlr_dsl_cst_node_evaluate_emitf(
|
|||
for (sllve_t* pf = pnode->pitems->phead; pf != NULL; pf = pf->pnext) {
|
||||
mlr_dsl_cst_statement_item_t* pitem = pf->pvvalue;
|
||||
char* emitf_or_unset_srec_field_name = pitem->emitf_or_unset_srec_field_name;
|
||||
rval_evaluator_t* prhs_evaluator = pitem->prhs_evaluator;
|
||||
rval_evaluator_t* pemitf_arg_evaluator = pitem->pemitf_arg_evaluator;
|
||||
|
||||
// This is overkill ... the grammar allows only for oosvar names as args to emit. So we could bypass
|
||||
// that and just hashmap-get keyed by emitf_or_unset_srec_field_name here.
|
||||
mv_t val = prhs_evaluator->pprocess_func(pinrec, ptyped_overlay, poosvars,
|
||||
ppregex_captures, pctx, prhs_evaluator->pvstate);
|
||||
mv_t val = pemitf_arg_evaluator->pprocess_func(pinrec, ptyped_overlay, poosvars,
|
||||
ppregex_captures, pctx, pemitf_arg_evaluator->pvstate);
|
||||
|
||||
if (val.type == MT_STRING) {
|
||||
// Ownership transfer from (newly created) mlrval to (newly created) lrec.
|
||||
|
|
@ -1210,8 +1220,7 @@ static void mlr_dsl_cst_node_evaluate_filter(
|
|||
sllv_t* poutrecs,
|
||||
char* oosvar_flatten_separator)
|
||||
{
|
||||
mlr_dsl_cst_statement_item_t* pitem = pnode->pitems->phead->pvvalue;
|
||||
rval_evaluator_t* prhs_evaluator = pitem->prhs_evaluator;
|
||||
rval_evaluator_t* prhs_evaluator = pnode->prhs_evaluator;
|
||||
|
||||
mv_t val = prhs_evaluator->pprocess_func(pinrec, ptyped_overlay, poosvars,
|
||||
ppregex_captures, pctx, prhs_evaluator->pvstate);
|
||||
|
|
@ -1235,8 +1244,7 @@ static void mlr_dsl_cst_node_evaluate_conditional_block(
|
|||
sllv_t* poutrecs,
|
||||
char* oosvar_flatten_separator)
|
||||
{
|
||||
mlr_dsl_cst_statement_item_t* pitem = pnode->pitems->phead->pvvalue;
|
||||
rval_evaluator_t* prhs_evaluator = pitem->prhs_evaluator;
|
||||
rval_evaluator_t* prhs_evaluator = pnode->prhs_evaluator;
|
||||
|
||||
mv_t val = prhs_evaluator->pprocess_func(pinrec, ptyped_overlay, poosvars,
|
||||
ppregex_captures, pctx, prhs_evaluator->pvstate);
|
||||
|
|
@ -1262,8 +1270,7 @@ static void mlr_dsl_cst_node_evaluate_bare_boolean(
|
|||
sllv_t* poutrecs,
|
||||
char* oosvar_flatten_separator)
|
||||
{
|
||||
mlr_dsl_cst_statement_item_t* pitem = pnode->pitems->phead->pvvalue;
|
||||
rval_evaluator_t* prhs_evaluator = pitem->prhs_evaluator;
|
||||
rval_evaluator_t* prhs_evaluator = pnode->prhs_evaluator;
|
||||
|
||||
mv_t val = prhs_evaluator->pprocess_func(pinrec, ptyped_overlay, poosvars,
|
||||
ppregex_captures, pctx, prhs_evaluator->pvstate);
|
||||
|
|
|
|||
|
|
@ -63,6 +63,7 @@ typedef struct _mlr_dsl_cst_statement_item_t {
|
|||
sllv_t* poosvar_lhs_namelist_evaluators; // for emit
|
||||
|
||||
char* emitf_or_unset_srec_field_name; // xxx temp
|
||||
rval_evaluator_t* pemitf_arg_evaluator; // xxx temp
|
||||
|
||||
// RHS:
|
||||
rval_evaluator_t* prhs_evaluator; // E.g. for srec assignments
|
||||
|
|
@ -73,6 +74,8 @@ typedef struct _mlr_dsl_cst_statement_t {
|
|||
mlr_dsl_cst_node_evaluator_func_t* pevaluator;
|
||||
|
||||
char* srec_lhs_field_name;
|
||||
// For assignments to srec or oosvar, filter, cond, and bare-boolean
|
||||
rval_evaluator_t* prhs_evaluator;
|
||||
//sllv_t* unset_srec_field_names;
|
||||
//sllv_t* emitf_srec_field_names;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue