From 2d025eb17cacaa89ac894e22f7722e04620c84da Mon Sep 17 00:00:00 2001 From: John Kerl Date: Thu, 9 Jun 2016 15:51:10 -0700 Subject: [PATCH] print iterate --- c/containers/mlr_dsl_ast.c | 1 + c/containers/mlr_dsl_ast.h | 1 + c/dsls/mlr_dsl_lexer.l | 4 ++++ c/dsls/mlr_dsl_parse.y | 4 ++++ c/mapping/mlr_dsl_cst.c | 27 +++++++++++++++++++++++++++ c/todo.txt | 2 +- 6 files changed, 38 insertions(+), 1 deletion(-) diff --git a/c/containers/mlr_dsl_ast.c b/c/containers/mlr_dsl_ast.c index 985792d25..c9f76c482 100644 --- a/c/containers/mlr_dsl_ast.c +++ b/c/containers/mlr_dsl_ast.c @@ -172,6 +172,7 @@ char* mlr_dsl_ast_node_describe_type(mlr_dsl_ast_node_type_t type) { case MD_AST_NODE_TYPE_EMITP: return "emitp"; break; case MD_AST_NODE_TYPE_EMIT: return "emit"; break; case MD_AST_NODE_TYPE_DUMP: return "dump"; break; + case MD_AST_NODE_TYPE_PRINT: return "print"; break; case MD_AST_NODE_TYPE_ALL: return "all"; break; case MD_AST_NODE_TYPE_ENV: return "env"; break; case MD_AST_NODE_TYPE_WHILE: return "while"; break; diff --git a/c/containers/mlr_dsl_ast.h b/c/containers/mlr_dsl_ast.h index 9a6cfa914..0ad06854e 100644 --- a/c/containers/mlr_dsl_ast.h +++ b/c/containers/mlr_dsl_ast.h @@ -37,6 +37,7 @@ typedef enum _mlr_dsl_ast_node_type_t { MD_AST_NODE_TYPE_EMITP, MD_AST_NODE_TYPE_EMIT, MD_AST_NODE_TYPE_DUMP, + MD_AST_NODE_TYPE_PRINT, MD_AST_NODE_TYPE_ALL, MD_AST_NODE_TYPE_NOP, // only for parser internals; should not be in the AST returned by the parser MD_AST_NODE_TYPE_WHILE, diff --git a/c/dsls/mlr_dsl_lexer.l b/c/dsls/mlr_dsl_lexer.l index 25ac479d9..0707863c6 100644 --- a/c/dsls/mlr_dsl_lexer.l +++ b/c/dsls/mlr_dsl_lexer.l @@ -55,6 +55,10 @@ *yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_DUMP); return MD_TOKEN_DUMP; } +"print" { + *yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_PRINT); + return MD_TOKEN_PRINT; +} "begin" { *yyextra = mlr_dsl_ast_node_alloc(yytext, MD_AST_NODE_TYPE_STRIPPED_AWAY); return MD_TOKEN_BEGIN; diff --git a/c/dsls/mlr_dsl_parse.y b/c/dsls/mlr_dsl_parse.y index 9e93b490c..bd1545202 100644 --- a/c/dsls/mlr_dsl_parse.y +++ b/c/dsls/mlr_dsl_parse.y @@ -136,6 +136,7 @@ md_statement_not_braced_end ::= md_emitf. md_statement_not_braced_end ::= md_emitp. md_statement_not_braced_end ::= md_emit. md_statement_not_braced_end ::= md_dump. +md_statement_not_braced_end ::= md_print. // Valid only within for/while, but we accept them here syntactically and reject them in the AST-to-CST // conversion, where we can produce much more informative error messages: @@ -650,6 +651,9 @@ md_emit_args(A) ::= md_emit_args(B) MD_TOKEN_COMMA md_rhs(C). { md_dump(A) ::= MD_TOKEN_DUMP(O). { A = mlr_dsl_ast_node_alloc_zary(O->text, MD_AST_NODE_TYPE_DUMP); } +md_print(A) ::= MD_TOKEN_PRINT(O) md_rhs(B). { + A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_PRINT, B); +} // ================================================================ // Begin RHS precedence chain diff --git a/c/mapping/mlr_dsl_cst.c b/c/mapping/mlr_dsl_cst.c index db42c1de7..2600a3f6c 100644 --- a/c/mapping/mlr_dsl_cst.c +++ b/c/mapping/mlr_dsl_cst.c @@ -30,6 +30,7 @@ static mlr_dsl_cst_statement_t* alloc_break(mlr_dsl_a static mlr_dsl_cst_statement_t* alloc_continue(mlr_dsl_ast_node_t* pnode, int ti, int cf); static mlr_dsl_cst_statement_t* alloc_filter(mlr_dsl_ast_node_t* pnode, int ti, int cf); static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* pnode, int ti, int cf); +static mlr_dsl_cst_statement_t* alloc_print(mlr_dsl_ast_node_t* pnode, int ti, int cf); static mlr_dsl_cst_statement_t* alloc_bare_boolean(mlr_dsl_ast_node_t* pnode, int ti, int cf); static mlr_dsl_cst_statement_t* alloc_if_item( @@ -69,6 +70,7 @@ static void handle_emitp_all(mlr_dsl_cst_statement_t* s, static void handle_emit(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_dump(mlr_dsl_cst_statement_t* s, variables_t* v, cst_outputs_t* o); +static void handle_print(mlr_dsl_cst_statement_t* s, variables_t* v, cst_outputs_t* o); static void handle_filter(mlr_dsl_cst_statement_t* s, variables_t* v, cst_outputs_t* o); static void handle_conditional_block(mlr_dsl_cst_statement_t* s, variables_t* v, cst_outputs_t* o); static void handle_while(mlr_dsl_cst_statement_t* s, variables_t* v, cst_outputs_t* o); @@ -401,6 +403,9 @@ static mlr_dsl_cst_statement_t* alloc_cst_statement(mlr_dsl_ast_node_t* pnode, i case MD_AST_NODE_TYPE_DUMP: return alloc_dump(pnode, type_inferencing, context_flags); break; + case MD_AST_NODE_TYPE_PRINT: + return alloc_print(pnode, type_inferencing, context_flags); + break; default: return alloc_bare_boolean(pnode, type_inferencing, context_flags); break; @@ -1080,6 +1085,7 @@ static mlr_dsl_cst_statement_t* alloc_filter(mlr_dsl_ast_node_t* pnode, int type return pstatement; } +// ---------------------------------------------------------------- static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* pnode, int type_inferencing, int context_flags) { @@ -1089,6 +1095,18 @@ static mlr_dsl_cst_statement_t* alloc_dump(mlr_dsl_ast_node_t* pnode, int type_i return pstatement; } +// ---------------------------------------------------------------- +static mlr_dsl_cst_statement_t* alloc_print(mlr_dsl_ast_node_t* pnode, int type_inferencing, + int context_flags) +{ + mlr_dsl_cst_statement_t* pstatement = alloc_blank(); + + pstatement->pnode_handler = handle_print; + // xxx + return pstatement; +} + +// ---------------------------------------------------------------- static mlr_dsl_cst_statement_t* alloc_bare_boolean(mlr_dsl_ast_node_t* pnode, int type_inferencing, int context_flags) { @@ -1603,6 +1621,15 @@ static void handle_dump( mlhmmv_print_json_stacked(pvars->poosvars, FALSE); } +// ---------------------------------------------------------------- +static void handle_print( + mlr_dsl_cst_statement_t* pnode, + variables_t* pvars, + cst_outputs_t* pcst_outputs) +{ + printf("STUB\n"); +} + // ---------------------------------------------------------------- static void handle_filter( mlr_dsl_cst_statement_t* pnode, diff --git a/c/todo.txt b/c/todo.txt index e2bf5015a..488999286 100644 --- a/c/todo.txt +++ b/c/todo.txt @@ -11,7 +11,6 @@ TOP OF LIST: ! heterogenize feature? COOKBOOK: -* cookbook example: key<->val inverter * cookbook https://github.com/johnkerl/miller/issues/103 to fix up short csv data lines mlr --from jb.csv --fs comma --nidx put ' @maxnf = max(@maxnf, NF); @@ -21,6 +20,7 @@ COOKBOOK: $[@nf] = "" } ' +* rename example also w/ for-srec? gentoo? http://euscan.gentooexperimental.org/package/sys-apps/miller/