do-while feature complete

This commit is contained in:
John Kerl 2016-05-14 23:21:57 -04:00
parent 9a1b819398
commit 37af4c31ed
2 changed files with 82 additions and 2 deletions

View file

@ -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,

View file

@ -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