summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2015-04-12 10:41:56 +0100
committerPatrick McHardy <kaber@trash.net>2015-04-12 19:59:27 +0100
commit6aa18b5216a34a2cd29ad4a1997c37f705f76247 (patch)
treeb1b333844321906894687a6de0e06ea0811eaddb
parent48587aa855a5173b4b1e94290af885000dbd679e (diff)
parser: fix inconsistencies in set expression rules
Set keys are currently defined as a regular expr for pure sets and map_lhs_expr for maps. map_lhs_expr is what can actually be used for a single member, namely a concat_expr or a multiton_expr. The reason why pure sets use expr for the key is to allow recursive set specifications, which doesn't make sense for maps since every element needs a mapping. However, the rule is too wide and also allows map expressions as a key, which obviously doesn't make sense. Rearrange the rules so we have: set_lhs_expr: concat or multiton set_rhs_expr: concat or verdict and special case the recursive set specifications, as they deserve. Besides making it a lot easier to understand what is actually supported, this will be used by the following patch to support timeouts and comments for keys in a uniform way. Signed-off-by: Patrick McHardy <kaber@trash.net>
-rw-r--r--src/parser_bison.y31
1 files changed, 18 insertions, 13 deletions
diff --git a/src/parser_bison.y b/src/parser_bison.y
index cd4e096a..c934533d 100644
--- a/src/parser_bison.y
+++ b/src/parser_bison.y
@@ -470,8 +470,8 @@ static void location_update(struct location *loc, struct location *rhs, int n)
%destructor { expr_free($$); } prefix_expr range_expr wildcard_expr
%type <expr> list_expr
%destructor { expr_free($$); } list_expr
-%type <expr> concat_expr map_lhs_expr
-%destructor { expr_free($$); } concat_expr map_lhs_expr
+%type <expr> concat_expr
+%destructor { expr_free($$); } concat_expr
%type <expr> map_expr
%destructor { expr_free($$); } map_expr
@@ -484,6 +484,8 @@ static void location_update(struct location *loc, struct location *rhs, int n)
%type <expr> set_expr set_list_expr set_list_member_expr
%destructor { expr_free($$); } set_expr set_list_expr set_list_member_expr
+%type <expr> set_lhs_expr set_rhs_expr
+%destructor { expr_free($$); } set_lhs_expr set_rhs_expr
%type <expr> expr initializer_expr
%destructor { expr_free($$); } expr initializer_expr
@@ -1297,13 +1299,12 @@ verdict_map_list_expr : verdict_map_list_member_expr
| verdict_map_list_expr COMMA opt_newline
;
-verdict_map_list_member_expr: opt_newline map_lhs_expr COLON verdict_expr opt_newline
+verdict_map_list_member_expr: opt_newline set_lhs_expr COLON verdict_expr opt_newline
{
$$ = mapping_expr_alloc(&@$, $2, $4);
}
;
-
counter_stmt : counter_stmt_alloc
| counter_stmt_alloc counter_args
@@ -1718,10 +1719,6 @@ multiton_expr : prefix_expr
| wildcard_expr
;
-map_lhs_expr : multiton_expr
- | concat_expr
- ;
-
map_expr : concat_expr MAP expr
{
$$ = map_expr_alloc(&@$, $1, $3);
@@ -1729,9 +1726,9 @@ map_expr : concat_expr MAP expr
;
expr : concat_expr
+ | multiton_expr
| set_expr
| map_expr
- | multiton_expr
;
set_expr : '{' set_list_expr '}'
@@ -1754,20 +1751,28 @@ set_list_expr : set_list_member_expr
| set_list_expr COMMA opt_newline
;
-set_list_member_expr : opt_newline expr opt_newline
+set_list_member_expr : opt_newline set_expr opt_newline
{
$$ = $2;
}
- | opt_newline map_lhs_expr COLON concat_expr opt_newline
+ | opt_newline set_lhs_expr opt_newline
{
- $$ = mapping_expr_alloc(&@$, $2, $4);
+ $$ = $2;
}
- | opt_newline map_lhs_expr COLON verdict_expr opt_newline
+ | opt_newline set_lhs_expr COLON set_rhs_expr opt_newline
{
$$ = mapping_expr_alloc(&@$, $2, $4);
}
;
+set_lhs_expr : concat_expr
+ | multiton_expr
+ ;
+
+set_rhs_expr : concat_expr
+ | verdict_expr
+ ;
+
initializer_expr : expr
| list_expr
;