--- conf/confbase.Y | 5 +++++ filter/config.Y | 18 +++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/conf/confbase.Y b/conf/confbase.Y index eda5b9c1..ca8ec19a 100644 --- a/conf/confbase.Y +++ b/conf/confbase.Y @@ -150,6 +150,11 @@ definition: if (f_eval(f_linearize($4), cfg_mem, val) > F_RETURN) cf_error("Runtime error"); cf_define_symbol($2, SYM_CONSTANT | val->type, val, val); } + | DEFINE symbol ':' net_type '=' term ';' { + struct f_val *val = cfg_alloc(sizeof(struct f_val)); + if (f_eval(f_linearize($6), cfg_mem, val) > F_RETURN) cf_error("Runtime error"); + cf_define_typed_symbol($2, SYM_CONSTANT | val->type, val, val, $4); + } ; expr: diff --git a/filter/config.Y b/filter/config.Y index a7d1dd9b..653d2265 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -462,12 +462,19 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN, %type <v> set_atom switch_atom fipa %type <px> fprefix %type <t> get_cf_position +%type <s> filter_symbol function_symbol CF_GRAMMAR +filter_symbol: + symbol { $$ = cf_define_symbol($1, SYM_FILTER, filter, NULL); } + | symbol ':' net_type { + $$ = cf_define_typed_symbol($1, SYM_FILTER, filter, NULL, $3); + }; + conf: filter_def ; filter_def: - FILTER symbol { $2 = cf_define_symbol($2, SYM_FILTER, filter, NULL); cf_push_scope( $2 ); } + FILTER filter_symbol { cf_push_scope( $2 ); } filter_body { struct filter *f = cfg_alloc(sizeof(struct filter)); *f = (struct filter) { .sym = $2, .root = $4 }; @@ -605,10 +612,15 @@ function_body: } ; +function_symbol: + symbol { $$ = cf_define_symbol($1, SYM_FUNCTION, function, NULL); } + | symbol ':' net_type { + $$ = cf_define_typed_symbol($1, SYM_FUNCTION, function, NULL, $3); + }; + conf: function_def ; function_def: - FUNCTION symbol { DBG( "Beginning of function %s\n", $2->name ); - $2 = cf_define_symbol($2, SYM_FUNCTION, function, NULL); + FUNCTION function_symbol { DBG( "Beginning of function %s\n", $2->name ); cf_push_scope($2); } function_args function_body { DBG("Definition of function %s with %u args and %u local vars.\n", $2->name, $4, $5->vars); -- 2.24.0