parameterized-emit iterate

This commit is contained in:
John Kerl 2016-02-22 08:56:13 -05:00
parent 993eb81501
commit 051f01d64f
2 changed files with 86 additions and 41 deletions

View file

@ -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);
}

View file

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