From 3137cb9c70d85b350d0591c70bc12ca80225c709 Mon Sep 17 00:00:00 2001 From: John Kerl Date: Wed, 2 Mar 2016 23:54:37 -0500 Subject: [PATCH] $$0 iterate --- c/containers/mlr_dsl_ast.c | 3 +++ c/containers/mlr_dsl_ast.h | 3 +++ c/dsls/mlr_dsl_lexer.l | 5 +++++ c/dsls/mlr_dsl_parse.y | 25 +++++++++++++++++++++++++ c/todo.txt | 3 ++- 5 files changed, 38 insertions(+), 1 deletion(-) diff --git a/c/containers/mlr_dsl_ast.c b/c/containers/mlr_dsl_ast.c index 8eef1415e..aefd257d8 100644 --- a/c/containers/mlr_dsl_ast.c +++ b/c/containers/mlr_dsl_ast.c @@ -151,12 +151,15 @@ char* mlr_dsl_ast_node_describe_type(mlr_dsl_ast_node_type_t type) { case MD_AST_NODE_TYPE_BOOLEAN_LITERAL: return "boolean_literal"; break; case MD_AST_NODE_TYPE_REGEXI: return "regexi"; break; case MD_AST_NODE_TYPE_FIELD_NAME: return "field_name"; break; + case MD_AST_NODE_TYPE_FULL_SREC: return "full_srec"; break; case MD_AST_NODE_TYPE_OOSVAR_NAME: return "oosvar_name"; break; case MD_AST_NODE_TYPE_OOSVAR_LEVEL_KEY: return "oosvar_level_key"; break; case MD_AST_NODE_TYPE_FUNCTION_NAME: return "function_name"; break; case MD_AST_NODE_TYPE_OPERATOR: return "operator"; break; case MD_AST_NODE_TYPE_SREC_ASSIGNMENT: return "srec_assignment"; break; case MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT: return "oosvar_assignment"; break; + case MD_AST_NODE_TYPE_OOSVAR_FROM_FULL_SREC_ASSIGNMENT: return "oosvar_from_full_srec_assignment"; break; + case MD_AST_NODE_TYPE_FULL_SREC_FROM_OOSVAR_ASSIGNMENT: return "full_srec_from_oosvar_assignment"; break; case MD_AST_NODE_TYPE_CONTEXT_VARIABLE: return "context_variable"; break; case MD_AST_NODE_TYPE_STRIPPED_AWAY: return "stripped_away"; break; case MD_AST_NODE_TYPE_CONDITIONAL_BLOCK: return "conditional_block"; break; diff --git a/c/containers/mlr_dsl_ast.h b/c/containers/mlr_dsl_ast.h index 24bde6006..72ac87ae5 100644 --- a/c/containers/mlr_dsl_ast.h +++ b/c/containers/mlr_dsl_ast.h @@ -12,12 +12,15 @@ typedef enum _mlr_dsl_ast_node_type_t { MD_AST_NODE_TYPE_BOOLEAN_LITERAL, MD_AST_NODE_TYPE_REGEXI, MD_AST_NODE_TYPE_FIELD_NAME, + MD_AST_NODE_TYPE_FULL_SREC, MD_AST_NODE_TYPE_OOSVAR_NAME, MD_AST_NODE_TYPE_OOSVAR_LEVEL_KEY, MD_AST_NODE_TYPE_FUNCTION_NAME, MD_AST_NODE_TYPE_OPERATOR, MD_AST_NODE_TYPE_SREC_ASSIGNMENT, MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, + MD_AST_NODE_TYPE_OOSVAR_FROM_FULL_SREC_ASSIGNMENT, + MD_AST_NODE_TYPE_FULL_SREC_FROM_OOSVAR_ASSIGNMENT, MD_AST_NODE_TYPE_CONTEXT_VARIABLE, MD_AST_NODE_TYPE_ENV, MD_AST_NODE_TYPE_STRIPPED_AWAY, diff --git a/c/dsls/mlr_dsl_lexer.l b/c/dsls/mlr_dsl_lexer.l index e04ee7c17..3fd614e68 100644 --- a/c/dsls/mlr_dsl_lexer.l +++ b/c/dsls/mlr_dsl_lexer.l @@ -252,6 +252,11 @@ return MD_TOKEN_POW_EQUALS; } +\$\$0 { + *yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_FULL_SREC); + return MD_TOKEN_FULL_SREC; +} + \$[a-zA-Z_0-9]+ { // Note: the parser depends on the dollar sign being here. If this is changed, // that needs to be changed as well. diff --git a/c/dsls/mlr_dsl_parse.y b/c/dsls/mlr_dsl_parse.y index a55b76a11..4f13529a1 100644 --- a/c/dsls/mlr_dsl_parse.y +++ b/c/dsls/mlr_dsl_parse.y @@ -47,6 +47,8 @@ md_statement ::= . md_statement ::= md_main_srec_assignment. md_statement ::= md_main_oosvar_assignment. +md_statement ::= md_main_oosvar_from_full_srec_assignment. +md_statement ::= md_main_full_srec_from_oosvar_assignment. md_statement ::= md_main_bare_boolean. md_statement ::= md_main_filter. md_statement ::= md_main_unset. @@ -133,6 +135,15 @@ md_main_oosvar_assignment(A) ::= md_oosvar_assignment(B). { A = B; sllv_append(past->pmain_statements, A); } +md_main_oosvar_from_full_srec_assignment(A) ::= md_oosvar_from_full_srec_assignment(B). { + A = B; + sllv_append(past->pmain_statements, A); +} +md_main_full_srec_from_oosvar_assignment(A) ::= md_full_srec_from_oosvar_assignment(B). { + A = B; + sllv_append(past->pmain_statements, A); +} + md_main_bare_boolean(A) ::= md_rhs(B). { A = B; sllv_append(past->pmain_statements, A); @@ -250,6 +261,20 @@ 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); } +md_oosvar_from_full_srec_assignment(A) ::= md_oosvar_name(B) MD_TOKEN_ASSIGN(O) MD_TOKEN_FULL_SREC(C). { + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OOSVAR_FROM_FULL_SREC_ASSIGNMENT, B, C); +} +md_oosvar_from_full_srec_assignment(A) ::= md_keyed_oosvar_name(B) MD_TOKEN_ASSIGN(O) MD_TOKEN_FULL_SREC(C). { + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_FULL_SREC_FROM_OOSVAR_ASSIGNMENT, B, C); +} + +md_full_srec_from_oosvar_assignment(A) ::= MD_TOKEN_FULL_SREC(B) MD_TOKEN_ASSIGN(O) md_oosvar_name(C). { + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OOSVAR_FROM_FULL_SREC_ASSIGNMENT, B, C); +} +md_full_srec_from_oosvar_assignment(A) ::= MD_TOKEN_FULL_SREC(B) MD_TOKEN_ASSIGN(O) md_keyed_oosvar_name(C). { + A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_FULL_SREC_FROM_OOSVAR_ASSIGNMENT, B, C); +} + // ---------------------------------------------------------------- md_srec_assignment(A) ::= md_field_name(B) MD_TOKEN_LOGICAL_OR_EQUALS md_rhs(C). { A = mlr_dsl_ast_node_alloc_binary("=", MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B, diff --git a/c/todo.txt b/c/todo.txt index 67a039767..c70e5d173 100644 --- a/c/todo.txt +++ b/c/todo.txt @@ -8,7 +8,6 @@ TOP-OF-LIST SUMMARY * rh/fedora/centos mlr-3.4.0 -! sllmv_add w/ free-flags * neaten/xxxes/valgrind/UT/doc for unset/tri-split-null/+=etal/parameterized emit * double-check oosvar+emit+tri-split-null by re-implementing as many mappers as possible using ossvars + emit @@ -66,6 +65,8 @@ PARAMETERIZED EMIT AND UNSET * rename emit restkeys to pullforwardkeys or some such +* cli-parameterize the joinchar (:) + ================================================================ TRI-SPLIT NULL, AND += ET AL.