mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-24 00:18:39 +00:00
do-while feature complete
This commit is contained in:
parent
9a1b819398
commit
37af4c31ed
2 changed files with 82 additions and 2 deletions
|
|
@ -18,6 +18,7 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc_emit_or_emitp(mlr_dsl_ast_no
|
|||
int do_full_prefixing);
|
||||
static mlr_dsl_cst_statement_t* cst_statement_alloc_conditional_block(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* cst_statement_alloc_while(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* cst_statement_alloc_do_while(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* cst_statement_alloc_for_srec(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* cst_statement_alloc_if_head(mlr_dsl_ast_node_t* past, int type_inferencing);
|
||||
static mlr_dsl_cst_statement_t* cst_statement_alloc_if_item(mlr_dsl_ast_node_t* pexprnode,
|
||||
|
|
@ -220,6 +221,28 @@ static void mlr_dsl_cst_node_handle_while(
|
|||
sllv_t* poutrecs,
|
||||
char* oosvar_flatten_separator);
|
||||
|
||||
static void mlr_dsl_cst_node_handle_do_while(
|
||||
mlr_dsl_cst_statement_t* pnode,
|
||||
mlhmmv_t* poosvars,
|
||||
lrec_t* pinrec,
|
||||
lhmsv_t* ptyped_overlay,
|
||||
string_array_t** ppregex_captures,
|
||||
context_t* pctx,
|
||||
int* pshould_emit_rec,
|
||||
sllv_t* poutrecs,
|
||||
char* oosvar_flatten_separator);
|
||||
|
||||
static void mlr_dsl_cst_node_handle_do_while(
|
||||
mlr_dsl_cst_statement_t* pnode,
|
||||
mlhmmv_t* poosvars,
|
||||
lrec_t* pinrec,
|
||||
lhmsv_t* ptyped_overlay,
|
||||
string_array_t** ppregex_captures,
|
||||
context_t* pctx,
|
||||
int* pshould_emit_rec,
|
||||
sllv_t* poutrecs,
|
||||
char* oosvar_flatten_separator);
|
||||
|
||||
static void mlr_dsl_cst_node_handle_for_srec(
|
||||
mlr_dsl_cst_statement_t* pnode,
|
||||
mlhmmv_t* poosvars,
|
||||
|
|
@ -452,6 +475,9 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc(mlr_dsl_ast_node_t* pnode,
|
|||
case MD_AST_NODE_TYPE_WHILE:
|
||||
return cst_statement_alloc_while(pnode, type_inferencing);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_DO_WHILE:
|
||||
return cst_statement_alloc_do_while(pnode, type_inferencing);
|
||||
break;
|
||||
case MD_AST_NODE_TYPE_FOR_SREC:
|
||||
printf("FOR SREC STUB\n");
|
||||
return cst_statement_alloc_for_srec(pnode, type_inferencing);
|
||||
|
|
@ -784,6 +810,28 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc_while(mlr_dsl_ast_node_t* pa
|
|||
return pstatement;
|
||||
}
|
||||
|
||||
static mlr_dsl_cst_statement_t* cst_statement_alloc_do_while(mlr_dsl_ast_node_t* past, int type_inferencing) {
|
||||
mlr_dsl_cst_statement_t* pstatement = cst_statement_alloc_blank();
|
||||
|
||||
// Left child node is the list of statements in the body.
|
||||
// Right child node is the AST for the boolean expression.
|
||||
mlr_dsl_ast_node_t* pleft = past->pchildren->phead->pvvalue;
|
||||
mlr_dsl_ast_node_t* pright = past->pchildren->phead->pnext->pvvalue;
|
||||
sllv_t* pblock_statements = sllv_alloc();
|
||||
|
||||
for (sllve_t* pe = pleft->pchildren->phead; pe != NULL; pe = pe->pnext) {
|
||||
mlr_dsl_ast_node_t* pbody_ast_node = pe->pvvalue;
|
||||
mlr_dsl_cst_statement_t *pstatement = cst_statement_alloc(pbody_ast_node, type_inferencing, FALSE); // xxx stub
|
||||
////printf("BODY %s\n", mlr_dsl_ast_node_describe_type(pbody_ast_node->type));
|
||||
sllv_append(pblock_statements, pstatement);
|
||||
}
|
||||
|
||||
pstatement->phandler = mlr_dsl_cst_node_handle_do_while;
|
||||
pstatement->prhs_evaluator = rval_evaluator_alloc_from_ast(pright, type_inferencing);
|
||||
pstatement->pblock_statements = pblock_statements;
|
||||
return pstatement;
|
||||
}
|
||||
|
||||
static mlr_dsl_cst_statement_t* cst_statement_alloc_for_srec(mlr_dsl_ast_node_t* past, int type_inferencing) {
|
||||
mlr_dsl_cst_statement_t* pstatement = cst_statement_alloc_blank();
|
||||
|
||||
|
|
@ -1515,6 +1563,38 @@ static void mlr_dsl_cst_node_handle_while(
|
|||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
static void mlr_dsl_cst_node_handle_do_while(
|
||||
mlr_dsl_cst_statement_t* pnode,
|
||||
mlhmmv_t* poosvars,
|
||||
lrec_t* pinrec,
|
||||
lhmsv_t* ptyped_overlay,
|
||||
string_array_t** ppregex_captures,
|
||||
context_t* pctx,
|
||||
int* pshould_emit_rec,
|
||||
sllv_t* poutrecs,
|
||||
char* oosvar_flatten_separator)
|
||||
{
|
||||
rval_evaluator_t* prhs_evaluator = pnode->prhs_evaluator;
|
||||
|
||||
while (TRUE) {
|
||||
mlr_dsl_cst_handle(pnode->pblock_statements,
|
||||
poosvars, pinrec, ptyped_overlay, ppregex_captures, pctx, pshould_emit_rec, poutrecs,
|
||||
oosvar_flatten_separator);
|
||||
|
||||
mv_t val = prhs_evaluator->pprocess_func(pinrec, ptyped_overlay, poosvars,
|
||||
ppregex_captures, pctx, prhs_evaluator->pvstate);
|
||||
if (mv_is_non_null(&val)) {
|
||||
mv_set_boolean_strict(&val);
|
||||
if (!val.u.boolv) {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
static void mlr_dsl_cst_node_handle_for_srec(
|
||||
mlr_dsl_cst_statement_t* pnode,
|
||||
|
|
|
|||
|
|
@ -27,14 +27,14 @@ TOP-OF-LIST SUMMARY
|
|||
UT/olh/mld:
|
||||
* UT for empty statement for put
|
||||
* UT for empty statement for filter
|
||||
* UT if-chaining: put -v's as well as contentful @ abixy
|
||||
* UT if-chaining, while, do-while: put -v's as well as contentful @ abixy
|
||||
* olh comment-stripping for put & filter
|
||||
* UT comment-stripping for put & filter
|
||||
* doc re oosvar keyed mean solvable with `for`.
|
||||
* let newlines replace semicolons? no, and make it clear why: no need for \ continuations that way.
|
||||
|
||||
4.1.0 release notes:
|
||||
* new forx2, while, if-chains
|
||||
* new forx2, while/do-while, if-chains
|
||||
* recursivity of existing conds
|
||||
* pound-to-EOL commenting for filter & put
|
||||
! don't release 4.1 w/o implicit semicolon after closing curly brace
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue