diff --git a/c/dsls/filter_dsl_parse.y b/c/dsls/filter_dsl_parse.y index e85ef1860..c119f2d55 100644 --- a/c/dsls/filter_dsl_parse.y +++ b/c/dsls/filter_dsl_parse.y @@ -48,118 +48,93 @@ filter_dsl_body(A) ::= filter_dsl_bool_expr(B) FILTER_DSL_EOL. { // For scan-fr } filter_dsl_bool_expr(A) ::= filter_dsl_or_term(B). { - //printf("[FDSL-PARSE] BEXPR-IS-OR-TERM %s\n", B->text); A = B; } -filter_dsl_bool_expr(A) ::= filter_dsl_or_term(B) FILTER_DSL_OR(O) filter_dsl_bool_expr(C). { - //printf("[FDSL-PARSE] OR %s %s %s\n", B->text, O->text, C->text); +filter_dsl_bool_expr(A) ::= filter_dsl_bool_expr(B) FILTER_DSL_OR(O) filter_dsl_or_term(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); } // ---------------------------------------------------------------- filter_dsl_or_term(A) ::= filter_dsl_and_term(B). { - //printf("[FDSL-PARSE] OR-TERM-IS-AND-TERM %s\n", B->text); A = B; } -filter_dsl_or_term(A) ::= filter_dsl_and_term(B) FILTER_DSL_AND(O) filter_dsl_or_term(C). { +filter_dsl_or_term(A) ::= filter_dsl_or_term(B) FILTER_DSL_AND(O) filter_dsl_and_term(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); - //printf("[FDSL-PARSE] AND %s %s %s\n", B->text, O->text, C->text); } // ---------------------------------------------------------------- filter_dsl_and_term(A) ::= filter_dsl_eqne_term(B). { - //printf("[FDSL-PARSE] AND-TERM-IS-EQNE-TERM %s\n", B->text); A = B; } filter_dsl_and_term(A) ::= filter_dsl_eqne_term(B) FILTER_DSL_EQ(O) filter_dsl_eqne_term(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); - //printf("[FDSL-PARSE] EQ %s %s %s\n", B->text, O->text, C->text); } filter_dsl_and_term(A) ::= filter_dsl_eqne_term(B) FILTER_DSL_NE(O) filter_dsl_eqne_term(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); - //printf("[FDSL-PARSE] NE %s %s %s\n", B->text, O->text, C->text); } // ---------------------------------------------------------------- filter_dsl_eqne_term(A) ::= filter_dsl_cmp_term(B). { - //printf("[FDSL-PARSE] EQNE-TERM-IS-CMP-TERM %s\n", B->text); A = B; } filter_dsl_eqne_term(A) ::= filter_dsl_cmp_term(B) FILTER_DSL_GT(O) filter_dsl_cmp_term(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); - //printf("[FDSL-PARSE] GT %s %s %s\n", B->text, O->text, C->text); } filter_dsl_eqne_term(A) ::= filter_dsl_cmp_term(B) FILTER_DSL_GE(O) filter_dsl_cmp_term(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); - //printf("[FDSL-PARSE] GE %s %s %s\n", B->text, O->text, C->text); } filter_dsl_eqne_term(A) ::= filter_dsl_cmp_term(B) FILTER_DSL_LT(O) filter_dsl_cmp_term(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); - //printf("[FDSL-PARSE] LT %s %s %s\n", B->text, O->text, C->text); } filter_dsl_eqne_term(A) ::= filter_dsl_cmp_term(B) FILTER_DSL_LE(O) filter_dsl_cmp_term(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); - //printf("[FDSL-PARSE] LE %s %s %s\n", B->text, O->text, C->text); } // ---------------------------------------------------------------- filter_dsl_cmp_term(A) ::= filter_dsl_pmdot_term(B). { - //printf("[FDSL-PARSE] CMP-TERM-IS-PMDOT-TERM %s\n", B->text); A = B; } -filter_dsl_cmp_term(A) ::= filter_dsl_pmdot_term(B) FILTER_DSL_PLUS(O) filter_dsl_cmp_term(C). { +filter_dsl_cmp_term(A) ::= filter_dsl_cmp_term(B) FILTER_DSL_PLUS(O) filter_dsl_pmdot_term(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); - //printf("[FDSL-PARSE] PMDOT %s %s %s\n", B->text, O->text, C->text); } -filter_dsl_cmp_term(A) ::= filter_dsl_pmdot_term(B) FILTER_DSL_MINUS(O) filter_dsl_cmp_term(C). { +filter_dsl_cmp_term(A) ::= filter_dsl_cmp_term(B) FILTER_DSL_MINUS(O) filter_dsl_pmdot_term(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); - //printf("[FDSL-PARSE] PMDOT %s %s %s\n", B->text, O->text, C->text); } -filter_dsl_cmp_term(A) ::= filter_dsl_pmdot_term(B) FILTER_DSL_DOT(O) filter_dsl_cmp_term(C). { +filter_dsl_cmp_term(A) ::= filter_dsl_cmp_term(B) FILTER_DSL_DOT(O) filter_dsl_pmdot_term(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); - //printf("[FDSL-PARSE] PMDOT %s %s %s\n", B->text, O->text, C->text); } // ---------------------------------------------------------------- filter_dsl_pmdot_term(A) ::= filter_dsl_muldiv_term(B). { - //printf("[FDSL-PARSE] PMDOT-TERM-IS-MULDIV-TERM %s\n", B->text); A = B; } -filter_dsl_pmdot_term(A) ::= filter_dsl_muldiv_term(B) FILTER_DSL_TIMES(O) filter_dsl_pmdot_term(C). { +filter_dsl_pmdot_term(A) ::= filter_dsl_pmdot_term(B) FILTER_DSL_TIMES(O) filter_dsl_muldiv_term(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); - //printf("[FDSL-PARSE] MULDIV %s %s %s\n", B->text, O->text, C->text); } -filter_dsl_pmdot_term(A) ::= filter_dsl_muldiv_term(B) FILTER_DSL_DIVIDE(O) filter_dsl_pmdot_term(C). { +filter_dsl_pmdot_term(A) ::= filter_dsl_pmdot_term(B) FILTER_DSL_DIVIDE(O) filter_dsl_muldiv_term(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); - //printf("[FDSL-PARSE] MULDIV %s %s %s\n", B->text, O->text, C->text); } // ---------------------------------------------------------------- filter_dsl_muldiv_term(A) ::= filter_dsl_unary_term(B). { - //printf("[FDSL-PARSE] MULDIV-IS-UNARY-TERM %s\n", B->text); A = B; } filter_dsl_muldiv_term(A) ::= FILTER_DSL_PLUS(O) filter_dsl_muldiv_term(C). { A = mlr_dsl_ast_node_alloc_unary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, C); - //printf("[FDSL-PARSE] UNARY %s %s\n", O->text, C->text); } filter_dsl_muldiv_term(A) ::= FILTER_DSL_MINUS(O) filter_dsl_muldiv_term(C). { A = mlr_dsl_ast_node_alloc_unary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, C); - //printf("[FDSL-PARSE] UNARY %s %s\n", O->text, C->text); } filter_dsl_muldiv_term(A) ::= FILTER_DSL_NOT(O) filter_dsl_muldiv_term(C). { A = mlr_dsl_ast_node_alloc_unary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, C); - //printf("[FDSL-PARSE] UNARY %s %s\n", O->text, C->text); } // ---------------------------------------------------------------- filter_dsl_unary_term(A) ::= filter_dsl_exp_term(B). { - //printf("[FDSL-PARSE] UNARY-IS-EXP %s\n", B->text); A = B; } filter_dsl_unary_term(A) ::= filter_dsl_unary_term(B) FILTER_DSL_POW(O) filter_dsl_exp_term(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); - //printf("[FDSL-PARSE] POW %s %s %s\n", B->text, O->text, C->text); } // ---------------------------------------------------------------- @@ -171,11 +146,9 @@ filter_dsl_exp_term(A) ::= FILTER_DSL_FIELD_NAME(B). { char* dollar_name = B->text; char* no_dollar_name = &dollar_name[1]; A = mlr_dsl_ast_node_alloc(no_dollar_name, B->type); - //printf("[FDSL-PARSE] EXP-TERM-IS-FIELD-NAME %s\n", B->text); } filter_dsl_exp_term(A) ::= FILTER_DSL_NUMBER(B). { A = B; - //printf("[FDSL-PARSE] EXP-TERM-IS-NUMBER %s\n", B->text); } // xxx commment me more filter_dsl_exp_term(A) ::= FILTER_DSL_STRING(B). { @@ -185,15 +158,12 @@ filter_dsl_exp_term(A) ::= FILTER_DSL_STRING(B). { int len = strlen(input); stripped[len-2] = 0; A = mlr_dsl_ast_node_alloc(stripped, B->type); - //printf("[FDSL-PARSE] EXP-TERM-IS-STRING %s\n", B->text); } filter_dsl_exp_term(A) ::= FILTER_DSL_CONTEXT_VARIABLE(B). { A = B; - //printf("[FDSL-PARSE] EXP-TERM-IS-CTX-VAR %s\n", B->text); } filter_dsl_exp_term(A) ::= FILTER_DSL_LPAREN filter_dsl_bool_expr(B) FILTER_DSL_RPAREN. { A = B; - //printf("[FDSL-PARSE] EXP-TERM-PARENS (%s)\n", B->text); } // Given "f(a,b,c)": since this is a bottom-up parser, we get first the "a", @@ -204,26 +174,16 @@ filter_dsl_exp_term(A) ::= FILTER_DSL_LPAREN filter_dsl_bool_expr(B) FILTER_DSL_ // * On the "f" we change the function name to get "f(a,b,c)". filter_dsl_exp_term(A) ::= FILTER_DSL_FCN_NAME(O) FILTER_DSL_LPAREN filter_dsl_fcn_args(B) FILTER_DSL_RPAREN. { - //printf("[FDSL-PARSE] EXPITEM-IS-FCN %s(%04x)\n", O->text, B->type); - //printf("[FDSL-PARSE] EXPITEM-IS-FCN %s(%s)\n", O->text, B->text); A = mlr_dsl_ast_node_set_function_name(B, O->text); - //mlr_dsl_ast_node_print(A); } // xxx need to invalidate "f(10,)" -- use some non-empty-args expr. filter_dsl_fcn_args(A) ::= . { - //printf("[FDSL-PARSE] FCNARGS empty\n"); A = mlr_dsl_ast_node_alloc_zary("anon", MLR_DSL_AST_NODE_TYPE_FUNCTION_NAME); - //mlr_dsl_ast_node_print(A); } filter_dsl_fcn_args(A) ::= filter_dsl_bool_expr(B). { - //printf("[FDSL-PARSE] FCNARG %04x\n", B->type); A = mlr_dsl_ast_node_alloc_unary("anon", MLR_DSL_AST_NODE_TYPE_FUNCTION_NAME, B); - //mlr_dsl_ast_node_print(A); } filter_dsl_fcn_args(A) ::= filter_dsl_fcn_args(B) FILTER_DSL_COMMA filter_dsl_bool_expr(C). { - //printf("[FDSL-PARSE] FCNARGS %04x, %04x\n", B->type, C->type); - //printf("[FDSL-PARSE] FCNARGS %s, %s\n", B->text, C->text); A = mlr_dsl_ast_node_append_arg(B, C); - //mlr_dsl_ast_node_print(A); } diff --git a/c/dsls/put_dsl_parse.y b/c/dsls/put_dsl_parse.y index bd6ae07da..c357f64fa 100644 --- a/c/dsls/put_dsl_parse.y +++ b/c/dsls/put_dsl_parse.y @@ -62,16 +62,13 @@ put_dsl_assignment(A) ::= PUT_DSL_FIELD_NAME(B) PUT_DSL_ASSIGN(O) put_dsl_expr( put_dsl_expr(A) ::= put_dsl_term(B). { A = B; } -put_dsl_expr(A) ::= put_dsl_term(B) PUT_DSL_PLUS(O) put_dsl_expr(C). { +put_dsl_expr(A) ::= put_dsl_expr(B) PUT_DSL_PLUS(O) put_dsl_term(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); } -put_dsl_expr(A) ::= put_dsl_term(B) PUT_DSL_MINUS(O) put_dsl_expr(C). { +put_dsl_expr(A) ::= put_dsl_expr(B) PUT_DSL_MINUS(O) put_dsl_term(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); } -put_dsl_expr(A) ::= PUT_DSL_MINUS(O) put_dsl_expr(B). { - A = mlr_dsl_ast_node_alloc_unary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B); -} -put_dsl_expr(A) ::= put_dsl_term(B) PUT_DSL_DOT(O) put_dsl_expr(C). { +put_dsl_expr(A) ::= put_dsl_expr(B) PUT_DSL_DOT(O) put_dsl_term(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); } @@ -79,10 +76,10 @@ put_dsl_expr(A) ::= put_dsl_term(B) PUT_DSL_DOT(O) put_dsl_expr(C). { put_dsl_term(A) ::= put_dsl_factor(B). { A = B; } -put_dsl_term(A) ::= put_dsl_factor(B) PUT_DSL_TIMES(O) put_dsl_term(C). { +put_dsl_term(A) ::= put_dsl_term(B) PUT_DSL_TIMES(O) put_dsl_factor(C). { A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); } -put_dsl_term(A) ::= put_dsl_factor(B) PUT_DSL_DIVIDE(O) put_dsl_term(C).{ +put_dsl_term(A) ::= put_dsl_term(B) PUT_DSL_DIVIDE(O) put_dsl_factor(C).{ A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); } @@ -123,6 +120,9 @@ put_dsl_expitem(A) ::= PUT_DSL_CONTEXT_VARIABLE(B). { put_dsl_expitem(A) ::= PUT_DSL_LPAREN put_dsl_expr(B) PUT_DSL_RPAREN. { A = B; } +put_dsl_expitem(A) ::= PUT_DSL_MINUS(O) put_dsl_expitem(B). { + A = mlr_dsl_ast_node_alloc_unary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B); +} // Given "f(a,b,c)": since this is a bottom-up parser, we get first the "a", // then "a,b", then "a,b,c", then finally "f(a,b,c)". So: diff --git a/c/mapping/lrec_evaluators.c b/c/mapping/lrec_evaluators.c index 25e7707ff..af0e9ccd7 100644 --- a/c/mapping/lrec_evaluators.c +++ b/c/mapping/lrec_evaluators.c @@ -401,19 +401,20 @@ lrec_evaluator_t* lrec_evaluator_alloc_from_zary_func_name(char* function_name) // xxx make a lookup table lrec_evaluator_t* lrec_evaluator_alloc_from_unary_func_name(char* function_name, lrec_evaluator_t* parg1) { if (streq(function_name, "not")) { return lrec_evaluator_alloc_from_b_b_func(b_b_not_func, parg1); - } else if (streq(function_name, "tolower")) { return lrec_evaluator_alloc_from_s_s_func(s_s_tolower_func, parg1); - } else if (streq(function_name, "toupper")) { return lrec_evaluator_alloc_from_s_s_func(s_s_toupper_func, parg1); } else if (streq(function_name, "-")) { return lrec_evaluator_alloc_from_f_f_func(f_f_uneg_func, parg1); } else if (streq(function_name, "abs")) { return lrec_evaluator_alloc_from_f_f_func(f_f_abs_func, parg1); + } else if (streq(function_name, "ceil")) { return lrec_evaluator_alloc_from_f_f_func(f_f_ceil_func, parg1); + } else if (streq(function_name, "cos")) { return lrec_evaluator_alloc_from_f_f_func(f_f_cos_func, parg1); + } else if (streq(function_name, "exp")) { return lrec_evaluator_alloc_from_f_f_func(f_f_exp_func, parg1); + } else if (streq(function_name, "floor")) { return lrec_evaluator_alloc_from_f_f_func(f_f_floor_func, parg1); } else if (streq(function_name, "log")) { return lrec_evaluator_alloc_from_f_f_func(f_f_log_func, parg1); } else if (streq(function_name, "log10")) { return lrec_evaluator_alloc_from_f_f_func(f_f_log10_func, parg1); - } else if (streq(function_name, "exp")) { return lrec_evaluator_alloc_from_f_f_func(f_f_exp_func, parg1); - } else if (streq(function_name, "sin")) { return lrec_evaluator_alloc_from_f_f_func(f_f_sin_func, parg1); - } else if (streq(function_name, "cos")) { return lrec_evaluator_alloc_from_f_f_func(f_f_cos_func, parg1); - } else if (streq(function_name, "tan")) { return lrec_evaluator_alloc_from_f_f_func(f_f_tan_func, parg1); - } else if (streq(function_name, "ceil")) { return lrec_evaluator_alloc_from_f_f_func(f_f_ceil_func, parg1); - } else if (streq(function_name, "floor")) { return lrec_evaluator_alloc_from_f_f_func(f_f_floor_func, parg1); } else if (streq(function_name, "round")) { return lrec_evaluator_alloc_from_f_f_func(f_f_round_func, parg1); + } else if (streq(function_name, "sin")) { return lrec_evaluator_alloc_from_f_f_func(f_f_sin_func, parg1); + } else if (streq(function_name, "sqrt")) { return lrec_evaluator_alloc_from_f_f_func(f_f_sqrt_func, parg1); + } else if (streq(function_name, "tan")) { return lrec_evaluator_alloc_from_f_f_func(f_f_tan_func, parg1); + } else if (streq(function_name, "tolower")) { return lrec_evaluator_alloc_from_s_s_func(s_s_tolower_func, parg1); + } else if (streq(function_name, "toupper")) { return lrec_evaluator_alloc_from_s_s_func(s_s_toupper_func, parg1); } else { return NULL; /* xxx handle me better */ } } diff --git a/c/mapping/mlr_val.h b/c/mapping/mlr_val.h index b87cf28d2..aed809f4d 100644 --- a/c/mapping/mlr_val.h +++ b/c/mapping/mlr_val.h @@ -118,6 +118,10 @@ static inline mlr_val_t f_f_tan_func(mlr_val_t* pval1) { mlr_val_t rv = {.type = MT_DOUBLE, .u.double_val = tan(pval1->u.double_val)}; return rv; } +static inline mlr_val_t f_f_sqrt_func(mlr_val_t* pval1) { + mlr_val_t rv = {.type = MT_DOUBLE, .u.double_val = sqrt(pval1->u.double_val)}; + return rv; +} static inline mlr_val_t f_f_round_func(mlr_val_t* pval1) { mlr_val_t rv = {.type = MT_DOUBLE, .u.double_val = round(pval1->u.double_val)}; return rv; diff --git a/c/test/expected/out b/c/test/expected/out index c9ae0039b..74b3157d6 100644 --- a/c/test/expected/out +++ b/c/test/expected/out @@ -358,16 +358,16 @@ a=hat,b=wye,i=9,x=0.03144187646093577,y=0.7495507603507059,x2=0.000989 a=pan,b=wye,i=10,x=0.5026260055412137,y=0.9526183602969864,x2=0.252633 ./test/../mlr put $z = -0.024*$x+0.13 ./test/input/abixy -a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533,z=-0.138323 -a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797,z=-0.148208 -a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776,z=-0.134910 -a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463,z=-0.139154 -a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729,z=-0.143759 -a=zee,b=pan,i=6,x=0.5271261600918548,y=0.49322128674835697,z=-0.142651 -a=eks,b=zee,i=7,x=0.6117840605678454,y=0.1878849191181694,z=-0.144683 -a=zee,b=wye,i=8,x=0.5985540091064224,y=0.976181385699006,z=-0.144365 -a=hat,b=wye,i=9,x=0.03144187646093577,y=0.7495507603507059,z=-0.130755 -a=pan,b=wye,i=10,x=0.5026260055412137,y=0.9526183602969864,z=-0.142063 +a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533,z=0.121677 +a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797,z=0.111792 +a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776,z=0.125090 +a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463,z=0.120846 +a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729,z=0.116241 +a=zee,b=pan,i=6,x=0.5271261600918548,y=0.49322128674835697,z=0.117349 +a=eks,b=zee,i=7,x=0.6117840605678454,y=0.1878849191181694,z=0.115317 +a=zee,b=wye,i=8,x=0.5985540091064224,y=0.976181385699006,z=0.115635 +a=hat,b=wye,i=9,x=0.03144187646093577,y=0.7495507603507059,z=0.129245 +a=pan,b=wye,i=10,x=0.5026260055412137,y=0.9526183602969864,z=0.117937 ./test/../mlr put $c = $a . $b ./test/input/abixy a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533,c=panpan @@ -405,6 +405,452 @@ hat wye 9 0.03144187646093577 0.7495507603507059 19 9 7 2 ./test/inpu pan wye 10 0.5026260055412137 0.9526183602969864 20 10 7 2 ./test/input/abixy +================================================================ +OPERATOR PRECEDENCE AND ASSOCIATIVITY + +mlr put -v $x=$a+$b+$c /dev/null += (operator): + x (field_name). + + (operator): + + (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a+$b-$c /dev/null += (operator): + x (field_name). + - (operator): + + (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a-$b-$c /dev/null += (operator): + x (field_name). + - (operator): + - (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a-$b+$c /dev/null += (operator): + x (field_name). + + (operator): + - (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a*$b*$c /dev/null += (operator): + x (field_name). + * (operator): + * (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a*$b/$c /dev/null += (operator): + x (field_name). + / (operator): + * (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a/$b/$c /dev/null += (operator): + x (field_name). + / (operator): + / (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a/$b*$c /dev/null += (operator): + x (field_name). + * (operator): + / (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a+$b+$c /dev/null += (operator): + x (field_name). + + (operator): + + (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a+$b*$c /dev/null += (operator): + x (field_name). + + (operator): + a (field_name). + * (operator): + b (field_name). + c (field_name). + +mlr put -v $x=$a*$b*$c /dev/null += (operator): + x (field_name). + * (operator): + * (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a*$b+$c /dev/null += (operator): + x (field_name). + + (operator): + * (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a+$b+$c /dev/null += (operator): + x (field_name). + + (operator): + + (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a+$b**$c /dev/null += (operator): + x (field_name). + + (operator): + a (field_name). + ** (operator): + b (field_name). + c (field_name). + +mlr put -v $x=$a**$b**$c /dev/null += (operator): + x (field_name). + ** (operator): + a (field_name). + ** (operator): + b (field_name). + c (field_name). + +mlr put -v $x=$a**$b+$c /dev/null += (operator): + x (field_name). + + (operator): + ** (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a.$b.$c /dev/null += (operator): + x (field_name). + . (operator): + . (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=-$a+$b*$c /dev/null += (operator): + x (field_name). + + (operator): + - (operator): + a (field_name). + * (operator): + b (field_name). + c (field_name). + +mlr put -v $x=-$a*$b+$c /dev/null += (operator): + x (field_name). + + (operator): + * (operator): + - (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a+-$b*$c /dev/null += (operator): + x (field_name). + + (operator): + a (field_name). + * (operator): + - (operator): + b (field_name). + c (field_name). + +mlr put -v $x=$a*-$b+$c /dev/null += (operator): + x (field_name). + + (operator): + * (operator): + a (field_name). + - (operator): + b (field_name). + c (field_name). + +mlr put -v $x=$a+$b*-$c /dev/null += (operator): + x (field_name). + + (operator): + a (field_name). + * (operator): + b (field_name). + - (operator): + c (field_name). + +mlr put -v $x=$a*$b+-$c /dev/null += (operator): + x (field_name). + + (operator): + * (operator): + a (field_name). + b (field_name). + - (operator): + c (field_name). + +mlr filter -v $a==1 && $b == 1 && $c == 1 /dev/null +&& (operator): + && (operator): + == (operator): + a (field_name). + 1 (literal). + == (operator): + b (field_name). + 1 (literal). + == (operator): + c (field_name). + 1 (literal). + +mlr filter -v $a==1 || $b == 1 && $c == 1 /dev/null +|| (operator): + == (operator): + a (field_name). + 1 (literal). + && (operator): + == (operator): + b (field_name). + 1 (literal). + == (operator): + c (field_name). + 1 (literal). + +mlr filter -v $a==1 || $b == 1 || $c == 1 /dev/null +|| (operator): + || (operator): + == (operator): + a (field_name). + 1 (literal). + == (operator): + b (field_name). + 1 (literal). + == (operator): + c (field_name). + 1 (literal). + +mlr filter -v $a==1 && $b == 1 || $c == 1 /dev/null +|| (operator): + && (operator): + == (operator): + a (field_name). + 1 (literal). + == (operator): + b (field_name). + 1 (literal). + == (operator): + c (field_name). + 1 (literal). + +mlr filter -v $x<$a*$b*$c /dev/null +< (operator): + x (field_name). + * (operator): + * (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a*$b/$c /dev/null +< (operator): + x (field_name). + / (operator): + * (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a/$b/$c /dev/null +< (operator): + x (field_name). + / (operator): + / (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a/$b*$c /dev/null +< (operator): + x (field_name). + * (operator): + / (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a+$b+$c /dev/null +< (operator): + x (field_name). + + (operator): + + (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a+$b*$c /dev/null +< (operator): + x (field_name). + + (operator): + a (field_name). + * (operator): + b (field_name). + c (field_name). + +mlr filter -v $x<$a*$b*$c /dev/null +< (operator): + x (field_name). + * (operator): + * (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a*$b+$c /dev/null +< (operator): + x (field_name). + + (operator): + * (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a+$b+$c /dev/null +< (operator): + x (field_name). + + (operator): + + (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a+$b**$c /dev/null +< (operator): + x (field_name). + + (operator): + a (field_name). + ** (operator): + b (field_name). + c (field_name). + +mlr filter -v $x<$a**$b**$c /dev/null +< (operator): + x (field_name). + ** (operator): + ** (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a**$b+$c /dev/null +< (operator): + x (field_name). + + (operator): + ** (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a.$b.$c /dev/null +< (operator): + x (field_name). + . (operator): + . (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<-$a+$b*$c /dev/null +< (operator): + x (field_name). + + (operator): + - (operator): + a (field_name). + * (operator): + b (field_name). + c (field_name). + +mlr filter -v $x<-$a*$b+$c /dev/null +< (operator): + x (field_name). + + (operator): + * (operator): + - (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a+-$b*$c /dev/null +< (operator): + x (field_name). + + (operator): + a (field_name). + * (operator): + - (operator): + b (field_name). + c (field_name). + +mlr filter -v $x<$a*-$b+$c /dev/null +< (operator): + x (field_name). + + (operator): + * (operator): + a (field_name). + - (operator): + b (field_name). + c (field_name). + +mlr filter -v $x<$a+$b*-$c /dev/null +< (operator): + x (field_name). + + (operator): + a (field_name). + * (operator): + b (field_name). + - (operator): + c (field_name). + +mlr filter -v $x<$a*$b+-$c /dev/null +< (operator): + x (field_name). + + (operator): + * (operator): + a (field_name). + b (field_name). + - (operator): + c (field_name). + + ================================================================ CHAINING diff --git a/c/test/output/out b/c/test/output/out index c9ae0039b..74b3157d6 100644 --- a/c/test/output/out +++ b/c/test/output/out @@ -358,16 +358,16 @@ a=hat,b=wye,i=9,x=0.03144187646093577,y=0.7495507603507059,x2=0.000989 a=pan,b=wye,i=10,x=0.5026260055412137,y=0.9526183602969864,x2=0.252633 ./test/../mlr put $z = -0.024*$x+0.13 ./test/input/abixy -a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533,z=-0.138323 -a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797,z=-0.148208 -a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776,z=-0.134910 -a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463,z=-0.139154 -a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729,z=-0.143759 -a=zee,b=pan,i=6,x=0.5271261600918548,y=0.49322128674835697,z=-0.142651 -a=eks,b=zee,i=7,x=0.6117840605678454,y=0.1878849191181694,z=-0.144683 -a=zee,b=wye,i=8,x=0.5985540091064224,y=0.976181385699006,z=-0.144365 -a=hat,b=wye,i=9,x=0.03144187646093577,y=0.7495507603507059,z=-0.130755 -a=pan,b=wye,i=10,x=0.5026260055412137,y=0.9526183602969864,z=-0.142063 +a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533,z=0.121677 +a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797,z=0.111792 +a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776,z=0.125090 +a=eks,b=wye,i=4,x=0.38139939387114097,y=0.13418874328430463,z=0.120846 +a=wye,b=pan,i=5,x=0.5732889198020006,y=0.8636244699032729,z=0.116241 +a=zee,b=pan,i=6,x=0.5271261600918548,y=0.49322128674835697,z=0.117349 +a=eks,b=zee,i=7,x=0.6117840605678454,y=0.1878849191181694,z=0.115317 +a=zee,b=wye,i=8,x=0.5985540091064224,y=0.976181385699006,z=0.115635 +a=hat,b=wye,i=9,x=0.03144187646093577,y=0.7495507603507059,z=0.129245 +a=pan,b=wye,i=10,x=0.5026260055412137,y=0.9526183602969864,z=0.117937 ./test/../mlr put $c = $a . $b ./test/input/abixy a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533,c=panpan @@ -405,6 +405,452 @@ hat wye 9 0.03144187646093577 0.7495507603507059 19 9 7 2 ./test/inpu pan wye 10 0.5026260055412137 0.9526183602969864 20 10 7 2 ./test/input/abixy +================================================================ +OPERATOR PRECEDENCE AND ASSOCIATIVITY + +mlr put -v $x=$a+$b+$c /dev/null += (operator): + x (field_name). + + (operator): + + (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a+$b-$c /dev/null += (operator): + x (field_name). + - (operator): + + (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a-$b-$c /dev/null += (operator): + x (field_name). + - (operator): + - (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a-$b+$c /dev/null += (operator): + x (field_name). + + (operator): + - (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a*$b*$c /dev/null += (operator): + x (field_name). + * (operator): + * (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a*$b/$c /dev/null += (operator): + x (field_name). + / (operator): + * (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a/$b/$c /dev/null += (operator): + x (field_name). + / (operator): + / (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a/$b*$c /dev/null += (operator): + x (field_name). + * (operator): + / (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a+$b+$c /dev/null += (operator): + x (field_name). + + (operator): + + (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a+$b*$c /dev/null += (operator): + x (field_name). + + (operator): + a (field_name). + * (operator): + b (field_name). + c (field_name). + +mlr put -v $x=$a*$b*$c /dev/null += (operator): + x (field_name). + * (operator): + * (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a*$b+$c /dev/null += (operator): + x (field_name). + + (operator): + * (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a+$b+$c /dev/null += (operator): + x (field_name). + + (operator): + + (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a+$b**$c /dev/null += (operator): + x (field_name). + + (operator): + a (field_name). + ** (operator): + b (field_name). + c (field_name). + +mlr put -v $x=$a**$b**$c /dev/null += (operator): + x (field_name). + ** (operator): + a (field_name). + ** (operator): + b (field_name). + c (field_name). + +mlr put -v $x=$a**$b+$c /dev/null += (operator): + x (field_name). + + (operator): + ** (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a.$b.$c /dev/null += (operator): + x (field_name). + . (operator): + . (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=-$a+$b*$c /dev/null += (operator): + x (field_name). + + (operator): + - (operator): + a (field_name). + * (operator): + b (field_name). + c (field_name). + +mlr put -v $x=-$a*$b+$c /dev/null += (operator): + x (field_name). + + (operator): + * (operator): + - (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr put -v $x=$a+-$b*$c /dev/null += (operator): + x (field_name). + + (operator): + a (field_name). + * (operator): + - (operator): + b (field_name). + c (field_name). + +mlr put -v $x=$a*-$b+$c /dev/null += (operator): + x (field_name). + + (operator): + * (operator): + a (field_name). + - (operator): + b (field_name). + c (field_name). + +mlr put -v $x=$a+$b*-$c /dev/null += (operator): + x (field_name). + + (operator): + a (field_name). + * (operator): + b (field_name). + - (operator): + c (field_name). + +mlr put -v $x=$a*$b+-$c /dev/null += (operator): + x (field_name). + + (operator): + * (operator): + a (field_name). + b (field_name). + - (operator): + c (field_name). + +mlr filter -v $a==1 && $b == 1 && $c == 1 /dev/null +&& (operator): + && (operator): + == (operator): + a (field_name). + 1 (literal). + == (operator): + b (field_name). + 1 (literal). + == (operator): + c (field_name). + 1 (literal). + +mlr filter -v $a==1 || $b == 1 && $c == 1 /dev/null +|| (operator): + == (operator): + a (field_name). + 1 (literal). + && (operator): + == (operator): + b (field_name). + 1 (literal). + == (operator): + c (field_name). + 1 (literal). + +mlr filter -v $a==1 || $b == 1 || $c == 1 /dev/null +|| (operator): + || (operator): + == (operator): + a (field_name). + 1 (literal). + == (operator): + b (field_name). + 1 (literal). + == (operator): + c (field_name). + 1 (literal). + +mlr filter -v $a==1 && $b == 1 || $c == 1 /dev/null +|| (operator): + && (operator): + == (operator): + a (field_name). + 1 (literal). + == (operator): + b (field_name). + 1 (literal). + == (operator): + c (field_name). + 1 (literal). + +mlr filter -v $x<$a*$b*$c /dev/null +< (operator): + x (field_name). + * (operator): + * (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a*$b/$c /dev/null +< (operator): + x (field_name). + / (operator): + * (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a/$b/$c /dev/null +< (operator): + x (field_name). + / (operator): + / (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a/$b*$c /dev/null +< (operator): + x (field_name). + * (operator): + / (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a+$b+$c /dev/null +< (operator): + x (field_name). + + (operator): + + (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a+$b*$c /dev/null +< (operator): + x (field_name). + + (operator): + a (field_name). + * (operator): + b (field_name). + c (field_name). + +mlr filter -v $x<$a*$b*$c /dev/null +< (operator): + x (field_name). + * (operator): + * (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a*$b+$c /dev/null +< (operator): + x (field_name). + + (operator): + * (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a+$b+$c /dev/null +< (operator): + x (field_name). + + (operator): + + (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a+$b**$c /dev/null +< (operator): + x (field_name). + + (operator): + a (field_name). + ** (operator): + b (field_name). + c (field_name). + +mlr filter -v $x<$a**$b**$c /dev/null +< (operator): + x (field_name). + ** (operator): + ** (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a**$b+$c /dev/null +< (operator): + x (field_name). + + (operator): + ** (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a.$b.$c /dev/null +< (operator): + x (field_name). + . (operator): + . (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<-$a+$b*$c /dev/null +< (operator): + x (field_name). + + (operator): + - (operator): + a (field_name). + * (operator): + b (field_name). + c (field_name). + +mlr filter -v $x<-$a*$b+$c /dev/null +< (operator): + x (field_name). + + (operator): + * (operator): + - (operator): + a (field_name). + b (field_name). + c (field_name). + +mlr filter -v $x<$a+-$b*$c /dev/null +< (operator): + x (field_name). + + (operator): + a (field_name). + * (operator): + - (operator): + b (field_name). + c (field_name). + +mlr filter -v $x<$a*-$b+$c /dev/null +< (operator): + x (field_name). + + (operator): + * (operator): + a (field_name). + - (operator): + b (field_name). + c (field_name). + +mlr filter -v $x<$a+$b*-$c /dev/null +< (operator): + x (field_name). + + (operator): + a (field_name). + * (operator): + b (field_name). + - (operator): + c (field_name). + +mlr filter -v $x<$a*$b+-$c /dev/null +< (operator): + x (field_name). + + (operator): + * (operator): + a (field_name). + b (field_name). + - (operator): + c (field_name). + + ================================================================ CHAINING diff --git a/c/test/run b/c/test/run index 0c97c583a..1ac42e8ec 100755 --- a/c/test/run +++ b/c/test/run @@ -102,6 +102,68 @@ run_command $mlr put '$c = $a . $b' $indir/abixy # xxx more ... run_command $mlr --opprint put '$nr=NR;$fnr=FNR;$nf=NF;$filenum=FILENUM;$filename=FILENAME' $indir/abixy $indir/abixy +announce OPERATOR PRECEDENCE AND ASSOCIATIVITY + +# filter -v and put -v print the AST +run_command mlr put -v '$x=$a+$b+$c' /dev/null +run_command mlr put -v '$x=$a+$b-$c' /dev/null +run_command mlr put -v '$x=$a-$b-$c' /dev/null +run_command mlr put -v '$x=$a-$b+$c' /dev/null + +run_command mlr put -v '$x=$a*$b*$c' /dev/null +run_command mlr put -v '$x=$a*$b/$c' /dev/null +run_command mlr put -v '$x=$a/$b/$c' /dev/null +run_command mlr put -v '$x=$a/$b*$c' /dev/null + +run_command mlr put -v '$x=$a+$b+$c' /dev/null +run_command mlr put -v '$x=$a+$b*$c' /dev/null +run_command mlr put -v '$x=$a*$b*$c' /dev/null +run_command mlr put -v '$x=$a*$b+$c' /dev/null + +run_command mlr put -v '$x=$a+$b+$c' /dev/null +run_command mlr put -v '$x=$a+$b**$c' /dev/null +run_command mlr put -v '$x=$a**$b**$c' /dev/null +run_command mlr put -v '$x=$a**$b+$c' /dev/null + +run_command mlr put -v '$x=$a.$b.$c' /dev/null + +run_command mlr put -v '$x=-$a+$b*$c' /dev/null +run_command mlr put -v '$x=-$a*$b+$c' /dev/null +run_command mlr put -v '$x=$a+-$b*$c' /dev/null +run_command mlr put -v '$x=$a*-$b+$c' /dev/null +run_command mlr put -v '$x=$a+$b*-$c' /dev/null +run_command mlr put -v '$x=$a*$b+-$c' /dev/null + + +run_command mlr filter -v '$a==1 && $b == 1 && $c == 1' /dev/null +run_command mlr filter -v '$a==1 || $b == 1 && $c == 1' /dev/null +run_command mlr filter -v '$a==1 || $b == 1 || $c == 1' /dev/null +run_command mlr filter -v '$a==1 && $b == 1 || $c == 1' /dev/null + +run_command mlr filter -v '$x<$a*$b*$c' /dev/null +run_command mlr filter -v '$x<$a*$b/$c' /dev/null +run_command mlr filter -v '$x<$a/$b/$c' /dev/null +run_command mlr filter -v '$x<$a/$b*$c' /dev/null + +run_command mlr filter -v '$x<$a+$b+$c' /dev/null +run_command mlr filter -v '$x<$a+$b*$c' /dev/null +run_command mlr filter -v '$x<$a*$b*$c' /dev/null +run_command mlr filter -v '$x<$a*$b+$c' /dev/null + +run_command mlr filter -v '$x<$a+$b+$c' /dev/null +run_command mlr filter -v '$x<$a+$b**$c' /dev/null +run_command mlr filter -v '$x<$a**$b**$c' /dev/null +run_command mlr filter -v '$x<$a**$b+$c' /dev/null + +run_command mlr filter -v '$x<$a.$b.$c' /dev/null + +run_command mlr filter -v '$x<-$a+$b*$c' /dev/null +run_command mlr filter -v '$x<-$a*$b+$c' /dev/null +run_command mlr filter -v '$x<$a+-$b*$c' /dev/null +run_command mlr filter -v '$x<$a*-$b+$c' /dev/null +run_command mlr filter -v '$x<$a+$b*-$c' /dev/null +run_command mlr filter -v '$x<$a*$b+-$c' /dev/null + # ---------------------------------------------------------------- announce CHAINING @@ -177,7 +239,8 @@ run_command $mlr --ipprint --odkvp cat test/input/f.pprint test/input/g.pprint run_command $mlr --ipprint --odkvp cat test/input/{a,b,c,d,e,f,g}.pprint # ================================================================ -diff $expdir/out $outdir/out +#diff $expdir/out $outdir/out +diff -C5 $expdir/out $outdir/out # ================================================================ echo ALL REGRESSION TESTS PASSED diff --git a/c/todo.txt b/c/todo.txt index 35de8c084..cbbef1a47 100644 --- a/c/todo.txt +++ b/c/todo.txt @@ -1,31 +1,14 @@ ================================================================ !! BUGFIX !! -$ echo 'x=0' | mlr put '$y=-2*$x+3' -x=0,y=-3.000000 - -$ echo 'x=0' | mlr put '$y=(-2*$x)+3' -x=0,y=3.000000 - -$ echo 'x=0' | mlr put '$y=-(2*$x)+3' -x=0,y=-3.000000 +mlr put w/o lhs segfaults +mlr put w/ syntax error segfaults +stats1/stats2/step w/ unrecognized subcmd segfaults ---------------------------------------------------------------- !! BUGFIX !! -mlr put '$x/$y*$z' not right - -================================================================ -NEATEN - -* prune pix -* makefile go/d/rs stuff -> language-comparisons -* catc.c/catc0.c -> language-comparisons -* remove/coalesce/gzip the large data files -* mk perfcomp dir -* "index-numbered" -> "implicitly index-numbered" in mlrwik -* source hygiene: xxx's, top-of-header comments, readme re memory management, etc. -* "level_1", "level_2", etc. are just confusing. come up with more descriptive names. +mlr filter '$>5' ok -- empty variable name isn't being disallowed ================================================================ FEATURES @@ -39,6 +22,21 @@ FEATURES * nidx feature: bulk rename cols 1,2,3,4,5 this,that,something,foo,bar * feature: ordered cut (a la reorder) * impl mlr check: no output +* linreq-quality 2nd pass -- code it up in stats2 w/ -m {m} -b {b} -- ? + +================================================================ +NEATEN + +* prune pix/ dir +* makefile go/d/rs stuff -> language-comparisons/ dir +* catc.c/catc0.c -> language-comparisons/ dir +* remove/coalesce/gzip the large data files +* mk perfcomp dir +* "index-numbered" -> "implicitly index-numbered" in mlrwik +* source hygiene: xxx's, top-of-header comments, readme re memory management, etc. +* "level_1", "level_2", etc. are just confusing. come up with more descriptive names. + +* play with python sketch.py (& rename -- mlr.py??) & make sure it's at least usable for something ================================================================ ONLINE HELP @@ -48,6 +46,7 @@ ONLINE HELP ================================================================ IMPROVEMENTS * pprint reader: read using field widths?!? with strip ... that would solve the embedded-whitespace problem. + lmhsi: column name -> char index?? * xtab -> vtab everywhere? (code+doc) * null-handling everywhere!! :/ * 80-column-wrap slls printer (for mlr --help) @@ -80,6 +79,7 @@ DOC * doc: section on to-do things, e.g. multichar rs/fs/ps; & regexes; & quantiles * put colored-shapes.dkvp in more places in wikset * ref to http://datapipes.okfnlabs.org/ +* emph all variables are stream variables and all functions are stream functions ================================================================ DATA