pattern-action blocks within begin/end

This commit is contained in:
John Kerl 2016-03-21 23:08:05 -04:00
parent 4ec448a401
commit e5e7dfe321
2 changed files with 18 additions and 4 deletions

View file

@ -57,9 +57,9 @@ md_statement ::= md_main_emitf.
md_statement ::= md_main_emit.
md_statement ::= md_main_dump.
md_statement ::= md_begin_block. // E.g. 'begin { @count = 0 }'
md_statement ::= md_cond_block. // e.g. '$x > 0 { $y = log10($x); $z = $y ** 2 }'
md_statement ::= md_end_block. // E.g. 'end { emit @count }'
md_statement ::= md_begin_block. // E.g. 'begin { @count = 0 }'
md_statement ::= md_main_cond_block. // E.g. '$x > 0 { $y = log10($x); $z = $y ** 2 }'
md_statement ::= md_end_block. // E.g. 'end { emit @count }'
// ================================================================
// This looks redundant to the above, but it avoids having pathologies such as nested 'begin { begin { ... } }'.
@ -74,6 +74,7 @@ md_begin_block_statement ::= .
md_begin_block_statement ::= md_begin_block_oosvar_assignment.
md_begin_block_statement ::= md_begin_block_bare_boolean.
md_begin_block_statement ::= md_begin_block_filter.
md_begin_block_statement ::= md_begin_block_cond_block.
md_begin_block_statement ::= md_begin_block_unset.
md_begin_block_statement ::= md_begin_block_emitf.
md_begin_block_statement ::= md_begin_block_emit.
@ -90,6 +91,7 @@ md_end_block_statement ::= .
md_end_block_statement ::= md_end_block_oosvar_assignment.
md_end_block_statement ::= md_end_block_bare_boolean.
md_end_block_statement ::= md_end_block_filter.
md_end_block_statement ::= md_end_block_cond_block.
md_end_block_statement ::= md_end_block_unset.
md_end_block_statement ::= md_end_block_emitf.
md_end_block_statement ::= md_end_block_emit.
@ -98,7 +100,6 @@ md_end_block_statement ::= md_end_block_dump.
// ----------------------------------------------------------------
md_cond_block(A) ::= md_rhs(B) MD_TOKEN_LEFT_BRACE md_cond_block_statements(C) MD_TOKEN_RIGHT_BRACE . {
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",
@ -155,6 +156,10 @@ md_main_filter(A) ::= MD_TOKEN_FILTER(O) md_rhs(B). {
A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILTER, B);
sllv_append(past->pmain_statements, A);
}
md_main_cond_block(A) ::= md_cond_block(B). {
A = B;
sllv_append(past->pmain_statements, A);
}
md_main_unset(A) ::= md_unset(B). {
A = B;
sllv_append(past->pmain_statements, A);
@ -187,6 +192,10 @@ md_begin_block_filter(A) ::= MD_TOKEN_FILTER(O) md_rhs(B). {
A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILTER, B);
sllv_append(past->pbegin_statements, A);
}
md_begin_block_cond_block(A) ::= md_cond_block(B). {
A = B;
sllv_append(past->pbegin_statements, A);
}
md_begin_block_unset(A) ::= md_unset(B). {
A = B;
sllv_append(past->pbegin_statements, A);
@ -242,6 +251,10 @@ md_end_block_filter(A) ::= MD_TOKEN_FILTER(O) md_rhs(B). {
A = mlr_dsl_ast_node_alloc_unary(O->text, MD_AST_NODE_TYPE_FILTER, B);
sllv_append(past->pend_statements, A);
}
md_end_block_cond_block(A) ::= md_cond_block(B). {
A = B;
sllv_append(past->pend_statements, A);
}
md_end_block_unset(A) ::= md_unset(B). {
A = B;
sllv_append(past->pend_statements, A);

View file

@ -1289,6 +1289,7 @@ run_mlr put -v 'begin{@a=1}; $e=2; $f==$g||$h==$i {$s=1}; $x=6; end{@z
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;emitf @v,@w;dump}; $x=6; end{@z=9}' /dev/null
run_mlr put -v 'begin{true{@x=1}}; true{@x=2}; end{true{@x=3}}' /dev/null
# ----------------------------------------------------------------
announce TRI-SPLIT NULL