From 69b2239272a94a072ad1cc748aefcd3a595db45c Mon Sep 17 00:00:00 2001 From: John Kerl Date: Mon, 16 May 2016 13:50:04 -0400 Subject: [PATCH] bind-stack integration into CST handler --- c/containers/mlr_dsl_ast.c | 2 +- c/containers/mlr_dsl_ast.h | 2 +- c/dsls/mlr_dsl_parse.y | 6 ++--- c/mapping/mlr_dsl_cst.c | 35 +++++++++++++++++----------- c/mapping/mlr_dsl_cst.h | 2 +- c/mapping/rval_evaluators.h | 1 + c/mapping/rval_expr_evaluators.c | 8 +++++++ c/output/out-dev | 40 ++++++++++++++++---------------- 8 files changed, 57 insertions(+), 39 deletions(-) diff --git a/c/containers/mlr_dsl_ast.c b/c/containers/mlr_dsl_ast.c index 3059b21dc..23d8c4287 100644 --- a/c/containers/mlr_dsl_ast.c +++ b/c/containers/mlr_dsl_ast.c @@ -171,7 +171,7 @@ char* mlr_dsl_ast_node_describe_type(mlr_dsl_ast_node_type_t type) { case MD_AST_NODE_TYPE_DO_WHILE: return "do_while"; break; case MD_AST_NODE_TYPE_FOR_SREC: return "for_srec"; break; case MD_AST_NODE_TYPE_FOR_VARIABLES: return "for_variables"; break; - case MD_AST_NODE_TYPE_BOUND_VAR: return "bound_var"; break; + case MD_AST_NODE_TYPE_BOUND_VARIABLE: return "bound_variable"; break; case MD_AST_NODE_TYPE_IN: return "in"; break; case MD_AST_NODE_TYPE_BREAK: return "break"; break; case MD_AST_NODE_TYPE_CONTINUE: return "continue"; break; diff --git a/c/containers/mlr_dsl_ast.h b/c/containers/mlr_dsl_ast.h index 977e0dcf4..e41b1d99a 100644 --- a/c/containers/mlr_dsl_ast.h +++ b/c/containers/mlr_dsl_ast.h @@ -40,7 +40,7 @@ typedef enum _mlr_dsl_ast_node_type_t { MD_AST_NODE_TYPE_DO_WHILE, MD_AST_NODE_TYPE_FOR_SREC, MD_AST_NODE_TYPE_FOR_VARIABLES, - MD_AST_NODE_TYPE_BOUND_VAR, + MD_AST_NODE_TYPE_BOUND_VARIABLE, MD_AST_NODE_TYPE_IN, MD_AST_NODE_TYPE_BREAK, MD_AST_NODE_TYPE_CONTINUE, diff --git a/c/dsls/mlr_dsl_parse.y b/c/dsls/mlr_dsl_parse.y index b1d781449..a6f9c01e6 100644 --- a/c/dsls/mlr_dsl_parse.y +++ b/c/dsls/mlr_dsl_parse.y @@ -813,11 +813,11 @@ md_atom_or_fcn(A) ::= md_regexi(B). { A = B; } -md_atom_or_fcn(A) ::= md_bound_var(B). { +md_atom_or_fcn(A) ::= md_bound_variable(B). { A = B; } -md_bound_var(A) ::= MD_TOKEN_NON_SIGIL_NAME(B). { - A = mlr_dsl_ast_node_alloc(B->text, MD_AST_NODE_TYPE_BOUND_VAR); +md_bound_variable(A) ::= MD_TOKEN_NON_SIGIL_NAME(B). { + A = mlr_dsl_ast_node_alloc(B->text, MD_AST_NODE_TYPE_BOUND_VARIABLE); } md_string(A) ::= MD_TOKEN_STRING(B). { diff --git a/c/mapping/mlr_dsl_cst.c b/c/mapping/mlr_dsl_cst.c index 518275eaf..0e5b5204e 100644 --- a/c/mapping/mlr_dsl_cst.c +++ b/c/mapping/mlr_dsl_cst.c @@ -559,7 +559,7 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc_blank() { pstatement->pvarargs = NULL; pstatement->pblock_statements = NULL; pstatement->pif_chain_statements = NULL; - pstatement->pbound_vars = NULL; + pstatement->pbound_variables = NULL; return pstatement; } @@ -874,8 +874,7 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc_for_srec(mlr_dsl_ast_node_t* // Left child node is list of bound variables. // Right child node is the list of statements in the body. - // xxx to do: - //mlr_dsl_ast_node_t* pleft = past->pchildren->phead->pvvalue; + 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(); @@ -894,9 +893,15 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc_for_srec(mlr_dsl_ast_node_t* } } + mlr_dsl_ast_node_t* pknode = pleft->pchildren->phead->pvvalue; + mlr_dsl_ast_node_t* pvnode = pleft->pchildren->phead->pnext->pvvalue; + pstatement->phandler = mlr_dsl_cst_node_handle_for_srec; pstatement->pblock_statements = pblock_statements; - pstatement->pbound_vars = lhmsmv_alloc(); + pstatement->for_srec_k_name = pknode->text; + pstatement->for_srec_v_name = pvnode->text; + pstatement->pbound_variables = lhmsmv_alloc(); + return pstatement; } @@ -1663,25 +1668,29 @@ static void mlr_dsl_cst_node_handle_for_srec( char* oosvar_flatten_separator, bind_stack_t* pbind_stack) { - bind_stack_push(pbind_stack, pnode->pbound_vars); + bind_stack_push(pbind_stack, pnode->pbound_variables); + //printf("FOO\n"); + //bind_stack_print(pbind_stack); + //printf("BAR\n"); for (lrece_t* pe = pinrec->phead; pe != NULL; pe = pe->pnext) { // xxx beware string/integer for lrec keys ... // Copy, not pointer-reference, in case of srec-unset in loop body. mv_t mvkey = mv_from_string_with_free(mlr_strdup_or_die(pe->key)); - mv_t* pmvval = lhmsv_get(ptyped_overlay, pe->key); - if (pmvval != NULL) { - *pmvval = mv_copy(pmvval); - } else { - *pmvval = mv_from_string_with_free(mlr_strdup_or_die(pe->value)); - } + mv_t* poverlay = lhmsv_get(ptyped_overlay, pe->key); + mv_t mvval = (poverlay != NULL) + ? mv_copy(poverlay) + : mv_from_string_with_free(mlr_strdup_or_die(pe->value)); - lhmsmv_put(pnode->pbound_vars, pnode->for_srec_k_name, &mvkey, FREE_ENTRY_VALUE); - lhmsmv_put(pnode->pbound_vars, pnode->for_srec_v_name, pmvval, FREE_ENTRY_VALUE); + lhmsmv_put(pnode->pbound_variables, pnode->for_srec_k_name, &mvkey, FREE_ENTRY_VALUE); + lhmsmv_put(pnode->pbound_variables, pnode->for_srec_v_name, &mvval, FREE_ENTRY_VALUE); mlr_dsl_cst_handle(pnode->pblock_statements, poosvars, pinrec, ptyped_overlay, ppregex_captures, pctx, pshould_emit_rec, poutrecs, oosvar_flatten_separator, pbind_stack); + //printf("FOO\n"); + //bind_stack_print(pbind_stack); + //printf("BAR\n"); } // xxx break/continue-handling (needs to be in rval evluators w/ stack of brk/ctu flags @ context bind_stack_pop(pbind_stack); diff --git a/c/mapping/mlr_dsl_cst.h b/c/mapping/mlr_dsl_cst.h index f808bc721..217816c77 100644 --- a/c/mapping/mlr_dsl_cst.h +++ b/c/mapping/mlr_dsl_cst.h @@ -102,7 +102,7 @@ typedef struct _mlr_dsl_cst_statement_t { // xxx for-oosvar key-list of names // for-srec and for-oosvar: - lhmsmv_t* pbound_vars; + lhmsmv_t* pbound_variables; } mlr_dsl_cst_statement_t; diff --git a/c/mapping/rval_evaluators.h b/c/mapping/rval_evaluators.h index 854f06ee4..15800c9d5 100644 --- a/c/mapping/rval_evaluators.h +++ b/c/mapping/rval_evaluators.h @@ -95,6 +95,7 @@ rval_evaluator_t* rval_evaluator_alloc_from_FILENUM(); rval_evaluator_t* rval_evaluator_alloc_from_PI(); rval_evaluator_t* rval_evaluator_alloc_from_E(); rval_evaluator_t* rval_evaluator_alloc_from_context_variable(char* variable_name); +rval_evaluator_t* rval_evaluator_alloc_from_bound_variable(char* variable_name); // For unit test: rval_evaluator_t* rval_evaluator_alloc_from_mlrval(mv_t* pval); diff --git a/c/mapping/rval_expr_evaluators.c b/c/mapping/rval_expr_evaluators.c index fd16b9307..152f230cc 100644 --- a/c/mapping/rval_expr_evaluators.c +++ b/c/mapping/rval_expr_evaluators.c @@ -37,6 +37,8 @@ static rval_evaluator_t* rval_evaluator_alloc_from_ast_aux(mlr_dsl_ast_node_t* p return rval_evaluator_alloc_from_strnum_literal(pnode->text, type_inferencing); } else if (pnode->type == MD_AST_NODE_TYPE_CONTEXT_VARIABLE) { return rval_evaluator_alloc_from_context_variable(pnode->text); + } else if (pnode->type == MD_AST_NODE_TYPE_BOUND_VARIABLE) { + return rval_evaluator_alloc_from_bound_variable(pnode->text); } else { fprintf(stderr, "%s: internal coding error detected in file %s at line %d.\n", MLR_GLOBALS.argv0, __FILE__, __LINE__); @@ -794,6 +796,12 @@ rval_evaluator_t* rval_evaluator_alloc_from_context_variable(char* variable_name } } +// ================================================================ +rval_evaluator_t* rval_evaluator_alloc_from_bound_variable(char* variable_name) { + // xxx stub + return rval_evaluator_alloc_from_FILENAME(); +} + // ---------------------------------------------------------------- typedef struct _rval_evaluator_mv_state_t { mv_t literal; diff --git a/c/output/out-dev b/c/output/out-dev index 68dcd5ab3..f44fad519 100644 --- a/c/output/out-dev +++ b/c/output/out-dev @@ -87,8 +87,8 @@ list (statement_list): mlr -n put -v for(k,v in $*) { } AST ROOT: list (statement_list): - for (for-srec): - variables (for-variables): + for (for_srec): + variables (for_variables): k (non_sigil_name). v (non_sigil_name). list (statement_list): @@ -98,8 +98,8 @@ list (statement_list): mlr -n put -v for(k,v in $*) { $m=1} AST ROOT: list (statement_list): - for (for-srec): - variables (for-variables): + for (for_srec): + variables (for_variables): k (non_sigil_name). v (non_sigil_name). list (statement_list): @@ -112,8 +112,8 @@ list (statement_list): mlr -n put -v for(k,v in $*) { $m=1;$m=2 } AST ROOT: list (statement_list): - for (for-srec): - variables (for-variables): + for (for_srec): + variables (for_variables): k (non_sigil_name). v (non_sigil_name). list (statement_list): @@ -129,8 +129,8 @@ list (statement_list): mlr -n put -v for(k,v in $*) { $m=1;break;$m=2 } AST ROOT: list (statement_list): - for (for-srec): - variables (for-variables): + for (for_srec): + variables (for_variables): k (non_sigil_name). v (non_sigil_name). list (statement_list): @@ -146,8 +146,8 @@ break alloc stub! mlr -n put -v for(k,v in $*) { $m=1;break;continue;$m=2 } AST ROOT: list (statement_list): - for (for-srec): - variables (for-variables): + for (for_srec): + variables (for_variables): k (non_sigil_name). v (non_sigil_name). list (statement_list): @@ -165,8 +165,8 @@ break alloc stub! mlr -n put -v for(k,v in $*) { $m=1;break;continue;;$m=2 } AST ROOT: list (statement_list): - for (for-srec): - variables (for-variables): + for (for_srec): + variables (for_variables): k (non_sigil_name). v (non_sigil_name). list (statement_list): @@ -186,8 +186,8 @@ break alloc stub! mlr -n put -v for(k,v in $*) { true{$m=3} } AST ROOT: list (statement_list): - for (for-srec): - variables (for-variables): + for (for_srec): + variables (for_variables): k (non_sigil_name). v (non_sigil_name). list (statement_list): @@ -206,8 +206,8 @@ list (statement_list): cond (conditional_block): true (boolean_literal). list (statement_list): - for (for-srec): - variables (for-variables): + for (for_srec): + variables (for_variables): k (non_sigil_name). v (non_sigil_name). list (statement_list): @@ -221,8 +221,8 @@ list (statement_list): cond (conditional_block): true (boolean_literal). list (statement_list): - for (for-srec): - variables (for-variables): + for (for_srec): + variables (for_variables): k (non_sigil_name). v (non_sigil_name). list (statement_list): @@ -245,8 +245,8 @@ list (statement_list): cond (conditional_block): true (boolean_literal). list (statement_list): - for (for-srec): - variables (for-variables): + for (for_srec): + variables (for_variables): k (non_sigil_name). v (non_sigil_name). list (statement_list):