summaryrefslogtreecommitdiffstats
path: root/src/parser.y
diff options
context:
space:
mode:
authorPatrick McHardy <kaber@trash.net>2009-03-20 08:34:59 +0100
committerPatrick McHardy <kaber@trash.net>2009-03-20 08:34:59 +0100
commit878cc0e4e863e6b2c9fa71f791d35245b3ddbdb2 (patch)
treebd29fb4134cc513820af99f196671264b4c367dc /src/parser.y
parent5c40780440c0e8661fc7cfcec72dab48b934631d (diff)
Add support for user-defined symbolic constants
User-defined constants can be used like this: define allowed_hosts = { 192.168.0.0/24, 10.0.0.20-10.0.0.30 } define udp_services = domain define tcp_services = { ssh, domain } ip saddr $allowed_hosts udp dport $udp_services counter accept ip saddr $allowed_hosts tcp dport $tcp_services counter accept Recursive definitions are possible, but currently not fully handled. Anything requiring transformations (sets using ranges) can not be used more than once currently since the expressions need to be COW'ed previously. Signed-off-by: Patrick McHardy <kaber@trash.net>
Diffstat (limited to 'src/parser.y')
-rw-r--r--src/parser.y27
1 files changed, 20 insertions, 7 deletions
diff --git a/src/parser.y b/src/parser.y
index 1ca5981b..d9da115a 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -151,6 +151,7 @@ static void location_update(struct location *loc, struct location *rhs, int n)
%token SET "set"
%token INCLUDE "include"
+%token DEFINE "define"
%token HOOK "hook"
%token <val> HOOKNUM "hooknum"
@@ -379,8 +380,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> expr
-%destructor { expr_free($$); } expr
+%type <expr> expr initializer_expr
+%destructor { expr_free($$); } expr initializer_expr
%type <expr> match_expr
%destructor { expr_free($$); } match_expr
@@ -461,6 +462,11 @@ common_block : INCLUDE QUOTED_STRING stmt_seperator
}
xfree($2);
}
+ | DEFINE identifier '=' initializer_expr stmt_seperator
+ {
+ symbol_bind(current_scope(state), $2, $4);
+ xfree($2);
+ }
;
line : common_block { $$ = NULL; }
@@ -809,6 +815,12 @@ symbol_expr : string
$$ = symbol_expr_alloc(&@$, $1);
xfree($1);
}
+ | '$' identifier
+ {
+ $$ = symbol_expr_alloc(&@$, $2);
+ $$->scope = current_scope(state);
+ xfree($2);
+ }
;
integer_expr : NUM
@@ -985,17 +997,18 @@ expr : concat_expr
| multiton_expr
;
+initializer_expr : expr
+ | set_expr
+ | list_expr
+ ;
+
match_expr : relational_expr
| membership_expr
;
relational_expr : expr /* implicit */ expr
{
- enum ops op;
-
- /* RHS determines operation */
- op = ($2->ops->type == EXPR_RANGE) ? OP_RANGE : OP_EQ;
- $$ = relational_expr_alloc(&@$, op, $1, $2);
+ $$ = relational_expr_alloc(&@$, OP_IMPLICIT, $1, $2);
}
| expr /* implicit */ list_expr
{