bitwise precedence fix for filter

This commit is contained in:
John Kerl 2015-11-13 20:53:50 -05:00
parent 22988bfc65
commit 364504e95e
2 changed files with 75 additions and 47 deletions

View file

@ -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);
}

View file

@ -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