kconfig: refactor scanning and parsing "option" properties
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Tue, 11 Dec 2018 11:01:00 +0000 (20:01 +0900)
committerChristian Lamparter <chunkeey@gmail.com>
Sun, 10 Feb 2019 21:32:12 +0000 (22:32 +0100)
For the keywords "modules", "defconfig_list", and "allnoconfig_y",
the lexer should pass specific tokens instead of generic T_WORD.

This simplifies both the lexer and the parser.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
config/kconf_id.c
config/lkc.h
config/menu.c
config/zconf.l
config/zconf.y

index ec2c011f9e6263b52ca6e0bff724169ffe1a27d1..f8b222cc8b874d5b4347f3dc913d24c075d9130a 100644 (file)
@@ -30,9 +30,6 @@ static struct kconf_id kconf_id_array[] = {
        { "visible",            T_VISIBLE,              TF_COMMAND },
        { "option",             T_OPTION,               TF_COMMAND },
        { "on",                 T_ON,                   TF_PARAM },
-       { "modules",            T_OPT_MODULES,          TF_OPTION },
-       { "defconfig_list",     T_OPT_DEFCONFIG_LIST,   TF_OPTION },
-       { "allnoconfig_y",      T_OPT_ALLNOCONFIG_Y,    TF_OPTION },
 };
 
 #define KCONF_ID_ARRAY_SIZE (sizeof(kconf_id_array)/sizeof(struct kconf_id))
index b6bbcd1dda2be89d3f2a6e63da92f6411c83f4ff..5f4880a12246a63671b7e8f1cda89e3d639dc45e 100644 (file)
@@ -32,7 +32,6 @@ static inline const char *CONFIG_prefix(void)
 
 #define TF_COMMAND     0x0001
 #define TF_PARAM       0x0002
-#define TF_OPTION      0x0004
 
 enum conf_def_mode {
        def_default,
@@ -42,10 +41,6 @@ enum conf_def_mode {
        def_random
 };
 
-#define T_OPT_MODULES          1
-#define T_OPT_DEFCONFIG_LIST   2
-#define T_OPT_ALLNOCONFIG_Y    4
-
 struct kconf_id {
        const char *name;
        int token;
@@ -90,7 +85,9 @@ void menu_add_visibility(struct expr *dep);
 struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep);
 void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
 void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
-void menu_add_option(int token, char *arg);
+void menu_add_option_modules(void);
+void menu_add_option_defconfig_list(void);
+void menu_add_option_allnoconfig_y(void);
 void menu_finalize(struct menu *parent);
 void menu_set_type(int type);
 
index 4cf15d449c05d2a126d0a3fa9af592068b8ff5d7..7e2b2c938d7ba053b1ed2583b45596e081d39ecb 100644 (file)
@@ -195,29 +195,26 @@ void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep)
        menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep);
 }
 
-void menu_add_option(int token, char *arg)
-{
-       switch (token) {
-       case T_OPT_MODULES:
-               if (modules_sym)
-                       zconf_error("symbol '%s' redefines option 'modules'"
-                                   " already defined by symbol '%s'",
-                                   current_entry->sym->name,
-                                   modules_sym->name
-                                   );
-               modules_sym = current_entry->sym;
-               break;
-       case T_OPT_DEFCONFIG_LIST:
-               if (!sym_defconfig_list)
-                       sym_defconfig_list = current_entry->sym;
-               else if (sym_defconfig_list != current_entry->sym)
-                       zconf_error("trying to redefine defconfig symbol");
-               sym_defconfig_list->flags |= SYMBOL_NO_WRITE;
-               break;
-       case T_OPT_ALLNOCONFIG_Y:
-               current_entry->sym->flags |= SYMBOL_ALLNOCONFIG_Y;
-               break;
-       }
+void menu_add_option_modules(void)
+{
+       if (modules_sym)
+               zconf_error("symbol '%s' redefines option 'modules' already defined by symbol '%s'",
+                           current_entry->sym->name, modules_sym->name);
+       modules_sym = current_entry->sym;
+}
+
+void menu_add_option_defconfig_list(void)
+{
+       if (!sym_defconfig_list)
+               sym_defconfig_list = current_entry->sym;
+       else if (sym_defconfig_list != current_entry->sym)
+               zconf_error("trying to redefine defconfig symbol");
+       sym_defconfig_list->flags |= SYMBOL_NO_WRITE;
+}
+
+void menu_add_option_allnoconfig_y(void)
+{
+       current_entry->sym->flags |= SYMBOL_ALLNOCONFIG_Y;
 }
 
 static int menu_validate_number(struct symbol *sym, struct symbol *sym2)
index a6caf06a6506d21648384e872c7adcd99af28b0c..81c1f40cdee6262a04e6f2e7bbd7301f23cede15 100644 (file)
@@ -140,6 +140,9 @@ n   [A-Za-z0-9_-]
 }
 
 <PARAM>{
+       "modules"               return T_MODULES;
+       "defconfig_list"        return T_DEFCONFIG_LIST;
+       "allnoconfig_y"         return T_ALLNOCONFIG_Y;
        "&&"    return T_AND;
        "||"    return T_OR;
        "("     return T_OPEN_PAREN;
index de3b94e7f4b680fc0a6ca7e15c53836701147fc5..7333e8e143631f7eb80880bf8ad6baf196346f51 100644 (file)
@@ -64,18 +64,21 @@ static struct menu *current_menu, *current_entry;
 %token <id>T_IMPLY
 %token <id>T_RANGE
 %token <id>T_VISIBLE
-%token <id>T_OPTION
 %token <id>T_ON
 %token <string> T_WORD
 %token <string> T_WORD_QUOTE
+%token T_ALLNOCONFIG_Y
 %token T_BOOL
 %token T_CLOSE_PAREN
 %token T_DEFAULT
+%token T_DEFCONFIG_LIST
 %token T_DEF_BOOL
 %token T_DEF_TRISTATE
 %token T_HEX
 %token T_INT
+%token T_MODULES
 %token T_OPEN_PAREN
+%token T_OPTION
 %token T_STRING
 %token T_TRISTATE
 %token T_EOL
@@ -97,7 +100,7 @@ static struct menu *current_menu, *current_entry;
 %type <expr> if_expr
 %type <id> end
 %type <menu> if_entry menu_entry choice_entry
-%type <string> symbol_option_arg word_opt assign_val
+%type <string> word_opt assign_val
 
 %destructor {
        fprintf(stderr, "%s:%d: missing end statement for this entry\n",
@@ -172,7 +175,6 @@ menuconfig_stmt: menuconfig_entry_start config_option_list
 config_option_list:
          /* empty */
        | config_option_list config_option
-       | config_option_list symbol_option
        | config_option_list depends
        | config_option_list help
 ;
@@ -219,27 +221,20 @@ config_option: T_RANGE symbol symbol if_expr T_EOL
        printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
 };
 
-symbol_option: T_OPTION symbol_option_list T_EOL
-;
+config_option: T_OPTION T_MODULES T_EOL
+{
+       menu_add_option_modules();
+};
 
-symbol_option_list:
-         /* empty */
-       | symbol_option_list T_WORD symbol_option_arg
+config_option: T_OPTION T_DEFCONFIG_LIST T_EOL
 {
-       const struct kconf_id *id = kconf_id_lookup($2, strlen($2));
-       if (id && id->flags & TF_OPTION) {
-               menu_add_option(id->token, $3);
-               free($3);
-       }
-       else
-               zconfprint("warning: ignoring unknown option %s", $2);
-       free($2);
+       menu_add_option_defconfig_list();
 };
 
-symbol_option_arg:
-         /* empty */           { $$ = NULL; }
-       | T_EQUAL prompt        { $$ = $2; }
-;
+config_option: T_OPTION T_ALLNOCONFIG_Y T_EOL
+{
+       menu_add_option_allnoconfig_y();
+};
 
 /* choice entry */