mirror of
				https://gitlab.labs.nic.cz/labs/bird.git
				synced 2024-05-11 16:54:54 +00:00 
			
		
		
		
	Conf: Allowing keyword redefinition
Some tokens are both keywords and symbols. For now, we allow only specific keywords to be redefined; in future, more of the keywords may be added to this category. The redefinable keywords must be specified in any .Y file as follows: toksym: THE_KEYWORD ; See proto/bgp/config.Y for an example. Also dropped a lot of unused terminals.
This commit is contained in:
		@@ -709,10 +709,7 @@ cf_lex_symbol(const char *data)
 | 
			
		||||
  struct symbol *sym = cf_get_symbol(data);
 | 
			
		||||
  cf_lval.s = sym;
 | 
			
		||||
 | 
			
		||||
  if (sym->class != SYM_VOID)
 | 
			
		||||
    return CF_SYM_KNOWN;
 | 
			
		||||
 | 
			
		||||
  /* Is it a keyword? */
 | 
			
		||||
  /* Is it a keyword? Prefer the keyword. */
 | 
			
		||||
  struct keyword *k = HASH_FIND(kw_hash, KW, data);
 | 
			
		||||
  if (k)
 | 
			
		||||
  {
 | 
			
		||||
@@ -725,9 +722,11 @@ cf_lex_symbol(const char *data)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* OK, undefined symbol */
 | 
			
		||||
  cf_lval.s = sym;
 | 
			
		||||
  return CF_SYM_UNDEFINED;
 | 
			
		||||
  /* OK, only a symbol. */
 | 
			
		||||
  if (sym->class == SYM_VOID)
 | 
			
		||||
    return CF_SYM_UNDEFINED;
 | 
			
		||||
  else
 | 
			
		||||
    return CF_SYM_KNOWN;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
 
 | 
			
		||||
@@ -116,7 +116,7 @@ CF_DECLS
 | 
			
		||||
%type <mls> label_stack_start label_stack
 | 
			
		||||
 | 
			
		||||
%type <t> text opttext
 | 
			
		||||
%type <s> symbol
 | 
			
		||||
%type <s> symbol symbol_known toksym 
 | 
			
		||||
 | 
			
		||||
%nonassoc PREFIX_DUMMY
 | 
			
		||||
%left AND OR
 | 
			
		||||
@@ -162,7 +162,7 @@ definition:
 | 
			
		||||
expr:
 | 
			
		||||
   NUM
 | 
			
		||||
 | '(' term ')' { $$ = f_eval_int(f_linearize($2)); }
 | 
			
		||||
 | CF_SYM_KNOWN {
 | 
			
		||||
 | symbol_known {
 | 
			
		||||
     if ($1->class != (SYM_CONSTANT | T_INT)) cf_error("Number constant expected");
 | 
			
		||||
     $$ = SYM_VAL($1).i; }
 | 
			
		||||
 ;
 | 
			
		||||
@@ -173,7 +173,9 @@ expr_us:
 | 
			
		||||
 | expr US { $$ = $1 US_; }
 | 
			
		||||
 ;
 | 
			
		||||
 | 
			
		||||
symbol: CF_SYM_UNDEFINED | CF_SYM_KNOWN ;
 | 
			
		||||
toksym: FROM ;
 | 
			
		||||
symbol: CF_SYM_UNDEFINED | CF_SYM_KNOWN | toksym ;
 | 
			
		||||
symbol_known: CF_SYM_KNOWN | toksym ;
 | 
			
		||||
 | 
			
		||||
/* Switches */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -26,8 +26,7 @@ m4_define(CF_DEFINES, `m4_divert(-1)')
 | 
			
		||||
m4_define(CF_handle_kw, `m4_divert(1){ "m4_translit($1,[[A-Z]],[[a-z]])", $1, NULL },
 | 
			
		||||
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, `CF_iterate([[CF_keywd]], [[$@]])DNL')
 | 
			
		||||
 | 
			
		||||
# CLI commands generate keywords as well
 | 
			
		||||
m4_define(CF_CLI, `CF_KEYWORDS(m4_translit($1, [[ ]], [[,]]))
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ m4_define(CF_iterate, `m4_define([[CF_iter]], m4_defn([[$1]]))CF_itera($2)')
 | 
			
		||||
 | 
			
		||||
# Keywords act as untyped %token
 | 
			
		||||
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_KEYWORDS, `m4_define([[CF_toks]],[[]])CF_iterate([[CF_keywd]], [[$@]])m4_ifelse(CF_toks,,,%token[[]]CF_toks
 | 
			
		||||
m4_define(CF_KEYWORDS, `m4_define([[CF_toks]],[[]])CF_iterate([[CF_keywd]], [[$@]])m4_ifelse(CF_toks,,,%token<s>[[]]CF_toks
 | 
			
		||||
)DNL')
 | 
			
		||||
 | 
			
		||||
# CLI commands
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user