mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-24 00:18:39 +00:00
parameterized-emit iterate
This commit is contained in:
parent
993eb81501
commit
051f01d64f
2 changed files with 86 additions and 41 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue