diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2015-12-29 17:21:24 +0100 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2016-01-03 20:53:37 +0100 |
commit | d169f38458f787f92ed2ede40ae93275108f6b34 (patch) | |
tree | 51574003fd601c69a3d8a6b1afd66575dc74a811 /src/parser_bison.y | |
parent | 6b59db6c6c302dcc527a84a67cb563b237dd6900 (diff) |
parser: restore bitwise operations from the rhs of relational expressions
Reintroduce bitwise operation on constants that was removed in ("parser:
restrict relational rhs expression recursion") since we support this
since the beginning.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'src/parser_bison.y')
-rw-r--r-- | src/parser_bison.y | 47 |
1 files changed, 41 insertions, 6 deletions
diff --git a/src/parser_bison.y b/src/parser_bison.y index 9f75abe7..af51e4dd 100644 --- a/src/parser_bison.y +++ b/src/parser_bison.y @@ -514,8 +514,11 @@ static void location_update(struct location *loc, struct location *rhs, int n) %type <expr> rhs_expr concat_rhs_expr basic_rhs_expr %destructor { expr_free($$); } rhs_expr concat_rhs_expr basic_rhs_expr -%type <expr> primary_rhs_expr list_rhs_expr -%destructor { expr_free($$); } primary_rhs_expr list_rhs_expr +%type <expr> primary_rhs_expr list_rhs_expr shift_rhs_expr +%destructor { expr_free($$); } primary_rhs_expr list_rhs_expr shift_rhs_expr +%type <expr> and_rhs_expr exclusive_or_rhs_expr inclusive_or_rhs_expr +%destructor { expr_free($$); } and_rhs_expr exclusive_or_rhs_expr inclusive_or_rhs_expr + %type <expr> relational_expr %destructor { expr_free($$); } relational_expr @@ -2010,7 +2013,42 @@ rhs_expr : concat_rhs_expr { $$ = $1; } | set_expr { $$ = $1; } ; -concat_rhs_expr : basic_rhs_expr { $$ = $1; } +shift_rhs_expr : primary_rhs_expr + | shift_rhs_expr LSHIFT primary_rhs_expr + { + $$ = binop_expr_alloc(&@$, OP_LSHIFT, $1, $3); + } + | shift_rhs_expr RSHIFT primary_rhs_expr + { + $$ = binop_expr_alloc(&@$, OP_RSHIFT, $1, $3); + } + ; + +and_rhs_expr : shift_rhs_expr + | and_rhs_expr AMPERSAND shift_rhs_expr + { + $$ = binop_expr_alloc(&@$, OP_AND, $1, $3); + } + ; + +exclusive_or_rhs_expr : and_rhs_expr + | exclusive_or_rhs_expr CARET and_rhs_expr + { + $$ = binop_expr_alloc(&@$, OP_XOR, $1, $3); + } + ; + +inclusive_or_rhs_expr : exclusive_or_rhs_expr + | inclusive_or_rhs_expr '|' exclusive_or_rhs_expr + { + $$ = binop_expr_alloc(&@$, OP_OR, $1, $3); + } + ; + +basic_rhs_expr : inclusive_or_rhs_expr + ; + +concat_rhs_expr : basic_rhs_expr | concat_rhs_expr DOT basic_rhs_expr { if ($$->ops->type != EXPR_CONCAT) { @@ -2030,9 +2068,6 @@ concat_rhs_expr : basic_rhs_expr { $$ = $1; } } ; -basic_rhs_expr : primary_rhs_expr { $$ = $1; } - ; - primary_rhs_expr : symbol_expr { $$ = $1; } | integer_expr { $$ = $1; } | ETHER |