mirror of
https://github.com/johnkerl/miller.git
synced 2026-01-23 18:25:45 +00:00
fix operator precedences and associativities
This commit is contained in:
parent
b31b2385ab
commit
7df98c19a2
8 changed files with 1025 additions and 105 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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 */ }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
65
c/test/run
65
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
|
||||
|
|
|
|||
42
c/todo.txt
42
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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue