kconfig: refactor scanning and parsing "option" properties
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>
This commit is contained in:
parent
3c8f317d4c
commit
ce2164ab58
|
@ -30,9 +30,6 @@ static struct kconf_id kconf_id_array[] = {
|
||||||
{ "visible", T_VISIBLE, TF_COMMAND },
|
{ "visible", T_VISIBLE, TF_COMMAND },
|
||||||
{ "option", T_OPTION, TF_COMMAND },
|
{ "option", T_OPTION, TF_COMMAND },
|
||||||
{ "on", T_ON, TF_PARAM },
|
{ "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))
|
#define KCONF_ID_ARRAY_SIZE (sizeof(kconf_id_array)/sizeof(struct kconf_id))
|
||||||
|
|
|
@ -32,7 +32,6 @@ static inline const char *CONFIG_prefix(void)
|
||||||
|
|
||||||
#define TF_COMMAND 0x0001
|
#define TF_COMMAND 0x0001
|
||||||
#define TF_PARAM 0x0002
|
#define TF_PARAM 0x0002
|
||||||
#define TF_OPTION 0x0004
|
|
||||||
|
|
||||||
enum conf_def_mode {
|
enum conf_def_mode {
|
||||||
def_default,
|
def_default,
|
||||||
|
@ -42,10 +41,6 @@ enum conf_def_mode {
|
||||||
def_random
|
def_random
|
||||||
};
|
};
|
||||||
|
|
||||||
#define T_OPT_MODULES 1
|
|
||||||
#define T_OPT_DEFCONFIG_LIST 2
|
|
||||||
#define T_OPT_ALLNOCONFIG_Y 4
|
|
||||||
|
|
||||||
struct kconf_id {
|
struct kconf_id {
|
||||||
const char *name;
|
const char *name;
|
||||||
int token;
|
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);
|
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_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_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_finalize(struct menu *parent);
|
||||||
void menu_set_type(int type);
|
void menu_set_type(int type);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep);
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu_add_option(int token, char *arg)
|
void menu_add_option_modules(void)
|
||||||
{
|
{
|
||||||
switch (token) {
|
|
||||||
case T_OPT_MODULES:
|
|
||||||
if (modules_sym)
|
if (modules_sym)
|
||||||
zconf_error("symbol '%s' redefines option 'modules'"
|
zconf_error("symbol '%s' redefines option 'modules' already defined by symbol '%s'",
|
||||||
" already defined by symbol '%s'",
|
current_entry->sym->name, modules_sym->name);
|
||||||
current_entry->sym->name,
|
|
||||||
modules_sym->name
|
|
||||||
);
|
|
||||||
modules_sym = current_entry->sym;
|
modules_sym = current_entry->sym;
|
||||||
break;
|
}
|
||||||
case T_OPT_DEFCONFIG_LIST:
|
|
||||||
|
void menu_add_option_defconfig_list(void)
|
||||||
|
{
|
||||||
if (!sym_defconfig_list)
|
if (!sym_defconfig_list)
|
||||||
sym_defconfig_list = current_entry->sym;
|
sym_defconfig_list = current_entry->sym;
|
||||||
else if (sym_defconfig_list != current_entry->sym)
|
else if (sym_defconfig_list != current_entry->sym)
|
||||||
zconf_error("trying to redefine defconfig symbol");
|
zconf_error("trying to redefine defconfig symbol");
|
||||||
sym_defconfig_list->flags |= SYMBOL_NO_WRITE;
|
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_allnoconfig_y(void)
|
||||||
|
{
|
||||||
|
current_entry->sym->flags |= SYMBOL_ALLNOCONFIG_Y;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int menu_validate_number(struct symbol *sym, struct symbol *sym2)
|
static int menu_validate_number(struct symbol *sym, struct symbol *sym2)
|
||||||
|
|
|
@ -140,6 +140,9 @@ n [A-Za-z0-9_-]
|
||||||
}
|
}
|
||||||
|
|
||||||
<PARAM>{
|
<PARAM>{
|
||||||
|
"modules" return T_MODULES;
|
||||||
|
"defconfig_list" return T_DEFCONFIG_LIST;
|
||||||
|
"allnoconfig_y" return T_ALLNOCONFIG_Y;
|
||||||
"&&" return T_AND;
|
"&&" return T_AND;
|
||||||
"||" return T_OR;
|
"||" return T_OR;
|
||||||
"(" return T_OPEN_PAREN;
|
"(" return T_OPEN_PAREN;
|
||||||
|
|
|
@ -64,18 +64,21 @@ static struct menu *current_menu, *current_entry;
|
||||||
%token <id>T_IMPLY
|
%token <id>T_IMPLY
|
||||||
%token <id>T_RANGE
|
%token <id>T_RANGE
|
||||||
%token <id>T_VISIBLE
|
%token <id>T_VISIBLE
|
||||||
%token <id>T_OPTION
|
|
||||||
%token <id>T_ON
|
%token <id>T_ON
|
||||||
%token <string> T_WORD
|
%token <string> T_WORD
|
||||||
%token <string> T_WORD_QUOTE
|
%token <string> T_WORD_QUOTE
|
||||||
|
%token T_ALLNOCONFIG_Y
|
||||||
%token T_BOOL
|
%token T_BOOL
|
||||||
%token T_CLOSE_PAREN
|
%token T_CLOSE_PAREN
|
||||||
%token T_DEFAULT
|
%token T_DEFAULT
|
||||||
|
%token T_DEFCONFIG_LIST
|
||||||
%token T_DEF_BOOL
|
%token T_DEF_BOOL
|
||||||
%token T_DEF_TRISTATE
|
%token T_DEF_TRISTATE
|
||||||
%token T_HEX
|
%token T_HEX
|
||||||
%token T_INT
|
%token T_INT
|
||||||
|
%token T_MODULES
|
||||||
%token T_OPEN_PAREN
|
%token T_OPEN_PAREN
|
||||||
|
%token T_OPTION
|
||||||
%token T_STRING
|
%token T_STRING
|
||||||
%token T_TRISTATE
|
%token T_TRISTATE
|
||||||
%token T_EOL
|
%token T_EOL
|
||||||
|
@ -97,7 +100,7 @@ static struct menu *current_menu, *current_entry;
|
||||||
%type <expr> if_expr
|
%type <expr> if_expr
|
||||||
%type <id> end
|
%type <id> end
|
||||||
%type <menu> if_entry menu_entry choice_entry
|
%type <menu> if_entry menu_entry choice_entry
|
||||||
%type <string> symbol_option_arg word_opt assign_val
|
%type <string> word_opt assign_val
|
||||||
|
|
||||||
%destructor {
|
%destructor {
|
||||||
fprintf(stderr, "%s:%d: missing end statement for this entry\n",
|
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:
|
config_option_list:
|
||||||
/* empty */
|
/* empty */
|
||||||
| config_option_list config_option
|
| config_option_list config_option
|
||||||
| config_option_list symbol_option
|
|
||||||
| config_option_list depends
|
| config_option_list depends
|
||||||
| config_option_list help
|
| 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());
|
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
|
||||||
;
|
|
||||||
|
|
||||||
symbol_option_list:
|
|
||||||
/* empty */
|
|
||||||
| symbol_option_list T_WORD symbol_option_arg
|
|
||||||
{
|
{
|
||||||
const struct kconf_id *id = kconf_id_lookup($2, strlen($2));
|
menu_add_option_modules();
|
||||||
if (id && id->flags & TF_OPTION) {
|
|
||||||
menu_add_option(id->token, $3);
|
|
||||||
free($3);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
zconfprint("warning: ignoring unknown option %s", $2);
|
|
||||||
free($2);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
symbol_option_arg:
|
config_option: T_OPTION T_DEFCONFIG_LIST T_EOL
|
||||||
/* empty */ { $$ = NULL; }
|
{
|
||||||
| T_EQUAL prompt { $$ = $2; }
|
menu_add_option_defconfig_list();
|
||||||
;
|
};
|
||||||
|
|
||||||
|
config_option: T_OPTION T_ALLNOCONFIG_Y T_EOL
|
||||||
|
{
|
||||||
|
menu_add_option_allnoconfig_y();
|
||||||
|
};
|
||||||
|
|
||||||
/* choice entry */
|
/* choice entry */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue