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:
Masahiro Yamada 2018-12-11 20:01:00 +09:00
parent 3c8f317d4c
commit ce2164ab58
5 changed files with 41 additions and 52 deletions

View File

@ -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))

View File

@ -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);

View 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); 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)

View File

@ -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;

View File

@ -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 */