summaryrefslogtreecommitdiffstats
path: root/src/parser.y
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2014-02-17 19:43:36 +0000
committerPatrick McHardy <kaber@trash.net>2014-03-07 11:02:32 +0100
commit35a2eedd27b45b6e94bde342cabe64ed34c14a95 (patch)
tree60997a4930cf9837e42d1cd5669041151d953e1a /src/parser.y
parent8ad2f12a68e0e1304ec29fac274c0a0165915e2c (diff)
parser: add grammatical distinction for verdict maps
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>
Diffstat (limited to 'src/parser.y')
-rw-r--r--src/parser.y52
1 files changed, 39 insertions, 13 deletions
diff --git a/src/parser.y b/src/parser.y
index dd09fb44..0d97ae98 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -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