From 051f01d64f6eecae61b6fafdd0c5aed3f88d47df Mon Sep 17 00:00:00 2001 From: John Kerl Date: Mon, 22 Feb 2016 08:56:13 -0500 Subject: [PATCH] parameterized-emit iterate --- c/dsls/mlr_dsl_parse.y | 36 +++++++++------- c/mapping/mlr_dsl_cst.c | 91 +++++++++++++++++++++++++++++------------ 2 files changed, 86 insertions(+), 41 deletions(-) diff --git a/c/dsls/mlr_dsl_parse.y b/c/dsls/mlr_dsl_parse.y index 6ca519bd5..7b51c2cb1 100644 --- a/c/dsls/mlr_dsl_parse.y +++ b/c/dsls/mlr_dsl_parse.y @@ -87,7 +87,7 @@ md_end_block_statement ::= md_end_block_emit. md_end_block_statement ::= md_end_block_dump. // ---------------------------------------------------------------- -md_conditional_block(A) ::= md_ternary(B) MD_TOKEN_LEFT_BRACE md_conditional_block_statements(C) MD_TOKEN_RIGHT_BRACE . { +md_conditional_block(A) ::= md_rhs(B) MD_TOKEN_LEFT_BRACE md_conditional_block_statements(C) MD_TOKEN_RIGHT_BRACE . { A = mlr_dsl_ast_node_prepend_arg(C, B); sllv_append(past->pmain_statements, A); } @@ -126,11 +126,11 @@ md_main_oosvar_assignment(A) ::= md_oosvar_assignment(B). { A = B; sllv_append(past->pmain_statements, A); } -md_main_bare_boolean(A) ::= md_ternary(B). { +md_main_bare_boolean(A) ::= md_rhs(B). { A = B; sllv_append(past->pmain_statements, A); } -md_main_filter(A) ::= MD_TOKEN_FILTER(O) md_ternary(B). { +md_main_filter(A) ::= MD_TOKEN_FILTER(O) md_rhs(B). { A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILTER, B); sllv_append(past->pmain_statements, A); } @@ -150,11 +150,11 @@ md_begin_block_oosvar_assignment(A) ::= md_oosvar_assignment(B). { A = B; sllv_append(past->pbegin_statements, A); } -md_begin_block_bare_boolean(A) ::= md_ternary(B). { +md_begin_block_bare_boolean(A) ::= md_rhs(B). { A = B; sllv_append(past->pbegin_statements, A); } -md_begin_block_filter(A) ::= MD_TOKEN_FILTER(O) md_ternary(B). { +md_begin_block_filter(A) ::= MD_TOKEN_FILTER(O) md_rhs(B). { A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILTER, B); sllv_append(past->pbegin_statements, A); } @@ -188,11 +188,11 @@ md_end_block_oosvar_assignment(A) ::= md_oosvar_assignment(B). { A = B; sllv_append(past->pend_statements, A); } -md_end_block_bare_boolean(A) ::= md_ternary(B). { +md_end_block_bare_boolean(A) ::= md_rhs(B). { A = B; sllv_append(past->pend_statements, A); } -md_end_block_filter(A) ::= MD_TOKEN_FILTER(O) md_ternary(B). { +md_end_block_filter(A) ::= MD_TOKEN_FILTER(O) md_rhs(B). { A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILTER, B); sllv_append(past->pend_statements, A); } @@ -206,13 +206,13 @@ md_end_block_dump(A) ::= md_dump(B). { } // ---------------------------------------------------------------- -md_srec_assignment(A) ::= md_field_name(B) MD_TOKEN_ASSIGN(O) md_ternary(C). { +md_srec_assignment(A) ::= md_field_name(B) MD_TOKEN_ASSIGN(O) md_rhs(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B, C); } -md_oosvar_assignment(A) ::= md_oosvar_name(B) MD_TOKEN_ASSIGN(O) md_ternary(C). { +md_oosvar_assignment(A) ::= md_oosvar_name(B) MD_TOKEN_ASSIGN(O) md_rhs(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B, C); } -md_oosvar_assignment(A) ::= md_keyed_oosvar_name(B) MD_TOKEN_ASSIGN(O) md_ternary(C). { +md_oosvar_assignment(A) ::= md_keyed_oosvar_name(B) MD_TOKEN_ASSIGN(O) md_rhs(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B, C); } @@ -243,10 +243,10 @@ md_emit(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_LPAREN md_oosvar_name(B) MD_TOKEN_COMMA B = mlr_dsl_ast_node_prepend_arg(C, B); A = mlr_dsl_ast_node_set_function_name(B, O->text); } -md_emit_args2(A) ::= md_string(B). { +md_emit_args2(A) ::= md_rhs(B). { A = mlr_dsl_ast_node_alloc_unary("temp", MD_AST_NODE_TYPE_EMIT2TEMP, B); } -md_emit_args2(A) ::= md_emit_args2(B) MD_TOKEN_COMMA md_string(C). { +md_emit_args2(A) ::= md_emit_args2(B) MD_TOKEN_COMMA md_rhs(C). { A = mlr_dsl_ast_node_append_arg(B, C); } @@ -257,6 +257,12 @@ md_dump(A) ::= MD_TOKEN_DUMP(O). { } // ================================================================ +// Begin RHS precedence chain + +md_rhs(A) ::= md_ternary(B). { + A = B; +} + md_ternary(A) ::= md_logical_or_term(B) MD_TOKEN_QUESTION_MARK md_ternary(C) MD_TOKEN_COLON md_ternary(D). { A = mlr_dsl_ast_node_alloc_ternary("? :", MD_AST_NODE_TYPE_OPERATOR, B, C, D); } @@ -446,10 +452,10 @@ md_atom_or_fcn(A) ::= md_oosvar_name(B). { A = B; } -md_keyed_oosvar_name(A) ::= md_oosvar_name(B) MD_TOKEN_LEFT_BRACKET md_ternary(C) MD_TOKEN_RIGHT_BRACKET. { +md_keyed_oosvar_name(A) ::= md_oosvar_name(B) MD_TOKEN_LEFT_BRACKET md_rhs(C) MD_TOKEN_RIGHT_BRACKET. { A = mlr_dsl_ast_node_alloc_binary("[]", MD_AST_NODE_TYPE_OOSVAR_LEVEL_KEY, B, C); } -md_keyed_oosvar_name(A) ::= md_keyed_oosvar_name(B) MD_TOKEN_LEFT_BRACKET md_ternary(C) MD_TOKEN_RIGHT_BRACKET. { +md_keyed_oosvar_name(A) ::= md_keyed_oosvar_name(B) MD_TOKEN_LEFT_BRACKET md_rhs(C) MD_TOKEN_RIGHT_BRACKET. { A = mlr_dsl_ast_node_alloc_binary("[]", MD_AST_NODE_TYPE_OOSVAR_LEVEL_KEY, B, C); } @@ -503,7 +509,7 @@ md_regexi(A) ::= MD_TOKEN_REGEXI(B). { md_atom_or_fcn(A) ::= MD_TOKEN_CONTEXT_VARIABLE(B). { A = B; } -md_atom_or_fcn(A) ::= MD_TOKEN_ENV(B) MD_TOKEN_LEFT_BRACKET md_ternary(C) MD_TOKEN_RIGHT_BRACKET. { +md_atom_or_fcn(A) ::= MD_TOKEN_ENV(B) MD_TOKEN_LEFT_BRACKET md_rhs(C) MD_TOKEN_RIGHT_BRACKET. { A = mlr_dsl_ast_node_alloc_binary("env", MD_AST_NODE_TYPE_ENV, B, C); } diff --git a/c/mapping/mlr_dsl_cst.c b/c/mapping/mlr_dsl_cst.c index b258e5d9b..2bc499716 100644 --- a/c/mapping/mlr_dsl_cst.c +++ b/c/mapping/mlr_dsl_cst.c @@ -44,6 +44,16 @@ static void mlr_dsl_cst_node_evaluate_emit( int* pshould_emit_rec, sllv_t* poutrecs); +static void mlr_dsl_cst_node_evaluate_emit2temp( + 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); + static void mlr_dsl_cst_node_evaluate_dump( mlr_dsl_cst_statement_t* pnode, mlhmmv_t* poosvars, @@ -217,6 +227,39 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc(mlr_dsl_ast_node_t* past, in pstatement->pevaluator = mlr_dsl_cst_node_evaluate_oosvar_assignment; + } else if (past->type == MD_AST_NODE_TYPE_EMIT) { + // Loop over oosvar names to emit in e.g. 'emit @a, @b, @c'. + for (sllve_t* pe = past->pchildren->phead; pe != NULL; pe = pe->pnext) { + mlr_dsl_ast_node_t* pnode = pe->pvvalue; + sllv_append(pstatement->pitems, mlr_dsl_cst_statement_item_alloc( + pnode->text, + NULL, + rval_evaluator_alloc_from_ast(pnode, type_inferencing), + NULL)); + } + + pstatement->pevaluator = mlr_dsl_cst_node_evaluate_emit; + + } else if (past->type == MD_AST_NODE_TYPE_EMIT2TEMP) { + // First argument is oosvar name. Remainings evaluate to string, + // e.g. 'emit(@sums, "color", "shape")'. + mlr_dsl_ast_node_t* pnamenode = past->pchildren->phead->pvvalue; + + sllv_t* poosvar_lhs_keylist_evaluators = sllv_alloc(); + for (sllve_t* pe = past->pchildren->phead->pnext; pe != NULL; pe = pe->pnext) { + mlr_dsl_ast_node_t* pkeynode = pe->pvvalue; + sllv_append(poosvar_lhs_keylist_evaluators, + rval_evaluator_alloc_from_ast(pkeynode, type_inferencing)); + } + + sllv_append(pstatement->pitems, mlr_dsl_cst_statement_item_alloc( + pnamenode->text, + poosvar_lhs_keylist_evaluators, + NULL, + NULL)); + + pstatement->pevaluator = mlr_dsl_cst_node_evaluate_emit2temp; + } else if (past->type == MD_AST_NODE_TYPE_CONDITIONAL_BLOCK) { // First child node is the AST for the boolean expression. Remaining child nodes are statements // to be executed if it evaluates to true. @@ -247,32 +290,6 @@ static mlr_dsl_cst_statement_t* cst_statement_alloc(mlr_dsl_ast_node_t* past, in pstatement->pevaluator = mlr_dsl_cst_node_evaluate_filter; - } else if (past->type == MD_AST_NODE_TYPE_EMIT) { - // Loop over oosvar names to emit in e.g. 'emit @a, @b, @c'. - for (sllve_t* pe = past->pchildren->phead; pe != NULL; pe = pe->pnext) { - mlr_dsl_ast_node_t* pnode = pe->pvvalue; - sllv_append(pstatement->pitems, mlr_dsl_cst_statement_item_alloc( - pnode->text, - NULL, - rval_evaluator_alloc_from_ast(pnode, type_inferencing), - NULL)); - } - - pstatement->pevaluator = mlr_dsl_cst_node_evaluate_emit; - - } else if (past->type == MD_AST_NODE_TYPE_EMIT2TEMP) { - // Loop over oosvar names to emit in e.g. 'emit @a, @b, @c'. - for (sllve_t* pe = past->pchildren->phead; pe != NULL; pe = pe->pnext) { - mlr_dsl_ast_node_t* pnode = pe->pvvalue; - sllv_append(pstatement->pitems, mlr_dsl_cst_statement_item_alloc( - pnode->text, - NULL, - rval_evaluator_alloc_from_ast(pnode, type_inferencing), - NULL)); - } - - pstatement->pevaluator = mlr_dsl_cst_node_evaluate_emit; - } else if (past->type == MD_AST_NODE_TYPE_DUMP) { sllv_append(pstatement->pitems, mlr_dsl_cst_statement_item_alloc( NULL, @@ -458,6 +475,28 @@ static void mlr_dsl_cst_node_evaluate_emit( sllv_append(poutrecs, prec_to_emit); } +// ---------------------------------------------------------------- +// xxx subsume 1-level oosvar multi-emit items into lhs-key-list evaluators & get rid of items-list entirely? + +static void mlr_dsl_cst_node_evaluate_emit2temp( + 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) +{ + // xxx get oosvar base-level + // xxx early-out if null + // xxx recurse over keylist + // xxx handle too-short, too-long, just-right cases + + // xxx too-short: don't recurse in the first place + +} + // ---------------------------------------------------------------- static void mlr_dsl_cst_node_evaluate_dump( mlr_dsl_cst_statement_t* pnode,