From e5e7dfe321f4b50fefcd30de8f98ccf7ef583a10 Mon Sep 17 00:00:00 2001 From: John Kerl Date: Mon, 21 Mar 2016 23:08:05 -0400 Subject: [PATCH] pattern-action blocks within begin/end --- c/dsls/mlr_dsl_parse.y | 21 +++++++++++++++++---- c/reg_test/run | 1 + 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/c/dsls/mlr_dsl_parse.y b/c/dsls/mlr_dsl_parse.y index ea176d57e..8467cbe99 100644 --- a/c/dsls/mlr_dsl_parse.y +++ b/c/dsls/mlr_dsl_parse.y @@ -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); diff --git a/c/reg_test/run b/c/reg_test/run index 7c91237cf..0467f9e94 100755 --- a/c/reg_test/run +++ b/c/reg_test/run @@ -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