]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Conf: Allow keywords to be redefined by user symbols
authorOndrej Zajicek <santiago@crfreenet.org>
Tue, 13 Dec 2022 18:31:46 +0000 (19:31 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Fri, 25 Aug 2023 21:50:44 +0000 (23:50 +0200)
Most syntactic constructs in BIRD configuration (e.g. protocol options)
are defined as keywords, which are distinct from symbols (user-defined
names for protocols, variables, ...). That may cause backwards
compatibility issue when a new feature is added, as it may collide with
existing user names.

We can allow keywords to be shadowed by symbols in almost all cases to
avoid this issue.

This replaces the previous mechanism, where shadowable symbols have to be
explictly added to kw_syms.

conf/confbase.Y
conf/gen_keywords.m4
conf/gen_parser.m4
filter/config.Y
nest/config.Y
proto/bgp/config.Y
proto/ospf/config.Y
proto/radv/config.Y
proto/rip/config.Y

index a6b4b1eec5df4c19919a035a3963c0506581a7b0..a43a8cca5d5f282f2e4635238938f7f2e1bc815b 100644 (file)
@@ -119,7 +119,6 @@ CF_DECLS
 %type <t> text opttext
 %type <bs> bytestring
 %type <s> symbol
-%type <kw> kw_sym
 
 %type <v> bytestring_text text_or_ipa
 %type <x> bytestring_expr
@@ -178,7 +177,7 @@ expr_us:
  | expr US { $$ = $1 US_; }
  ;
 
-symbol: CF_SYM_UNDEFINED | CF_SYM_KNOWN | kw_sym { $$ = cf_symbol_from_keyword($1); } ;
+symbol: CF_SYM_UNDEFINED | CF_SYM_KNOWN | KEYWORD { $$ = cf_symbol_from_keyword($1); } ;
 
 /* Switches */
 
index 0c1dc545b52835a46cfb4e6ee160e7101f18bffe..3206c18631ebb6ebba47aaa2964d0bd7fbe13429 100644 (file)
@@ -28,6 +28,7 @@ m4_divert(-1)')
 m4_define(CF_keywd, `m4_ifdef([[CF_tok_$1]],,[[m4_define([[CF_tok_$1]],1)CF_handle_kw($1)]])')
 m4_define(CF_KEYWORDS, `m4_define([[CF_toks]],[[]])CF_iterate([[CF_keywd]], [[$@]])m4_ifelse(CF_toks,,,%token[[]]CF_toks
 )DNL')
+m4_define(CF_KEYWORDS_EXCLUSIVE, `CF_KEYWORDS($@)')
 
 # CLI commands generate keywords as well
 m4_define(CF_CLI, `CF_KEYWORDS(m4_translit($1, [[ ]], [[,]]))
index 7a2a9de445c9fb86b84b1ee5dee1538189c6b30f..a26af8510b1c01e29e6197d833e8530abb447113 100644 (file)
@@ -29,11 +29,17 @@ m4_define(CF_END, `m4_divert(-1)')
 m4_define(CF_itera, `m4_ifelse($#, 1, [[CF_iter($1)]], [[CF_iter($1)[[]]CF_itera(m4_shift($@))]])')
 m4_define(CF_iterate, `m4_define([[CF_iter]], m4_defn([[$1]]))CF_itera($2)')
 
+m4_define(CF_append, `m4_define([[$1]], m4_ifdef([[$1]], m4_defn([[$1]])[[$3]])[[$2]])')
+
 # Keywords act as %token<kw>
-m4_define(CF_keywd, `m4_ifdef([[CF_tok_$1]],,[[m4_define([[CF_tok_$1]],1)m4_define([[CF_toks]],CF_toks $1)]])')
+m4_define(CF_keywd, `m4_ifdef([[CF_tok_$1]],,[[m4_define([[CF_tok_$1]],1)CF_append([[CF_kw_rule]],$1,[[ | ]])m4_define([[CF_toks]],CF_toks $1)]])')
 m4_define(CF_KEYWORDS, `m4_define([[CF_toks]],[[]])CF_iterate([[CF_keywd]], [[$@]])m4_ifelse(CF_toks,,,%token<kw>[[]]CF_toks
 )DNL')
 
+m4_define(CF_keywd2, `m4_ifdef([[CF_tok_$1]],,[[m4_define([[CF_tok_$1]],1)m4_define([[CF_toks]],CF_toks $1)]])')
+m4_define(CF_KEYWORDS_EXCLUSIVE, `m4_define([[CF_toks]],[[]])CF_iterate([[CF_keywd2]], [[$@]])m4_ifelse(CF_toks,,,%token<kw>[[]]CF_toks
+)DNL')
+
 # CLI commands
 m4_define(CF_CLI, `m4_define([[CF_cmd]], cmd_[[]]m4_translit($1, [[ ]], _))DNL
 m4_divert(2)CF_KEYWORDS(m4_translit($1, [[ ]], [[,]]))
@@ -55,7 +61,11 @@ m4_undivert(1)DNL
 
 m4_undivert(2)DNL
 
+%type <kw> KEYWORD
+
 %%
+KEYWORD: CF_kw_rule;
+
 m4_undivert(3)DNL
 
 %%
index e02af182db3f8ff5da9e1e7c3c240a4936c4c72d..3bf3a2b6d67846406631be0642510ee6ce896171 100644 (file)
@@ -298,12 +298,13 @@ assert_assign(struct f_lval *lval, struct f_inst *expr, const char *start, const
 
 CF_DECLS
 
+CF_KEYWORDS_EXCLUSIVE(IN)
 CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN,
        ACCEPT, REJECT, ERROR,
        INT, BOOL, IP, TYPE, PREFIX, RD, PAIR, QUAD, EC, LC,
        SET, STRING, BYTESTRING, BGPMASK, BGPPATH, CLIST, ECLIST, LCLIST,
        IF, THEN, ELSE, CASE,
-       FOR, IN, DO,
+       FOR, DO,
        TRUE, FALSE, RT, RO, UNKNOWN, GENERIC,
        FROM, GW, NET, MASK, PROTO, SOURCE, SCOPE, DEST, IFNAME, IFINDEX, WEIGHT, GW_MPLS, ONLINK,
        PREFERENCE,
index ce45d98d57a23ddd6445c154495ca4fe8d16d6c2..c583dc7f907e3377016e198bdf2eecb546eb79af 100644 (file)
@@ -154,8 +154,6 @@ CF_ENUM_PX(T_ENUM_AF, AF_, AFI_, IPV4, IPV6)
 
 CF_GRAMMAR
 
-kw_sym: MIN | MAX ;
-
 /* Setting of router ID */
 
 conf: rtrid ;
@@ -842,7 +840,7 @@ sym_args:
  | sym_args FILTER { $$ = $1; $$->type = SYM_FILTER; }
  | sym_args PROTOCOL { $$ = $1; $$->type = SYM_PROTO; }
  | sym_args TEMPLATE { $$ = $1; $$->type = SYM_TEMPLATE; }
- | sym_args symbol { $$ = $1; $$->sym = $2; }
+ | sym_args CF_SYM_KNOWN { $$ = $1; $$->sym = $2; }
  ;
 
 
index 218e0d04803246d069373eb46aaa72218479f5d3..ba50446afe4a0cc1009e0289f72c175aa0c4ad44 100644 (file)
@@ -45,9 +45,6 @@ CF_KEYWORDS(CEASE, PREFIX, LIMIT, HIT, ADMINISTRATIVE, SHUTDOWN, RESET, PEER,
 
 CF_GRAMMAR
 
-/* Workaround for collisions between keywords and symbols */
-kw_sym: ROLE | PEER | PROVIDER | CUSTOMER | RS_SERVER | RS_CLIENT ;
-
 proto: bgp_proto '}'  ;
 
 bgp_proto_start: proto_start BGP {
index 4b7d5a361196612e176ebbca499d48dd4f7eb53e..cfde3a5dc56a1fcffb2fa479a6a035142d17f38b 100644 (file)
@@ -190,7 +190,8 @@ ospf_check_auth(void)
 
 CF_DECLS
 
-CF_KEYWORDS(OSPF, V2, V3, OSPF_METRIC1, OSPF_METRIC2, OSPF_TAG, OSPF_ROUTER_ID)
+CF_KEYWORDS_EXCLUSIVE(V2, V3)
+CF_KEYWORDS(OSPF, OSPF_METRIC1, OSPF_METRIC2, OSPF_TAG, OSPF_ROUTER_ID)
 CF_KEYWORDS(AREA, NEIGHBORS, RFC1583COMPAT, STUB, TICK, COST, COST2, RETRANSMIT)
 CF_KEYWORDS(HELLO, TRANSMIT, PRIORITY, DEAD, TYPE, BROADCAST, BCAST, DEFAULT)
 CF_KEYWORDS(NONBROADCAST, NBMA, POINTOPOINT, PTP, POINTOMULTIPOINT, PTMP)
index 9c5e1761c948f0f311c2160b2da399df4d40efb2..c57752d996dab86a5ab1668118a7d962e60bf294 100644 (file)
@@ -50,8 +50,6 @@ CF_ENUM(T_ENUM_RA_PREFERENCE, RA_PREF_, LOW, MEDIUM, HIGH)
 
 CF_GRAMMAR
 
-kw_sym: CUSTOM | OPTION | VALUE ;
-
 proto: radv_proto ;
 
 radv_proto_start: proto_start RADV
index 28ee9609ab5abd0cf8e69eb37881cd9400bab66f..1fab4527994c59ffa16fbdff75df7b0a225715f6 100644 (file)
@@ -32,7 +32,8 @@ rip_check_auth(void)
 
 CF_DECLS
 
-CF_KEYWORDS(RIP, NG, ECMP, LIMIT, WEIGHT, INFINITY, METRIC, UPDATE, TIMEOUT,
+CF_KEYWORDS_EXCLUSIVE(NG)
+CF_KEYWORDS(RIP, ECMP, LIMIT, WEIGHT, INFINITY, METRIC, UPDATE, TIMEOUT,
            GARBAGE, RETRANSMIT, PORT, ADDRESS, MODE, BROADCAST, MULTICAST,
            PASSIVE, VERSION, SPLIT, HORIZON, POISON, REVERSE, CHECK, ZERO,
            TIME, BFD, AUTHENTICATION, NONE, PLAINTEXT, CRYPTOGRAPHIC, MD5,