From 364504e95e50fafec88cb3e0cb42f0cc9bf92a1a Mon Sep 17 00:00:00 2001 From: John Kerl Date: Fri, 13 Nov 2015 20:53:50 -0500 Subject: [PATCH] bitwise precedence fix for filter --- c/dsls/filter_dsl_parse.y | 91 ++++++++++++++++++++------------------- c/todo.txt | 31 +++++++++++-- 2 files changed, 75 insertions(+), 47 deletions(-) diff --git a/c/dsls/filter_dsl_parse.y b/c/dsls/filter_dsl_parse.y index fad3f5968..c9080f6f6 100644 --- a/c/dsls/filter_dsl_parse.y +++ b/c/dsls/filter_dsl_parse.y @@ -43,6 +43,7 @@ filter_dsl_body(A) ::= filter_dsl_bool_expr(B). { past->proot = A; } +// ---------------------------------------------------------------- filter_dsl_bool_expr(A) ::= filter_dsl_or_term(B). { A = B; } @@ -50,6 +51,7 @@ filter_dsl_bool_expr(A) ::= filter_dsl_bool_expr(B) FILTER_DSL_OR(O) filter_dsl_ 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). { A = B; } @@ -57,15 +59,49 @@ filter_dsl_or_term(A) ::= filter_dsl_or_term(B) FILTER_DSL_AND(O) filter_dsl_and A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); } - -filter_dsl_and_term(A) ::= filter_dsl_bit_or_term(B). { +// ---------------------------------------------------------------- +filter_dsl_and_term(A) ::= filter_dsl_eqne_term(B). { A = B; } -filter_dsl_and_term(A) ::= filter_dsl_and_term(B) FILTER_DSL_BIT_OR(O) filter_dsl_bit_or_term(C). { +filter_dsl_and_term(A) ::= filter_dsl_and_term(B) FILTER_DSL_MATCHES(O) filter_dsl_eqne_term(C). { + A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); +} +filter_dsl_and_term(A) ::= filter_dsl_and_term(B) FILTER_DSL_DOES_NOT_MATCH(O) filter_dsl_eqne_term(C). { + A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); +} +filter_dsl_and_term(A) ::= filter_dsl_and_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); +} +filter_dsl_and_term(A) ::= filter_dsl_and_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); } +// ---------------------------------------------------------------- +filter_dsl_eqne_term(A) ::= filter_dsl_cmp_term(B). { + A = B; +} +filter_dsl_eqne_term(A) ::= filter_dsl_eqne_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); +} +filter_dsl_eqne_term(A) ::= filter_dsl_eqne_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); +} +filter_dsl_eqne_term(A) ::= filter_dsl_eqne_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); +} +filter_dsl_eqne_term(A) ::= filter_dsl_eqne_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); +} +// ---------------------------------------------------------------- +filter_dsl_cmp_term(A) ::= filter_dsl_bit_or_term(B). { + A = B; +} +filter_dsl_cmp_term(A) ::= filter_dsl_cmp_term(B) FILTER_DSL_BIT_OR(O) filter_dsl_bit_or_term(C). { + A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); +} + +// ---------------------------------------------------------------- filter_dsl_bit_or_term(A) ::= filter_dsl_bit_xor_term(B). { A = B; } @@ -73,6 +109,7 @@ filter_dsl_bit_or_term(A) ::= filter_dsl_bit_or_term(B) FILTER_DSL_BIT_XOR(O) fi A = mlr_dsl_ast_node_alloc_binary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, B, C); } +// ---------------------------------------------------------------- filter_dsl_bit_xor_term(A) ::= filter_dsl_bit_and_term(B). { A = B; } @@ -81,50 +118,16 @@ filter_dsl_bit_xor_term(A) ::= filter_dsl_bit_xor_term(B) FILTER_DSL_BIT_AND(O) } // ---------------------------------------------------------------- -filter_dsl_bit_and_term(A) ::= filter_dsl_eqne_term(B). { +filter_dsl_bit_and_term(A) ::= filter_dsl_pmdot_term(B). { A = B; } -filter_dsl_bit_and_term(A) ::= filter_dsl_eqne_term(B) FILTER_DSL_MATCHES(O) filter_dsl_eqne_term(C). { +filter_dsl_bit_and_term(A) ::= filter_dsl_bit_and_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); } -filter_dsl_bit_and_term(A) ::= filter_dsl_eqne_term(B) FILTER_DSL_DOES_NOT_MATCH(O) filter_dsl_eqne_term(C). { +filter_dsl_bit_and_term(A) ::= filter_dsl_bit_and_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); } -filter_dsl_bit_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); -} -filter_dsl_bit_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); -} - -// ---------------------------------------------------------------- -filter_dsl_eqne_term(A) ::= filter_dsl_cmp_term(B). { - 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); -} -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); -} -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); -} -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); -} - -// ---------------------------------------------------------------- -filter_dsl_cmp_term(A) ::= filter_dsl_pmdot_term(B). { - A = B; -} -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); -} -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); -} -filter_dsl_cmp_term(A) ::= filter_dsl_cmp_term(B) FILTER_DSL_DOT(O) filter_dsl_pmdot_term(C). { +filter_dsl_bit_and_term(A) ::= filter_dsl_bit_and_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); } @@ -149,13 +152,13 @@ filter_dsl_pmdot_term(A) ::= filter_dsl_pmdot_term(B) FILTER_DSL_MOD(O) filter_d filter_dsl_muldiv_term(A) ::= filter_dsl_unary_term(B). { A = B; } -filter_dsl_muldiv_term(A) ::= FILTER_DSL_PLUS(O) filter_dsl_muldiv_term(C). { +filter_dsl_muldiv_term(A) ::= FILTER_DSL_PLUS(O) filter_dsl_unary_term(C). { A = mlr_dsl_ast_node_alloc_unary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, C); } -filter_dsl_muldiv_term(A) ::= FILTER_DSL_MINUS(O) filter_dsl_muldiv_term(C). { +filter_dsl_muldiv_term(A) ::= FILTER_DSL_MINUS(O) filter_dsl_unary_term(C). { A = mlr_dsl_ast_node_alloc_unary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, C); } -filter_dsl_muldiv_term(A) ::= FILTER_DSL_NOT(O) filter_dsl_muldiv_term(C). { +filter_dsl_muldiv_term(A) ::= FILTER_DSL_NOT(O) filter_dsl_unary_term(C). { A = mlr_dsl_ast_node_alloc_unary(O->text, MLR_DSL_AST_NODE_TYPE_OPERATOR, C); } diff --git a/c/todo.txt b/c/todo.txt index d37961927..df8f0f71c 100644 --- a/c/todo.txt +++ b/c/todo.txt @@ -24,13 +24,17 @@ TOP OF LIST http://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html. o expanded UTs x all of the above. lncl. ./tmod o sgn function needs UT cases + o bitops UTs x put/filter + o >>, <<, ~ o urandint -> w/urand @ mlr -h, mld, etc. + o bitops filter faqent / online help: filter '0 != $x | $y' vs. filter '0 != ($x | $y)' + ... or change the precedence :) - o now is a good time to look at bitops. first get the precedence right. - +OLD * mlr doc precedence: Operators Associativity --------- ------------- + = N/A for Miller (no $a=$b=$c) || left to right && left to right | left to right @@ -39,11 +43,32 @@ TOP OF LIST == != left to right < <= > >= left to right << >> left to right - binary+ binary- left to right + binary+ binary- . left to right binary* / % left to right ! ~ ++ -- unary+ unary- & right to left () left to right +NEW +* mlr doc precedence: + Operators Associativity + --------- ------------- + = N/A for Miller (no $a=$b=$c) + || left to right + && left to right + == != left to right + < <= > >= left to right + | left to right + ^ left to right + & left to right + << >> left to right + binary+ binary- . left to right + binary* / % left to right + ! ~ ++ -- unary+ unary- & right to left + () left to right + +-> put in dot & other mlr operators +-> stack the bitwise precedences + * packaging: - brew version bump?!? - cut a release w/ manpage