fix operator precedences and associativities

This commit is contained in:
John Kerl 2015-05-06 19:39:34 -07:00
parent b31b2385ab
commit 7df98c19a2
8 changed files with 1025 additions and 105 deletions

View file

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

View file

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

View file

@ -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 */ }
}

View file

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

View file

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

View file

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

View file

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

View file

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