From 74b279ac491cabbd0a0a81feb2db3c5edbc2ff82 Mon Sep 17 00:00:00 2001 From: John Kerl Date: Wed, 27 Jul 2016 09:31:03 -0400 Subject: [PATCH] write/append code-dedupe iterate --- c/containers/mlr_dsl_ast.c | 4 - c/containers/mlr_dsl_ast.h | 4 - c/dsls/mlr_dsl_parse.y | 185 +++++++++++++++++++++++++------------ c/mapping/mlr_dsl_cst.c | 136 +++++---------------------- c/reg_test/expected/out | 46 +++++---- 5 files changed, 176 insertions(+), 199 deletions(-) diff --git a/c/containers/mlr_dsl_ast.c b/c/containers/mlr_dsl_ast.c index 214d3e4cf..daf72e1f7 100644 --- a/c/containers/mlr_dsl_ast.c +++ b/c/containers/mlr_dsl_ast.c @@ -173,11 +173,7 @@ char* mlr_dsl_ast_node_describe_type(mlr_dsl_ast_node_type_t type) { case MD_AST_NODE_TYPE_TEE: return "tee"; break; case MD_AST_NODE_TYPE_EMITF: return "emitf"; break; case MD_AST_NODE_TYPE_EMITP: return "emitp"; break; - case MD_AST_NODE_TYPE_EMITP_WRITE: return "emitp_write"; break; - case MD_AST_NODE_TYPE_EMITP_APPEND: return "emitp_append"; break; case MD_AST_NODE_TYPE_EMIT: return "emit"; break; - case MD_AST_NODE_TYPE_EMIT_WRITE: return "emit_write"; break; - case MD_AST_NODE_TYPE_EMIT_APPEND: return "emit_append"; break; case MD_AST_NODE_TYPE_EMITP_LASHED: return "emitp_lashed"; break; case MD_AST_NODE_TYPE_EMITP_LASHED_WRITE: return "emitp_lashed_write"; break; case MD_AST_NODE_TYPE_EMITP_LASHED_APPEND: return "emitp_lashed_append"; break; diff --git a/c/containers/mlr_dsl_ast.h b/c/containers/mlr_dsl_ast.h index c7e097d93..0ebbba49a 100644 --- a/c/containers/mlr_dsl_ast.h +++ b/c/containers/mlr_dsl_ast.h @@ -38,11 +38,7 @@ typedef enum _mlr_dsl_ast_node_type_t { MD_AST_NODE_TYPE_TEE, MD_AST_NODE_TYPE_EMITF, MD_AST_NODE_TYPE_EMITP, - MD_AST_NODE_TYPE_EMITP_WRITE, - MD_AST_NODE_TYPE_EMITP_APPEND, MD_AST_NODE_TYPE_EMIT, - MD_AST_NODE_TYPE_EMIT_WRITE, - MD_AST_NODE_TYPE_EMIT_APPEND, MD_AST_NODE_TYPE_EMITP_LASHED, MD_AST_NODE_TYPE_EMITP_LASHED_WRITE, MD_AST_NODE_TYPE_EMITP_LASHED_APPEND, diff --git a/c/dsls/mlr_dsl_parse.y b/c/dsls/mlr_dsl_parse.y index daa8ce03d..86ad01428 100644 --- a/c/dsls/mlr_dsl_parse.y +++ b/c/dsls/mlr_dsl_parse.y @@ -635,84 +635,123 @@ md_emitf_append(A) ::= MD_TOKEN_EMITF(O) MD_TOKEN_BITWISE_RSH md_output_file(F) // ---------------------------------------------------------------- md_emitp(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_ALL(B). { - A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMITP, B); -} -md_emitp(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_ALL(B) MD_TOKEN_COMMA md_emitp_namelist(C). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, B, C); + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMITP, B), + mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDOUT)); } md_emitp(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_FULL_OOSVAR(B). { - A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMITP, B); + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMITP, B), + mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDOUT)); +} + +md_emitp(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_ALL(B) MD_TOKEN_COMMA md_emitp_namelist(C). { + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, + mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, B, C), + mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDOUT)); } md_emitp(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_FULL_OOSVAR(B) MD_TOKEN_COMMA md_emitp_namelist(C). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, B, C); + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, + mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, B, C), + mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDOUT)); } + md_emitp(A) ::= MD_TOKEN_EMITP(O) md_oosvar_keylist(B). { - A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMITP, B); + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMITP, B), + mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDOUT)); } md_emitp(A) ::= MD_TOKEN_EMITP(O) md_oosvar_keylist(B) MD_TOKEN_COMMA md_emitp_namelist(C). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, B, C); + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, + mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, B, C), + mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDOUT)); } md_emitp_write(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA MD_TOKEN_ALL(B). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP_WRITE, B, F); + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, B, + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_WRITE, + F)); } md_emitp_write(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA MD_TOKEN_ALL(B) MD_TOKEN_COMMA md_emitp_namelist(C). { - A = mlr_dsl_ast_node_alloc_ternary(O->text, MD_AST_NODE_TYPE_EMITP_WRITE, B, C, F); + A = mlr_dsl_ast_node_alloc_ternary(O->text, MD_AST_NODE_TYPE_EMITP, B, C, + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_WRITE, + F)); } md_emitp_write(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA MD_TOKEN_FULL_OOSVAR(B). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP_WRITE, B, F); + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, B, + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_WRITE, + F)); } md_emitp_write(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA MD_TOKEN_FULL_OOSVAR(B) MD_TOKEN_COMMA md_emitp_namelist(C). { - A = mlr_dsl_ast_node_alloc_ternary(O->text, MD_AST_NODE_TYPE_EMITP_WRITE, B, C, F); + A = mlr_dsl_ast_node_alloc_ternary(O->text, MD_AST_NODE_TYPE_EMITP, B, C, + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_WRITE, + F)); } md_emitp_write(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA md_oosvar_keylist(B). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP_WRITE, B, F); + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, B, + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_WRITE, + F)); } md_emitp_write(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA md_oosvar_keylist(B) MD_TOKEN_COMMA md_emitp_namelist(C). { - A = mlr_dsl_ast_node_alloc_ternary(O->text, MD_AST_NODE_TYPE_EMITP_WRITE, B, C, F); + A = mlr_dsl_ast_node_alloc_ternary(O->text, MD_AST_NODE_TYPE_EMITP, B, C, + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_WRITE, + F)); } + md_emitp_append(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_BITWISE_RHS md_output_file(F) MD_TOKEN_COMMA MD_TOKEN_ALL(B). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP_APPEND, B, F); + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, B, + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_APPEND, + F)); } md_emitp_append(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_BITWISE_RHS md_output_file(F) MD_TOKEN_COMMA MD_TOKEN_ALL(B) MD_TOKEN_COMMA md_emitp_namelist(C). { - A = mlr_dsl_ast_node_alloc_ternary(O->text, MD_AST_NODE_TYPE_EMITP_APPEND, B, C, F); + A = mlr_dsl_ast_node_alloc_ternary(O->text, MD_AST_NODE_TYPE_EMITP, B, C, + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_APPEND, + F)); } md_emitp_append(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_BITWISE_RHS md_output_file(F) MD_TOKEN_COMMA MD_TOKEN_FULL_OOSVAR(B). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP_WRITE, B, F); + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, B, + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_APPEND, + F)); } md_emitp_append(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_BITWISE_RHS md_output_file(F) MD_TOKEN_COMMA MD_TOKEN_FULL_OOSVAR(B) MD_TOKEN_COMMA md_emitp_namelist(C). { - A = mlr_dsl_ast_node_alloc_ternary(O->text, MD_AST_NODE_TYPE_EMITP_WRITE, B, C, F); + A = mlr_dsl_ast_node_alloc_ternary(O->text, MD_AST_NODE_TYPE_EMITP, B, C, + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_APPEND, + F)); } md_emitp_append(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_BITWISE_RHS md_output_file(F) MD_TOKEN_COMMA md_oosvar_keylist(B). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP_APPEND, B, F); + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMITP, B, + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_APPEND, + F)); } md_emitp_append(A) ::= MD_TOKEN_EMITP(O) MD_TOKEN_BITWISE_RHS md_output_file(F) MD_TOKEN_COMMA md_oosvar_keylist(B) MD_TOKEN_COMMA md_emitp_namelist(C). { - A = mlr_dsl_ast_node_alloc_ternary(O->text, MD_AST_NODE_TYPE_EMITP_APPEND, B, C, F); + A = mlr_dsl_ast_node_alloc_ternary(O->text, MD_AST_NODE_TYPE_EMITP, B, C, + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_APPEND, + F)); } md_emitp_namelist(A) ::= md_rhs(B). { @@ -724,112 +763,136 @@ md_emitp_namelist(A) ::= md_emitp_namelist(B) MD_TOKEN_COMMA md_rhs(C). { // ================================================================ md_emit(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_ALL(B). { - A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT, B); + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT, B), + mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDOUT)); } -md_emit(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_ALL(B) MD_TOKEN_COMMA md_emit_namelist(C). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, B, C); +md_emit(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_FULL_OOSVAR(B). { + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT, B), + mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDOUT)); } -md_emit(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_FULL_OOSVAR(B). { - A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT, B); +md_emit(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_ALL(B) MD_TOKEN_COMMA md_emit_namelist(C). { + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, + mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, B, C), + mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDOUT)); } md_emit(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_FULL_OOSVAR(B) MD_TOKEN_COMMA md_emit_namelist(C). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, B, C); + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, + mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, B, C), + mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDOUT)); } md_emit(A) ::= MD_TOKEN_EMIT(O) md_oosvar_keylist(B). { - A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT, B); + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT, B), + mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDOUT)); } md_emit(A) ::= MD_TOKEN_EMIT(O) md_oosvar_keylist(B) MD_TOKEN_COMMA md_emit_namelist(C). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, B, C); + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, + mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, B, C), + mlr_dsl_ast_node_alloc_zary("stdout", MD_AST_NODE_TYPE_STDOUT)); } // ---------------------------------------------------------------- md_emit_write(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA MD_TOKEN_ALL(B). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_WRITE, + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT, B), - F); + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_WRITE, + F)); } md_emit_write(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA MD_TOKEN_ALL(B) MD_TOKEN_COMMA md_emit_namelist(C). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_WRITE, + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, B, C), - F); + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_WRITE, + F)); } md_emit_write(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA MD_TOKEN_FULL_OOSVAR(B). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_WRITE, + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT, B), - F); + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_WRITE, + F)); } md_emit_write(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA MD_TOKEN_FULL_OOSVAR(B) MD_TOKEN_COMMA md_emit_namelist(C). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_WRITE, + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, B, C), - F); + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_WRITE, + F)); } md_emit_write(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA md_oosvar_keylist(B). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_WRITE, + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT, B), - F); + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_WRITE, + F)); } md_emit_write(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA md_oosvar_keylist(B) MD_TOKEN_COMMA md_emit_namelist(C). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_WRITE, + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, B, C), - F); + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_WRITE, + F)); } // ---------------------------------------------------------------- md_emit_append(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_BITWISE_RHS md_output_file(F) MD_TOKEN_COMMA MD_TOKEN_ALL(B). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_APPEND, + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT, B), - F); + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_APPEND, + F)); } md_emit_append(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_BITWISE_RHS md_output_file(F) MD_TOKEN_COMMA MD_TOKEN_ALL(B) MD_TOKEN_COMMA md_emit_namelist(C). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_APPEND, + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, B, C), - F); + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_APPEND, + F)); } md_emit_append(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_BITWISE_RHS md_output_file(F) MD_TOKEN_COMMA MD_TOKEN_FULL_OOSVAR(B). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_APPEND, + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT, B), - F); + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_APPEND, + F)); } md_emit_append(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_BITWISE_RHS md_output_file(F) MD_TOKEN_COMMA MD_TOKEN_FULL_OOSVAR(B) MD_TOKEN_COMMA md_emit_namelist(C). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_APPEND, + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, B, C), - F); + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_APPEND, + F)); } md_emit_append(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_BITWISE_RHS md_output_file(F) MD_TOKEN_COMMA md_oosvar_keylist(B). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_APPEND, + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_EMIT, B), - F); + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_APPEND, + F)); } md_emit_append(A) ::= MD_TOKEN_EMIT(O) MD_TOKEN_BITWISE_RHS md_output_file(F) MD_TOKEN_COMMA md_oosvar_keylist(B) MD_TOKEN_COMMA md_emit_namelist(C). { - A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT_APPEND, + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_EMIT, B, C), - F); + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_APPEND, + F)); } // ---------------------------------------------------------------- @@ -969,11 +1032,13 @@ md_edump(A) ::= MD_TOKEN_EDUMP(O). { } md_dump_write(A) ::= MD_TOKEN_DUMP(O) MD_TOKEN_GT md_rhs(F). { A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_DUMP, - mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_WRITE, F)); + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_WRITE, + F)); } md_dump_append(A) ::= MD_TOKEN_DUMP(O) MD_TOKEN_BITWISE_RSH md_rhs(F). { A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_DUMP, - mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_APPEND, F)); + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_APPEND, + F)); } md_print(A) ::= MD_TOKEN_PRINT(O) md_rhs(B). { @@ -986,11 +1051,13 @@ md_eprint(A) ::= MD_TOKEN_EPRINT(O) md_rhs(B). { } md_print_write(A) ::= MD_TOKEN_PRINT(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA md_rhs(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINT, C, - mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_WRITE, F)); + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_WRITE, + F)); } md_print_append(A) ::= MD_TOKEN_PRINT(O) MD_TOKEN_BITWISE_RSH md_output_file(F) MD_TOKEN_COMMA md_rhs(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINT, C, - mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_APPEND, F)); + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_APPEND, + F)); } md_printn(A) ::= MD_TOKEN_PRINTN(O) md_rhs(B). { @@ -1003,11 +1070,13 @@ md_eprintn(A) ::= MD_TOKEN_EPRINTN(O) md_rhs(B). { } md_printn_write(A) ::= MD_TOKEN_PRINTN(O) MD_TOKEN_GT md_output_file(F) MD_TOKEN_COMMA md_rhs(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINTN, C, - mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_WRITE, F)); + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_WRITE, + F)); } md_printn_append(A) ::= MD_TOKEN_PRINTN(O) MD_TOKEN_BITWISE_RSH md_output_file(F) MD_TOKEN_COMMA md_rhs(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_PRINTN, C, - mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_APPEND, F)); + mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILE_APPEND, + F)); } // ---------------------------------------------------------------- diff --git a/c/mapping/mlr_dsl_cst.c b/c/mapping/mlr_dsl_cst.c index 799b988c3..ff2a1cc04 100644 --- a/c/mapping/mlr_dsl_cst.c +++ b/c/mapping/mlr_dsl_cst.c @@ -35,7 +35,6 @@ static mlr_dsl_cst_statement_t* alloc_unset(mlr_dsl_ast_node_t* p, int t static mlr_dsl_cst_statement_t* alloc_tee(mlr_dsl_ast_node_t* p, int ti, int cf); static mlr_dsl_cst_statement_t* alloc_emitf(mlr_dsl_ast_node_t* p, int ti, int cf); static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* p, int ti, int cf, int dfp); -static mlr_dsl_cst_statement_t* alloc_emit_to_file(mlr_dsl_ast_node_t* p, int ti, int cf, int dfp, file_output_mode_t m); static mlr_dsl_cst_statement_t* alloc_emit_lashed(mlr_dsl_ast_node_t* p, int ti, int cf, int dfp); static mlr_dsl_cst_statement_t* alloc_emit_lashed_to_file(mlr_dsl_ast_node_t* p, int ti, int cf, int dfp, file_output_mode_t m); static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* p, int ti, int cf); @@ -94,7 +93,6 @@ static void handle_emitp_lashed(mlr_dsl_cst_statement_t* s, static void handle_emitp_lashed_to_file(mlr_dsl_cst_statement_t* s, variables_t* v, cst_outputs_t* o); static void handle_emit_lashed(mlr_dsl_cst_statement_t* s, variables_t* v, cst_outputs_t* o); static void handle_emit_lashed_to_file(mlr_dsl_cst_statement_t* s, variables_t* v, cst_outputs_t* o); -static void handle_emitp_all_to_file(mlr_dsl_cst_statement_t* s, variables_t* v, cst_outputs_t* o); static void handle_emit_all(mlr_dsl_cst_statement_t* s, variables_t* v, cst_outputs_t* o); static void handle_emit_all_to_file(mlr_dsl_cst_statement_t* s, variables_t* v, cst_outputs_t* o); static void handle_dump(mlr_dsl_cst_statement_t* s, variables_t* v, cst_outputs_t* o); @@ -430,21 +428,9 @@ static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, i case MD_AST_NODE_TYPE_EMITP: return alloc_emit(pnode, type_inferencing, context_flags, TRUE); break; - case MD_AST_NODE_TYPE_EMITP_WRITE: - return alloc_emit_to_file(pnode, type_inferencing, context_flags, TRUE, MODE_WRITE); - break; - case MD_AST_NODE_TYPE_EMITP_APPEND: - return alloc_emit_to_file(pnode, type_inferencing, context_flags, TRUE, MODE_APPEND); - break; case MD_AST_NODE_TYPE_EMIT: return alloc_emit(pnode, type_inferencing, context_flags, FALSE); break; - case MD_AST_NODE_TYPE_EMIT_WRITE: - return alloc_emit_to_file(pnode, type_inferencing, context_flags, FALSE, MODE_WRITE); - break; - case MD_AST_NODE_TYPE_EMIT_APPEND: - return alloc_emit_to_file(pnode, type_inferencing, context_flags, FALSE, MODE_APPEND); - break; case MD_AST_NODE_TYPE_EMITP_LASHED: return alloc_emit_lashed(pnode, type_inferencing, context_flags, TRUE); @@ -815,77 +801,16 @@ static mlr_dsl_cst_statement_t* alloc_emit(mlr_dsl_ast_node_t* pnode, int type_i { mlr_dsl_cst_statement_t* pstatement = alloc_blank(); - mlr_dsl_ast_node_t* pkeylist_node = pnode->pchildren->phead->pvvalue; - - // The grammar allows only 'emit all', not 'emit @x, all, $y'. - // So if 'all' appears at all, it's the only name. - if (pkeylist_node->type == MD_AST_NODE_TYPE_ALL || pkeylist_node->type == MD_AST_NODE_TYPE_FULL_OOSVAR) { - - sllv_t* pemit_oosvar_namelist_evaluators = sllv_alloc(); - if (pnode->pchildren->length == 2) { - mlr_dsl_ast_node_t* pnamelist_node = pnode->pchildren->phead->pnext->pvvalue; - for (sllve_t* pe = pnamelist_node->pchildren->phead; pe != NULL; pe = pe->pnext) { - mlr_dsl_ast_node_t* pkeynode = pe->pvvalue; - sllv_append(pemit_oosvar_namelist_evaluators, - rval_evaluator_alloc_from_ast(pkeynode, type_inferencing, context_flags)); - } - } - pstatement->pemit_oosvar_namelist_evaluators = pemit_oosvar_namelist_evaluators; - - pstatement->do_full_prefixing = do_full_prefixing; - pstatement->pnode_handler = handle_emit_all; - - } else if (pkeylist_node->type == MD_AST_NODE_TYPE_OOSVAR_KEYLIST) { - - pstatement->pemit_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pkeylist_node, - type_inferencing, context_flags); - - sllv_t* pemit_oosvar_namelist_evaluators = sllv_alloc(); - if (pnode->pchildren->length == 2) { - mlr_dsl_ast_node_t* pnamelist_node = pnode->pchildren->phead->pnext->pvvalue; - for (sllve_t* pe = pnamelist_node->pchildren->phead; pe != NULL; pe = pe->pnext) { - mlr_dsl_ast_node_t* pkeynode = pe->pvvalue; - sllv_append(pemit_oosvar_namelist_evaluators, - rval_evaluator_alloc_from_ast(pkeynode, type_inferencing, context_flags)); - } - } - pstatement->pemit_oosvar_namelist_evaluators = pemit_oosvar_namelist_evaluators; - - pstatement->do_full_prefixing = do_full_prefixing; - pstatement->pnode_handler = handle_emit; - - } else { - fprintf(stderr, "%s: internal coding error detected in file %s at line %d.\n", - MLR_GLOBALS.bargv0, __FILE__, __LINE__); - exit(1); - } - return pstatement; -} - -// ================================================================ -// mlr --from ../data/small put -v -q emit > "out", @a, "x", "y" -// * text="emit", type=emit_write: -// text="emit", type=emit: -// text="oosvar_keylist", type=oosvar_keylist: -// text="a", type=string_literal. -// text="emit_namelist", type=emit: -// text="x", type=strnum_literal. -// text="y", type=strnum_literal. -// text="out", type=strnum_literal. - -static mlr_dsl_cst_statement_t* alloc_emit_to_file(mlr_dsl_ast_node_t* pnode, int type_inferencing, - int context_flags, int do_full_prefixing, file_output_mode_t file_output_mode) -{ - mlr_dsl_cst_statement_t* pstatement = alloc_blank(); - mlr_dsl_ast_node_t* pemit_node = pnode->pchildren->phead->pvvalue; - mlr_dsl_ast_node_t* pfilename_node = pnode->pchildren->phead->pnext->pvvalue; + mlr_dsl_ast_node_t* poutput_node = pnode->pchildren->phead->pnext->pvvalue; mlr_dsl_ast_node_t* pkeylist_node = pemit_node->pchildren->phead->pvvalue; + int output_all = FALSE; // The grammar allows only 'emit all', not 'emit @x, all, $y'. // So if 'all' appears at all, it's the only name. if (pkeylist_node->type == MD_AST_NODE_TYPE_ALL || pkeylist_node->type == MD_AST_NODE_TYPE_FULL_OOSVAR) { + output_all = TRUE; sllv_t* pemit_oosvar_namelist_evaluators = sllv_alloc(); if (pemit_node->pchildren->length == 2) { @@ -898,10 +823,6 @@ static mlr_dsl_cst_statement_t* alloc_emit_to_file(mlr_dsl_ast_node_t* pnode, in } pstatement->pemit_oosvar_namelist_evaluators = pemit_oosvar_namelist_evaluators; - pstatement->pnode_handler = do_full_prefixing - ? handle_emit_all_to_file - : handle_emitp_all_to_file; - } else if (pkeylist_node->type == MD_AST_NODE_TYPE_OOSVAR_KEYLIST) { pstatement->pemit_keylist_evaluators = allocate_keylist_evaluators_from_oosvar_node(pkeylist_node, @@ -927,10 +848,23 @@ static mlr_dsl_cst_statement_t* alloc_emit_to_file(mlr_dsl_ast_node_t* pnode, in exit(1); } - pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node, - type_inferencing, context_flags); - pstatement->file_output_mode = file_output_mode; - pstatement->pmulti_lrec_writer = multi_lrec_writer_alloc(); + pstatement->do_full_prefixing = do_full_prefixing; + if (poutput_node->type == MD_AST_NODE_TYPE_STDOUT) { + pstatement->pnode_handler = output_all ? handle_emit_all : handle_emit; + pstatement->stdfp = stdout; + } else if (poutput_node->type == MD_AST_NODE_TYPE_STDERR) { + pstatement->pnode_handler = output_all ? handle_emit_all : handle_emit; + pstatement->stdfp = stderr; + } else { + // xxx replicate x all & rid of {VARIOUS}_WRITE/APPEND node types + mlr_dsl_ast_node_t* pfilename_node = poutput_node->pchildren->phead->pvvalue; + pstatement->poutput_filename_evaluator = rval_evaluator_alloc_from_ast(pfilename_node, + type_inferencing, context_flags); + pstatement->file_output_mode = poutput_node->type == MD_AST_NODE_TYPE_FILE_APPEND + ? MODE_APPEND : MODE_WRITE; + pstatement->pmulti_lrec_writer = multi_lrec_writer_alloc(); + pstatement->pnode_handler = output_all ? handle_emit_all_to_file : handle_emit_to_file; + } return pstatement; } @@ -2169,34 +2103,6 @@ static void handle_emit_lashed_to_file( free(ppmvkeys); } -// ---------------------------------------------------------------- -static void handle_emitp_all_to_file( - mlr_dsl_cst_statement_t* pnode, - variables_t* pvars, - cst_outputs_t* pcst_outputs) -{ - sllv_t* poutrecs = sllv_alloc(); - rval_evaluator_t* poutput_filename_evaluator = pnode->poutput_filename_evaluator; - mv_t filename_mv = poutput_filename_evaluator->pprocess_func(poutput_filename_evaluator->pvstate, pvars); - int all_non_null_or_error = TRUE; - sllmv_t* pmvnames = evaluate_list(pnode->pemit_oosvar_namelist_evaluators, pvars, &all_non_null_or_error); - if (all_non_null_or_error) { - mlhmmv_all_to_lrecs(pvars->poosvars, pmvnames, poutrecs, - FALSE, pcst_outputs->oosvar_flatten_separator); - } - - char fn_free_flags = 0; - char* filename = mv_format_val(&filename_mv, &fn_free_flags); - multi_lrec_writer_output_list(pnode->pmulti_lrec_writer, poutrecs, filename, - MODE_WRITE, pcst_outputs->flush_every_record); - sllv_free(poutrecs); - - if (fn_free_flags) - free(filename); - mv_free(&filename_mv); - sllmv_free(pmvnames); -} - // ---------------------------------------------------------------- static void handle_emit_all( mlr_dsl_cst_statement_t* pnode, @@ -2224,7 +2130,7 @@ static void handle_emit_all_to_file( sllmv_t* pmvnames = evaluate_list(pnode->pemit_oosvar_namelist_evaluators, pvars, &all_non_null_or_error); if (all_non_null_or_error) { mlhmmv_all_to_lrecs(pvars->poosvars, pmvnames, poutrecs, - TRUE, pcst_outputs->oosvar_flatten_separator); + pnode->do_full_prefixing, pcst_outputs->oosvar_flatten_separator); } char fn_free_flags = 0; diff --git a/c/reg_test/expected/out b/c/reg_test/expected/out index b32ead591..3e7d1382e 100644 --- a/c/reg_test/expected/out +++ b/c/reg_test/expected/out @@ -17476,17 +17476,17 @@ text="list", type=statement_list: text="x", type=field_name. text="end", type=end: text="list", type=statement_list: - text="emitf", type=emitf_write: + text="emitf", type=emitf: text="emitf", type=emitf: text="oosvar_keylist", type=oosvar_keylist: text="a", type=string_literal. text="stdout", type=stdout: - text="emitf", type=emitf_write: + text="emitf", type=emitf: text="emitf", type=emitf: text="oosvar_keylist", type=oosvar_keylist: text="b", type=string_literal. text="stdout", type=stdout: - text="emitf", type=emitf_write: + text="emitf", type=emitf: text="emitf", type=emitf: text="oosvar_keylist", type=oosvar_keylist: text="c", type=string_literal. @@ -17522,7 +17522,7 @@ text="list", type=statement_list: text="x", type=field_name. text="end", type=end: text="list", type=statement_list: - text="emitf", type=emitf_write: + text="emitf", type=emitf: text="emitf", type=emitf: text="oosvar_keylist", type=oosvar_keylist: text="a", type=string_literal. @@ -17580,7 +17580,7 @@ text="list", type=statement_list: text="sum", type=string_literal. text="oosvar_keylist", type=oosvar_keylist: text="count", type=string_literal. - text="emitf", type=emitf_write: + text="emitf", type=emitf: text="emitf", type=emitf: text="oosvar_keylist", type=oosvar_keylist: text="mean", type=string_literal. @@ -17613,7 +17613,7 @@ text="list", type=statement_list: text="sum", type=string_literal. text="oosvar_keylist", type=oosvar_keylist: text="count", type=string_literal. - text="emitf", type=emitf_write: + text="emitf", type=emitf: text="emitf", type=emitf: text="oosvar_keylist", type=oosvar_keylist: text="mean", type=string_literal. @@ -18361,7 +18361,7 @@ text="list", type=statement_list: text="u", type=strnum_literal. text="5", type=field_name. text="2", type=strnum_literal. - text="emitf", type=emitf_write: + text="emitf", type=emitf: text="emitf", type=emitf: text="oosvar_keylist", type=oosvar_keylist: text="v", type=string_literal. @@ -19259,7 +19259,9 @@ text="list", type=statement_list: text="t", type=strnum_literal. text="u", type=strnum_literal. text="emitp", type=emitp: - text="all", type=all. + text="emitp", type=emitp: + text="all", type=all. + text="stdout", type=stdout: t:u=1 a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533,tu=1 t:u=2 @@ -19295,7 +19297,9 @@ text="list", type=statement_list: text="t", type=strnum_literal. text="u", type=strnum_literal. text="emitp", type=emitp: - text="@*", type=full_oosvar. + text="emitp", type=emitp: + text="@*", type=full_oosvar. + text="stdout", type=stdout: t:u=1 a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533,tu=1 t:u=2 @@ -19325,7 +19329,9 @@ text="list", type=statement_list: text="s", type=strnum_literal. text="x", type=field_name. text="emitp", type=emitp: - text="all", type=all. + text="emitp", type=emitp: + text="all", type=all. + text="stdout", type=stdout: s=0.346790 a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 s=0.758680 @@ -19356,7 +19362,9 @@ text="list", type=statement_list: text="u", type=strnum_literal. text="y", type=field_name. text="emitp", type=emitp: - text="all", type=all. + text="emitp", type=emitp: + text="all", type=all. + text="stdout", type=stdout: t:u=0.726803 a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533 t:u=0.522151 @@ -19734,13 +19742,15 @@ text="list", type=statement_list: text="end", type=end: text="list", type=statement_list: text="emit", type=emit: - text="oosvar_keylist", type=oosvar_keylist: - text="n", type=string_literal. - text="emit_namelist", type=emit: - text="a", type=strnum_literal. - text="b", type=strnum_literal. - text="c", type=strnum_literal. - text="d", type=strnum_literal. + text="emit", type=emit: + text="oosvar_keylist", type=oosvar_keylist: + text="n", type=string_literal. + text="emit_namelist", type=emit: + text="a", type=strnum_literal. + text="b", type=strnum_literal. + text="c", type=strnum_literal. + text="d", type=strnum_literal. + text="stdout", type=stdout: mlr --opprint --from ./reg_test/input/abixy put -q @o[1][1]["text1"][NR] = $a;