]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
parser: add grammatical distinction for verdict maps
authorPatrick McHardy <kaber@trash.net>
Mon, 17 Feb 2014 19:43:36 +0000 (19:43 +0000)
committerPatrick McHardy <kaber@trash.net>
Fri, 7 Mar 2014 10:02:32 +0000 (11:02 +0100)
Currently the parser accepts verdicts in regular maps and non-verdicts
in verdict maps and we have to check matching types during evaluation.
Add grammar rules for verdict maps and seperate them from regular maps.
This has a couple of advantages:

- We recognize verdict maps completely in the parser and any attempt to
  mix verdicts and other expressions will result in a syntax error.
  So far this hasn't actually been checked.

- Using verdicts in non-verdict mappings will also result in a syntax
  error instead of a datatype mismatch.

- There's a grammatical distinction between dictionaries and verdict
  maps, which are actually statements.

This is needed as preparation for a following patch to turn verdicts
into pure statements, which in turn is needed to reinstate support for
using the queue verdict in maps, which was broken by the introduction
of the queue statement.

Signed-off-by: Patrick McHardy <kaber@trash.net>
src/parser.y

index dd09fb44694b9fc79cba19b003b08ec0aa32423a..0d97ae98c596d2ded14ca188ded28d6878e00bd7 100644 (file)
@@ -428,8 +428,11 @@ static void location_update(struct location *loc, struct location *rhs, int n)
 %type <expr>                   map_expr
 %destructor { expr_free($$); } map_expr
 
-%type <expr>                   verdict_map_expr
-%destructor { expr_free($$); } verdict_map_expr
+%type <expr>                   verdict_map_stmt
+%destructor { expr_free($$); } verdict_map_stmt
+
+%type <expr>                   verdict_map_expr verdict_map_list_expr verdict_map_list_member_expr
+%destructor { expr_free($$); } verdict_map_expr verdict_map_list_expr verdict_map_list_member_expr
 
 %type <expr>                   set_expr set_list_expr set_list_member_expr
 %destructor { expr_free($$); } set_expr set_list_expr set_list_member_expr
@@ -1072,12 +1075,45 @@ verdict_stmt            :       verdict_expr
                        {
                                $$ = verdict_stmt_alloc(&@$, $1);
                        }
-                       |       verdict_map_expr
+                       |       verdict_map_stmt
                        {
                                $$ = verdict_stmt_alloc(&@$, $1);
                        }
                        ;
 
+verdict_map_stmt       :       concat_expr     VMAP    verdict_map_expr
+                       {
+                               $$ = map_expr_alloc(&@$, $1, $3);
+                       }
+                       ;
+
+verdict_map_expr       :       '{'     verdict_map_list_expr   '}'
+                       {
+                               $2->location = @$;
+                               $$ = $2;
+                       }
+                       ;
+
+verdict_map_list_expr  :       verdict_map_list_member_expr
+                       {
+                               $$ = set_expr_alloc(&@$);
+                               compound_expr_add($$, $1);
+                       }
+                       |       verdict_map_list_expr   COMMA   verdict_map_list_member_expr
+                       {
+                               compound_expr_add($1, $3);
+                               $$ = $1;
+                       }
+                       |       verdict_map_list_expr   COMMA   opt_newline
+                       ;
+
+verdict_map_list_member_expr:  opt_newline     map_lhs_expr    COLON   verdict_expr    opt_newline
+                       {
+                               $$ = mapping_expr_alloc(&@$, $2, $4);
+                       }
+                       ;
+
+
 counter_stmt           :       counter_stmt_alloc
                        |       counter_stmt_alloc      counter_args
 
@@ -1404,12 +1440,6 @@ map_expr         :       concat_expr     MAP     expr
                        }
                        ;
 
-verdict_map_expr       :       concat_expr     VMAP    expr
-                       {
-                               $$ = map_expr_alloc(&@$, $1, $3);
-                       }
-                       ;
-
 expr                   :       concat_expr
                        |       set_expr
                        |       map_expr
@@ -1444,10 +1474,6 @@ set_list_member_expr     :       opt_newline     expr    opt_newline
                        {
                                $$ = mapping_expr_alloc(&@$, $2, $4);
                        }
-                       |       opt_newline     map_lhs_expr    COLON   verdict_expr    opt_newline
-                       {
-                               $$ = mapping_expr_alloc(&@$, $2, $4);
-                       }
                        ;
 
 initializer_expr       :       expr