write/append code-dedupe iterate

This commit is contained in:
John Kerl 2016-07-27 09:31:03 -04:00
parent 054c9f1fc6
commit 74b279ac49
5 changed files with 176 additions and 199 deletions

View file

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

View file

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

View file

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

View file

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

View file

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