mirror of
https://github.com/johnkerl/miller.git
synced 2026-07-22 07:30:43 +00:00
pattern-action AST finalize
This commit is contained in:
parent
9f97b531f2
commit
00f6c96eaa
6 changed files with 240 additions and 47 deletions
|
|
@ -69,6 +69,15 @@ mlr_dsl_ast_node_t* mlr_dsl_ast_node_alloc_ternary(char* text, mlr_dsl_ast_node_
|
|||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
mlr_dsl_ast_node_t* mlr_dsl_ast_node_prepend_arg(
|
||||
mlr_dsl_ast_node_t* pa, mlr_dsl_ast_node_t* pb)
|
||||
{
|
||||
if (pa->pchildren == NULL)
|
||||
pa->pchildren = sllv_alloc();
|
||||
sllv_prepend(pa->pchildren, pb);
|
||||
return pa;
|
||||
}
|
||||
|
||||
mlr_dsl_ast_node_t* mlr_dsl_ast_node_append_arg(
|
||||
mlr_dsl_ast_node_t* pa, mlr_dsl_ast_node_t* pb)
|
||||
{
|
||||
|
|
@ -137,6 +146,7 @@ char* mlr_dsl_ast_node_describe_type(mlr_dsl_ast_node_type_t type) {
|
|||
case MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT: return "oosvar_assignment"; break;
|
||||
case MD_AST_NODE_TYPE_CONTEXT_VARIABLE: return "context_variable"; break;
|
||||
case MD_AST_NODE_TYPE_STRIPPED_AWAY: return "stripped_away"; break;
|
||||
case MD_AST_NODE_TYPE_CONDITIONAL_BLOCK: return "conditional_block"; break;
|
||||
case MD_AST_NODE_TYPE_FILTER: return "filter"; break;
|
||||
case MD_AST_NODE_TYPE_GATE: return "gate"; break;
|
||||
case MD_AST_NODE_TYPE_EMIT: return "emit"; break;
|
||||
|
|
|
|||
|
|
@ -60,10 +60,9 @@ mlr_dsl_ast_node_t* mlr_dsl_ast_node_copy(mlr_dsl_ast_node_t* pother);
|
|||
// See comments in mlr_dsl_parse.y for this seemingly awkward syntax wherein
|
||||
// we change the function name after having set it up. This is a consequence of
|
||||
// bottom-up DSL parsing.
|
||||
mlr_dsl_ast_node_t* mlr_dsl_ast_node_append_arg(
|
||||
mlr_dsl_ast_node_t* pa, mlr_dsl_ast_node_t* pb);
|
||||
mlr_dsl_ast_node_t* mlr_dsl_ast_node_set_function_name(
|
||||
mlr_dsl_ast_node_t* pa, char* name);
|
||||
mlr_dsl_ast_node_t* mlr_dsl_ast_node_prepend_arg(mlr_dsl_ast_node_t* pa, mlr_dsl_ast_node_t* pb);
|
||||
mlr_dsl_ast_node_t* mlr_dsl_ast_node_append_arg(mlr_dsl_ast_node_t* pa, mlr_dsl_ast_node_t* pb);
|
||||
mlr_dsl_ast_node_t* mlr_dsl_ast_node_set_function_name(mlr_dsl_ast_node_t* pa, char* name);
|
||||
|
||||
void mlr_dsl_ast_print(mlr_dsl_ast_t* past);
|
||||
void mlr_dsl_ast_node_print(mlr_dsl_ast_node_t* pnode);
|
||||
|
|
|
|||
|
|
@ -91,28 +91,28 @@ md_end_block_statement ::= md_end_block_dump.
|
|||
|
||||
// ----------------------------------------------------------------
|
||||
md_conditional_block(A) ::= md_ternary(B) MD_TOKEN_LEFT_BRACE md_conditional_block_statements(C) MD_TOKEN_RIGHT_BRACE . {
|
||||
A = mlr_dsl_ast_node_alloc_binary("conditional", MD_AST_NODE_TYPE_CONDITIONAL_BLOCK, B, C);
|
||||
A = mlr_dsl_ast_node_prepend_arg(C, B);
|
||||
sllv_append(past->pmain_statements, A);
|
||||
}
|
||||
|
||||
// Given "$x>0 {$a=1;$b=2;$c=3}": since this is a bottom-up parser, we get first the "$a=1",
|
||||
// then "$a=1;$b=2", then "$a=1;$b=2;$c=3", then finally "$x>0 {$a=1;$b=2;$c=3}". So:
|
||||
// * On the "$a=1" we make a sub-AST called "conditional $a=1".
|
||||
// * On the "$b=2" we append the next argument to get "conditional $a=1,$b=2".
|
||||
// * On the "$c=3" we append the next argument to get "conditional $a=1,$b=2,$c=3".
|
||||
// * On the "$x>0" we attach the conditional expression.
|
||||
// * On the "$a=1" we make a sub-AST called "cond" with child $a=1.
|
||||
// * On the "$b=2" we append the next argument to get "cond" having children $a=1 and $b=2.
|
||||
// * On the "$c=3" we append the next argument to get "cond" having children $a=1, $b=2, and $c=3.
|
||||
// * On the "$x>0" we prepend the conditional expression to get "cond" having children $x>0, $a=1, $b=2, and $c=3.
|
||||
|
||||
// This allows for trailing semicolon, as well as empty string (or whitespace) between semicolons:
|
||||
md_conditional_block_statements(A) ::= . {
|
||||
A = mlr_dsl_ast_node_alloc_zary("conditional", MD_AST_NODE_TYPE_CONDITIONAL_BLOCK);
|
||||
A = mlr_dsl_ast_node_alloc_zary("cond", MD_AST_NODE_TYPE_CONDITIONAL_BLOCK);
|
||||
}
|
||||
md_conditional_block_statements(A) ::= md_conditional_block_statement(B). {
|
||||
A = mlr_dsl_ast_node_alloc_unary("conditional", MD_AST_NODE_TYPE_CONDITIONAL_BLOCK, B);
|
||||
A = mlr_dsl_ast_node_alloc_unary("cond", MD_AST_NODE_TYPE_CONDITIONAL_BLOCK, B);
|
||||
}
|
||||
md_conditional_block_statements(A) ::= md_conditional_block_statement(B) MD_TOKEN_SEMICOLON md_conditional_block_statements(C). {
|
||||
md_conditional_block_statements(A) ::= md_conditional_block_statements(B) MD_TOKEN_SEMICOLON md_conditional_block_statement(C). {
|
||||
A = mlr_dsl_ast_node_append_arg(B, C);
|
||||
}
|
||||
|
||||
// This allows for trailing semicolon, as well as empty string (or whitespace) between semicolons:
|
||||
//md_conditional_block_statement ::= .
|
||||
md_conditional_block_statement ::= md_conditional_block_srec_assignment.
|
||||
md_conditional_block_statement ::= md_conditional_block_oosvar_assignment.
|
||||
md_conditional_block_statement ::= md_conditional_block_emit.
|
||||
|
|
@ -121,8 +121,8 @@ md_conditional_block_statement ::= md_conditional_block_dump.
|
|||
// ================================================================
|
||||
// These are top-level; they update the AST top-level statement-lists.
|
||||
|
||||
md_main_srec_assignment(A) ::= md_field_name(B) MD_TOKEN_ASSIGN(O) md_ternary(C). {
|
||||
A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B, C);
|
||||
md_main_srec_assignment(A) ::= md_srec_assignment(B). {
|
||||
A = B;
|
||||
sllv_append(past->pmain_statements, A);
|
||||
}
|
||||
md_main_oosvar_assignment(A) ::= md_oosvar_assignment(B). {
|
||||
|
|
@ -179,22 +179,17 @@ md_begin_block_dump(A) ::= md_dump(B). {
|
|||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
// xxx encapsulate this doubly-used RHS
|
||||
md_conditional_block_srec_assignment(A) ::= md_field_name(B) MD_TOKEN_ASSIGN md_ternary. {
|
||||
md_conditional_block_srec_assignment(A) ::= md_srec_assignment(B). {
|
||||
A = B;
|
||||
//sllv_append(past->pconditional_statements, A);
|
||||
}
|
||||
md_conditional_block_oosvar_assignment(A) ::= md_oosvar_assignment(B). {
|
||||
A = B;
|
||||
//sllv_append(past->pconditional_statements, A);
|
||||
}
|
||||
md_conditional_block_emit(A) ::= md_emit(B). {
|
||||
A = B;
|
||||
//sllv_append(past->pconditional_statements, A);
|
||||
}
|
||||
md_conditional_block_dump(A) ::= md_dump(B). {
|
||||
A = B;
|
||||
//sllv_append(past->pconditional_statements, A);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
|
|
@ -226,6 +221,9 @@ md_end_block_dump(A) ::= md_dump(B). {
|
|||
}
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
md_srec_assignment(A) ::= md_field_name(B) MD_TOKEN_ASSIGN(O) md_ternary(C). {
|
||||
A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_SREC_ASSIGNMENT, B, C);
|
||||
}
|
||||
md_oosvar_assignment(A) ::= md_oosvar_name(B) MD_TOKEN_ASSIGN(O) md_ternary(C). {
|
||||
A = mlr_dsl_ast_node_alloc_binary(O->text, MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, B, C);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2360,6 +2360,9 @@ static lrec_evaluator_t* lrec_evaluator_alloc_from_ast_aux(mlr_dsl_ast_node_t* p
|
|||
} else if (pnode->type == MD_AST_NODE_TYPE_ENV) {
|
||||
return lrec_evaluator_alloc_from_environment(pnode, type_inferencing);
|
||||
|
||||
} else if (pnode->type == MD_AST_NODE_TYPE_CONDITIONAL_BLOCK) {
|
||||
return lrec_evaluator_alloc_from_NR(); // xxx stub
|
||||
|
||||
} else { // operator/function
|
||||
if ((pnode->type != MD_AST_NODE_TYPE_FUNCTION_NAME)
|
||||
&& (pnode->type != MD_AST_NODE_TYPE_OPERATOR)) {
|
||||
|
|
@ -2386,18 +2389,23 @@ static lrec_evaluator_t* lrec_evaluator_alloc_from_ast_aux(mlr_dsl_ast_node_t* p
|
|||
int type2 = parg2_node->type;
|
||||
|
||||
if ((streq(func_name, "=~") || streq(func_name, "!=~")) && type2 == MD_AST_NODE_TYPE_STRNUM_LITERAL) {
|
||||
lrec_evaluator_t* parg1 = lrec_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing, fcn_lookup_table);
|
||||
pevaluator = lrec_evaluator_alloc_from_binary_regex_arg2_func_name(func_name, parg1, parg2_node->text, FALSE);
|
||||
lrec_evaluator_t* parg1 = lrec_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
|
||||
fcn_lookup_table);
|
||||
pevaluator = lrec_evaluator_alloc_from_binary_regex_arg2_func_name(func_name,
|
||||
parg1, parg2_node->text, FALSE);
|
||||
} else if ((streq(func_name, "=~") || streq(func_name, "!=~")) && type2 == MD_AST_NODE_TYPE_REGEXI) {
|
||||
lrec_evaluator_t* parg1 = lrec_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing, fcn_lookup_table);
|
||||
lrec_evaluator_t* parg1 = lrec_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
|
||||
fcn_lookup_table);
|
||||
pevaluator = lrec_evaluator_alloc_from_binary_regex_arg2_func_name(func_name, parg1, parg2_node->text,
|
||||
TYPE_INFER_STRING_FLOAT_INT);
|
||||
} else {
|
||||
// regexes can still be applied here, e.g. if the 2nd argument is a non-terminal AST: however
|
||||
// the regexes will be compiled record-by-record rather than once at alloc time, which will
|
||||
// be slower.
|
||||
lrec_evaluator_t* parg1 = lrec_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing, fcn_lookup_table);
|
||||
lrec_evaluator_t* parg2 = lrec_evaluator_alloc_from_ast_aux(parg2_node, type_inferencing, fcn_lookup_table);
|
||||
lrec_evaluator_t* parg1 = lrec_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
|
||||
fcn_lookup_table);
|
||||
lrec_evaluator_t* parg2 = lrec_evaluator_alloc_from_ast_aux(parg2_node, type_inferencing,
|
||||
fcn_lookup_table);
|
||||
pevaluator = lrec_evaluator_alloc_from_binary_func_name(func_name, parg1, parg2);
|
||||
}
|
||||
|
||||
|
|
@ -2409,14 +2417,19 @@ static lrec_evaluator_t* lrec_evaluator_alloc_from_ast_aux(mlr_dsl_ast_node_t* p
|
|||
|
||||
if ((streq(func_name, "sub") || streq(func_name, "gsub")) && type2 == MD_AST_NODE_TYPE_STRNUM_LITERAL) {
|
||||
// sub/gsub-regex special case:
|
||||
lrec_evaluator_t* parg1 = lrec_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing, fcn_lookup_table);
|
||||
lrec_evaluator_t* parg3 = lrec_evaluator_alloc_from_ast_aux(parg3_node, type_inferencing, fcn_lookup_table);
|
||||
pevaluator = lrec_evaluator_alloc_from_ternary_regex_arg2_func_name(func_name, parg1, parg2_node->text, FALSE, parg3);
|
||||
lrec_evaluator_t* parg1 = lrec_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
|
||||
fcn_lookup_table);
|
||||
lrec_evaluator_t* parg3 = lrec_evaluator_alloc_from_ast_aux(parg3_node, type_inferencing,
|
||||
fcn_lookup_table);
|
||||
pevaluator = lrec_evaluator_alloc_from_ternary_regex_arg2_func_name(func_name, parg1, parg2_node->text,
|
||||
FALSE, parg3);
|
||||
|
||||
} else if ((streq(func_name, "sub") || streq(func_name, "gsub")) && type2 == MD_AST_NODE_TYPE_REGEXI) {
|
||||
// sub/gsub-regex special case:
|
||||
lrec_evaluator_t* parg1 = lrec_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing, fcn_lookup_table);
|
||||
lrec_evaluator_t* parg3 = lrec_evaluator_alloc_from_ast_aux(parg3_node, type_inferencing, fcn_lookup_table);
|
||||
lrec_evaluator_t* parg1 = lrec_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
|
||||
fcn_lookup_table);
|
||||
lrec_evaluator_t* parg3 = lrec_evaluator_alloc_from_ast_aux(parg3_node, type_inferencing,
|
||||
fcn_lookup_table);
|
||||
pevaluator = lrec_evaluator_alloc_from_ternary_regex_arg2_func_name(func_name, parg1, parg2_node->text,
|
||||
TYPE_INFER_STRING_FLOAT_INT, parg3);
|
||||
|
||||
|
|
@ -2424,9 +2437,12 @@ static lrec_evaluator_t* lrec_evaluator_alloc_from_ast_aux(mlr_dsl_ast_node_t* p
|
|||
// regexes can still be applied here, e.g. if the 2nd argument is a non-terminal AST: however
|
||||
// the regexes will be compiled record-by-record rather than once at alloc time, which will
|
||||
// be slower.
|
||||
lrec_evaluator_t* parg1 = lrec_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing, fcn_lookup_table);
|
||||
lrec_evaluator_t* parg2 = lrec_evaluator_alloc_from_ast_aux(parg2_node, type_inferencing, fcn_lookup_table);
|
||||
lrec_evaluator_t* parg3 = lrec_evaluator_alloc_from_ast_aux(parg3_node, type_inferencing, fcn_lookup_table);
|
||||
lrec_evaluator_t* parg1 = lrec_evaluator_alloc_from_ast_aux(parg1_node, type_inferencing,
|
||||
fcn_lookup_table);
|
||||
lrec_evaluator_t* parg2 = lrec_evaluator_alloc_from_ast_aux(parg2_node, type_inferencing,
|
||||
fcn_lookup_table);
|
||||
lrec_evaluator_t* parg3 = lrec_evaluator_alloc_from_ast_aux(parg3_node, type_inferencing,
|
||||
fcn_lookup_table);
|
||||
pevaluator = lrec_evaluator_alloc_from_ternary_func_name(func_name, parg1, parg2, parg3);
|
||||
}
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -12101,9 +12101,9 @@ ABABBABBBA BBBBBB
|
|||
|
||||
|
||||
================================================================
|
||||
DSL EXPERIMENTAL OOSVARS
|
||||
DSL OOSVARS
|
||||
|
||||
mlr --opprint put -v begin @ox=0; $d=$x-@ox; @ox=$x ./reg_test/input/abixy
|
||||
mlr --opprint put -v begin{@ox=0}; $d=$x-@ox; @ox=$x ./reg_test/input/abixy
|
||||
AST BEGIN STATEMENTS (1):
|
||||
= (oosvar_assignment):
|
||||
ox (oosvar_name).
|
||||
|
|
@ -12130,7 +12130,7 @@ zee wye 8 0.5985540091064224 0.976181385699006 -0.013230
|
|||
hat wye 9 0.03144187646093577 0.7495507603507059 -0.567112
|
||||
pan wye 10 0.5026260055412137 0.9526183602969864 0.471184
|
||||
|
||||
mlr --opprint put -v begin @ox="no"; $d=@ox == "no" ? 1.0 : $x/@ox; @ox=$x then step -a ratio -f x ./reg_test/input/abixy
|
||||
mlr --opprint put -v begin{@ox="no"}; $d=@ox == "no" ? 1.0 : $x/@ox; @ox=$x then step -a ratio -f x ./reg_test/input/abixy
|
||||
AST BEGIN STATEMENTS (1):
|
||||
= (oosvar_assignment):
|
||||
ox (oosvar_name).
|
||||
|
|
@ -12186,7 +12186,7 @@ zee wye 8 0.5985540091064224 0.976181385699006 0.978375 0.978375
|
|||
hat wye 9 0.03144187646093577 0.7495507603507059 0.052530 0.052530
|
||||
pan wye 10 0.5026260055412137 0.9526183602969864 15.985878 15.985878
|
||||
|
||||
mlr --opprint put -v begin @ox="no"; $d=@ox == "no" ? 1.0 : $x/@ox; @ox=$x then step -a ratio -f x ./reg_test/input/abixy
|
||||
mlr --opprint put -v begin{@ox="no"}; $d=@ox == "no" ? 1.0 : $x/@ox; @ox=$x then step -a ratio -f x ./reg_test/input/abixy
|
||||
AST BEGIN STATEMENTS (1):
|
||||
= (oosvar_assignment):
|
||||
ox (oosvar_name).
|
||||
|
|
@ -12218,7 +12218,7 @@ zee wye 8 0.5985540091064224 0.976181385699006 0.978375 0.978375
|
|||
hat wye 9 0.03144187646093577 0.7495507603507059 0.052530 0.052530
|
||||
pan wye 10 0.5026260055412137 0.9526183602969864 15.985878 15.985878
|
||||
|
||||
mlr --opprint put -v begin @rsum = 0; @rsum = @rsum + $x; $rsum = @rsum ./reg_test/input/abixy
|
||||
mlr --opprint put -v begin{@rsum = 0}; @rsum = @rsum + $x; $rsum = @rsum ./reg_test/input/abixy
|
||||
AST BEGIN STATEMENTS (1):
|
||||
= (oosvar_assignment):
|
||||
rsum (oosvar_name).
|
||||
|
|
@ -12245,7 +12245,7 @@ zee wye 8 0.5985540091064224 0.976181385699006 4.002226
|
|||
hat wye 9 0.03144187646093577 0.7495507603507059 4.033668
|
||||
pan wye 10 0.5026260055412137 0.9526183602969864 4.536294
|
||||
|
||||
mlr --opprint put -v begin @a=0; begin @b=0; begin @c=0; $za=@a; $zb=@b; $zc=@c; $d=@a+@b+@c; @a=@b; @b=@c; @c=$i ./reg_test/input/abixy
|
||||
mlr --opprint put -v begin{@a=0; @b=0; @c=0}; $za=@a; $zb=@b; $zc=@c; $d=@a+@b+@c; @a=@b; @b=@c; @c=$i ./reg_test/input/abixy
|
||||
AST BEGIN STATEMENTS (3):
|
||||
= (oosvar_assignment):
|
||||
a (oosvar_name).
|
||||
|
|
@ -12345,7 +12345,7 @@ zee wye 8 0.5985540091064224 0.976181385699006 5 6 7 18
|
|||
hat wye 9 0.03144187646093577 0.7495507603507059 6 7 8 21
|
||||
pan wye 10 0.5026260055412137 0.9526183602969864 7 8 9 24
|
||||
|
||||
mlr --opprint put -v begin @ox=0; $d=$x-@ox; @ox=$x ./reg_test/input/abixy
|
||||
mlr --opprint put -v begin{@ox=0}; $d=$x-@ox; @ox=$x ./reg_test/input/abixy
|
||||
AST BEGIN STATEMENTS (1):
|
||||
= (oosvar_assignment):
|
||||
ox (oosvar_name).
|
||||
|
|
@ -12405,7 +12405,7 @@ a=pan
|
|||
b=wye
|
||||
c=0.502626
|
||||
|
||||
mlr put -v @a=$a; @b=$b; @c=$x; end emit @a, @b, @c ./reg_test/input/abixy
|
||||
mlr put -v @a=$a; @b=$b; @c=$x; end{emit @a, @b, @c} ./reg_test/input/abixy
|
||||
AST BEGIN STATEMENTS (0):
|
||||
AST MAIN STATEMENTS (3):
|
||||
= (oosvar_assignment):
|
||||
|
|
@ -12518,7 +12518,7 @@ pan wye 10 0.5026260055412137 0.9526183602969864
|
|||
mean
|
||||
0.453629
|
||||
|
||||
mlr put -v begin{ @a = @b[1] }; $c = @d; @e[$i][2+$j][3] = $4; end @f[@g[5][@h]] = 6 /dev/null
|
||||
mlr put -v begin{ @a = @b[1] }; $c = @d; @e[$i][2+$j][3] = $4; end{@f[@g[5][@h]] = 6} /dev/null
|
||||
AST BEGIN STATEMENTS (1):
|
||||
= (oosvar_assignment):
|
||||
a (oosvar_name).
|
||||
|
|
@ -12551,7 +12551,7 @@ AST END STATEMENTS (1):
|
|||
h (oosvar_name).
|
||||
6 (strnum_literal).
|
||||
|
||||
mlr put @y[$a]=$y; end dump ./reg_test/input/abixy
|
||||
mlr put @y[$a]=$y; end{dump} ./reg_test/input/abixy
|
||||
a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533
|
||||
a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797
|
||||
a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776
|
||||
|
|
@ -12579,7 +12579,7 @@ a=wye,y_sum=1.201943
|
|||
a=zee,y_sum=1.469403
|
||||
a=hat,y_sum=0.749551
|
||||
|
||||
mlr put @y_sum[$a] = $y; end dump ./reg_test/input/abixy
|
||||
mlr put @y_sum[$a] = $y; end{dump} ./reg_test/input/abixy
|
||||
a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533
|
||||
a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797
|
||||
a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776
|
||||
|
|
@ -12601,6 +12601,167 @@ a=pan,b=wye,i=10,x=0.5026260055412137,y=0.9526183602969864
|
|||
}
|
||||
|
||||
|
||||
================================================================
|
||||
DSL PATTERN-ACTION BLOCKS
|
||||
|
||||
mlr put -v begin{@a=1}; $e=2; $f==$g||$h==$i {}; $x=6; end{@z=9} /dev/null
|
||||
AST BEGIN STATEMENTS (1):
|
||||
= (oosvar_assignment):
|
||||
a (oosvar_name).
|
||||
1 (strnum_literal).
|
||||
AST MAIN STATEMENTS (3):
|
||||
= (srec_assignment):
|
||||
e (field_name).
|
||||
2 (strnum_literal).
|
||||
cond (conditional_block):
|
||||
|| (operator):
|
||||
== (operator):
|
||||
f (field_name).
|
||||
g (field_name).
|
||||
== (operator):
|
||||
h (field_name).
|
||||
i (field_name).
|
||||
= (srec_assignment):
|
||||
x (field_name).
|
||||
6 (strnum_literal).
|
||||
AST END STATEMENTS (1):
|
||||
= (oosvar_assignment):
|
||||
z (oosvar_name).
|
||||
9 (strnum_literal).
|
||||
|
||||
mlr put -v begin{@a=1}; $e=2; $f==$g||$h==$i {$s=1}; $x=6; end{@z=9} /dev/null
|
||||
AST BEGIN STATEMENTS (1):
|
||||
= (oosvar_assignment):
|
||||
a (oosvar_name).
|
||||
1 (strnum_literal).
|
||||
AST MAIN STATEMENTS (3):
|
||||
= (srec_assignment):
|
||||
e (field_name).
|
||||
2 (strnum_literal).
|
||||
cond (conditional_block):
|
||||
|| (operator):
|
||||
== (operator):
|
||||
f (field_name).
|
||||
g (field_name).
|
||||
== (operator):
|
||||
h (field_name).
|
||||
i (field_name).
|
||||
= (srec_assignment):
|
||||
s (field_name).
|
||||
1 (strnum_literal).
|
||||
= (srec_assignment):
|
||||
x (field_name).
|
||||
6 (strnum_literal).
|
||||
AST END STATEMENTS (1):
|
||||
= (oosvar_assignment):
|
||||
z (oosvar_name).
|
||||
9 (strnum_literal).
|
||||
|
||||
mlr put -v begin{@a=1}; $e=2; $f==$g||$h==$i {$s=1;$t=2}; $x=6; end{@z=9} /dev/null
|
||||
AST BEGIN STATEMENTS (1):
|
||||
= (oosvar_assignment):
|
||||
a (oosvar_name).
|
||||
1 (strnum_literal).
|
||||
AST MAIN STATEMENTS (3):
|
||||
= (srec_assignment):
|
||||
e (field_name).
|
||||
2 (strnum_literal).
|
||||
cond (conditional_block):
|
||||
|| (operator):
|
||||
== (operator):
|
||||
f (field_name).
|
||||
g (field_name).
|
||||
== (operator):
|
||||
h (field_name).
|
||||
i (field_name).
|
||||
= (srec_assignment):
|
||||
s (field_name).
|
||||
1 (strnum_literal).
|
||||
= (srec_assignment):
|
||||
t (field_name).
|
||||
2 (strnum_literal).
|
||||
= (srec_assignment):
|
||||
x (field_name).
|
||||
6 (strnum_literal).
|
||||
AST END STATEMENTS (1):
|
||||
= (oosvar_assignment):
|
||||
z (oosvar_name).
|
||||
9 (strnum_literal).
|
||||
|
||||
mlr put -v begin{@a=1}; $e=2; $f==$g||$h==$i {$s=1;$t=2;$u=3}; $x=6; end{@z=9} /dev/null
|
||||
AST BEGIN STATEMENTS (1):
|
||||
= (oosvar_assignment):
|
||||
a (oosvar_name).
|
||||
1 (strnum_literal).
|
||||
AST MAIN STATEMENTS (3):
|
||||
= (srec_assignment):
|
||||
e (field_name).
|
||||
2 (strnum_literal).
|
||||
cond (conditional_block):
|
||||
|| (operator):
|
||||
== (operator):
|
||||
f (field_name).
|
||||
g (field_name).
|
||||
== (operator):
|
||||
h (field_name).
|
||||
i (field_name).
|
||||
= (srec_assignment):
|
||||
s (field_name).
|
||||
1 (strnum_literal).
|
||||
= (srec_assignment):
|
||||
t (field_name).
|
||||
2 (strnum_literal).
|
||||
= (srec_assignment):
|
||||
u (field_name).
|
||||
3 (strnum_literal).
|
||||
= (srec_assignment):
|
||||
x (field_name).
|
||||
6 (strnum_literal).
|
||||
AST END STATEMENTS (1):
|
||||
= (oosvar_assignment):
|
||||
z (oosvar_name).
|
||||
9 (strnum_literal).
|
||||
|
||||
mlr put -v begin{@a=1}; $e=2; $f==$g||$h==$i {$s=1;@t["u".$5]=2;emit @v,@w;dump}; $x=6; end{@z=9} /dev/null
|
||||
AST BEGIN STATEMENTS (1):
|
||||
= (oosvar_assignment):
|
||||
a (oosvar_name).
|
||||
1 (strnum_literal).
|
||||
AST MAIN STATEMENTS (3):
|
||||
= (srec_assignment):
|
||||
e (field_name).
|
||||
2 (strnum_literal).
|
||||
cond (conditional_block):
|
||||
|| (operator):
|
||||
== (operator):
|
||||
f (field_name).
|
||||
g (field_name).
|
||||
== (operator):
|
||||
h (field_name).
|
||||
i (field_name).
|
||||
= (srec_assignment):
|
||||
s (field_name).
|
||||
1 (strnum_literal).
|
||||
= (oosvar_assignment):
|
||||
[] (oosvar_level_key):
|
||||
t (oosvar_name).
|
||||
. (operator):
|
||||
u (strnum_literal).
|
||||
5 (field_name).
|
||||
2 (strnum_literal).
|
||||
emit (emit):
|
||||
v (oosvar_name).
|
||||
w (oosvar_name).
|
||||
dump (dump):
|
||||
= (srec_assignment):
|
||||
x (field_name).
|
||||
6 (strnum_literal).
|
||||
AST END STATEMENTS (1):
|
||||
= (oosvar_assignment):
|
||||
z (oosvar_name).
|
||||
9 (strnum_literal).
|
||||
|
||||
|
||||
================================================================
|
||||
CHAINING
|
||||
|
||||
|
|
|
|||
|
|
@ -1194,7 +1194,7 @@ run_mlr --opprint put '$y = gsub($x, "a"i, "")' $indir/gsub.dat
|
|||
run_mlr --opprint put '$y = gsub($x, "A"i, "")' $indir/gsub.dat
|
||||
|
||||
# ----------------------------------------------------------------
|
||||
announce DSL EXPERIMENTAL OOSVARS
|
||||
announce DSL OOSVARS
|
||||
|
||||
run_mlr --opprint put -v 'begin{@ox=0}; $d=$x-@ox; @ox=$x' $indir/abixy
|
||||
run_mlr --opprint put -v 'begin{@ox="no"}; $d=@ox == "no" ? 1.0 : $x/@ox; @ox=$x' then step -a ratio -f x $indir/abixy
|
||||
|
|
@ -1218,6 +1218,15 @@ run_mlr put '@y[$a]=$y; end{dump}' $indir/abixy
|
|||
run_mlr stats1 -a sum -f y -g a $indir/abixy
|
||||
run_mlr put '@y_sum[$a] = $y; end{dump}' $indir/abixy
|
||||
|
||||
# ----------------------------------------------------------------
|
||||
announce DSL PATTERN-ACTION BLOCKS
|
||||
|
||||
run_mlr put -v 'begin{@a=1}; $e=2; $f==$g||$h==$i {}; $x=6; end{@z=9}' /dev/null
|
||||
run_mlr put -v 'begin{@a=1}; $e=2; $f==$g||$h==$i {$s=1}; $x=6; end{@z=9}' /dev/null
|
||||
run_mlr put -v 'begin{@a=1}; $e=2; $f==$g||$h==$i {$s=1;$t=2}; $x=6; end{@z=9}' /dev/null
|
||||
run_mlr put -v 'begin{@a=1}; $e=2; $f==$g||$h==$i {$s=1;$t=2;$u=3}; $x=6; end{@z=9}' /dev/null
|
||||
run_mlr put -v 'begin{@a=1}; $e=2; $f==$g||$h==$i {$s=1;@t["u".$5]=2;emit @v,@w;dump}; $x=6; end{@z=9}' /dev/null
|
||||
|
||||
# ----------------------------------------------------------------
|
||||
announce CHAINING
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue