diff --git a/filter/config.Y b/filter/config.Y index 22206d09..f8674e5c 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -43,7 +43,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN, %nonassoc THEN %nonassoc ELSE -%type term block cmds cmd function_body constant print_one print_list var_list var_listn dynamic_attr static_attr function_call symbol dpair bgp_path_expr +%type term block cmds cmds_int cmd function_body constant print_one print_list var_list var_listn dynamic_attr static_attr function_call symbol dpair bgp_path_expr %type filter filter_body where_filter %type type break_command cpair %type set_item set_items switch_body @@ -191,15 +191,15 @@ function_def: /* Programs */ +/* Hack: $$ of cmds_int is the last node. + $$->next of cmds_int is temporary used for the first node */ + cmds: /* EMPTY */ { $$ = NULL; } - | cmd cmds { - if ($1) { - if ($1->next) - bug("Command has next already set"); - $1->next = $2; - $$ = $1; - } else $$ = $2; - } + | cmds_int { $$ = $1->next; $1->next = NULL; } + ; + +cmds_int: cmd { $$ = $1; $1->next = $1; } + | cmds_int cmd { $$ = $2; $2->next = $1->next ; $1->next = $2; } ; block: