All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/4] init/Kconfig: Fix break in middle of EXPERT menu
@ 2015-05-13 23:37 Josh Triplett
  2015-05-13 23:37 ` [PATCH 2/4] init/Kconfig: Split expert menu into a separate file, init/Kconfig.expert Josh Triplett
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Josh Triplett @ 2015-05-13 23:37 UTC (permalink / raw)
  To: Ingo Molnar, Andrew Morton, Paul E. McKenney, Michal Hocko,
	Josh Triplett, Vladimir Davydov, Johannes Weiner,
	Geert Uytterhoeven, Andy Lutomirski, Bertrand Jacquin,
	Luis R. Rodriguez, Iulia Manda, Pranith Kumar, Clark Williams,
	Mel Gorman, Randy Dunlap, Paul Bolle, linux-kernel

Commit e1abf2cc8d5 ("bpf: Fix the build on BPF_SYSCALL=y &&
!CONFIG_TRACING kernels, make it more configurable") made BPF_SYSCALL no
longer hidden with !EXPERT, but left it in the middle of the EXPERT
menu.  menuconfig stops putting config items under a submenu once it
encounters an item that doesn't depend on the menu's config item, so
this caused the remainder of the EXPERT menu to spill out into the
containing menu around it.  Fix by moving BPF_SYSCALL before the EXPERT
menu, next to BPF.

Fixes: e1abf2cc8d5 ("bpf: Fix the build on BPF_SYSCALL=y && !CONFIG_TRACING kernels, make it more configurable")
Signed-off-by: Josh Triplett <josh@joshtriplett.org>
---
 init/Kconfig | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/init/Kconfig b/init/Kconfig
index dc24dec..e2f16f1 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -1341,6 +1341,16 @@ config HAVE_PCSPKR_PLATFORM
 config BPF
 	bool
 
+# syscall, maps, verifier
+config BPF_SYSCALL
+	bool "Enable bpf() system call"
+	select ANON_INODES
+	select BPF
+	default n
+	help
+	  Enable the bpf() system call that allows to manipulate eBPF
+	  programs and maps via file descriptors.
+
 menuconfig EXPERT
 	bool "Configure standard kernel features (expert users)"
 	# Unhide debug options, to make the on-by-default options visible
@@ -1535,16 +1545,6 @@ config EVENTFD
 
 	  If unsure, say Y.
 
-# syscall, maps, verifier
-config BPF_SYSCALL
-	bool "Enable bpf() system call"
-	select ANON_INODES
-	select BPF
-	default n
-	help
-	  Enable the bpf() system call that allows to manipulate eBPF
-	  programs and maps via file descriptors.
-
 config SHMEM
 	bool "Use full shmem filesystem" if EXPERT
 	default y
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/4] init/Kconfig: Split expert menu into a separate file, init/Kconfig.expert
  2015-05-13 23:37 [PATCH 1/4] init/Kconfig: Fix break in middle of EXPERT menu Josh Triplett
@ 2015-05-13 23:37 ` Josh Triplett
  2015-05-13 23:38 ` [PATCH 3/4] kconfig: Regenerate parser with current Bison prior to making changes Josh Triplett
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 7+ messages in thread
From: Josh Triplett @ 2015-05-13 23:37 UTC (permalink / raw)
  To: Ingo Molnar, Andrew Morton, Paul E. McKenney, Michal Hocko,
	Josh Triplett, Vladimir Davydov, Johannes Weiner,
	Geert Uytterhoeven, Andy Lutomirski, Bertrand Jacquin,
	Luis R. Rodriguez, Iulia Manda, Pranith Kumar, Clark Williams,
	Mel Gorman, Randy Dunlap, Paul Bolle, linux-kernel

The expert menu frequently gets broken by a config item in the middle
that leaves off the "if EXPERT" from its prompt.  This results in the
remainder of the menu spilling out into the parent "General setup" menu.
Move the entire expert menu into a separate Kconfig file,
init/Kconfig.expert, to make this harder to do accidentally, and to
break up the exceedingly long init/Kconfig a bit.

Signed-off-by: Josh Triplett <josh@joshtriplett.org>
---
 init/Kconfig        | 232 +---------------------------------------------------
 init/Kconfig.expert | 231 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 232 insertions(+), 231 deletions(-)
 create mode 100644 init/Kconfig.expert

diff --git a/init/Kconfig b/init/Kconfig
index e2f16f1..a2de3f5 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -1351,237 +1351,7 @@ config BPF_SYSCALL
 	  Enable the bpf() system call that allows to manipulate eBPF
 	  programs and maps via file descriptors.
 
-menuconfig EXPERT
-	bool "Configure standard kernel features (expert users)"
-	# Unhide debug options, to make the on-by-default options visible
-	select DEBUG_KERNEL
-	help
-	  This option allows certain base kernel options and settings
-          to be disabled or tweaked. This is for specialized
-          environments which can tolerate a "non-standard" kernel.
-          Only use this if you really know what you are doing.
-
-config UID16
-	bool "Enable 16-bit UID system calls" if EXPERT
-	depends on HAVE_UID16 && MULTIUSER
-	default y
-	help
-	  This enables the legacy 16-bit UID syscall wrappers.
-
-config MULTIUSER
-	bool "Multiple users, groups and capabilities support" if EXPERT
-	default y
-	help
-	  This option enables support for non-root users, groups and
-	  capabilities.
-
-	  If you say N here, all processes will run with UID 0, GID 0, and all
-	  possible capabilities.  Saying N here also compiles out support for
-	  system calls related to UIDs, GIDs, and capabilities, such as setuid,
-	  setgid, and capset.
-
-	  If unsure, say Y here.
-
-config SGETMASK_SYSCALL
-	bool "sgetmask/ssetmask syscalls support" if EXPERT
-	def_bool PARISC || MN10300 || BLACKFIN || M68K || PPC || MIPS || X86 || SPARC || CRIS || MICROBLAZE || SUPERH
-	---help---
-	  sys_sgetmask and sys_ssetmask are obsolete system calls
-	  no longer supported in libc but still enabled by default in some
-	  architectures.
-
-	  If unsure, leave the default option here.
-
-config SYSFS_SYSCALL
-	bool "Sysfs syscall support" if EXPERT
-	default y
-	---help---
-	  sys_sysfs is an obsolete system call no longer supported in libc.
-	  Note that disabling this option is more secure but might break
-	  compatibility with some systems.
-
-	  If unsure say Y here.
-
-config SYSCTL_SYSCALL
-	bool "Sysctl syscall support" if EXPERT
-	depends on PROC_SYSCTL
-	default n
-	select SYSCTL
-	---help---
-	  sys_sysctl uses binary paths that have been found challenging
-	  to properly maintain and use.  The interface in /proc/sys
-	  using paths with ascii names is now the primary path to this
-	  information.
-
-	  Almost nothing using the binary sysctl interface so if you are
-	  trying to save some space it is probably safe to disable this,
-	  making your kernel marginally smaller.
-
-	  If unsure say N here.
-
-config KALLSYMS
-	 bool "Load all symbols for debugging/ksymoops" if EXPERT
-	 default y
-	 help
-	   Say Y here to let the kernel print out symbolic crash information and
-	   symbolic stack backtraces. This increases the size of the kernel
-	   somewhat, as all symbols have to be loaded into the kernel image.
-
-config KALLSYMS_ALL
-	bool "Include all symbols in kallsyms"
-	depends on DEBUG_KERNEL && KALLSYMS
-	help
-	   Normally kallsyms only contains the symbols of functions for nicer
-	   OOPS messages and backtraces (i.e., symbols from the text and inittext
-	   sections). This is sufficient for most cases. And only in very rare
-	   cases (e.g., when a debugger is used) all symbols are required (e.g.,
-	   names of variables from the data sections, etc).
-
-	   This option makes sure that all symbols are loaded into the kernel
-	   image (i.e., symbols from all sections) in cost of increased kernel
-	   size (depending on the kernel configuration, it may be 300KiB or
-	   something like this).
-
-	   Say N unless you really need all symbols.
-
-config PRINTK
-	default y
-	bool "Enable support for printk" if EXPERT
-	select IRQ_WORK
-	help
-	  This option enables normal printk support. Removing it
-	  eliminates most of the message strings from the kernel image
-	  and makes the kernel more or less silent. As this makes it
-	  very difficult to diagnose system problems, saying N here is
-	  strongly discouraged.
-
-config BUG
-	bool "BUG() support" if EXPERT
-	default y
-	help
-          Disabling this option eliminates support for BUG and WARN, reducing
-          the size of your kernel image and potentially quietly ignoring
-          numerous fatal conditions. You should only consider disabling this
-          option for embedded systems with no facilities for reporting errors.
-          Just say Y.
-
-config ELF_CORE
-	depends on COREDUMP
-	default y
-	bool "Enable ELF core dumps" if EXPERT
-	help
-	  Enable support for generating core dumps. Disabling saves about 4k.
-
-
-config PCSPKR_PLATFORM
-	bool "Enable PC-Speaker support" if EXPERT
-	depends on HAVE_PCSPKR_PLATFORM
-	select I8253_LOCK
-	default y
-	help
-          This option allows to disable the internal PC-Speaker
-          support, saving some memory.
-
-config BASE_FULL
-	default y
-	bool "Enable full-sized data structures for core" if EXPERT
-	help
-	  Disabling this option reduces the size of miscellaneous core
-	  kernel data structures. This saves memory on small machines,
-	  but may reduce performance.
-
-config FUTEX
-	bool "Enable futex support" if EXPERT
-	default y
-	select RT_MUTEXES
-	help
-	  Disabling this option will cause the kernel to be built without
-	  support for "fast userspace mutexes".  The resulting kernel may not
-	  run glibc-based applications correctly.
-
-config HAVE_FUTEX_CMPXCHG
-	bool
-	depends on FUTEX
-	help
-	  Architectures should select this if futex_atomic_cmpxchg_inatomic()
-	  is implemented and always working. This removes a couple of runtime
-	  checks.
-
-config EPOLL
-	bool "Enable eventpoll support" if EXPERT
-	default y
-	select ANON_INODES
-	help
-	  Disabling this option will cause the kernel to be built without
-	  support for epoll family of system calls.
-
-config SIGNALFD
-	bool "Enable signalfd() system call" if EXPERT
-	select ANON_INODES
-	default y
-	help
-	  Enable the signalfd() system call that allows to receive signals
-	  on a file descriptor.
-
-	  If unsure, say Y.
-
-config TIMERFD
-	bool "Enable timerfd() system call" if EXPERT
-	select ANON_INODES
-	default y
-	help
-	  Enable the timerfd() system call that allows to receive timer
-	  events on a file descriptor.
-
-	  If unsure, say Y.
-
-config EVENTFD
-	bool "Enable eventfd() system call" if EXPERT
-	select ANON_INODES
-	default y
-	help
-	  Enable the eventfd() system call that allows to receive both
-	  kernel notification (ie. KAIO) or userspace notifications.
-
-	  If unsure, say Y.
-
-config SHMEM
-	bool "Use full shmem filesystem" if EXPERT
-	default y
-	depends on MMU
-	help
-	  The shmem is an internal filesystem used to manage shared memory.
-	  It is backed by swap and manages resource limits. It is also exported
-	  to userspace as tmpfs if TMPFS is enabled. Disabling this
-	  option replaces shmem and tmpfs with the much simpler ramfs code,
-	  which may be appropriate on small systems without swap.
-
-config AIO
-	bool "Enable AIO support" if EXPERT
-	default y
-	help
-	  This option enables POSIX asynchronous I/O which may by used
-	  by some high performance threaded applications. Disabling
-	  this option saves about 7k.
-
-config ADVISE_SYSCALLS
-	bool "Enable madvise/fadvise syscalls" if EXPERT
-	default y
-	help
-	  This option enables the madvise and fadvise syscalls, used by
-	  applications to advise the kernel about their future memory or file
-	  usage, improving performance. If building an embedded system where no
-	  applications use these syscalls, you can disable this option to save
-	  space.
-
-config PCI_QUIRKS
-	default y
-	bool "Enable PCI quirk workarounds" if EXPERT
-	depends on PCI
-	help
-	  This enables workarounds for various PCI chipset
-	  bugs/quirks. Disable this only if your target machine is
-	  unaffected by PCI quirks.
+source init/Kconfig.expert
 
 config EMBEDDED
 	bool "Embedded system"
diff --git a/init/Kconfig.expert b/init/Kconfig.expert
new file mode 100644
index 0000000..c84a372
--- /dev/null
+++ b/init/Kconfig.expert
@@ -0,0 +1,231 @@
+menuconfig EXPERT
+	bool "Configure standard kernel features (expert users)"
+	# Unhide debug options, to make the on-by-default options visible
+	select DEBUG_KERNEL
+	help
+	  This option allows certain base kernel options and settings
+          to be disabled or tweaked. This is for specialized
+          environments which can tolerate a "non-standard" kernel.
+          Only use this if you really know what you are doing.
+
+config UID16
+	bool "Enable 16-bit UID system calls" if EXPERT
+	depends on HAVE_UID16 && MULTIUSER
+	default y
+	help
+	  This enables the legacy 16-bit UID syscall wrappers.
+
+config MULTIUSER
+	bool "Multiple users, groups and capabilities support" if EXPERT
+	default y
+	help
+	  This option enables support for non-root users, groups and
+	  capabilities.
+
+	  If you say N here, all processes will run with UID 0, GID 0, and all
+	  possible capabilities.  Saying N here also compiles out support for
+	  system calls related to UIDs, GIDs, and capabilities, such as setuid,
+	  setgid, and capset.
+
+	  If unsure, say Y here.
+
+config SGETMASK_SYSCALL
+	bool "sgetmask/ssetmask syscalls support" if EXPERT
+	def_bool PARISC || MN10300 || BLACKFIN || M68K || PPC || MIPS || X86 || SPARC || CRIS || MICROBLAZE || SUPERH
+	---help---
+	  sys_sgetmask and sys_ssetmask are obsolete system calls
+	  no longer supported in libc but still enabled by default in some
+	  architectures.
+
+	  If unsure, leave the default option here.
+
+config SYSFS_SYSCALL
+	bool "Sysfs syscall support" if EXPERT
+	default y
+	---help---
+	  sys_sysfs is an obsolete system call no longer supported in libc.
+	  Note that disabling this option is more secure but might break
+	  compatibility with some systems.
+
+	  If unsure say Y here.
+
+config SYSCTL_SYSCALL
+	bool "Sysctl syscall support" if EXPERT
+	depends on PROC_SYSCTL
+	default n
+	select SYSCTL
+	---help---
+	  sys_sysctl uses binary paths that have been found challenging
+	  to properly maintain and use.  The interface in /proc/sys
+	  using paths with ascii names is now the primary path to this
+	  information.
+
+	  Almost nothing using the binary sysctl interface so if you are
+	  trying to save some space it is probably safe to disable this,
+	  making your kernel marginally smaller.
+
+	  If unsure say N here.
+
+config KALLSYMS
+	 bool "Load all symbols for debugging/ksymoops" if EXPERT
+	 default y
+	 help
+	   Say Y here to let the kernel print out symbolic crash information and
+	   symbolic stack backtraces. This increases the size of the kernel
+	   somewhat, as all symbols have to be loaded into the kernel image.
+
+config KALLSYMS_ALL
+	bool "Include all symbols in kallsyms"
+	depends on DEBUG_KERNEL && KALLSYMS
+	help
+	   Normally kallsyms only contains the symbols of functions for nicer
+	   OOPS messages and backtraces (i.e., symbols from the text and inittext
+	   sections). This is sufficient for most cases. And only in very rare
+	   cases (e.g., when a debugger is used) all symbols are required (e.g.,
+	   names of variables from the data sections, etc).
+
+	   This option makes sure that all symbols are loaded into the kernel
+	   image (i.e., symbols from all sections) in cost of increased kernel
+	   size (depending on the kernel configuration, it may be 300KiB or
+	   something like this).
+
+	   Say N unless you really need all symbols.
+
+config PRINTK
+	default y
+	bool "Enable support for printk" if EXPERT
+	select IRQ_WORK
+	help
+	  This option enables normal printk support. Removing it
+	  eliminates most of the message strings from the kernel image
+	  and makes the kernel more or less silent. As this makes it
+	  very difficult to diagnose system problems, saying N here is
+	  strongly discouraged.
+
+config BUG
+	bool "BUG() support" if EXPERT
+	default y
+	help
+          Disabling this option eliminates support for BUG and WARN, reducing
+          the size of your kernel image and potentially quietly ignoring
+          numerous fatal conditions. You should only consider disabling this
+          option for embedded systems with no facilities for reporting errors.
+          Just say Y.
+
+config ELF_CORE
+	depends on COREDUMP
+	default y
+	bool "Enable ELF core dumps" if EXPERT
+	help
+	  Enable support for generating core dumps. Disabling saves about 4k.
+
+
+config PCSPKR_PLATFORM
+	bool "Enable PC-Speaker support" if EXPERT
+	depends on HAVE_PCSPKR_PLATFORM
+	select I8253_LOCK
+	default y
+	help
+          This option allows to disable the internal PC-Speaker
+          support, saving some memory.
+
+config BASE_FULL
+	default y
+	bool "Enable full-sized data structures for core" if EXPERT
+	help
+	  Disabling this option reduces the size of miscellaneous core
+	  kernel data structures. This saves memory on small machines,
+	  but may reduce performance.
+
+config FUTEX
+	bool "Enable futex support" if EXPERT
+	default y
+	select RT_MUTEXES
+	help
+	  Disabling this option will cause the kernel to be built without
+	  support for "fast userspace mutexes".  The resulting kernel may not
+	  run glibc-based applications correctly.
+
+config HAVE_FUTEX_CMPXCHG
+	bool
+	depends on FUTEX
+	help
+	  Architectures should select this if futex_atomic_cmpxchg_inatomic()
+	  is implemented and always working. This removes a couple of runtime
+	  checks.
+
+config EPOLL
+	bool "Enable eventpoll support" if EXPERT
+	default y
+	select ANON_INODES
+	help
+	  Disabling this option will cause the kernel to be built without
+	  support for epoll family of system calls.
+
+config SIGNALFD
+	bool "Enable signalfd() system call" if EXPERT
+	select ANON_INODES
+	default y
+	help
+	  Enable the signalfd() system call that allows to receive signals
+	  on a file descriptor.
+
+	  If unsure, say Y.
+
+config TIMERFD
+	bool "Enable timerfd() system call" if EXPERT
+	select ANON_INODES
+	default y
+	help
+	  Enable the timerfd() system call that allows to receive timer
+	  events on a file descriptor.
+
+	  If unsure, say Y.
+
+config EVENTFD
+	bool "Enable eventfd() system call" if EXPERT
+	select ANON_INODES
+	default y
+	help
+	  Enable the eventfd() system call that allows to receive both
+	  kernel notification (ie. KAIO) or userspace notifications.
+
+	  If unsure, say Y.
+
+config SHMEM
+	bool "Use full shmem filesystem" if EXPERT
+	default y
+	depends on MMU
+	help
+	  The shmem is an internal filesystem used to manage shared memory.
+	  It is backed by swap and manages resource limits. It is also exported
+	  to userspace as tmpfs if TMPFS is enabled. Disabling this
+	  option replaces shmem and tmpfs with the much simpler ramfs code,
+	  which may be appropriate on small systems without swap.
+
+config AIO
+	bool "Enable AIO support" if EXPERT
+	default y
+	help
+	  This option enables POSIX asynchronous I/O which may by used
+	  by some high performance threaded applications. Disabling
+	  this option saves about 7k.
+
+config ADVISE_SYSCALLS
+	bool "Enable madvise/fadvise syscalls" if EXPERT
+	default y
+	help
+	  This option enables the madvise and fadvise syscalls, used by
+	  applications to advise the kernel about their future memory or file
+	  usage, improving performance. If building an embedded system where no
+	  applications use these syscalls, you can disable this option to save
+	  space.
+
+config PCI_QUIRKS
+	default y
+	bool "Enable PCI quirk workarounds" if EXPERT
+	depends on PCI
+	help
+	  This enables workarounds for various PCI chipset
+	  bugs/quirks. Disable this only if your target machine is
+	  unaffected by PCI quirks.
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/4] kconfig: Regenerate parser with current Bison prior to making changes
  2015-05-13 23:37 [PATCH 1/4] init/Kconfig: Fix break in middle of EXPERT menu Josh Triplett
  2015-05-13 23:37 ` [PATCH 2/4] init/Kconfig: Split expert menu into a separate file, init/Kconfig.expert Josh Triplett
@ 2015-05-13 23:38 ` Josh Triplett
  2015-05-13 23:38 ` [PATCH 4/4] kconfig: Introduce "showif" to factor out conditions on visibility Josh Triplett
  2015-05-14 11:04 ` [PATCH 1/4] init/Kconfig: Fix break in middle of EXPERT menu Paul Bolle
  3 siblings, 0 replies; 7+ messages in thread
From: Josh Triplett @ 2015-05-13 23:38 UTC (permalink / raw)
  To: Ingo Molnar, Andrew Morton, Paul E. McKenney, Michal Hocko,
	Josh Triplett, Vladimir Davydov, Johannes Weiner,
	Geert Uytterhoeven, Andy Lutomirski, Bertrand Jacquin,
	Luis R. Rodriguez, Iulia Manda, Pranith Kumar, Clark Williams,
	Mel Gorman, Randy Dunlap, Paul Bolle, linux-kernel

Before making changes to the parser, regenerate the parser with current
Bison to avoid mixing those changes with those produced by updating
Bison.

Signed-off-by: Josh Triplett <josh@joshtriplett.org>
---
 scripts/kconfig/zconf.tab.c_shipped | 1244 ++++++++++++++++-------------------
 1 file changed, 561 insertions(+), 683 deletions(-)

diff --git a/scripts/kconfig/zconf.tab.c_shipped b/scripts/kconfig/zconf.tab.c_shipped
index de5e84e..0864c7d 100644
--- a/scripts/kconfig/zconf.tab.c_shipped
+++ b/scripts/kconfig/zconf.tab.c_shipped
@@ -1,19 +1,19 @@
-/* A Bison parser, made by GNU Bison 2.5.  */
+/* A Bison parser, made by GNU Bison 3.0.2.  */
 
 /* Bison implementation for Yacc-like parsers in C
-   
-      Copyright (C) 1984, 1989-1990, 2000-2011 Free Software Foundation, Inc.
-   
+
+   Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
+
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
@@ -26,7 +26,7 @@
    special exception, which will cause the skeleton and the resulting
    Bison output files to be licensed under the GNU General Public
    License without this special exception.
-   
+
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
 
@@ -44,7 +44,7 @@
 #define YYBISON 1
 
 /* Bison version.  */
-#define YYBISON_VERSION "2.5"
+#define YYBISON_VERSION "3.0.2"
 
 /* Skeleton name.  */
 #define YYSKELETON_NAME "yacc.c"
@@ -58,18 +58,16 @@
 /* Pull parsers.  */
 #define YYPULL 1
 
-/* Using locations.  */
-#define YYLSP_NEEDED 0
 
 /* Substitute the variable and function names.  */
 #define yyparse         zconfparse
 #define yylex           zconflex
 #define yyerror         zconferror
-#define yylval          zconflval
-#define yychar          zconfchar
 #define yydebug         zconfdebug
 #define yynerrs         zconfnerrs
 
+#define yylval          zconflval
+#define yychar          zconfchar
 
 /* Copy the first part of user declarations.  */
 
@@ -108,10 +106,13 @@ static struct menu *current_menu, *current_entry;
 
 
 
-/* Enabling traces.  */
-#ifndef YYDEBUG
-# define YYDEBUG 1
-#endif
+# ifndef YY_NULLPTR
+#  if defined __cplusplus && 201103L <= __cplusplus
+#   define YY_NULLPTR nullptr
+#  else
+#   define YY_NULLPTR 0
+#  endif
+# endif
 
 /* Enabling verbose error messages.  */
 #ifdef YYERROR_VERBOSE
@@ -121,58 +122,60 @@ static struct menu *current_menu, *current_entry;
 # define YYERROR_VERBOSE 0
 #endif
 
-/* Enabling the token table.  */
-#ifndef YYTOKEN_TABLE
-# define YYTOKEN_TABLE 0
-#endif
 
+/* Debug traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 1
+#endif
+#if YYDEBUG
+extern int zconfdebug;
+#endif
 
-/* Tokens.  */
+/* Token type.  */
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum yytokentype {
-     T_MAINMENU = 258,
-     T_MENU = 259,
-     T_ENDMENU = 260,
-     T_SOURCE = 261,
-     T_CHOICE = 262,
-     T_ENDCHOICE = 263,
-     T_COMMENT = 264,
-     T_CONFIG = 265,
-     T_MENUCONFIG = 266,
-     T_HELP = 267,
-     T_HELPTEXT = 268,
-     T_IF = 269,
-     T_ENDIF = 270,
-     T_DEPENDS = 271,
-     T_OPTIONAL = 272,
-     T_PROMPT = 273,
-     T_TYPE = 274,
-     T_DEFAULT = 275,
-     T_SELECT = 276,
-     T_RANGE = 277,
-     T_VISIBLE = 278,
-     T_OPTION = 279,
-     T_ON = 280,
-     T_WORD = 281,
-     T_WORD_QUOTE = 282,
-     T_UNEQUAL = 283,
-     T_CLOSE_PAREN = 284,
-     T_OPEN_PAREN = 285,
-     T_EOL = 286,
-     T_OR = 287,
-     T_AND = 288,
-     T_EQUAL = 289,
-     T_NOT = 290
-   };
+  enum yytokentype
+  {
+    T_MAINMENU = 258,
+    T_MENU = 259,
+    T_ENDMENU = 260,
+    T_SOURCE = 261,
+    T_CHOICE = 262,
+    T_ENDCHOICE = 263,
+    T_COMMENT = 264,
+    T_CONFIG = 265,
+    T_MENUCONFIG = 266,
+    T_HELP = 267,
+    T_HELPTEXT = 268,
+    T_IF = 269,
+    T_ENDIF = 270,
+    T_DEPENDS = 271,
+    T_OPTIONAL = 272,
+    T_PROMPT = 273,
+    T_TYPE = 274,
+    T_DEFAULT = 275,
+    T_SELECT = 276,
+    T_RANGE = 277,
+    T_VISIBLE = 278,
+    T_OPTION = 279,
+    T_ON = 280,
+    T_WORD = 281,
+    T_WORD_QUOTE = 282,
+    T_UNEQUAL = 283,
+    T_CLOSE_PAREN = 284,
+    T_OPEN_PAREN = 285,
+    T_EOL = 286,
+    T_OR = 287,
+    T_AND = 288,
+    T_EQUAL = 289,
+    T_NOT = 290
+  };
 #endif
 
-
-
+/* Value type.  */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-typedef union YYSTYPE
+typedef union YYSTYPE YYSTYPE;
+union YYSTYPE
 {
 
 
@@ -184,14 +187,18 @@ typedef union YYSTYPE
 	const struct kconf_id *id;
 
 
-
-} YYSTYPE;
+};
 # define YYSTYPE_IS_TRIVIAL 1
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
 #endif
 
 
+extern YYSTYPE zconflval;
+
+int zconfparse (void);
+
+
+
 /* Copy the second part of user declarations.  */
 
 
@@ -212,11 +219,8 @@ typedef unsigned char yytype_uint8;
 
 #ifdef YYTYPE_INT8
 typedef YYTYPE_INT8 yytype_int8;
-#elif (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-typedef signed char yytype_int8;
 #else
-typedef short int yytype_int8;
+typedef signed char yytype_int8;
 #endif
 
 #ifdef YYTYPE_UINT16
@@ -236,8 +240,7 @@ typedef short int yytype_int16;
 #  define YYSIZE_T __SIZE_TYPE__
 # elif defined size_t
 #  define YYSIZE_T size_t
-# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
+# elif ! defined YYSIZE_T
 #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
 #  define YYSIZE_T size_t
 # else
@@ -251,38 +254,67 @@ typedef short int yytype_int16;
 # if defined YYENABLE_NLS && YYENABLE_NLS
 #  if ENABLE_NLS
 #   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
-#   define YY_(msgid) dgettext ("bison-runtime", msgid)
+#   define YY_(Msgid) dgettext ("bison-runtime", Msgid)
 #  endif
 # endif
 # ifndef YY_
-#  define YY_(msgid) msgid
+#  define YY_(Msgid) Msgid
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE
+# if (defined __GNUC__                                               \
+      && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__)))  \
+     || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
+#  define YY_ATTRIBUTE(Spec) __attribute__(Spec)
+# else
+#  define YY_ATTRIBUTE(Spec) /* empty */
+# endif
+#endif
+
+#ifndef YY_ATTRIBUTE_PURE
+# define YY_ATTRIBUTE_PURE   YY_ATTRIBUTE ((__pure__))
+#endif
+
+#ifndef YY_ATTRIBUTE_UNUSED
+# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
+#endif
+
+#if !defined _Noreturn \
+     && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
+# if defined _MSC_VER && 1200 <= _MSC_VER
+#  define _Noreturn __declspec (noreturn)
+# else
+#  define _Noreturn YY_ATTRIBUTE ((__noreturn__))
 # endif
 #endif
 
 /* Suppress unused-variable warnings by "using" E.  */
 #if ! defined lint || defined __GNUC__
-# define YYUSE(e) ((void) (e))
+# define YYUSE(E) ((void) (E))
 #else
-# define YYUSE(e) /* empty */
+# define YYUSE(E) /* empty */
 #endif
 
-/* Identity function, used to suppress warnings about constant conditions.  */
-#ifndef lint
-# define YYID(n) (n)
-#else
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static int
-YYID (int yyi)
+#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
+/* Suppress an incorrect diagnostic about yylval being uninitialized.  */
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
+    _Pragma ("GCC diagnostic push") \
+    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
+    _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
+    _Pragma ("GCC diagnostic pop")
 #else
-static int
-YYID (yyi)
-    int yyi;
+# define YY_INITIAL_VALUE(Value) Value
 #endif
-{
-  return yyi;
-}
+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
+# define YY_IGNORE_MAYBE_UNINITIALIZED_END
 #endif
+#ifndef YY_INITIAL_VALUE
+# define YY_INITIAL_VALUE(Value) /* Nothing. */
+#endif
+
 
 #if ! defined yyoverflow || YYERROR_VERBOSE
 
@@ -301,9 +333,9 @@ YYID (yyi)
 #    define alloca _alloca
 #   else
 #    define YYSTACK_ALLOC alloca
-#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
+#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
 #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+      /* Use EXIT_SUCCESS as a witness for stdlib.h.  */
 #     ifndef EXIT_SUCCESS
 #      define EXIT_SUCCESS 0
 #     endif
@@ -313,8 +345,8 @@ YYID (yyi)
 # endif
 
 # ifdef YYSTACK_ALLOC
-   /* Pacify GCC's `empty if-body' warning.  */
-#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
+   /* Pacify GCC's 'empty if-body' warning.  */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
 #  ifndef YYSTACK_ALLOC_MAXIMUM
     /* The OS might guarantee only one guard page at the bottom of the stack,
        and a page size can be as small as 4096 bytes.  So we cannot safely
@@ -330,7 +362,7 @@ YYID (yyi)
 #  endif
 #  if (defined __cplusplus && ! defined EXIT_SUCCESS \
        && ! ((defined YYMALLOC || defined malloc) \
-	     && (defined YYFREE || defined free)))
+             && (defined YYFREE || defined free)))
 #   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
 #   ifndef EXIT_SUCCESS
 #    define EXIT_SUCCESS 0
@@ -338,15 +370,13 @@ YYID (yyi)
 #  endif
 #  ifndef YYMALLOC
 #   define YYMALLOC malloc
-#   if ! defined malloc && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
+#   if ! defined malloc && ! defined EXIT_SUCCESS
 void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
 #  ifndef YYFREE
 #   define YYFREE free
-#   if ! defined free && ! defined EXIT_SUCCESS && (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
+#   if ! defined free && ! defined EXIT_SUCCESS
 void free (void *); /* INFRINGES ON USER NAME SPACE */
 #   endif
 #  endif
@@ -356,7 +386,7 @@ void free (void *); /* INFRINGES ON USER NAME SPACE */
 
 #if (! defined yyoverflow \
      && (! defined __cplusplus \
-	 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+         || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
 
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
@@ -381,35 +411,35 @@ union yyalloc
    elements in the stack, and YYPTR gives the new location of the
    stack.  Advance YYPTR to a properly aligned location for the next
    stack.  */
-# define YYSTACK_RELOCATE(Stack_alloc, Stack)				\
-    do									\
-      {									\
-	YYSIZE_T yynewbytes;						\
-	YYCOPY (&yyptr->Stack_alloc, Stack, yysize);			\
-	Stack = &yyptr->Stack_alloc;					\
-	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
-	yyptr += yynewbytes / sizeof (*yyptr);				\
-      }									\
-    while (YYID (0))
+# define YYSTACK_RELOCATE(Stack_alloc, Stack)                           \
+    do                                                                  \
+      {                                                                 \
+        YYSIZE_T yynewbytes;                                            \
+        YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
+        Stack = &yyptr->Stack_alloc;                                    \
+        yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+        yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                 \
+    while (0)
 
 #endif
 
 #if defined YYCOPY_NEEDED && YYCOPY_NEEDED
-/* Copy COUNT objects from FROM to TO.  The source and destination do
+/* Copy COUNT objects from SRC to DST.  The source and destination do
    not overlap.  */
 # ifndef YYCOPY
 #  if defined __GNUC__ && 1 < __GNUC__
-#   define YYCOPY(To, From, Count) \
-      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#   define YYCOPY(Dst, Src, Count) \
+      __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
 #  else
-#   define YYCOPY(To, From, Count)		\
-      do					\
-	{					\
-	  YYSIZE_T yyi;				\
-	  for (yyi = 0; yyi < (Count); yyi++)	\
-	    (To)[yyi] = (From)[yyi];		\
-	}					\
-      while (YYID (0))
+#   define YYCOPY(Dst, Src, Count)              \
+      do                                        \
+        {                                       \
+          YYSIZE_T yyi;                         \
+          for (yyi = 0; yyi < (Count); yyi++)   \
+            (Dst)[yyi] = (Src)[yyi];            \
+        }                                       \
+      while (0)
 #  endif
 # endif
 #endif /* !YYCOPY_NEEDED */
@@ -425,17 +455,19 @@ union yyalloc
 #define YYNNTS  50
 /* YYNRULES -- Number of rules.  */
 #define YYNRULES  118
-/* YYNRULES -- Number of states.  */
+/* YYNSTATES -- Number of states.  */
 #define YYNSTATES  191
 
-/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
+   by yylex, with out-of-bounds checking.  */
 #define YYUNDEFTOK  2
 #define YYMAXUTOK   290
 
-#define YYTRANSLATE(YYX)						\
+#define YYTRANSLATE(YYX)                                                \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
 
-/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
+   as returned by yylex, without out-of-bounds checking.  */
 static const yytype_uint8 yytranslate[] =
 {
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -471,65 +503,7 @@ static const yytype_uint8 yytranslate[] =
 };
 
 #if YYDEBUG
-/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
-   YYRHS.  */
-static const yytype_uint16 yyprhs[] =
-{
-       0,     0,     3,     6,     8,    11,    13,    14,    17,    20,
-      23,    26,    31,    36,    40,    42,    44,    46,    48,    50,
-      52,    54,    56,    58,    60,    62,    64,    66,    68,    72,
-      75,    79,    82,    86,    89,    90,    93,    96,    99,   102,
-     105,   108,   112,   117,   122,   127,   133,   137,   138,   142,
-     143,   146,   150,   153,   155,   159,   160,   163,   166,   169,
-     172,   175,   180,   184,   187,   192,   193,   196,   200,   202,
-     206,   207,   210,   213,   216,   220,   224,   228,   230,   234,
-     235,   238,   241,   244,   248,   252,   255,   258,   261,   262,
-     265,   268,   271,   276,   277,   280,   283,   286,   287,   290,
-     292,   294,   297,   300,   303,   305,   308,   309,   312,   314,
-     318,   322,   326,   329,   333,   337,   339,   341,   342
-};
-
-/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
-static const yytype_int8 yyrhs[] =
-{
-      37,     0,    -1,    81,    38,    -1,    38,    -1,    63,    39,
-      -1,    39,    -1,    -1,    39,    41,    -1,    39,    55,    -1,
-      39,    67,    -1,    39,    80,    -1,    39,    26,     1,    31,
-      -1,    39,    40,     1,    31,    -1,    39,     1,    31,    -1,
-      16,    -1,    18,    -1,    19,    -1,    21,    -1,    17,    -1,
-      22,    -1,    20,    -1,    23,    -1,    31,    -1,    61,    -1,
-      71,    -1,    44,    -1,    46,    -1,    69,    -1,    26,     1,
-      31,    -1,     1,    31,    -1,    10,    26,    31,    -1,    43,
-      47,    -1,    11,    26,    31,    -1,    45,    47,    -1,    -1,
-      47,    48,    -1,    47,    49,    -1,    47,    75,    -1,    47,
-      73,    -1,    47,    42,    -1,    47,    31,    -1,    19,    78,
-      31,    -1,    18,    79,    82,    31,    -1,    20,    83,    82,
-      31,    -1,    21,    26,    82,    31,    -1,    22,    84,    84,
-      82,    31,    -1,    24,    50,    31,    -1,    -1,    50,    26,
-      51,    -1,    -1,    34,    79,    -1,     7,    85,    31,    -1,
-      52,    56,    -1,    80,    -1,    53,    58,    54,    -1,    -1,
-      56,    57,    -1,    56,    75,    -1,    56,    73,    -1,    56,
-      31,    -1,    56,    42,    -1,    18,    79,    82,    31,    -1,
-      19,    78,    31,    -1,    17,    31,    -1,    20,    26,    82,
-      31,    -1,    -1,    58,    41,    -1,    14,    83,    81,    -1,
-      80,    -1,    59,    62,    60,    -1,    -1,    62,    41,    -1,
-      62,    67,    -1,    62,    55,    -1,     3,    79,    81,    -1,
-       4,    79,    31,    -1,    64,    76,    74,    -1,    80,    -1,
-      65,    68,    66,    -1,    -1,    68,    41,    -1,    68,    67,
-      -1,    68,    55,    -1,     6,    79,    31,    -1,     9,    79,
-      31,    -1,    70,    74,    -1,    12,    31,    -1,    72,    13,
-      -1,    -1,    74,    75,    -1,    74,    31,    -1,    74,    42,
-      -1,    16,    25,    83,    31,    -1,    -1,    76,    77,    -1,
-      76,    31,    -1,    23,    82,    -1,    -1,    79,    82,    -1,
-      26,    -1,    27,    -1,     5,    31,    -1,     8,    31,    -1,
-      15,    31,    -1,    31,    -1,    81,    31,    -1,    -1,    14,
-      83,    -1,    84,    -1,    84,    34,    84,    -1,    84,    28,
-      84,    -1,    30,    83,    29,    -1,    35,    83,    -1,    83,
-      32,    83,    -1,    83,    33,    83,    -1,    26,    -1,    27,
-      -1,    -1,    26,    -1
-};
-
-/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+  /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
        0,   103,   103,   103,   105,   105,   107,   109,   110,   111,
@@ -547,7 +521,7 @@ static const yytype_uint16 yyrline[] =
 };
 #endif
 
-#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
+#if YYDEBUG || YYERROR_VERBOSE || 0
 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
 static const char *const yytname[] =
@@ -568,13 +542,13 @@ static const char *const yytname[] =
   "menu_entry", "menu_end", "menu_stmt", "menu_block", "source_stmt",
   "comment", "comment_stmt", "help_start", "help", "depends_list",
   "depends", "visibility_list", "visible", "prompt_stmt_opt", "prompt",
-  "end", "nl", "if_expr", "expr", "symbol", "word_opt", 0
+  "end", "nl", "if_expr", "expr", "symbol", "word_opt", YY_NULLPTR
 };
 #endif
 
 # ifdef YYPRINT
-/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
-   token YYLEX-NUM.  */
+/* YYTOKNUM[NUM] -- (External) token number corresponding to the
+   (internal) symbol number NUM (which must be that of a token).  */
 static const yytype_uint16 yytoknum[] =
 {
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
@@ -584,80 +558,18 @@ static const yytype_uint16 yytoknum[] =
 };
 # endif
 
-/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
-static const yytype_uint8 yyr1[] =
-{
-       0,    36,    37,    37,    38,    38,    39,    39,    39,    39,
-      39,    39,    39,    39,    40,    40,    40,    40,    40,    40,
-      40,    40,    41,    41,    41,    41,    41,    41,    42,    42,
-      43,    44,    45,    46,    47,    47,    47,    47,    47,    47,
-      47,    48,    48,    48,    48,    48,    49,    50,    50,    51,
-      51,    52,    53,    54,    55,    56,    56,    56,    56,    56,
-      56,    57,    57,    57,    57,    58,    58,    59,    60,    61,
-      62,    62,    62,    62,    63,    64,    65,    66,    67,    68,
-      68,    68,    68,    69,    70,    71,    72,    73,    74,    74,
-      74,    74,    75,    76,    76,    76,    77,    78,    78,    79,
-      79,    80,    80,    80,    81,    81,    82,    82,    83,    83,
-      83,    83,    83,    83,    83,    84,    84,    85,    85
-};
+#define YYPACT_NINF -90
 
-/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
-static const yytype_uint8 yyr2[] =
-{
-       0,     2,     2,     1,     2,     1,     0,     2,     2,     2,
-       2,     4,     4,     3,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     3,     2,
-       3,     2,     3,     2,     0,     2,     2,     2,     2,     2,
-       2,     3,     4,     4,     4,     5,     3,     0,     3,     0,
-       2,     3,     2,     1,     3,     0,     2,     2,     2,     2,
-       2,     4,     3,     2,     4,     0,     2,     3,     1,     3,
-       0,     2,     2,     2,     3,     3,     3,     1,     3,     0,
-       2,     2,     2,     3,     3,     2,     2,     2,     0,     2,
-       2,     2,     4,     0,     2,     2,     2,     0,     2,     1,
-       1,     2,     2,     2,     1,     2,     0,     2,     1,     3,
-       3,     3,     2,     3,     3,     1,     1,     0,     1
-};
+#define yypact_value_is_default(Yystate) \
+  (!!((Yystate) == (-90)))
 
-/* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
-   Performed when YYTABLE doesn't specify something else to do.  Zero
-   means the default is an error.  */
-static const yytype_uint8 yydefact[] =
-{
-       6,     0,   104,     0,     3,     0,     6,     6,    99,   100,
-       0,     1,     0,     0,     0,     0,   117,     0,     0,     0,
-       0,     0,     0,    14,    18,    15,    16,    20,    17,    19,
-      21,     0,    22,     0,     7,    34,    25,    34,    26,    55,
-      65,     8,    70,    23,    93,    79,     9,    27,    88,    24,
-      10,     0,   105,     2,    74,    13,     0,   101,     0,   118,
-       0,   102,     0,     0,     0,   115,   116,     0,     0,     0,
-     108,   103,     0,     0,     0,     0,     0,     0,     0,    88,
-       0,     0,    75,    83,    51,    84,    30,    32,     0,   112,
-       0,     0,    67,     0,     0,    11,    12,     0,     0,     0,
-       0,    97,     0,     0,     0,    47,     0,    40,    39,    35,
-      36,     0,    38,    37,     0,     0,    97,     0,    59,    60,
-      56,    58,    57,    66,    54,    53,    71,    73,    69,    72,
-      68,   106,    95,     0,    94,    80,    82,    78,    81,    77,
-      90,    91,    89,   111,   113,   114,   110,   109,    29,    86,
-       0,   106,     0,   106,   106,   106,     0,     0,     0,    87,
-      63,   106,     0,   106,     0,    96,     0,     0,    41,    98,
-       0,     0,   106,    49,    46,    28,     0,    62,     0,   107,
-      92,    42,    43,    44,     0,     0,    48,    61,    64,    45,
-      50
-};
+#define YYTABLE_NINF -86
 
-/* YYDEFGOTO[NTERM-NUM].  */
-static const yytype_int16 yydefgoto[] =
-{
-      -1,     3,     4,     5,    33,    34,   108,    35,    36,    37,
-      38,    74,   109,   110,   157,   186,    39,    40,   124,    41,
-      76,   120,    77,    42,   128,    43,    78,     6,    44,    45,
-     137,    46,    80,    47,    48,    49,   111,   112,    81,   113,
-      79,   134,   152,   153,    50,     7,   165,    69,    70,    60
-};
+#define yytable_value_is_error(Yytable_value) \
+  0
 
-/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-   STATE-NUM.  */
-#define YYPACT_NINF -90
+  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+     STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
        4,    42,   -90,    96,   -90,   111,   -90,    15,   -90,   -90,
@@ -682,7 +594,34 @@ static const yytype_int16 yypact[] =
      -90
 };
 
-/* YYPGOTO[NTERM-NUM].  */
+  /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
+     Performed when YYTABLE does not specify something else to do.  Zero
+     means the default is an error.  */
+static const yytype_uint8 yydefact[] =
+{
+       6,     0,   104,     0,     3,     0,     6,     6,    99,   100,
+       0,     1,     0,     0,     0,     0,   117,     0,     0,     0,
+       0,     0,     0,    14,    18,    15,    16,    20,    17,    19,
+      21,     0,    22,     0,     7,    34,    25,    34,    26,    55,
+      65,     8,    70,    23,    93,    79,     9,    27,    88,    24,
+      10,     0,   105,     2,    74,    13,     0,   101,     0,   118,
+       0,   102,     0,     0,     0,   115,   116,     0,     0,     0,
+     108,   103,     0,     0,     0,     0,     0,     0,     0,    88,
+       0,     0,    75,    83,    51,    84,    30,    32,     0,   112,
+       0,     0,    67,     0,     0,    11,    12,     0,     0,     0,
+       0,    97,     0,     0,     0,    47,     0,    40,    39,    35,
+      36,     0,    38,    37,     0,     0,    97,     0,    59,    60,
+      56,    58,    57,    66,    54,    53,    71,    73,    69,    72,
+      68,   106,    95,     0,    94,    80,    82,    78,    81,    77,
+      90,    91,    89,   111,   113,   114,   110,   109,    29,    86,
+       0,   106,     0,   106,   106,   106,     0,     0,     0,    87,
+      63,   106,     0,   106,     0,    96,     0,     0,    41,    98,
+       0,     0,   106,    49,    46,    28,     0,    62,     0,   107,
+      92,    42,    43,    44,     0,     0,    48,    61,    64,    45,
+      50
+};
+
+  /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
      -90,   -90,   269,   271,   -90,    23,   -70,   -90,   -90,   -90,
@@ -692,10 +631,19 @@ static const yytype_int16 yypgoto[] =
      -90,   -90,   169,    -1,    27,    -7,   118,   -66,   -89,   -90
 };
 
-/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
-   positive, shift that token.  If negative, reduce the rule which
-   number is the opposite.  If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -86
+  /* YYDEFGOTO[NTERM-NUM].  */
+static const yytype_int16 yydefgoto[] =
+{
+      -1,     3,     4,     5,    33,    34,   108,    35,    36,    37,
+      38,    74,   109,   110,   157,   186,    39,    40,   124,    41,
+      76,   120,    77,    42,   128,    43,    78,     6,    44,    45,
+     137,    46,    80,    47,    48,    49,   111,   112,    81,   113,
+      79,   134,   152,   153,    50,     7,   165,    69,    70,    60
+};
+
+  /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
+     positive, shift that token.  If negative, reduce the rule whose
+     number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
       10,    88,    89,    54,   146,   147,   119,     1,   122,   164,
@@ -730,12 +678,6 @@ static const yytype_int16 yytable[] =
      184
 };
 
-#define yypact_value_is_default(yystate) \
-  ((yystate) == (-90))
-
-#define yytable_value_is_error(yytable_value) \
-  YYID (0)
-
 static const yytype_int16 yycheck[] =
 {
        1,    67,    68,    10,    93,    94,    76,     3,    76,    14,
@@ -770,8 +712,8 @@ static const yytype_int16 yycheck[] =
      172
 };
 
-/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-   symbol of state STATE-NUM.  */
+  /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+     symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
        0,     3,    31,    37,    38,    39,    63,    81,    26,    27,
@@ -796,94 +738,75 @@ static const yytype_uint8 yystos[] =
       79
 };
 
-#define yyerrok		(yyerrstatus = 0)
-#define yyclearin	(yychar = YYEMPTY)
-#define YYEMPTY		(-2)
-#define YYEOF		0
-
-#define YYACCEPT	goto yyacceptlab
-#define YYABORT		goto yyabortlab
-#define YYERROR		goto yyerrorlab
-
-
-/* Like YYERROR except do call yyerror.  This remains here temporarily
-   to ease the transition to the new meaning of YYERROR, for GCC.
-   Once GCC version 2 has supplanted version 1, this can go.  However,
-   YYFAIL appears to be in use.  Nevertheless, it is formally deprecated
-   in Bison 2.4.2's NEWS entry, where a plan to phase it out is
-   discussed.  */
-
-#define YYFAIL		goto yyerrlab
-#if defined YYFAIL
-  /* This is here to suppress warnings from the GCC cpp's
-     -Wunused-macros.  Normally we don't worry about that warning, but
-     some users do, and we want to make it easy for users to remove
-     YYFAIL uses, which will produce warnings from Bison 2.5.  */
-#endif
+  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const yytype_uint8 yyr1[] =
+{
+       0,    36,    37,    37,    38,    38,    39,    39,    39,    39,
+      39,    39,    39,    39,    40,    40,    40,    40,    40,    40,
+      40,    40,    41,    41,    41,    41,    41,    41,    42,    42,
+      43,    44,    45,    46,    47,    47,    47,    47,    47,    47,
+      47,    48,    48,    48,    48,    48,    49,    50,    50,    51,
+      51,    52,    53,    54,    55,    56,    56,    56,    56,    56,
+      56,    57,    57,    57,    57,    58,    58,    59,    60,    61,
+      62,    62,    62,    62,    63,    64,    65,    66,    67,    68,
+      68,    68,    68,    69,    70,    71,    72,    73,    74,    74,
+      74,    74,    75,    76,    76,    76,    77,    78,    78,    79,
+      79,    80,    80,    80,    81,    81,    82,    82,    83,    83,
+      83,    83,    83,    83,    83,    84,    84,    85,    85
+};
 
-#define YYRECOVERING()  (!!yyerrstatus)
+  /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
+static const yytype_uint8 yyr2[] =
+{
+       0,     2,     2,     1,     2,     1,     0,     2,     2,     2,
+       2,     4,     4,     3,     1,     1,     1,     1,     1,     1,
+       1,     1,     1,     1,     1,     1,     1,     1,     3,     2,
+       3,     2,     3,     2,     0,     2,     2,     2,     2,     2,
+       2,     3,     4,     4,     4,     5,     3,     0,     3,     0,
+       2,     3,     2,     1,     3,     0,     2,     2,     2,     2,
+       2,     4,     3,     2,     4,     0,     2,     3,     1,     3,
+       0,     2,     2,     2,     3,     3,     3,     1,     3,     0,
+       2,     2,     2,     3,     3,     2,     2,     2,     0,     2,
+       2,     2,     4,     0,     2,     2,     2,     0,     2,     1,
+       1,     2,     2,     2,     1,     2,     0,     2,     1,     3,
+       3,     3,     2,     3,     3,     1,     1,     0,     1
+};
 
-#define YYBACKUP(Token, Value)					\
-do								\
-  if (yychar == YYEMPTY && yylen == 1)				\
-    {								\
-      yychar = (Token);						\
-      yylval = (Value);						\
-      YYPOPSTACK (1);						\
-      goto yybackup;						\
-    }								\
-  else								\
-    {								\
-      yyerror (YY_("syntax error: cannot back up")); \
-      YYERROR;							\
-    }								\
-while (YYID (0))
-
-
-#define YYTERROR	1
-#define YYERRCODE	256
-
-
-/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
-   If N is 0, then set CURRENT to the empty location which ends
-   the previous symbol: RHS[0] (always defined).  */
-
-#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-#ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N)				\
-    do									\
-      if (YYID (N))                                                    \
-	{								\
-	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
-	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
-	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
-	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
-	}								\
-      else								\
-	{								\
-	  (Current).first_line   = (Current).last_line   =		\
-	    YYRHSLOC (Rhs, 0).last_line;				\
-	  (Current).first_column = (Current).last_column =		\
-	    YYRHSLOC (Rhs, 0).last_column;				\
-	}								\
-    while (YYID (0))
-#endif
 
+#define yyerrok         (yyerrstatus = 0)
+#define yyclearin       (yychar = YYEMPTY)
+#define YYEMPTY         (-2)
+#define YYEOF           0
 
-/* This macro is provided for backward compatibility. */
+#define YYACCEPT        goto yyacceptlab
+#define YYABORT         goto yyabortlab
+#define YYERROR         goto yyerrorlab
 
-#ifndef YY_LOCATION_PRINT
-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-#endif
 
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)                                  \
+do                                                              \
+  if (yychar == YYEMPTY)                                        \
+    {                                                           \
+      yychar = (Token);                                         \
+      yylval = (Value);                                         \
+      YYPOPSTACK (yylen);                                       \
+      yystate = *yyssp;                                         \
+      goto yybackup;                                            \
+    }                                                           \
+  else                                                          \
+    {                                                           \
+      yyerror (YY_("syntax error: cannot back up")); \
+      YYERROR;                                                  \
+    }                                                           \
+while (0)
+
+/* Error token number */
+#define YYTERROR        1
+#define YYERRCODE       256
 
-/* YYLEX -- calling `yylex' with the right arguments.  */
 
-#ifdef YYLEX_PARAM
-# define YYLEX yylex (YYLEX_PARAM)
-#else
-# define YYLEX yylex ()
-#endif
 
 /* Enable debugging if requested.  */
 #if YYDEBUG
@@ -893,54 +816,46 @@ while (YYID (0))
 #  define YYFPRINTF fprintf
 # endif
 
-# define YYDPRINTF(Args)			\
-do {						\
-  if (yydebug)					\
-    YYFPRINTF Args;				\
-} while (YYID (0))
+# define YYDPRINTF(Args)                        \
+do {                                            \
+  if (yydebug)                                  \
+    YYFPRINTF Args;                             \
+} while (0)
 
-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
-do {									  \
-  if (yydebug)								  \
-    {									  \
-      YYFPRINTF (stderr, "%s ", Title);					  \
-      yy_symbol_print (stderr,						  \
-		  Type, Value); \
-      YYFPRINTF (stderr, "\n");						  \
-    }									  \
-} while (YYID (0))
+/* This macro is provided for backward compatibility. */
+#ifndef YY_LOCATION_PRINT
+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
+#endif
 
 
-/*--------------------------------.
-| Print this symbol on YYOUTPUT.  |
-`--------------------------------*/
+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                    \
+do {                                                                      \
+  if (yydebug)                                                            \
+    {                                                                     \
+      YYFPRINTF (stderr, "%s ", Title);                                   \
+      yy_symbol_print (stderr,                                            \
+                  Type, Value); \
+      YYFPRINTF (stderr, "\n");                                           \
+    }                                                                     \
+} while (0)
+
+
+/*----------------------------------------.
+| Print this symbol's value on YYOUTPUT.  |
+`----------------------------------------*/
 
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 static void
 yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-#else
-static void
-yy_symbol_value_print (yyoutput, yytype, yyvaluep)
-    FILE *yyoutput;
-    int yytype;
-    YYSTYPE const * const yyvaluep;
-#endif
 {
+  FILE *yyo = yyoutput;
+  YYUSE (yyo);
   if (!yyvaluep)
     return;
 # ifdef YYPRINT
   if (yytype < YYNTOKENS)
     YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-# else
-  YYUSE (yyoutput);
 # endif
-  switch (yytype)
-    {
-      default:
-	break;
-    }
+  YYUSE (yytype);
 }
 
 
@@ -948,22 +863,11 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep)
 | Print this symbol on YYOUTPUT.  |
 `--------------------------------*/
 
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 static void
 yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
-#else
-static void
-yy_symbol_print (yyoutput, yytype, yyvaluep)
-    FILE *yyoutput;
-    int yytype;
-    YYSTYPE const * const yyvaluep;
-#endif
 {
-  if (yytype < YYNTOKENS)
-    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
-  else
-    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+  YYFPRINTF (yyoutput, "%s %s (",
+             yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
 
   yy_symbol_value_print (yyoutput, yytype, yyvaluep);
   YYFPRINTF (yyoutput, ")");
@@ -974,16 +878,8 @@ yy_symbol_print (yyoutput, yytype, yyvaluep)
 | TOP (included).                                                   |
 `------------------------------------------------------------------*/
 
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 static void
 yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
-#else
-static void
-yy_stack_print (yybottom, yytop)
-    yytype_int16 *yybottom;
-    yytype_int16 *yytop;
-#endif
 {
   YYFPRINTF (stderr, "Stack now");
   for (; yybottom <= yytop; yybottom++)
@@ -994,49 +890,42 @@ yy_stack_print (yybottom, yytop)
   YYFPRINTF (stderr, "\n");
 }
 
-# define YY_STACK_PRINT(Bottom, Top)				\
-do {								\
-  if (yydebug)							\
-    yy_stack_print ((Bottom), (Top));				\
-} while (YYID (0))
+# define YY_STACK_PRINT(Bottom, Top)                            \
+do {                                                            \
+  if (yydebug)                                                  \
+    yy_stack_print ((Bottom), (Top));                           \
+} while (0)
 
 
 /*------------------------------------------------.
 | Report that the YYRULE is going to be reduced.  |
 `------------------------------------------------*/
 
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-static void
-yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
-#else
 static void
-yy_reduce_print (yyvsp, yyrule)
-    YYSTYPE *yyvsp;
-    int yyrule;
-#endif
+yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule)
 {
+  unsigned long int yylno = yyrline[yyrule];
   int yynrhs = yyr2[yyrule];
   int yyi;
-  unsigned long int yylno = yyrline[yyrule];
   YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
-	     yyrule - 1, yylno);
+             yyrule - 1, yylno);
   /* The symbols being reduced.  */
   for (yyi = 0; yyi < yynrhs; yyi++)
     {
       YYFPRINTF (stderr, "   $%d = ", yyi + 1);
-      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
-		       &(yyvsp[(yyi + 1) - (yynrhs)])
-		       		       );
+      yy_symbol_print (stderr,
+                       yystos[yyssp[yyi + 1 - yynrhs]],
+                       &(yyvsp[(yyi + 1) - (yynrhs)])
+                                              );
       YYFPRINTF (stderr, "\n");
     }
 }
 
-# define YY_REDUCE_PRINT(Rule)		\
-do {					\
-  if (yydebug)				\
-    yy_reduce_print (yyvsp, Rule); \
-} while (YYID (0))
+# define YY_REDUCE_PRINT(Rule)          \
+do {                                    \
+  if (yydebug)                          \
+    yy_reduce_print (yyssp, yyvsp, Rule); \
+} while (0)
 
 /* Nonzero means print parse trace.  It is left uninitialized so that
    multiple parsers can coexist.  */
@@ -1050,7 +939,7 @@ int yydebug;
 
 
 /* YYINITDEPTH -- initial size of the parser's stacks.  */
-#ifndef	YYINITDEPTH
+#ifndef YYINITDEPTH
 # define YYINITDEPTH 200
 #endif
 
@@ -1073,15 +962,8 @@ int yydebug;
 #   define yystrlen strlen
 #  else
 /* Return the length of YYSTR.  */
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 static YYSIZE_T
 yystrlen (const char *yystr)
-#else
-static YYSIZE_T
-yystrlen (yystr)
-    const char *yystr;
-#endif
 {
   YYSIZE_T yylen;
   for (yylen = 0; yystr[yylen]; yylen++)
@@ -1097,16 +979,8 @@ yystrlen (yystr)
 #  else
 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
    YYDEST.  */
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 static char *
 yystpcpy (char *yydest, const char *yysrc)
-#else
-static char *
-yystpcpy (yydest, yysrc)
-    char *yydest;
-    const char *yysrc;
-#endif
 {
   char *yyd = yydest;
   const char *yys = yysrc;
@@ -1136,27 +1010,27 @@ yytnamerr (char *yyres, const char *yystr)
       char const *yyp = yystr;
 
       for (;;)
-	switch (*++yyp)
-	  {
-	  case '\'':
-	  case ',':
-	    goto do_not_strip_quotes;
-
-	  case '\\':
-	    if (*++yyp != '\\')
-	      goto do_not_strip_quotes;
-	    /* Fall through.  */
-	  default:
-	    if (yyres)
-	      yyres[yyn] = *yyp;
-	    yyn++;
-	    break;
-
-	  case '"':
-	    if (yyres)
-	      yyres[yyn] = '\0';
-	    return yyn;
-	  }
+        switch (*++yyp)
+          {
+          case '\'':
+          case ',':
+            goto do_not_strip_quotes;
+
+          case '\\':
+            if (*++yyp != '\\')
+              goto do_not_strip_quotes;
+            /* Fall through.  */
+          default:
+            if (yyres)
+              yyres[yyn] = *yyp;
+            yyn++;
+            break;
+
+          case '"':
+            if (yyres)
+              yyres[yyn] = '\0';
+            return yyn;
+          }
     do_not_strip_quotes: ;
     }
 
@@ -1179,12 +1053,11 @@ static int
 yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                 yytype_int16 *yyssp, int yytoken)
 {
-  YYSIZE_T yysize0 = yytnamerr (0, yytname[yytoken]);
+  YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
   YYSIZE_T yysize = yysize0;
-  YYSIZE_T yysize1;
   enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
   /* Internationalized format string. */
-  const char *yyformat = 0;
+  const char *yyformat = YY_NULLPTR;
   /* Arguments of yyformat. */
   char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
   /* Number of reported tokens (one for the "unexpected", one per
@@ -1192,10 +1065,6 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
   int yycount = 0;
 
   /* There are many possibilities here to consider:
-     - Assume YYFAIL is not used.  It's too flawed to consider.  See
-       <http://lists.gnu.org/archive/html/bison-patches/2009-12/msg00024.html>
-       for details.  YYERROR is fine as it does not invoke this
-       function.
      - If this state is a consistent state with a default action, then
        the only way this function was invoked is if the default action
        is an error action.  In that case, don't check for expected
@@ -1244,11 +1113,13 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
                     break;
                   }
                 yyarg[yycount++] = yytname[yyx];
-                yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-                if (! (yysize <= yysize1
-                       && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-                  return 2;
-                yysize = yysize1;
+                {
+                  YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
+                  if (! (yysize <= yysize1
+                         && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+                    return 2;
+                  yysize = yysize1;
+                }
               }
         }
     }
@@ -1268,10 +1139,12 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
 # undef YYCASE_
     }
 
-  yysize1 = yysize + yystrlen (yyformat);
-  if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
-    return 2;
-  yysize = yysize1;
+  {
+    YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
+    if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
+      return 2;
+    yysize = yysize1;
+  }
 
   if (*yymsg_alloc < yysize)
     {
@@ -1308,78 +1181,58 @@ yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
 | Release the memory associated to this symbol.  |
 `-----------------------------------------------*/
 
-/*ARGSUSED*/
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 static void
 yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
-#else
-static void
-yydestruct (yymsg, yytype, yyvaluep)
-    const char *yymsg;
-    int yytype;
-    YYSTYPE *yyvaluep;
-#endif
 {
   YYUSE (yyvaluep);
-
   if (!yymsg)
     yymsg = "Deleting";
   YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
 
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   switch (yytype)
     {
-      case 53: /* "choice_entry" */
+          case 53: /* choice_entry  */
 
-	{
+      {
 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
-		(yyvaluep->menu)->file->name, (yyvaluep->menu)->lineno);
-	if (current_menu == (yyvaluep->menu))
+		((*yyvaluep).menu)->file->name, ((*yyvaluep).menu)->lineno);
+	if (current_menu == ((*yyvaluep).menu))
 		menu_end_menu();
-};
+}
+
+        break;
 
-	break;
-      case 59: /* "if_entry" */
+    case 59: /* if_entry  */
 
-	{
+      {
 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
-		(yyvaluep->menu)->file->name, (yyvaluep->menu)->lineno);
-	if (current_menu == (yyvaluep->menu))
+		((*yyvaluep).menu)->file->name, ((*yyvaluep).menu)->lineno);
+	if (current_menu == ((*yyvaluep).menu))
 		menu_end_menu();
-};
+}
+
+        break;
 
-	break;
-      case 65: /* "menu_entry" */
+    case 65: /* menu_entry  */
 
-	{
+      {
 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
-		(yyvaluep->menu)->file->name, (yyvaluep->menu)->lineno);
-	if (current_menu == (yyvaluep->menu))
+		((*yyvaluep).menu)->file->name, ((*yyvaluep).menu)->lineno);
+	if (current_menu == ((*yyvaluep).menu))
 		menu_end_menu();
-};
+}
+
+        break;
 
-	break;
 
       default:
-	break;
+        break;
     }
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
 }
 
 
-/* Prevent warnings from -Wmissing-prototypes.  */
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void *YYPARSE_PARAM);
-#else
-int yyparse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
-int yyparse (void);
-#else
-int yyparse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
 
 
 /* The lookahead symbol.  */
@@ -1387,7 +1240,6 @@ int yychar;
 
 /* The semantic value of the lookahead symbol.  */
 YYSTYPE yylval;
-
 /* Number of syntax errors so far.  */
 int yynerrs;
 
@@ -1396,37 +1248,18 @@ int yynerrs;
 | yyparse.  |
 `----------*/
 
-#ifdef YYPARSE_PARAM
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
-int
-yyparse (void *YYPARSE_PARAM)
-#else
-int
-yyparse (YYPARSE_PARAM)
-    void *YYPARSE_PARAM;
-#endif
-#else /* ! YYPARSE_PARAM */
-#if (defined __STDC__ || defined __C99__FUNC__ \
-     || defined __cplusplus || defined _MSC_VER)
 int
 yyparse (void)
-#else
-int
-yyparse ()
-
-#endif
-#endif
 {
     int yystate;
     /* Number of tokens to shift before error messages enabled.  */
     int yyerrstatus;
 
     /* The stacks and their tools:
-       `yyss': related to states.
-       `yyvs': related to semantic values.
+       'yyss': related to states.
+       'yyvs': related to semantic values.
 
-       Refer to the stacks thru separate pointers, to allow yyoverflow
+       Refer to the stacks through separate pointers, to allow yyoverflow
        to reallocate them elsewhere.  */
 
     /* The state stack.  */
@@ -1444,7 +1277,7 @@ yyparse ()
   int yyn;
   int yyresult;
   /* Lookahead token as an internal (translated) token number.  */
-  int yytoken;
+  int yytoken = 0;
   /* The variables used to return semantic value and location from the
      action routines.  */
   YYSTYPE yyval;
@@ -1462,9 +1295,8 @@ yyparse ()
      Keep to zero when no symbol should be popped.  */
   int yylen = 0;
 
-  yytoken = 0;
-  yyss = yyssa;
-  yyvs = yyvsa;
+  yyssp = yyss = yyssa;
+  yyvsp = yyvs = yyvsa;
   yystacksize = YYINITDEPTH;
 
   YYDPRINTF ((stderr, "Starting parse\n"));
@@ -1473,14 +1305,6 @@ yyparse ()
   yyerrstatus = 0;
   yynerrs = 0;
   yychar = YYEMPTY; /* Cause a token to be read.  */
-
-  /* Initialize stack pointers.
-     Waste one element of value and location stack
-     so that they stay on the same level as the state stack.
-     The wasted elements are never initialized.  */
-  yyssp = yyss;
-  yyvsp = yyvs;
-
   goto yysetstate;
 
 /*------------------------------------------------------------.
@@ -1501,23 +1325,23 @@ yyparse ()
 
 #ifdef yyoverflow
       {
-	/* Give user a chance to reallocate the stack.  Use copies of
-	   these so that the &'s don't force the real ones into
-	   memory.  */
-	YYSTYPE *yyvs1 = yyvs;
-	yytype_int16 *yyss1 = yyss;
-
-	/* Each stack pointer address is followed by the size of the
-	   data in use in that stack, in bytes.  This used to be a
-	   conditional around just the two extra args, but that might
-	   be undefined if yyoverflow is a macro.  */
-	yyoverflow (YY_("memory exhausted"),
-		    &yyss1, yysize * sizeof (*yyssp),
-		    &yyvs1, yysize * sizeof (*yyvsp),
-		    &yystacksize);
-
-	yyss = yyss1;
-	yyvs = yyvs1;
+        /* Give user a chance to reallocate the stack.  Use copies of
+           these so that the &'s don't force the real ones into
+           memory.  */
+        YYSTYPE *yyvs1 = yyvs;
+        yytype_int16 *yyss1 = yyss;
+
+        /* Each stack pointer address is followed by the size of the
+           data in use in that stack, in bytes.  This used to be a
+           conditional around just the two extra args, but that might
+           be undefined if yyoverflow is a macro.  */
+        yyoverflow (YY_("memory exhausted"),
+                    &yyss1, yysize * sizeof (*yyssp),
+                    &yyvs1, yysize * sizeof (*yyvsp),
+                    &yystacksize);
+
+        yyss = yyss1;
+        yyvs = yyvs1;
       }
 #else /* no yyoverflow */
 # ifndef YYSTACK_RELOCATE
@@ -1525,22 +1349,22 @@ yyparse ()
 # else
       /* Extend the stack our own way.  */
       if (YYMAXDEPTH <= yystacksize)
-	goto yyexhaustedlab;
+        goto yyexhaustedlab;
       yystacksize *= 2;
       if (YYMAXDEPTH < yystacksize)
-	yystacksize = YYMAXDEPTH;
+        yystacksize = YYMAXDEPTH;
 
       {
-	yytype_int16 *yyss1 = yyss;
-	union yyalloc *yyptr =
-	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
-	if (! yyptr)
-	  goto yyexhaustedlab;
-	YYSTACK_RELOCATE (yyss_alloc, yyss);
-	YYSTACK_RELOCATE (yyvs_alloc, yyvs);
+        yytype_int16 *yyss1 = yyss;
+        union yyalloc *yyptr =
+          (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+        if (! yyptr)
+          goto yyexhaustedlab;
+        YYSTACK_RELOCATE (yyss_alloc, yyss);
+        YYSTACK_RELOCATE (yyvs_alloc, yyvs);
 #  undef YYSTACK_RELOCATE
-	if (yyss1 != yyssa)
-	  YYSTACK_FREE (yyss1);
+        if (yyss1 != yyssa)
+          YYSTACK_FREE (yyss1);
       }
 # endif
 #endif /* no yyoverflow */
@@ -1549,10 +1373,10 @@ yyparse ()
       yyvsp = yyvs + yysize - 1;
 
       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
-		  (unsigned long int) yystacksize));
+                  (unsigned long int) yystacksize));
 
       if (yyss + yystacksize - 1 <= yyssp)
-	YYABORT;
+        YYABORT;
     }
 
   YYDPRINTF ((stderr, "Entering state %d\n", yystate));
@@ -1581,7 +1405,7 @@ yybackup:
   if (yychar == YYEMPTY)
     {
       YYDPRINTF ((stderr, "Reading a token: "));
-      yychar = YYLEX;
+      yychar = yylex ();
     }
 
   if (yychar <= YYEOF)
@@ -1621,7 +1445,9 @@ yybackup:
   yychar = YYEMPTY;
 
   yystate = yyn;
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   *++yyvsp = yylval;
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
 
   goto yynewstate;
 
@@ -1644,7 +1470,7 @@ yyreduce:
   yylen = yyr2[yyn];
 
   /* If YYLEN is nonzero, implement the default value of the action:
-     `$$ = $1'.
+     '$$ = $1'.
 
      Otherwise, the following line sets YYVAL to garbage.
      This behavior is undocumented and Bison
@@ -1660,43 +1486,50 @@ yyreduce:
         case 10:
 
     { zconf_error("unexpected end statement"); }
+
     break;
 
   case 11:
 
-    { zconf_error("unknown statement \"%s\"", (yyvsp[(2) - (4)].string)); }
+    { zconf_error("unknown statement \"%s\"", (yyvsp[-2].string)); }
+
     break;
 
   case 12:
 
     {
-	zconf_error("unexpected option \"%s\"", kconf_id_strings + (yyvsp[(2) - (4)].id)->name);
+	zconf_error("unexpected option \"%s\"", kconf_id_strings + (yyvsp[-2].id)->name);
 }
+
     break;
 
   case 13:
 
     { zconf_error("invalid statement"); }
+
     break;
 
   case 28:
 
-    { zconf_error("unknown option \"%s\"", (yyvsp[(1) - (3)].string)); }
+    { zconf_error("unknown option \"%s\"", (yyvsp[-2].string)); }
+
     break;
 
   case 29:
 
     { zconf_error("invalid option"); }
+
     break;
 
   case 30:
 
     {
-	struct symbol *sym = sym_lookup((yyvsp[(2) - (3)].string), 0);
+	struct symbol *sym = sym_lookup((yyvsp[-1].string), 0);
 	sym->flags |= SYMBOL_OPTIONAL;
 	menu_add_entry(sym);
-	printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), (yyvsp[(2) - (3)].string));
+	printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
 }
+
     break;
 
   case 31:
@@ -1705,16 +1538,18 @@ yyreduce:
 	menu_end_entry();
 	printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
 }
+
     break;
 
   case 32:
 
     {
-	struct symbol *sym = sym_lookup((yyvsp[(2) - (3)].string), 0);
+	struct symbol *sym = sym_lookup((yyvsp[-1].string), 0);
 	sym->flags |= SYMBOL_OPTIONAL;
 	menu_add_entry(sym);
-	printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), (yyvsp[(2) - (3)].string));
+	printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
 }
+
     break;
 
   case 33:
@@ -1727,85 +1562,95 @@ yyreduce:
 	menu_end_entry();
 	printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
 }
+
     break;
 
   case 41:
 
     {
-	menu_set_type((yyvsp[(1) - (3)].id)->stype);
+	menu_set_type((yyvsp[-2].id)->stype);
 	printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
 		zconf_curname(), zconf_lineno(),
-		(yyvsp[(1) - (3)].id)->stype);
+		(yyvsp[-2].id)->stype);
 }
+
     break;
 
   case 42:
 
     {
-	menu_add_prompt(P_PROMPT, (yyvsp[(2) - (4)].string), (yyvsp[(3) - (4)].expr));
+	menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr));
 	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
 }
+
     break;
 
   case 43:
 
     {
-	menu_add_expr(P_DEFAULT, (yyvsp[(2) - (4)].expr), (yyvsp[(3) - (4)].expr));
-	if ((yyvsp[(1) - (4)].id)->stype != S_UNKNOWN)
-		menu_set_type((yyvsp[(1) - (4)].id)->stype);
+	menu_add_expr(P_DEFAULT, (yyvsp[-2].expr), (yyvsp[-1].expr));
+	if ((yyvsp[-3].id)->stype != S_UNKNOWN)
+		menu_set_type((yyvsp[-3].id)->stype);
 	printd(DEBUG_PARSE, "%s:%d:default(%u)\n",
 		zconf_curname(), zconf_lineno(),
-		(yyvsp[(1) - (4)].id)->stype);
+		(yyvsp[-3].id)->stype);
 }
+
     break;
 
   case 44:
 
     {
-	menu_add_symbol(P_SELECT, sym_lookup((yyvsp[(2) - (4)].string), 0), (yyvsp[(3) - (4)].expr));
+	menu_add_symbol(P_SELECT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr));
 	printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
 }
+
     break;
 
   case 45:
 
     {
-	menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,(yyvsp[(2) - (5)].symbol), (yyvsp[(3) - (5)].symbol)), (yyvsp[(4) - (5)].expr));
+	menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,(yyvsp[-3].symbol), (yyvsp[-2].symbol)), (yyvsp[-1].expr));
 	printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
 }
+
     break;
 
   case 48:
 
     {
-	const struct kconf_id *id = kconf_id_lookup((yyvsp[(2) - (3)].string), strlen((yyvsp[(2) - (3)].string)));
+	const struct kconf_id *id = kconf_id_lookup((yyvsp[-1].string), strlen((yyvsp[-1].string)));
 	if (id && id->flags & TF_OPTION)
-		menu_add_option(id->token, (yyvsp[(3) - (3)].string));
+		menu_add_option(id->token, (yyvsp[0].string));
 	else
-		zconfprint("warning: ignoring unknown option %s", (yyvsp[(2) - (3)].string));
-	free((yyvsp[(2) - (3)].string));
+		zconfprint("warning: ignoring unknown option %s", (yyvsp[-1].string));
+	free((yyvsp[-1].string));
 }
+
     break;
 
   case 49:
 
     { (yyval.string) = NULL; }
+
     break;
 
   case 50:
 
-    { (yyval.string) = (yyvsp[(2) - (2)].string); }
+    { (yyval.string) = (yyvsp[0].string); }
+
     break;
 
   case 51:
 
     {
-	struct symbol *sym = sym_lookup((yyvsp[(2) - (3)].string), SYMBOL_CHOICE);
+	struct symbol *sym = sym_lookup((yyvsp[-1].string), SYMBOL_CHOICE);
 	sym->flags |= SYMBOL_AUTO;
 	menu_add_entry(sym);
 	menu_add_expr(P_CHOICE, NULL, NULL);
 	printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
 }
+
     break;
 
   case 52:
@@ -1813,37 +1658,41 @@ yyreduce:
     {
 	(yyval.menu) = menu_add_menu();
 }
+
     break;
 
   case 53:
 
     {
-	if (zconf_endtoken((yyvsp[(1) - (1)].id), T_CHOICE, T_ENDCHOICE)) {
+	if (zconf_endtoken((yyvsp[0].id), T_CHOICE, T_ENDCHOICE)) {
 		menu_end_menu();
 		printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
 	}
 }
+
     break;
 
   case 61:
 
     {
-	menu_add_prompt(P_PROMPT, (yyvsp[(2) - (4)].string), (yyvsp[(3) - (4)].expr));
+	menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr));
 	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
 }
+
     break;
 
   case 62:
 
     {
-	if ((yyvsp[(1) - (3)].id)->stype == S_BOOLEAN || (yyvsp[(1) - (3)].id)->stype == S_TRISTATE) {
-		menu_set_type((yyvsp[(1) - (3)].id)->stype);
+	if ((yyvsp[-2].id)->stype == S_BOOLEAN || (yyvsp[-2].id)->stype == S_TRISTATE) {
+		menu_set_type((yyvsp[-2].id)->stype);
 		printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
 			zconf_curname(), zconf_lineno(),
-			(yyvsp[(1) - (3)].id)->stype);
+			(yyvsp[-2].id)->stype);
 	} else
 		YYERROR;
 }
+
     break;
 
   case 63:
@@ -1852,18 +1701,20 @@ yyreduce:
 	current_entry->sym->flags |= SYMBOL_OPTIONAL;
 	printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
 }
+
     break;
 
   case 64:
 
     {
-	if ((yyvsp[(1) - (4)].id)->stype == S_UNKNOWN) {
-		menu_add_symbol(P_DEFAULT, sym_lookup((yyvsp[(2) - (4)].string), 0), (yyvsp[(3) - (4)].expr));
+	if ((yyvsp[-3].id)->stype == S_UNKNOWN) {
+		menu_add_symbol(P_DEFAULT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr));
 		printd(DEBUG_PARSE, "%s:%d:default\n",
 			zconf_curname(), zconf_lineno());
 	} else
 		YYERROR;
 }
+
     break;
 
   case 67:
@@ -1871,35 +1722,39 @@ yyreduce:
     {
 	printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
 	menu_add_entry(NULL);
-	menu_add_dep((yyvsp[(2) - (3)].expr));
+	menu_add_dep((yyvsp[-1].expr));
 	(yyval.menu) = menu_add_menu();
 }
+
     break;
 
   case 68:
 
     {
-	if (zconf_endtoken((yyvsp[(1) - (1)].id), T_IF, T_ENDIF)) {
+	if (zconf_endtoken((yyvsp[0].id), T_IF, T_ENDIF)) {
 		menu_end_menu();
 		printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
 	}
 }
+
     break;
 
   case 74:
 
     {
-	menu_add_prompt(P_MENU, (yyvsp[(2) - (3)].string), NULL);
+	menu_add_prompt(P_MENU, (yyvsp[-1].string), NULL);
 }
+
     break;
 
   case 75:
 
     {
 	menu_add_entry(NULL);
-	menu_add_prompt(P_MENU, (yyvsp[(2) - (3)].string), NULL);
+	menu_add_prompt(P_MENU, (yyvsp[-1].string), NULL);
 	printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
 }
+
     break;
 
   case 76:
@@ -1907,33 +1762,37 @@ yyreduce:
     {
 	(yyval.menu) = menu_add_menu();
 }
+
     break;
 
   case 77:
 
     {
-	if (zconf_endtoken((yyvsp[(1) - (1)].id), T_MENU, T_ENDMENU)) {
+	if (zconf_endtoken((yyvsp[0].id), T_MENU, T_ENDMENU)) {
 		menu_end_menu();
 		printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
 	}
 }
+
     break;
 
   case 83:
 
     {
-	printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), (yyvsp[(2) - (3)].string));
-	zconf_nextfile((yyvsp[(2) - (3)].string));
+	printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
+	zconf_nextfile((yyvsp[-1].string));
 }
+
     break;
 
   case 84:
 
     {
 	menu_add_entry(NULL);
-	menu_add_prompt(P_COMMENT, (yyvsp[(2) - (3)].string), NULL);
+	menu_add_prompt(P_COMMENT, (yyvsp[-1].string), NULL);
 	printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
 }
+
     break;
 
   case 85:
@@ -1941,6 +1800,7 @@ yyreduce:
     {
 	menu_end_entry();
 }
+
     break;
 
   case 86:
@@ -1949,110 +1809,130 @@ yyreduce:
 	printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
 	zconf_starthelp();
 }
+
     break;
 
   case 87:
 
     {
-	current_entry->help = (yyvsp[(2) - (2)].string);
+	current_entry->help = (yyvsp[0].string);
 }
+
     break;
 
   case 92:
 
     {
-	menu_add_dep((yyvsp[(3) - (4)].expr));
+	menu_add_dep((yyvsp[-1].expr));
 	printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
 }
+
     break;
 
   case 96:
 
     {
-	menu_add_visibility((yyvsp[(2) - (2)].expr));
+	menu_add_visibility((yyvsp[0].expr));
 }
+
     break;
 
   case 98:
 
     {
-	menu_add_prompt(P_PROMPT, (yyvsp[(1) - (2)].string), (yyvsp[(2) - (2)].expr));
+	menu_add_prompt(P_PROMPT, (yyvsp[-1].string), (yyvsp[0].expr));
 }
+
     break;
 
   case 101:
 
-    { (yyval.id) = (yyvsp[(1) - (2)].id); }
+    { (yyval.id) = (yyvsp[-1].id); }
+
     break;
 
   case 102:
 
-    { (yyval.id) = (yyvsp[(1) - (2)].id); }
+    { (yyval.id) = (yyvsp[-1].id); }
+
     break;
 
   case 103:
 
-    { (yyval.id) = (yyvsp[(1) - (2)].id); }
+    { (yyval.id) = (yyvsp[-1].id); }
+
     break;
 
   case 106:
 
     { (yyval.expr) = NULL; }
+
     break;
 
   case 107:
 
-    { (yyval.expr) = (yyvsp[(2) - (2)].expr); }
+    { (yyval.expr) = (yyvsp[0].expr); }
+
     break;
 
   case 108:
 
-    { (yyval.expr) = expr_alloc_symbol((yyvsp[(1) - (1)].symbol)); }
+    { (yyval.expr) = expr_alloc_symbol((yyvsp[0].symbol)); }
+
     break;
 
   case 109:
 
-    { (yyval.expr) = expr_alloc_comp(E_EQUAL, (yyvsp[(1) - (3)].symbol), (yyvsp[(3) - (3)].symbol)); }
+    { (yyval.expr) = expr_alloc_comp(E_EQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); }
+
     break;
 
   case 110:
 
-    { (yyval.expr) = expr_alloc_comp(E_UNEQUAL, (yyvsp[(1) - (3)].symbol), (yyvsp[(3) - (3)].symbol)); }
+    { (yyval.expr) = expr_alloc_comp(E_UNEQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); }
+
     break;
 
   case 111:
 
-    { (yyval.expr) = (yyvsp[(2) - (3)].expr); }
+    { (yyval.expr) = (yyvsp[-1].expr); }
+
     break;
 
   case 112:
 
-    { (yyval.expr) = expr_alloc_one(E_NOT, (yyvsp[(2) - (2)].expr)); }
+    { (yyval.expr) = expr_alloc_one(E_NOT, (yyvsp[0].expr)); }
+
     break;
 
   case 113:
 
-    { (yyval.expr) = expr_alloc_two(E_OR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
+    { (yyval.expr) = expr_alloc_two(E_OR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+
     break;
 
   case 114:
 
-    { (yyval.expr) = expr_alloc_two(E_AND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
+    { (yyval.expr) = expr_alloc_two(E_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); }
+
     break;
 
   case 115:
 
-    { (yyval.symbol) = sym_lookup((yyvsp[(1) - (1)].string), 0); free((yyvsp[(1) - (1)].string)); }
+    { (yyval.symbol) = sym_lookup((yyvsp[0].string), 0); free((yyvsp[0].string)); }
+
     break;
 
   case 116:
 
-    { (yyval.symbol) = sym_lookup((yyvsp[(1) - (1)].string), SYMBOL_CONST); free((yyvsp[(1) - (1)].string)); }
+    { (yyval.symbol) = sym_lookup((yyvsp[0].string), SYMBOL_CONST); free((yyvsp[0].string)); }
+
     break;
 
   case 117:
 
     { (yyval.string) = NULL; }
+
     break;
 
 
@@ -2078,7 +1958,7 @@ yyreduce:
 
   *++yyvsp = yyval;
 
-  /* Now `shift' the result of the reduction.  Determine what state
+  /* Now 'shift' the result of the reduction.  Determine what state
      that goes to, based on the state we popped back to and the rule
      number reduced by.  */
 
@@ -2093,9 +1973,9 @@ yyreduce:
   goto yynewstate;
 
 
-/*------------------------------------.
-| yyerrlab -- here on detecting error |
-`------------------------------------*/
+/*--------------------------------------.
+| yyerrlab -- here on detecting error.  |
+`--------------------------------------*/
 yyerrlab:
   /* Make sure we have latest lookahead translation.  See comments at
      user semantic actions for why this is necessary.  */
@@ -2146,20 +2026,20 @@ yyerrlab:
   if (yyerrstatus == 3)
     {
       /* If just tried and failed to reuse lookahead token after an
-	 error, discard it.  */
+         error, discard it.  */
 
       if (yychar <= YYEOF)
-	{
-	  /* Return failure if at end of input.  */
-	  if (yychar == YYEOF)
-	    YYABORT;
-	}
+        {
+          /* Return failure if at end of input.  */
+          if (yychar == YYEOF)
+            YYABORT;
+        }
       else
-	{
-	  yydestruct ("Error: discarding",
-		      yytoken, &yylval);
-	  yychar = YYEMPTY;
-	}
+        {
+          yydestruct ("Error: discarding",
+                      yytoken, &yylval);
+          yychar = YYEMPTY;
+        }
     }
 
   /* Else will try to reuse lookahead token after shifting the error
@@ -2178,7 +2058,7 @@ yyerrorlab:
   if (/*CONSTCOND*/ 0)
      goto yyerrorlab;
 
-  /* Do not reclaim the symbols of the rule which action triggered
+  /* Do not reclaim the symbols of the rule whose action triggered
      this YYERROR.  */
   YYPOPSTACK (yylen);
   yylen = 0;
@@ -2191,35 +2071,37 @@ yyerrorlab:
 | yyerrlab1 -- common code for both syntax error and YYERROR.  |
 `-------------------------------------------------------------*/
 yyerrlab1:
-  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
+  yyerrstatus = 3;      /* Each real token shifted decrements this.  */
 
   for (;;)
     {
       yyn = yypact[yystate];
       if (!yypact_value_is_default (yyn))
-	{
-	  yyn += YYTERROR;
-	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
-	    {
-	      yyn = yytable[yyn];
-	      if (0 < yyn)
-		break;
-	    }
-	}
+        {
+          yyn += YYTERROR;
+          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+            {
+              yyn = yytable[yyn];
+              if (0 < yyn)
+                break;
+            }
+        }
 
       /* Pop the current state because it cannot handle the error token.  */
       if (yyssp == yyss)
-	YYABORT;
+        YYABORT;
 
 
       yydestruct ("Error: popping",
-		  yystos[yystate], yyvsp);
+                  yystos[yystate], yyvsp);
       YYPOPSTACK (1);
       yystate = *yyssp;
       YY_STACK_PRINT (yyss, yyssp);
     }
 
+  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   *++yyvsp = yylval;
+  YY_IGNORE_MAYBE_UNINITIALIZED_END
 
 
   /* Shift the error token.  */
@@ -2243,7 +2125,7 @@ yyabortlab:
   yyresult = 1;
   goto yyreturn;
 
-#if !defined(yyoverflow) || YYERROR_VERBOSE
+#if !defined yyoverflow || YYERROR_VERBOSE
 /*-------------------------------------------------.
 | yyexhaustedlab -- memory exhaustion comes here.  |
 `-------------------------------------------------*/
@@ -2262,14 +2144,14 @@ yyreturn:
       yydestruct ("Cleanup: discarding lookahead",
                   yytoken, &yylval);
     }
-  /* Do not reclaim the symbols of the rule which action triggered
+  /* Do not reclaim the symbols of the rule whose action triggered
      this YYABORT or YYACCEPT.  */
   YYPOPSTACK (yylen);
   YY_STACK_PRINT (yyss, yyssp);
   while (yyssp != yyss)
     {
       yydestruct ("Cleanup: popping",
-		  yystos[*yyssp], yyvsp);
+                  yystos[*yyssp], yyvsp);
       YYPOPSTACK (1);
     }
 #ifndef yyoverflow
@@ -2280,14 +2162,11 @@ yyreturn:
   if (yymsg != yymsgbuf)
     YYSTACK_FREE (yymsg);
 #endif
-  /* Make sure YYID is used.  */
-  return YYID (yyresult);
+  return yyresult;
 }
 
 
 
-
-
 void conf_parse(const char *name)
 {
 	struct symbol *sym;
@@ -2535,4 +2414,3 @@ void zconfdump(FILE *out)
 #include "expr.c"
 #include "symbol.c"
 #include "menu.c"
-
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 4/4] kconfig: Introduce "showif" to factor out conditions on visibility
  2015-05-13 23:37 [PATCH 1/4] init/Kconfig: Fix break in middle of EXPERT menu Josh Triplett
  2015-05-13 23:37 ` [PATCH 2/4] init/Kconfig: Split expert menu into a separate file, init/Kconfig.expert Josh Triplett
  2015-05-13 23:38 ` [PATCH 3/4] kconfig: Regenerate parser with current Bison prior to making changes Josh Triplett
@ 2015-05-13 23:38 ` Josh Triplett
  2015-05-14 12:30   ` Paul E. McKenney
  2015-05-14 11:04 ` [PATCH 1/4] init/Kconfig: Fix break in middle of EXPERT menu Paul Bolle
  3 siblings, 1 reply; 7+ messages in thread
From: Josh Triplett @ 2015-05-13 23:38 UTC (permalink / raw)
  To: Ingo Molnar, Andrew Morton, Paul E. McKenney, Michal Hocko,
	Josh Triplett, Vladimir Davydov, Johannes Weiner,
	Geert Uytterhoeven, Andy Lutomirski, Bertrand Jacquin,
	Luis R. Rodriguez, Iulia Manda, Pranith Kumar, Clark Williams,
	Mel Gorman, Randy Dunlap, Paul Bolle, linux-kernel

kconfig implicitly creates a submenu whenever a series of symbols all
have dependencies or prompt-visibility expressions that all depend on a
preceeding symbol.  For instance, the series of symbols following
"menuconfig EXPERT" that all have "if EXPERT" on their prompt will all
appear as a submenu of EXPERT.

However, this implicit submenuing will break if any intervening symbol
loses its "if EXPERT"; doing so causes the subsequent symbols to appear
in the parent menu ("General setup").  This has happened many times, and
it's easy to miss that the entire block should have that same
expression.

For submenus created from "depends" dependencies, these can be converted
to a single wrapping "if expr ... endif" block around all the submenu
items.  However, there's no equivalent for invisible items, for which
the prompt is hidden but the symbol may potentially be enabled.  For
instance, many items in the EXPERT menu are hidden if EXPERT is
disabled, but they have "default y" or are determined by some other
expression.

To handle this case, introduce a new kconfig construct, "showif", which
does the same thing as "if" but for visibility expressions rather than
dependencies.  Every symbol in a "showif expr ... endif" block
effectively has "if expr" added to its prompt.

Use that new construct to simplify the expert menu.  Now, making a
symbol no longer invisible when !EXPERT requires moving it out of the
EXPERT menu, which makes it more difficult to break the EXPERT menu.

Signed-off-by: Josh Triplett <josh@joshtriplett.org>
---
 init/Kconfig.expert                  |  44 +--
 scripts/kconfig/menu.c               |   4 +-
 scripts/kconfig/zconf.gperf          |   1 +
 scripts/kconfig/zconf.hash.c_shipped | 258 ++++++++--------
 scripts/kconfig/zconf.tab.c_shipped  | 561 +++++++++++++++++++----------------
 scripts/kconfig/zconf.y              |  28 +-
 6 files changed, 483 insertions(+), 413 deletions(-)

diff --git a/init/Kconfig.expert b/init/Kconfig.expert
index c84a372..fb3c3aa 100644
--- a/init/Kconfig.expert
+++ b/init/Kconfig.expert
@@ -8,15 +8,17 @@ menuconfig EXPERT
           environments which can tolerate a "non-standard" kernel.
           Only use this if you really know what you are doing.
 
+showif EXPERT
+
 config UID16
-	bool "Enable 16-bit UID system calls" if EXPERT
+	bool "Enable 16-bit UID system calls"
 	depends on HAVE_UID16 && MULTIUSER
 	default y
 	help
 	  This enables the legacy 16-bit UID syscall wrappers.
 
 config MULTIUSER
-	bool "Multiple users, groups and capabilities support" if EXPERT
+	bool "Multiple users, groups and capabilities support"
 	default y
 	help
 	  This option enables support for non-root users, groups and
@@ -30,7 +32,7 @@ config MULTIUSER
 	  If unsure, say Y here.
 
 config SGETMASK_SYSCALL
-	bool "sgetmask/ssetmask syscalls support" if EXPERT
+	bool "sgetmask/ssetmask syscalls support"
 	def_bool PARISC || MN10300 || BLACKFIN || M68K || PPC || MIPS || X86 || SPARC || CRIS || MICROBLAZE || SUPERH
 	---help---
 	  sys_sgetmask and sys_ssetmask are obsolete system calls
@@ -40,7 +42,7 @@ config SGETMASK_SYSCALL
 	  If unsure, leave the default option here.
 
 config SYSFS_SYSCALL
-	bool "Sysfs syscall support" if EXPERT
+	bool "Sysfs syscall support"
 	default y
 	---help---
 	  sys_sysfs is an obsolete system call no longer supported in libc.
@@ -50,7 +52,7 @@ config SYSFS_SYSCALL
 	  If unsure say Y here.
 
 config SYSCTL_SYSCALL
-	bool "Sysctl syscall support" if EXPERT
+	bool "Sysctl syscall support"
 	depends on PROC_SYSCTL
 	default n
 	select SYSCTL
@@ -67,7 +69,7 @@ config SYSCTL_SYSCALL
 	  If unsure say N here.
 
 config KALLSYMS
-	 bool "Load all symbols for debugging/ksymoops" if EXPERT
+	 bool "Load all symbols for debugging/ksymoops"
 	 default y
 	 help
 	   Say Y here to let the kernel print out symbolic crash information and
@@ -93,7 +95,7 @@ config KALLSYMS_ALL
 
 config PRINTK
 	default y
-	bool "Enable support for printk" if EXPERT
+	bool "Enable support for printk"
 	select IRQ_WORK
 	help
 	  This option enables normal printk support. Removing it
@@ -103,7 +105,7 @@ config PRINTK
 	  strongly discouraged.
 
 config BUG
-	bool "BUG() support" if EXPERT
+	bool "BUG() support"
 	default y
 	help
           Disabling this option eliminates support for BUG and WARN, reducing
@@ -115,13 +117,13 @@ config BUG
 config ELF_CORE
 	depends on COREDUMP
 	default y
-	bool "Enable ELF core dumps" if EXPERT
+	bool "Enable ELF core dumps"
 	help
 	  Enable support for generating core dumps. Disabling saves about 4k.
 
 
 config PCSPKR_PLATFORM
-	bool "Enable PC-Speaker support" if EXPERT
+	bool "Enable PC-Speaker support"
 	depends on HAVE_PCSPKR_PLATFORM
 	select I8253_LOCK
 	default y
@@ -131,14 +133,14 @@ config PCSPKR_PLATFORM
 
 config BASE_FULL
 	default y
-	bool "Enable full-sized data structures for core" if EXPERT
+	bool "Enable full-sized data structures for core"
 	help
 	  Disabling this option reduces the size of miscellaneous core
 	  kernel data structures. This saves memory on small machines,
 	  but may reduce performance.
 
 config FUTEX
-	bool "Enable futex support" if EXPERT
+	bool "Enable futex support"
 	default y
 	select RT_MUTEXES
 	help
@@ -155,7 +157,7 @@ config HAVE_FUTEX_CMPXCHG
 	  checks.
 
 config EPOLL
-	bool "Enable eventpoll support" if EXPERT
+	bool "Enable eventpoll support"
 	default y
 	select ANON_INODES
 	help
@@ -163,7 +165,7 @@ config EPOLL
 	  support for epoll family of system calls.
 
 config SIGNALFD
-	bool "Enable signalfd() system call" if EXPERT
+	bool "Enable signalfd() system call"
 	select ANON_INODES
 	default y
 	help
@@ -173,7 +175,7 @@ config SIGNALFD
 	  If unsure, say Y.
 
 config TIMERFD
-	bool "Enable timerfd() system call" if EXPERT
+	bool "Enable timerfd() system call"
 	select ANON_INODES
 	default y
 	help
@@ -183,7 +185,7 @@ config TIMERFD
 	  If unsure, say Y.
 
 config EVENTFD
-	bool "Enable eventfd() system call" if EXPERT
+	bool "Enable eventfd() system call"
 	select ANON_INODES
 	default y
 	help
@@ -193,7 +195,7 @@ config EVENTFD
 	  If unsure, say Y.
 
 config SHMEM
-	bool "Use full shmem filesystem" if EXPERT
+	bool "Use full shmem filesystem"
 	default y
 	depends on MMU
 	help
@@ -204,7 +206,7 @@ config SHMEM
 	  which may be appropriate on small systems without swap.
 
 config AIO
-	bool "Enable AIO support" if EXPERT
+	bool "Enable AIO support"
 	default y
 	help
 	  This option enables POSIX asynchronous I/O which may by used
@@ -212,7 +214,7 @@ config AIO
 	  this option saves about 7k.
 
 config ADVISE_SYSCALLS
-	bool "Enable madvise/fadvise syscalls" if EXPERT
+	bool "Enable madvise/fadvise syscalls"
 	default y
 	help
 	  This option enables the madvise and fadvise syscalls, used by
@@ -223,9 +225,11 @@ config ADVISE_SYSCALLS
 
 config PCI_QUIRKS
 	default y
-	bool "Enable PCI quirk workarounds" if EXPERT
+	bool "Enable PCI quirk workarounds"
 	depends on PCI
 	help
 	  This enables workarounds for various PCI chipset
 	  bugs/quirks. Disable this only if your target machine is
 	  unaffected by PCI quirks.
+
+endif # showif EXPERT
diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c
index b05cc3d..75b7467 100644
--- a/scripts/kconfig/menu.c
+++ b/scripts/kconfig/menu.c
@@ -344,7 +344,9 @@ void menu_finalize(struct menu *parent)
 		basedep = expr_eliminate_dups(expr_transform(basedep));
 		last_menu = NULL;
 		for (menu = parent->next; menu; menu = menu->next) {
-			dep = menu->prompt ? menu->prompt->visible.expr : menu->dep;
+			dep = menu->prompt ? menu->prompt->visible.expr
+			    : menu->visibility ? menu->visibility
+			    : menu->dep;
 			if (!expr_contains_symbol(dep, sym))
 				break;
 			if (expr_depends_symbol(dep, sym))
diff --git a/scripts/kconfig/zconf.gperf b/scripts/kconfig/zconf.gperf
index b6ac02d..fd602b5 100644
--- a/scripts/kconfig/zconf.gperf
+++ b/scripts/kconfig/zconf.gperf
@@ -23,6 +23,7 @@ config,		T_CONFIG,	TF_COMMAND
 menuconfig,	T_MENUCONFIG,	TF_COMMAND
 help,		T_HELP,		TF_COMMAND
 if,		T_IF,		TF_COMMAND|TF_PARAM
+showif,		T_SHOWIF,	TF_COMMAND
 endif,		T_ENDIF,	TF_COMMAND
 depends,	T_DEPENDS,	TF_COMMAND
 optional,	T_OPTIONAL,	TF_COMMAND
diff --git a/scripts/kconfig/zconf.hash.c_shipped b/scripts/kconfig/zconf.hash.c_shipped
index c77a8ef..eab7830 100644
--- a/scripts/kconfig/zconf.hash.c_shipped
+++ b/scripts/kconfig/zconf.hash.c_shipped
@@ -32,7 +32,7 @@
 struct kconf_id;
 
 static const struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len);
-/* maximum key range = 71, duplicates = 0 */
+/* maximum key range = 53, duplicates = 0 */
 
 #ifdef __GNUC__
 __inline
@@ -46,32 +46,32 @@ kconf_id_hash (register const char *str, register unsigned int len)
 {
   static const unsigned char asso_values[] =
     {
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73,  5, 25, 25,
-       0,  0,  0,  5,  0,  0, 73, 73,  5,  0,
-      10,  5, 45, 73, 20, 20,  0, 15, 15, 73,
-      20,  5, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
-      73, 73, 73, 73, 73, 73
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55,  5, 15, 15,
+       0,  0,  0,  0,  0,  0, 55, 55, 15, 15,
+      20,  5, 35, 55,  0,  0,  0, 10, 25, 55,
+       5,  5, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
+      55, 55, 55, 55, 55, 55
     };
   register int hval = len;
 
@@ -93,72 +93,74 @@ struct kconf_id_strings_t
     char kconf_id_strings_str2[sizeof("if")];
     char kconf_id_strings_str3[sizeof("int")];
     char kconf_id_strings_str5[sizeof("endif")];
+    char kconf_id_strings_str6[sizeof("string")];
     char kconf_id_strings_str7[sizeof("default")];
     char kconf_id_strings_str8[sizeof("tristate")];
     char kconf_id_strings_str9[sizeof("endchoice")];
+    char kconf_id_strings_str11[sizeof("showif")];
     char kconf_id_strings_str12[sizeof("def_tristate")];
-    char kconf_id_strings_str13[sizeof("def_bool")];
+    char kconf_id_strings_str13[sizeof("hex")];
     char kconf_id_strings_str14[sizeof("defconfig_list")];
-    char kconf_id_strings_str17[sizeof("on")];
-    char kconf_id_strings_str18[sizeof("optional")];
-    char kconf_id_strings_str21[sizeof("option")];
-    char kconf_id_strings_str22[sizeof("endmenu")];
-    char kconf_id_strings_str23[sizeof("mainmenu")];
-    char kconf_id_strings_str25[sizeof("menuconfig")];
-    char kconf_id_strings_str27[sizeof("modules")];
-    char kconf_id_strings_str28[sizeof("allnoconfig_y")];
-    char kconf_id_strings_str29[sizeof("menu")];
-    char kconf_id_strings_str31[sizeof("select")];
-    char kconf_id_strings_str32[sizeof("comment")];
-    char kconf_id_strings_str33[sizeof("env")];
-    char kconf_id_strings_str35[sizeof("range")];
-    char kconf_id_strings_str36[sizeof("choice")];
+    char kconf_id_strings_str16[sizeof("source")];
+    char kconf_id_strings_str17[sizeof("endmenu")];
+    char kconf_id_strings_str21[sizeof("select")];
+    char kconf_id_strings_str22[sizeof("modules")];
+    char kconf_id_strings_str23[sizeof("def_bool")];
+    char kconf_id_strings_str25[sizeof("range")];
+    char kconf_id_strings_str26[sizeof("choice")];
+    char kconf_id_strings_str27[sizeof("on")];
+    char kconf_id_strings_str28[sizeof("optional")];
+    char kconf_id_strings_str31[sizeof("option")];
+    char kconf_id_strings_str32[sizeof("visible")];
+    char kconf_id_strings_str33[sizeof("mainmenu")];
+    char kconf_id_strings_str37[sizeof("comment")];
+    char kconf_id_strings_str38[sizeof("allnoconfig_y")];
     char kconf_id_strings_str39[sizeof("bool")];
-    char kconf_id_strings_str41[sizeof("source")];
-    char kconf_id_strings_str42[sizeof("visible")];
-    char kconf_id_strings_str43[sizeof("hex")];
-    char kconf_id_strings_str46[sizeof("config")];
+    char kconf_id_strings_str41[sizeof("config")];
+    char kconf_id_strings_str42[sizeof("depends")];
+    char kconf_id_strings_str45[sizeof("menuconfig")];
+    char kconf_id_strings_str46[sizeof("prompt")];
     char kconf_id_strings_str47[sizeof("boolean")];
-    char kconf_id_strings_str51[sizeof("string")];
+    char kconf_id_strings_str49[sizeof("menu")];
+    char kconf_id_strings_str53[sizeof("env")];
     char kconf_id_strings_str54[sizeof("help")];
-    char kconf_id_strings_str56[sizeof("prompt")];
-    char kconf_id_strings_str72[sizeof("depends")];
   };
 static const struct kconf_id_strings_t kconf_id_strings_contents =
   {
     "if",
     "int",
     "endif",
+    "string",
     "default",
     "tristate",
     "endchoice",
+    "showif",
     "def_tristate",
-    "def_bool",
+    "hex",
     "defconfig_list",
+    "source",
+    "endmenu",
+    "select",
+    "modules",
+    "def_bool",
+    "range",
+    "choice",
     "on",
     "optional",
     "option",
-    "endmenu",
+    "visible",
     "mainmenu",
-    "menuconfig",
-    "modules",
-    "allnoconfig_y",
-    "menu",
-    "select",
     "comment",
-    "env",
-    "range",
-    "choice",
+    "allnoconfig_y",
     "bool",
-    "source",
-    "visible",
-    "hex",
     "config",
-    "boolean",
-    "string",
-    "help",
+    "depends",
+    "menuconfig",
     "prompt",
-    "depends"
+    "boolean",
+    "menu",
+    "env",
+    "help"
   };
 #define kconf_id_strings ((const char *) &kconf_id_strings_contents)
 #ifdef __GNUC__
@@ -172,11 +174,11 @@ kconf_id_lookup (register const char *str, register unsigned int len)
 {
   enum
     {
-      TOTAL_KEYWORDS = 33,
+      TOTAL_KEYWORDS = 34,
       MIN_WORD_LENGTH = 2,
       MAX_WORD_LENGTH = 14,
       MIN_HASH_VALUE = 2,
-      MAX_HASH_VALUE = 72
+      MAX_HASH_VALUE = 54
     };
 
   static const struct kconf_id wordlist[] =
@@ -184,87 +186,83 @@ kconf_id_lookup (register const char *str, register unsigned int len)
       {-1}, {-1},
 #line 25 "scripts/kconfig/zconf.gperf"
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2,		T_IF,		TF_COMMAND|TF_PARAM},
-#line 36 "scripts/kconfig/zconf.gperf"
+#line 37 "scripts/kconfig/zconf.gperf"
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str3,		T_TYPE,		TF_COMMAND, S_INT},
       {-1},
-#line 26 "scripts/kconfig/zconf.gperf"
+#line 27 "scripts/kconfig/zconf.gperf"
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str5,		T_ENDIF,	TF_COMMAND},
-      {-1},
-#line 29 "scripts/kconfig/zconf.gperf"
+#line 39 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str6,		T_TYPE,		TF_COMMAND, S_STRING},
+#line 30 "scripts/kconfig/zconf.gperf"
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7,	T_DEFAULT,	TF_COMMAND, S_UNKNOWN},
-#line 31 "scripts/kconfig/zconf.gperf"
+#line 32 "scripts/kconfig/zconf.gperf"
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8,	T_TYPE,		TF_COMMAND, S_TRISTATE},
 #line 20 "scripts/kconfig/zconf.gperf"
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str9,	T_ENDCHOICE,	TF_COMMAND},
-      {-1}, {-1},
-#line 32 "scripts/kconfig/zconf.gperf"
+      {-1},
+#line 26 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str11,		T_SHOWIF,	TF_COMMAND},
+#line 33 "scripts/kconfig/zconf.gperf"
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12,	T_DEFAULT,	TF_COMMAND, S_TRISTATE},
-#line 35 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN},
-#line 45 "scripts/kconfig/zconf.gperf"
+#line 38 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13,		T_TYPE,		TF_COMMAND, S_HEX},
+#line 46 "scripts/kconfig/zconf.gperf"
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14,	T_OPT_DEFCONFIG_LIST,TF_OPTION},
+      {-1},
+#line 18 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str16,		T_SOURCE,	TF_COMMAND},
+#line 17 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17,	T_ENDMENU,	TF_COMMAND},
+      {-1}, {-1}, {-1},
+#line 40 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21,		T_SELECT,	TF_COMMAND},
+#line 45 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22,	T_OPT_MODULES,	TF_OPTION},
+#line 36 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN},
+      {-1},
+#line 41 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str25,		T_RANGE,	TF_COMMAND},
+#line 19 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str26,		T_CHOICE,	TF_COMMAND},
+#line 44 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27,		T_ON,		TF_PARAM},
+#line 29 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28,	T_OPTIONAL,	TF_COMMAND},
       {-1}, {-1},
 #line 43 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17,		T_ON,		TF_PARAM},
-#line 28 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18,	T_OPTIONAL,	TF_COMMAND},
-      {-1}, {-1},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31,		T_OPTION,	TF_COMMAND},
 #line 42 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21,		T_OPTION,	TF_COMMAND},
-#line 17 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22,	T_ENDMENU,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32,	T_VISIBLE,	TF_COMMAND},
 #line 15 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23,	T_MAINMENU,	TF_COMMAND},
-      {-1},
-#line 23 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str25,	T_MENUCONFIG,	TF_COMMAND},
-      {-1},
-#line 44 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27,	T_OPT_MODULES,	TF_OPTION},
-#line 47 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28,	T_OPT_ALLNOCONFIG_Y,TF_OPTION},
-#line 16 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str29,		T_MENU,		TF_COMMAND},
-      {-1},
-#line 39 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31,		T_SELECT,	TF_COMMAND},
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33,	T_MAINMENU,	TF_COMMAND},
+      {-1}, {-1}, {-1},
 #line 21 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32,	T_COMMENT,	TF_COMMAND},
-#line 46 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33,		T_OPT_ENV,	TF_OPTION},
-      {-1},
-#line 40 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str35,		T_RANGE,	TF_COMMAND},
-#line 19 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str36,		T_CHOICE,	TF_COMMAND},
-      {-1}, {-1},
-#line 33 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str37,	T_COMMENT,	TF_COMMAND},
+#line 48 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str38,	T_OPT_ALLNOCONFIG_Y,TF_OPTION},
+#line 34 "scripts/kconfig/zconf.gperf"
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str39,		T_TYPE,		TF_COMMAND, S_BOOLEAN},
       {-1},
-#line 18 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41,		T_SOURCE,	TF_COMMAND},
-#line 41 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str42,	T_VISIBLE,	TF_COMMAND},
-#line 37 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str43,		T_TYPE,		TF_COMMAND, S_HEX},
-      {-1}, {-1},
 #line 22 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46,		T_CONFIG,	TF_COMMAND},
-#line 34 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41,		T_CONFIG,	TF_COMMAND},
+#line 28 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str42,	T_DEPENDS,	TF_COMMAND},
+      {-1}, {-1},
+#line 23 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str45,	T_MENUCONFIG,	TF_COMMAND},
+#line 31 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46,		T_PROMPT,	TF_COMMAND},
+#line 35 "scripts/kconfig/zconf.gperf"
       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str47,	T_TYPE,		TF_COMMAND, S_BOOLEAN},
+      {-1},
+#line 16 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str49,		T_MENU,		TF_COMMAND},
       {-1}, {-1}, {-1},
-#line 38 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str51,		T_TYPE,		TF_COMMAND, S_STRING},
-      {-1}, {-1},
+#line 47 "scripts/kconfig/zconf.gperf"
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str53,		T_OPT_ENV,	TF_OPTION},
 #line 24 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str54,		T_HELP,		TF_COMMAND},
-      {-1},
-#line 30 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str56,		T_PROMPT,	TF_COMMAND},
-      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
-      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
-#line 27 "scripts/kconfig/zconf.gperf"
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str72,	T_DEPENDS,	TF_COMMAND}
+      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str54,		T_HELP,		TF_COMMAND}
     };
 
   if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
@@ -285,5 +283,5 @@ kconf_id_lookup (register const char *str, register unsigned int len)
     }
   return 0;
 }
-#line 48 "scripts/kconfig/zconf.gperf"
+#line 49 "scripts/kconfig/zconf.gperf"
 
diff --git a/scripts/kconfig/zconf.tab.c_shipped b/scripts/kconfig/zconf.tab.c_shipped
index 0864c7d..c7d6ced 100644
--- a/scripts/kconfig/zconf.tab.c_shipped
+++ b/scripts/kconfig/zconf.tab.c_shipped
@@ -148,27 +148,28 @@ extern int zconfdebug;
     T_HELP = 267,
     T_HELPTEXT = 268,
     T_IF = 269,
-    T_ENDIF = 270,
-    T_DEPENDS = 271,
-    T_OPTIONAL = 272,
-    T_PROMPT = 273,
-    T_TYPE = 274,
-    T_DEFAULT = 275,
-    T_SELECT = 276,
-    T_RANGE = 277,
-    T_VISIBLE = 278,
-    T_OPTION = 279,
-    T_ON = 280,
-    T_WORD = 281,
-    T_WORD_QUOTE = 282,
-    T_UNEQUAL = 283,
-    T_CLOSE_PAREN = 284,
-    T_OPEN_PAREN = 285,
-    T_EOL = 286,
-    T_OR = 287,
-    T_AND = 288,
-    T_EQUAL = 289,
-    T_NOT = 290
+    T_SHOWIF = 270,
+    T_ENDIF = 271,
+    T_DEPENDS = 272,
+    T_OPTIONAL = 273,
+    T_PROMPT = 274,
+    T_TYPE = 275,
+    T_DEFAULT = 276,
+    T_SELECT = 277,
+    T_RANGE = 278,
+    T_VISIBLE = 279,
+    T_OPTION = 280,
+    T_ON = 281,
+    T_WORD = 282,
+    T_WORD_QUOTE = 283,
+    T_UNEQUAL = 284,
+    T_CLOSE_PAREN = 285,
+    T_OPEN_PAREN = 286,
+    T_EOL = 287,
+    T_OR = 288,
+    T_AND = 289,
+    T_EQUAL = 290,
+    T_NOT = 291
   };
 #endif
 
@@ -447,21 +448,21 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  11
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   290
+#define YYLAST   303
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  36
+#define YYNTOKENS  37
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  50
+#define YYNNTS  53
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  118
+#define YYNRULES  122
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  191
+#define YYNSTATES  199
 
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   290
+#define YYMAXUTOK   291
 
 #define YYTRANSLATE(YYX)                                                \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -499,25 +500,26 @@ static const yytype_uint8 yytranslate[] =
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35
+      35,    36
 };
 
 #if YYDEBUG
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   103,   103,   103,   105,   105,   107,   109,   110,   111,
-     112,   113,   114,   118,   122,   122,   122,   122,   122,   122,
-     122,   122,   126,   127,   128,   129,   130,   131,   135,   136,
-     142,   150,   156,   164,   174,   176,   177,   178,   179,   180,
-     181,   184,   192,   198,   208,   214,   220,   223,   225,   236,
-     237,   242,   251,   256,   264,   267,   269,   270,   271,   272,
-     273,   276,   282,   293,   299,   309,   311,   316,   324,   332,
-     335,   337,   338,   339,   344,   351,   358,   363,   371,   374,
-     376,   377,   378,   381,   389,   396,   403,   409,   416,   418,
-     419,   420,   423,   431,   433,   434,   437,   444,   446,   451,
-     452,   455,   456,   457,   461,   462,   465,   466,   469,   470,
-     471,   472,   473,   474,   475,   478,   479,   482,   483
+       0,   104,   104,   104,   106,   106,   108,   110,   111,   112,
+     113,   114,   115,   119,   123,   123,   123,   123,   123,   123,
+     123,   123,   127,   128,   129,   130,   131,   132,   133,   137,
+     138,   144,   152,   158,   166,   176,   178,   179,   180,   181,
+     182,   183,   186,   194,   200,   210,   216,   222,   225,   227,
+     238,   239,   244,   253,   258,   266,   269,   271,   272,   273,
+     274,   275,   278,   284,   295,   301,   311,   313,   318,   326,
+     334,   342,   350,   353,   356,   358,   359,   360,   365,   372,
+     379,   384,   392,   395,   397,   398,   399,   402,   410,   417,
+     424,   430,   437,   439,   440,   441,   444,   452,   454,   455,
+     458,   465,   467,   472,   473,   476,   477,   478,   482,   483,
+     486,   487,   490,   491,   492,   493,   494,   495,   496,   499,
+     500,   503,   504
 };
 #endif
 
@@ -528,17 +530,18 @@ static const char *const yytname[] =
 {
   "$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU",
   "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG",
-  "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS",
-  "T_OPTIONAL", "T_PROMPT", "T_TYPE", "T_DEFAULT", "T_SELECT", "T_RANGE",
-  "T_VISIBLE", "T_OPTION", "T_ON", "T_WORD", "T_WORD_QUOTE", "T_UNEQUAL",
-  "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_EOL", "T_OR", "T_AND", "T_EQUAL",
-  "T_NOT", "$accept", "input", "start", "stmt_list", "option_name",
-  "common_stmt", "option_error", "config_entry_start", "config_stmt",
-  "menuconfig_entry_start", "menuconfig_stmt", "config_option_list",
-  "config_option", "symbol_option", "symbol_option_list",
-  "symbol_option_arg", "choice", "choice_entry", "choice_end",
-  "choice_stmt", "choice_option_list", "choice_option", "choice_block",
-  "if_entry", "if_end", "if_stmt", "if_block", "mainmenu_stmt", "menu",
+  "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_SHOWIF", "T_ENDIF",
+  "T_DEPENDS", "T_OPTIONAL", "T_PROMPT", "T_TYPE", "T_DEFAULT", "T_SELECT",
+  "T_RANGE", "T_VISIBLE", "T_OPTION", "T_ON", "T_WORD", "T_WORD_QUOTE",
+  "T_UNEQUAL", "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_EOL", "T_OR", "T_AND",
+  "T_EQUAL", "T_NOT", "$accept", "input", "start", "stmt_list",
+  "option_name", "common_stmt", "option_error", "config_entry_start",
+  "config_stmt", "menuconfig_entry_start", "menuconfig_stmt",
+  "config_option_list", "config_option", "symbol_option",
+  "symbol_option_list", "symbol_option_arg", "choice", "choice_entry",
+  "choice_end", "choice_stmt", "choice_option_list", "choice_option",
+  "choice_block", "if_entry", "showif_entry", "if_end", "showif_end",
+  "if_stmt", "showif_stmt", "if_block", "mainmenu_stmt", "menu",
   "menu_entry", "menu_end", "menu_stmt", "menu_block", "source_stmt",
   "comment", "comment_stmt", "help_start", "help", "depends_list",
   "depends", "visibility_list", "visible", "prompt_stmt_opt", "prompt",
@@ -554,16 +557,16 @@ static const yytype_uint16 yytoknum[] =
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
-     285,   286,   287,   288,   289,   290
+     285,   286,   287,   288,   289,   290,   291
 };
 # endif
 
-#define YYPACT_NINF -90
+#define YYPACT_NINF -105
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-90)))
+  (!!((Yystate) == (-105)))
 
-#define YYTABLE_NINF -86
+#define YYTABLE_NINF -90
 
 #define yytable_value_is_error(Yytable_value) \
   0
@@ -572,26 +575,26 @@ static const yytype_uint16 yytoknum[] =
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-       4,    42,   -90,    96,   -90,   111,   -90,    15,   -90,   -90,
-      75,   -90,    82,    42,   104,    42,   110,   107,    42,   115,
-     125,    -4,   121,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
-     -90,   162,   -90,   163,   -90,   -90,   -90,   -90,   -90,   -90,
-     -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
-     -90,   139,   -90,   -90,   138,   -90,   142,   -90,   143,   -90,
-     152,   -90,   164,   167,   168,   -90,   -90,    -4,    -4,    77,
-     -18,   -90,   177,   185,    33,    71,   195,   247,   236,    -2,
-     236,   171,   -90,   -90,   -90,   -90,   -90,   -90,    41,   -90,
-      -4,    -4,   138,    97,    97,   -90,   -90,   186,   187,   194,
-      42,    42,    -4,   196,    97,   -90,   219,   -90,   -90,   -90,
-     -90,   210,   -90,   -90,   204,    42,    42,   199,   -90,   -90,
-     -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
-     -90,   222,   -90,   223,   -90,   -90,   -90,   -90,   -90,   -90,
-     -90,   -90,   -90,   -90,   215,   -90,   -90,   -90,   -90,   -90,
-      -4,   222,   228,   222,    -5,   222,    97,    35,   229,   -90,
-     -90,   222,   232,   222,    -4,   -90,   135,   233,   -90,   -90,
-     234,   235,   222,   240,   -90,   -90,   237,   -90,   239,   -13,
-     -90,   -90,   -90,   -90,   244,    42,   -90,   -90,   -90,   -90,
-     -90
+      15,   -19,  -105,     6,  -105,   125,  -105,    29,  -105,  -105,
+      13,  -105,    20,   -19,    22,   -19,    33,    30,   -19,    36,
+      43,    50,    50,    48,  -105,  -105,  -105,  -105,  -105,  -105,
+    -105,  -105,    90,  -105,    93,  -105,  -105,  -105,  -105,  -105,
+    -105,  -105,  -105,  -105,  -105,  -105,  -105,  -105,  -105,  -105,
+    -105,  -105,  -105,  -105,   154,  -105,  -105,    58,  -105,    63,
+    -105,    86,  -105,    95,  -105,    96,   106,   118,  -105,  -105,
+      50,    50,    89,   -24,    89,  -105,   121,   124,    19,    92,
+     214,   271,   257,   257,    24,   257,   189,  -105,  -105,  -105,
+    -105,  -105,  -105,    55,  -105,    50,    50,    58,    -6,    -6,
+      58,  -105,  -105,   134,   135,   162,   -19,   -19,    50,   164,
+      -6,  -105,   200,  -105,  -105,  -105,  -105,   201,  -105,  -105,
+     170,   -19,   -19,   190,  -105,  -105,  -105,  -105,  -105,  -105,
+    -105,  -105,  -105,  -105,  -105,  -105,  -105,  -105,  -105,   204,
+    -105,   243,  -105,  -105,  -105,  -105,  -105,  -105,  -105,  -105,
+    -105,  -105,   193,  -105,  -105,  -105,  -105,  -105,    50,   204,
+     207,   204,    39,   204,    -6,    52,   223,  -105,  -105,   204,
+     224,   204,    50,  -105,   258,   237,  -105,  -105,   242,   246,
+     204,   248,  -105,  -105,   252,  -105,   256,    49,  -105,  -105,
+    -105,  -105,   261,   -19,  -105,  -105,  -105,  -105,  -105
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -599,46 +602,48 @@ static const yytype_int16 yypact[] =
      means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
-       6,     0,   104,     0,     3,     0,     6,     6,    99,   100,
-       0,     1,     0,     0,     0,     0,   117,     0,     0,     0,
-       0,     0,     0,    14,    18,    15,    16,    20,    17,    19,
-      21,     0,    22,     0,     7,    34,    25,    34,    26,    55,
-      65,     8,    70,    23,    93,    79,     9,    27,    88,    24,
-      10,     0,   105,     2,    74,    13,     0,   101,     0,   118,
-       0,   102,     0,     0,     0,   115,   116,     0,     0,     0,
-     108,   103,     0,     0,     0,     0,     0,     0,     0,    88,
-       0,     0,    75,    83,    51,    84,    30,    32,     0,   112,
-       0,     0,    67,     0,     0,    11,    12,     0,     0,     0,
-       0,    97,     0,     0,     0,    47,     0,    40,    39,    35,
-      36,     0,    38,    37,     0,     0,    97,     0,    59,    60,
-      56,    58,    57,    66,    54,    53,    71,    73,    69,    72,
-      68,   106,    95,     0,    94,    80,    82,    78,    81,    77,
-      90,    91,    89,   111,   113,   114,   110,   109,    29,    86,
-       0,   106,     0,   106,   106,   106,     0,     0,     0,    87,
-      63,   106,     0,   106,     0,    96,     0,     0,    41,    98,
-       0,     0,   106,    49,    46,    28,     0,    62,     0,   107,
-      92,    42,    43,    44,     0,     0,    48,    61,    64,    45,
-      50
+       6,     0,   108,     0,     3,     0,     6,     6,   103,   104,
+       0,     1,     0,     0,     0,     0,   121,     0,     0,     0,
+       0,     0,     0,     0,    14,    18,    15,    16,    20,    17,
+      19,    21,     0,    22,     0,     7,    35,    26,    35,    27,
+      56,    66,     8,    74,    74,    23,    24,    97,    83,     9,
+      28,    92,    25,    10,     0,   109,     2,    78,    13,     0,
+     105,     0,   122,     0,   106,     0,     0,     0,   119,   120,
+       0,     0,     0,   112,     0,   107,     0,     0,     0,     0,
+       0,     0,     0,     0,    92,     0,     0,    79,    87,    52,
+      88,    31,    33,     0,   116,     0,     0,    68,     0,     0,
+      69,    11,    12,     0,     0,     0,     0,   101,     0,     0,
+       0,    48,     0,    41,    40,    36,    37,     0,    39,    38,
+       0,     0,   101,     0,    60,    61,    57,    59,    58,    67,
+      55,    54,    75,    77,    72,    76,    70,    73,    71,   110,
+      99,     0,    98,    84,    86,    82,    85,    81,    94,    95,
+      93,   115,   117,   118,   114,   113,    30,    90,     0,   110,
+       0,   110,   110,   110,     0,     0,     0,    91,    64,   110,
+       0,   110,     0,   100,     0,     0,    42,   102,     0,     0,
+     110,    50,    47,    29,     0,    63,     0,   111,    96,    43,
+      44,    45,     0,     0,    49,    62,    65,    46,    51
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-     -90,   -90,   269,   271,   -90,    23,   -70,   -90,   -90,   -90,
-     -90,   243,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -48,
-     -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
-     -90,   -20,   -90,   -90,   -90,   -90,   -90,   206,   205,   -68,
-     -90,   -90,   169,    -1,    27,    -7,   118,   -66,   -89,   -90
+    -105,  -105,   287,   289,  -105,   102,   -73,  -105,  -105,  -105,
+    -105,   259,  -105,  -105,  -105,  -105,  -105,  -105,  -105,    97,
+    -105,  -105,  -105,  -105,  -105,  -105,  -105,  -105,  -105,   254,
+    -105,  -105,  -105,  -105,   160,  -105,  -105,  -105,  -105,  -105,
+     216,   215,   -70,  -105,  -105,   178,    -1,   155,    -8,  -104,
+     -21,   -95,  -105
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,     3,     4,     5,    33,    34,   108,    35,    36,    37,
-      38,    74,   109,   110,   157,   186,    39,    40,   124,    41,
-      76,   120,    77,    42,   128,    43,    78,     6,    44,    45,
-     137,    46,    80,    47,    48,    49,   111,   112,    81,   113,
-      79,   134,   152,   153,    50,     7,   165,    69,    70,    60
+      -1,     3,     4,     5,    34,    35,   114,    36,    37,    38,
+      39,    78,   115,   116,   165,   194,    40,    41,   130,    42,
+      80,   126,    81,    43,    44,   134,   137,    45,    46,    82,
+       6,    47,    48,   145,    49,    85,    50,    51,    52,   117,
+     118,    86,   119,    84,   142,   160,   161,    53,     7,   173,
+      72,    73,    63
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -646,113 +651,116 @@ static const yytype_int16 yydefgoto[] =
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      10,    88,    89,    54,   146,   147,   119,     1,   122,   164,
-      93,   141,    56,   142,    58,   156,    94,    62,     1,    90,
-      91,   131,    65,    66,   144,   145,    67,    90,    91,   132,
-     127,    68,   136,   -31,    97,     2,   154,   -31,   -31,   -31,
-     -31,   -31,   -31,   -31,   -31,    98,    52,   -31,   -31,    99,
-     -31,   100,   101,   102,   103,   104,   -31,   105,   129,   106,
-     138,   173,    92,   141,   107,   142,   174,   172,     8,     9,
-     143,   -33,    97,    90,    91,   -33,   -33,   -33,   -33,   -33,
-     -33,   -33,   -33,    98,   166,   -33,   -33,    99,   -33,   100,
-     101,   102,   103,   104,   -33,   105,    11,   106,   179,   151,
-     123,   126,   107,   135,   125,   130,     2,   139,     2,    90,
-      91,    -5,    12,    55,   161,    13,    14,    15,    16,    17,
-      18,    19,    20,    65,    66,    21,    22,    23,    24,    25,
-      26,    27,    28,    29,    30,    57,    59,    31,    61,    -4,
-      12,    63,    32,    13,    14,    15,    16,    17,    18,    19,
-      20,    64,    71,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    72,    73,    31,   180,    90,    91,    52,
-      32,   -85,    97,    82,    83,   -85,   -85,   -85,   -85,   -85,
-     -85,   -85,   -85,    84,   190,   -85,   -85,    99,   -85,   -85,
-     -85,   -85,   -85,   -85,   -85,    85,    97,   106,    86,    87,
-     -52,   -52,   140,   -52,   -52,   -52,   -52,    98,    95,   -52,
-     -52,    99,   114,   115,   116,   117,    96,   148,   149,   150,
-     158,   106,   155,   159,    97,   163,   118,   -76,   -76,   -76,
-     -76,   -76,   -76,   -76,   -76,   160,   164,   -76,   -76,    99,
-      13,    14,    15,    16,    17,    18,    19,    20,    91,   106,
-      21,    22,    14,    15,   140,    17,    18,    19,    20,   168,
-     175,    21,    22,   177,   181,   182,   183,    32,   187,   167,
-     188,   169,   170,   171,   185,   189,    53,    51,    32,   176,
-      75,   178,   121,     0,   133,   162,     0,     0,     0,     0,
-     184
+      10,    74,    57,   154,   155,    98,    11,   125,     8,     9,
+     128,    99,    59,   149,    61,   164,   150,    65,     1,   -32,
+     103,    68,    69,   -32,   -32,   -32,   -32,   -32,   -32,   -32,
+     -32,   104,     1,   -32,   -32,   -32,   105,   -32,   106,   107,
+     108,   109,   110,   -32,   111,     2,   112,     2,   139,    93,
+      94,   113,    58,   172,    60,   175,   140,   177,   178,   179,
+      62,    55,    64,    66,    97,   184,   100,   186,   149,   180,
+      67,   150,    95,    96,   152,   153,   192,    68,    69,   181,
+      75,    70,    95,    96,   182,   151,    71,   162,    95,    96,
+      55,    76,   -34,   103,    77,    87,   -34,   -34,   -34,   -34,
+     -34,   -34,   -34,   -34,   104,   159,   -34,   -34,   -34,   105,
+     -34,   106,   107,   108,   109,   110,   -34,   111,    88,   112,
+     169,     2,    95,    96,   113,    -5,    12,    89,    90,    13,
+      14,    15,    16,    17,    18,    19,    20,   174,    91,    21,
+      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
+      92,   187,    32,   101,    -4,    12,   102,    33,    13,    14,
+      15,    16,    17,    18,    19,    20,   156,   157,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,   133,
+     133,    32,   144,   129,   132,   132,    33,   143,   158,   -89,
+     103,   163,   198,   -89,   -89,   -89,   -89,   -89,   -89,   -89,
+     -89,   166,   168,   -89,   -89,   -89,   105,   -89,   -89,   -89,
+     -89,   -89,   -89,   -89,   167,   103,   112,   171,   172,   -53,
+     -53,   148,   -53,   -53,   -53,   -53,   104,    96,   -53,   -53,
+     -53,   105,   120,   121,   122,   123,   131,   136,   138,   176,
+     147,   112,   135,   135,   103,   146,   124,   -80,   -80,   -80,
+     -80,   -80,   -80,   -80,   -80,   183,   185,   -80,   -80,   -80,
+     105,    13,    14,    15,    16,    17,    18,    19,    20,   189,
+     112,    21,    22,    23,   190,   148,    14,    15,   191,    17,
+      18,    19,    20,   193,   195,    21,    22,    23,   196,    33,
+     188,    95,    96,   197,    56,    54,   127,    79,    83,   141,
+     170,     0,     0,    33
 };
 
 static const yytype_int16 yycheck[] =
 {
-       1,    67,    68,    10,    93,    94,    76,     3,    76,    14,
-      28,    81,    13,    81,    15,   104,    34,    18,     3,    32,
-      33,    23,    26,    27,    90,    91,    30,    32,    33,    31,
-      78,    35,    80,     0,     1,    31,   102,     4,     5,     6,
-       7,     8,     9,    10,    11,    12,    31,    14,    15,    16,
-      17,    18,    19,    20,    21,    22,    23,    24,    78,    26,
-      80,    26,    69,   133,    31,   133,    31,   156,    26,    27,
-      29,     0,     1,    32,    33,     4,     5,     6,     7,     8,
-       9,    10,    11,    12,   150,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    24,     0,    26,   164,   100,
-      77,    78,    31,    80,    77,    78,    31,    80,    31,    32,
-      33,     0,     1,    31,   115,     4,     5,     6,     7,     8,
-       9,    10,    11,    26,    27,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    31,    26,    26,    31,     0,
-       1,    26,    31,     4,     5,     6,     7,     8,     9,    10,
-      11,    26,    31,    14,    15,    16,    17,    18,    19,    20,
-      21,    22,    23,     1,     1,    26,    31,    32,    33,    31,
-      31,     0,     1,    31,    31,     4,     5,     6,     7,     8,
-       9,    10,    11,    31,   185,    14,    15,    16,    17,    18,
-      19,    20,    21,    22,    23,    31,     1,    26,    31,    31,
-       5,     6,    31,     8,     9,    10,    11,    12,    31,    14,
-      15,    16,    17,    18,    19,    20,    31,    31,    31,    25,
-       1,    26,    26,    13,     1,    26,    31,     4,     5,     6,
-       7,     8,     9,    10,    11,    31,    14,    14,    15,    16,
-       4,     5,     6,     7,     8,     9,    10,    11,    33,    26,
-      14,    15,     5,     6,    31,     8,     9,    10,    11,    31,
-      31,    14,    15,    31,    31,    31,    31,    31,    31,   151,
-      31,   153,   154,   155,    34,    31,     7,     6,    31,   161,
-      37,   163,    76,    -1,    79,   116,    -1,    -1,    -1,    -1,
-     172
+       1,    22,    10,    98,    99,    29,     0,    80,    27,    28,
+      80,    35,    13,    86,    15,   110,    86,    18,     3,     0,
+       1,    27,    28,     4,     5,     6,     7,     8,     9,    10,
+      11,    12,     3,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    32,    27,    32,    24,    70,
+      71,    32,    32,    14,    32,   159,    32,   161,   162,   163,
+      27,    32,    32,    27,    72,   169,    74,   171,   141,   164,
+      27,   141,    33,    34,    95,    96,   180,    27,    28,    27,
+      32,    31,    33,    34,    32,    30,    36,   108,    33,    34,
+      32,     1,     0,     1,     1,    32,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,   106,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    32,    27,
+     121,    32,    33,    34,    32,     0,     1,    32,    32,     4,
+       5,     6,     7,     8,     9,    10,    11,   158,    32,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      32,   172,    27,    32,     0,     1,    32,    32,     4,     5,
+       6,     7,     8,     9,    10,    11,    32,    32,    14,    15,
+      16,    17,    18,    19,    20,    21,    22,    23,    24,    82,
+      83,    27,    85,    81,    82,    83,    32,    85,    26,     0,
+       1,    27,   193,     4,     5,     6,     7,     8,     9,    10,
+      11,     1,    32,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    13,     1,    27,    27,    14,     5,
+       6,    32,     8,     9,    10,    11,    12,    34,    14,    15,
+      16,    17,    18,    19,    20,    21,    81,    82,    83,    32,
+      85,    27,    82,    83,     1,    85,    32,     4,     5,     6,
+       7,     8,     9,    10,    11,    32,    32,    14,    15,    16,
+      17,     4,     5,     6,     7,     8,     9,    10,    11,    32,
+      27,    14,    15,    16,    32,    32,     5,     6,    32,     8,
+       9,    10,    11,    35,    32,    14,    15,    16,    32,    32,
+      32,    33,    34,    32,     7,     6,    80,    38,    44,    84,
+     122,    -1,    -1,    32
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
      symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
-       0,     3,    31,    37,    38,    39,    63,    81,    26,    27,
-      79,     0,     1,     4,     5,     6,     7,     8,     9,    10,
+       0,     3,    32,    38,    39,    40,    67,    85,    27,    28,
+      83,     0,     1,     4,     5,     6,     7,     8,     9,    10,
       11,    14,    15,    16,    17,    18,    19,    20,    21,    22,
-      23,    26,    31,    40,    41,    43,    44,    45,    46,    52,
-      53,    55,    59,    61,    64,    65,    67,    69,    70,    71,
-      80,    39,    31,    38,    81,    31,    79,    31,    79,    26,
-      85,    31,    79,    26,    26,    26,    27,    30,    35,    83,
-      84,    31,     1,     1,    47,    47,    56,    58,    62,    76,
-      68,    74,    31,    31,    31,    31,    31,    31,    83,    83,
-      32,    33,    81,    28,    34,    31,    31,     1,    12,    16,
-      18,    19,    20,    21,    22,    24,    26,    31,    42,    48,
-      49,    72,    73,    75,    17,    18,    19,    20,    31,    42,
-      57,    73,    75,    41,    54,    80,    41,    55,    60,    67,
-      80,    23,    31,    74,    77,    41,    55,    66,    67,    80,
-      31,    42,    75,    29,    83,    83,    84,    84,    31,    31,
-      25,    79,    78,    79,    83,    26,    84,    50,     1,    13,
-      31,    79,    78,    26,    14,    82,    83,    82,    31,    82,
-      82,    82,    84,    26,    31,    31,    82,    31,    82,    83,
-      31,    31,    31,    31,    82,    34,    51,    31,    31,    31,
-      79
+      23,    24,    27,    32,    41,    42,    44,    45,    46,    47,
+      53,    54,    56,    60,    61,    64,    65,    68,    69,    71,
+      73,    74,    75,    84,    40,    32,    39,    85,    32,    83,
+      32,    83,    27,    89,    32,    83,    27,    27,    27,    28,
+      31,    36,    87,    88,    87,    32,     1,     1,    48,    48,
+      57,    59,    66,    66,    80,    72,    78,    32,    32,    32,
+      32,    32,    32,    87,    87,    33,    34,    85,    29,    35,
+      85,    32,    32,     1,    12,    17,    19,    20,    21,    22,
+      23,    25,    27,    32,    43,    49,    50,    76,    77,    79,
+      18,    19,    20,    21,    32,    43,    58,    77,    79,    42,
+      55,    84,    42,    56,    62,    71,    84,    63,    84,    24,
+      32,    78,    81,    42,    56,    70,    71,    84,    32,    43,
+      79,    30,    87,    87,    88,    88,    32,    32,    26,    83,
+      82,    83,    87,    27,    88,    51,     1,    13,    32,    83,
+      82,    27,    14,    86,    87,    86,    32,    86,    86,    86,
+      88,    27,    32,    32,    86,    32,    86,    87,    32,    32,
+      32,    32,    86,    35,    52,    32,    32,    32,    83
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
-       0,    36,    37,    37,    38,    38,    39,    39,    39,    39,
-      39,    39,    39,    39,    40,    40,    40,    40,    40,    40,
-      40,    40,    41,    41,    41,    41,    41,    41,    42,    42,
-      43,    44,    45,    46,    47,    47,    47,    47,    47,    47,
-      47,    48,    48,    48,    48,    48,    49,    50,    50,    51,
-      51,    52,    53,    54,    55,    56,    56,    56,    56,    56,
-      56,    57,    57,    57,    57,    58,    58,    59,    60,    61,
-      62,    62,    62,    62,    63,    64,    65,    66,    67,    68,
-      68,    68,    68,    69,    70,    71,    72,    73,    74,    74,
-      74,    74,    75,    76,    76,    76,    77,    78,    78,    79,
-      79,    80,    80,    80,    81,    81,    82,    82,    83,    83,
-      83,    83,    83,    83,    83,    84,    84,    85,    85
+       0,    37,    38,    38,    39,    39,    40,    40,    40,    40,
+      40,    40,    40,    40,    41,    41,    41,    41,    41,    41,
+      41,    41,    42,    42,    42,    42,    42,    42,    42,    43,
+      43,    44,    45,    46,    47,    48,    48,    48,    48,    48,
+      48,    48,    49,    49,    49,    49,    49,    50,    51,    51,
+      52,    52,    53,    54,    55,    56,    57,    57,    57,    57,
+      57,    57,    58,    58,    58,    58,    59,    59,    60,    61,
+      62,    63,    64,    65,    66,    66,    66,    66,    67,    68,
+      69,    70,    71,    72,    72,    72,    72,    73,    74,    75,
+      76,    77,    78,    78,    78,    78,    79,    80,    80,    80,
+      81,    82,    82,    83,    83,    84,    84,    84,    85,    85,
+      86,    86,    87,    87,    87,    87,    87,    87,    87,    88,
+      88,    89,    89
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
@@ -760,16 +768,17 @@ static const yytype_uint8 yyr2[] =
 {
        0,     2,     2,     1,     2,     1,     0,     2,     2,     2,
        2,     4,     4,     3,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     1,     1,     1,     3,     2,
-       3,     2,     3,     2,     0,     2,     2,     2,     2,     2,
-       2,     3,     4,     4,     4,     5,     3,     0,     3,     0,
-       2,     3,     2,     1,     3,     0,     2,     2,     2,     2,
-       2,     4,     3,     2,     4,     0,     2,     3,     1,     3,
-       0,     2,     2,     2,     3,     3,     3,     1,     3,     0,
-       2,     2,     2,     3,     3,     2,     2,     2,     0,     2,
-       2,     2,     4,     0,     2,     2,     2,     0,     2,     1,
-       1,     2,     2,     2,     1,     2,     0,     2,     1,     3,
-       3,     3,     2,     3,     3,     1,     1,     0,     1
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     3,
+       2,     3,     2,     3,     2,     0,     2,     2,     2,     2,
+       2,     2,     3,     4,     4,     4,     5,     3,     0,     3,
+       0,     2,     3,     2,     1,     3,     0,     2,     2,     2,
+       2,     2,     4,     3,     2,     4,     0,     2,     3,     3,
+       1,     1,     3,     3,     0,     2,     2,     2,     3,     3,
+       3,     1,     3,     0,     2,     2,     2,     3,     3,     2,
+       2,     2,     0,     2,     2,     2,     4,     0,     2,     2,
+       2,     0,     2,     1,     1,     2,     2,     2,     1,     2,
+       0,     2,     1,     3,     3,     3,     2,     3,     3,     1,
+       1,     0,     1
 };
 
 
@@ -1192,7 +1201,18 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
   switch (yytype)
     {
-          case 53: /* choice_entry  */
+          case 54: /* choice_entry  */
+
+      {
+	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
+		((*yyvaluep).menu)->file->name, ((*yyvaluep).menu)->lineno);
+	if (current_menu == ((*yyvaluep).menu))
+		menu_end_menu();
+}
+
+        break;
+
+    case 60: /* if_entry  */
 
       {
 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
@@ -1203,7 +1223,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
 
         break;
 
-    case 59: /* if_entry  */
+    case 61: /* showif_entry  */
 
       {
 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
@@ -1214,7 +1234,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
 
         break;
 
-    case 65: /* menu_entry  */
+    case 69: /* menu_entry  */
 
       {
 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
@@ -1509,19 +1529,19 @@ yyreduce:
 
     break;
 
-  case 28:
+  case 29:
 
     { zconf_error("unknown option \"%s\"", (yyvsp[-2].string)); }
 
     break;
 
-  case 29:
+  case 30:
 
     { zconf_error("invalid option"); }
 
     break;
 
-  case 30:
+  case 31:
 
     {
 	struct symbol *sym = sym_lookup((yyvsp[-1].string), 0);
@@ -1532,7 +1552,7 @@ yyreduce:
 
     break;
 
-  case 31:
+  case 32:
 
     {
 	menu_end_entry();
@@ -1541,7 +1561,7 @@ yyreduce:
 
     break;
 
-  case 32:
+  case 33:
 
     {
 	struct symbol *sym = sym_lookup((yyvsp[-1].string), 0);
@@ -1552,7 +1572,7 @@ yyreduce:
 
     break;
 
-  case 33:
+  case 34:
 
     {
 	if (current_entry->prompt)
@@ -1565,7 +1585,7 @@ yyreduce:
 
     break;
 
-  case 41:
+  case 42:
 
     {
 	menu_set_type((yyvsp[-2].id)->stype);
@@ -1576,7 +1596,7 @@ yyreduce:
 
     break;
 
-  case 42:
+  case 43:
 
     {
 	menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr));
@@ -1585,7 +1605,7 @@ yyreduce:
 
     break;
 
-  case 43:
+  case 44:
 
     {
 	menu_add_expr(P_DEFAULT, (yyvsp[-2].expr), (yyvsp[-1].expr));
@@ -1598,7 +1618,7 @@ yyreduce:
 
     break;
 
-  case 44:
+  case 45:
 
     {
 	menu_add_symbol(P_SELECT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr));
@@ -1607,7 +1627,7 @@ yyreduce:
 
     break;
 
-  case 45:
+  case 46:
 
     {
 	menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,(yyvsp[-3].symbol), (yyvsp[-2].symbol)), (yyvsp[-1].expr));
@@ -1616,7 +1636,7 @@ yyreduce:
 
     break;
 
-  case 48:
+  case 49:
 
     {
 	const struct kconf_id *id = kconf_id_lookup((yyvsp[-1].string), strlen((yyvsp[-1].string)));
@@ -1629,19 +1649,19 @@ yyreduce:
 
     break;
 
-  case 49:
+  case 50:
 
     { (yyval.string) = NULL; }
 
     break;
 
-  case 50:
+  case 51:
 
     { (yyval.string) = (yyvsp[0].string); }
 
     break;
 
-  case 51:
+  case 52:
 
     {
 	struct symbol *sym = sym_lookup((yyvsp[-1].string), SYMBOL_CHOICE);
@@ -1653,7 +1673,7 @@ yyreduce:
 
     break;
 
-  case 52:
+  case 53:
 
     {
 	(yyval.menu) = menu_add_menu();
@@ -1661,7 +1681,7 @@ yyreduce:
 
     break;
 
-  case 53:
+  case 54:
 
     {
 	if (zconf_endtoken((yyvsp[0].id), T_CHOICE, T_ENDCHOICE)) {
@@ -1672,7 +1692,7 @@ yyreduce:
 
     break;
 
-  case 61:
+  case 62:
 
     {
 	menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr));
@@ -1681,7 +1701,7 @@ yyreduce:
 
     break;
 
-  case 62:
+  case 63:
 
     {
 	if ((yyvsp[-2].id)->stype == S_BOOLEAN || (yyvsp[-2].id)->stype == S_TRISTATE) {
@@ -1695,7 +1715,7 @@ yyreduce:
 
     break;
 
-  case 63:
+  case 64:
 
     {
 	current_entry->sym->flags |= SYMBOL_OPTIONAL;
@@ -1704,7 +1724,7 @@ yyreduce:
 
     break;
 
-  case 64:
+  case 65:
 
     {
 	if ((yyvsp[-3].id)->stype == S_UNKNOWN) {
@@ -1717,7 +1737,7 @@ yyreduce:
 
     break;
 
-  case 67:
+  case 68:
 
     {
 	printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
@@ -1728,7 +1748,18 @@ yyreduce:
 
     break;
 
-  case 68:
+  case 69:
+
+    {
+	printd(DEBUG_PARSE, "%s:%d:showif\n", zconf_curname(), zconf_lineno());
+	menu_add_entry(NULL);
+	menu_add_visibility((yyvsp[-1].expr));
+	(yyval.menu) = menu_add_menu();
+}
+
+    break;
+
+  case 70:
 
     {
 	if (zconf_endtoken((yyvsp[0].id), T_IF, T_ENDIF)) {
@@ -1739,7 +1770,18 @@ yyreduce:
 
     break;
 
-  case 74:
+  case 71:
+
+    {
+	if (zconf_endtoken((yyvsp[0].id), T_SHOWIF, T_ENDIF)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
+	}
+}
+
+    break;
+
+  case 78:
 
     {
 	menu_add_prompt(P_MENU, (yyvsp[-1].string), NULL);
@@ -1747,7 +1789,7 @@ yyreduce:
 
     break;
 
-  case 75:
+  case 79:
 
     {
 	menu_add_entry(NULL);
@@ -1757,7 +1799,7 @@ yyreduce:
 
     break;
 
-  case 76:
+  case 80:
 
     {
 	(yyval.menu) = menu_add_menu();
@@ -1765,7 +1807,7 @@ yyreduce:
 
     break;
 
-  case 77:
+  case 81:
 
     {
 	if (zconf_endtoken((yyvsp[0].id), T_MENU, T_ENDMENU)) {
@@ -1776,7 +1818,7 @@ yyreduce:
 
     break;
 
-  case 83:
+  case 87:
 
     {
 	printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
@@ -1785,7 +1827,7 @@ yyreduce:
 
     break;
 
-  case 84:
+  case 88:
 
     {
 	menu_add_entry(NULL);
@@ -1795,7 +1837,7 @@ yyreduce:
 
     break;
 
-  case 85:
+  case 89:
 
     {
 	menu_end_entry();
@@ -1803,7 +1845,7 @@ yyreduce:
 
     break;
 
-  case 86:
+  case 90:
 
     {
 	printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
@@ -1812,7 +1854,7 @@ yyreduce:
 
     break;
 
-  case 87:
+  case 91:
 
     {
 	current_entry->help = (yyvsp[0].string);
@@ -1820,7 +1862,7 @@ yyreduce:
 
     break;
 
-  case 92:
+  case 96:
 
     {
 	menu_add_dep((yyvsp[-1].expr));
@@ -1829,7 +1871,7 @@ yyreduce:
 
     break;
 
-  case 96:
+  case 100:
 
     {
 	menu_add_visibility((yyvsp[0].expr));
@@ -1837,7 +1879,7 @@ yyreduce:
 
     break;
 
-  case 98:
+  case 102:
 
     {
 	menu_add_prompt(P_PROMPT, (yyvsp[-1].string), (yyvsp[0].expr));
@@ -1845,91 +1887,91 @@ yyreduce:
 
     break;
 
-  case 101:
+  case 105:
 
     { (yyval.id) = (yyvsp[-1].id); }
 
     break;
 
-  case 102:
+  case 106:
 
     { (yyval.id) = (yyvsp[-1].id); }
 
     break;
 
-  case 103:
+  case 107:
 
     { (yyval.id) = (yyvsp[-1].id); }
 
     break;
 
-  case 106:
+  case 110:
 
     { (yyval.expr) = NULL; }
 
     break;
 
-  case 107:
+  case 111:
 
     { (yyval.expr) = (yyvsp[0].expr); }
 
     break;
 
-  case 108:
+  case 112:
 
     { (yyval.expr) = expr_alloc_symbol((yyvsp[0].symbol)); }
 
     break;
 
-  case 109:
+  case 113:
 
     { (yyval.expr) = expr_alloc_comp(E_EQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); }
 
     break;
 
-  case 110:
+  case 114:
 
     { (yyval.expr) = expr_alloc_comp(E_UNEQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); }
 
     break;
 
-  case 111:
+  case 115:
 
     { (yyval.expr) = (yyvsp[-1].expr); }
 
     break;
 
-  case 112:
+  case 116:
 
     { (yyval.expr) = expr_alloc_one(E_NOT, (yyvsp[0].expr)); }
 
     break;
 
-  case 113:
+  case 117:
 
     { (yyval.expr) = expr_alloc_two(E_OR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
 
     break;
 
-  case 114:
+  case 118:
 
     { (yyval.expr) = expr_alloc_two(E_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); }
 
     break;
 
-  case 115:
+  case 119:
 
     { (yyval.symbol) = sym_lookup((yyvsp[0].string), 0); free((yyvsp[0].string)); }
 
     break;
 
-  case 116:
+  case 120:
 
     { (yyval.symbol) = sym_lookup((yyvsp[0].string), SYMBOL_CONST); free((yyvsp[0].string)); }
 
     break;
 
-  case 117:
+  case 121:
 
     { (yyval.string) = NULL; }
 
@@ -2207,6 +2249,7 @@ static const char *zconf_tokenname(int token)
 	case T_CHOICE:		return "choice";
 	case T_ENDCHOICE:	return "endchoice";
 	case T_IF:		return "if";
+	case T_SHOWIF:		return "showif";
 	case T_ENDIF:		return "endif";
 	case T_DEPENDS:		return "depends";
 	case T_VISIBLE:		return "visible";
diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y
index 0f683cf..bb314bd 100644
--- a/scripts/kconfig/zconf.y
+++ b/scripts/kconfig/zconf.y
@@ -31,7 +31,7 @@ struct symbol *symbol_hash[SYMBOL_HASHSIZE];
 static struct menu *current_menu, *current_entry;
 
 %}
-%expect 30
+%expect 31
 
 %union
 {
@@ -55,6 +55,7 @@ static struct menu *current_menu, *current_entry;
 %token <id>T_HELP
 %token <string> T_HELPTEXT
 %token <id>T_IF
+%token <id>T_SHOWIF
 %token <id>T_ENDIF
 %token <id>T_DEPENDS
 %token <id>T_OPTIONAL
@@ -84,7 +85,7 @@ static struct menu *current_menu, *current_entry;
 %type <expr> if_expr
 %type <id> end
 %type <id> option_name
-%type <menu> if_entry menu_entry choice_entry
+%type <menu> if_entry showif_entry menu_entry choice_entry
 %type <string> symbol_option_arg word_opt
 
 %destructor {
@@ -92,7 +93,7 @@ static struct menu *current_menu, *current_entry;
 		$$->file->name, $$->lineno);
 	if (current_menu == $$)
 		menu_end_menu();
-} if_entry menu_entry choice_entry
+} if_entry showif_entry menu_entry choice_entry
 
 %{
 /* Include zconf.hash.c here so it can see the token constants. */
@@ -125,6 +126,7 @@ option_name:
 common_stmt:
 	  T_EOL
 	| if_stmt
+	| showif_stmt
 	| comment_stmt
 	| config_stmt
 	| menuconfig_stmt
@@ -321,6 +323,14 @@ if_entry: T_IF expr nl
 	$$ = menu_add_menu();
 };
 
+showif_entry: T_SHOWIF expr nl
+{
+	printd(DEBUG_PARSE, "%s:%d:showif\n", zconf_curname(), zconf_lineno());
+	menu_add_entry(NULL);
+	menu_add_visibility($2);
+	$$ = menu_add_menu();
+};
+
 if_end: end
 {
 	if (zconf_endtoken($1, T_IF, T_ENDIF)) {
@@ -329,9 +339,20 @@ if_end: end
 	}
 };
 
+showif_end: end
+{
+	if (zconf_endtoken($1, T_SHOWIF, T_ENDIF)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
+	}
+};
+
 if_stmt: if_entry if_block if_end
 ;
 
+showif_stmt: showif_entry if_block showif_end
+;
+
 if_block:
 	  /* empty */
 	| if_block common_stmt
@@ -524,6 +545,7 @@ static const char *zconf_tokenname(int token)
 	case T_CHOICE:		return "choice";
 	case T_ENDCHOICE:	return "endchoice";
 	case T_IF:		return "if";
+	case T_SHOWIF:		return "showif";
 	case T_ENDIF:		return "endif";
 	case T_DEPENDS:		return "depends";
 	case T_VISIBLE:		return "visible";
-- 
2.1.4


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/4] init/Kconfig: Fix break in middle of EXPERT menu
  2015-05-13 23:37 [PATCH 1/4] init/Kconfig: Fix break in middle of EXPERT menu Josh Triplett
                   ` (2 preceding siblings ...)
  2015-05-13 23:38 ` [PATCH 4/4] kconfig: Introduce "showif" to factor out conditions on visibility Josh Triplett
@ 2015-05-14 11:04 ` Paul Bolle
  2015-05-14 15:37   ` josh
  3 siblings, 1 reply; 7+ messages in thread
From: Paul Bolle @ 2015-05-14 11:04 UTC (permalink / raw)
  To: Josh Triplett
  Cc: Michal Marek, linux-kbuild, Ingo Molnar, Andrew Morton,
	Paul E. McKenney, Michal Hocko, Vladimir Davydov,
	Johannes Weiner, Geert Uytterhoeven, Andy Lutomirski,
	Bertrand Jacquin, Luis R. Rodriguez, Iulia Manda, Pranith Kumar,
	Clark Williams, Mel Gorman, Randy Dunlap, linux-kernel

[Adding Michal and linux-kbuild.]

Hi Josh,

Could you please resend this series to include Michal and linux-kbuild?
Don't bother to include Yann. (I almost forwarded the entire series but
that looked impractical for patches.)

Please split 4/4 into two patches, while you're at it. Ie, 5/5 for
init/Kconfig.expert only, and 4/5 for the changes to scripts/kconfig/.

Thanks,


Paul Bolle


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 4/4] kconfig: Introduce "showif" to factor out conditions on visibility
  2015-05-13 23:38 ` [PATCH 4/4] kconfig: Introduce "showif" to factor out conditions on visibility Josh Triplett
@ 2015-05-14 12:30   ` Paul E. McKenney
  0 siblings, 0 replies; 7+ messages in thread
From: Paul E. McKenney @ 2015-05-14 12:30 UTC (permalink / raw)
  To: Josh Triplett
  Cc: Ingo Molnar, Andrew Morton, Michal Hocko, Vladimir Davydov,
	Johannes Weiner, Geert Uytterhoeven, Andy Lutomirski,
	Bertrand Jacquin, Luis R. Rodriguez, Iulia Manda, Pranith Kumar,
	Clark Williams, Mel Gorman, Randy Dunlap, Paul Bolle,
	linux-kernel

On Wed, May 13, 2015 at 04:38:23PM -0700, Josh Triplett wrote:
> kconfig implicitly creates a submenu whenever a series of symbols all
> have dependencies or prompt-visibility expressions that all depend on a
> preceeding symbol.  For instance, the series of symbols following
> "menuconfig EXPERT" that all have "if EXPERT" on their prompt will all
> appear as a submenu of EXPERT.
> 
> However, this implicit submenuing will break if any intervening symbol
> loses its "if EXPERT"; doing so causes the subsequent symbols to appear
> in the parent menu ("General setup").  This has happened many times, and
> it's easy to miss that the entire block should have that same
> expression.
> 
> For submenus created from "depends" dependencies, these can be converted
> to a single wrapping "if expr ... endif" block around all the submenu
> items.  However, there's no equivalent for invisible items, for which
> the prompt is hidden but the symbol may potentially be enabled.  For
> instance, many items in the EXPERT menu are hidden if EXPERT is
> disabled, but they have "default y" or are determined by some other
> expression.
> 
> To handle this case, introduce a new kconfig construct, "showif", which
> does the same thing as "if" but for visibility expressions rather than
> dependencies.  Every symbol in a "showif expr ... endif" block
> effectively has "if expr" added to its prompt.
> 
> Use that new construct to simplify the expert menu.  Now, making a
> symbol no longer invisible when !EXPERT requires moving it out of the
> EXPERT menu, which makes it more difficult to break the EXPERT menu.
> 
> Signed-off-by: Josh Triplett <josh@joshtriplett.org>

Having this would have simplified RCU_EXPERT.

Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>

> ---
>  init/Kconfig.expert                  |  44 +--
>  scripts/kconfig/menu.c               |   4 +-
>  scripts/kconfig/zconf.gperf          |   1 +
>  scripts/kconfig/zconf.hash.c_shipped | 258 ++++++++--------
>  scripts/kconfig/zconf.tab.c_shipped  | 561 +++++++++++++++++++----------------
>  scripts/kconfig/zconf.y              |  28 +-
>  6 files changed, 483 insertions(+), 413 deletions(-)
> 
> diff --git a/init/Kconfig.expert b/init/Kconfig.expert
> index c84a372..fb3c3aa 100644
> --- a/init/Kconfig.expert
> +++ b/init/Kconfig.expert
> @@ -8,15 +8,17 @@ menuconfig EXPERT
>            environments which can tolerate a "non-standard" kernel.
>            Only use this if you really know what you are doing.
> 
> +showif EXPERT
> +
>  config UID16
> -	bool "Enable 16-bit UID system calls" if EXPERT
> +	bool "Enable 16-bit UID system calls"
>  	depends on HAVE_UID16 && MULTIUSER
>  	default y
>  	help
>  	  This enables the legacy 16-bit UID syscall wrappers.
> 
>  config MULTIUSER
> -	bool "Multiple users, groups and capabilities support" if EXPERT
> +	bool "Multiple users, groups and capabilities support"
>  	default y
>  	help
>  	  This option enables support for non-root users, groups and
> @@ -30,7 +32,7 @@ config MULTIUSER
>  	  If unsure, say Y here.
> 
>  config SGETMASK_SYSCALL
> -	bool "sgetmask/ssetmask syscalls support" if EXPERT
> +	bool "sgetmask/ssetmask syscalls support"
>  	def_bool PARISC || MN10300 || BLACKFIN || M68K || PPC || MIPS || X86 || SPARC || CRIS || MICROBLAZE || SUPERH
>  	---help---
>  	  sys_sgetmask and sys_ssetmask are obsolete system calls
> @@ -40,7 +42,7 @@ config SGETMASK_SYSCALL
>  	  If unsure, leave the default option here.
> 
>  config SYSFS_SYSCALL
> -	bool "Sysfs syscall support" if EXPERT
> +	bool "Sysfs syscall support"
>  	default y
>  	---help---
>  	  sys_sysfs is an obsolete system call no longer supported in libc.
> @@ -50,7 +52,7 @@ config SYSFS_SYSCALL
>  	  If unsure say Y here.
> 
>  config SYSCTL_SYSCALL
> -	bool "Sysctl syscall support" if EXPERT
> +	bool "Sysctl syscall support"
>  	depends on PROC_SYSCTL
>  	default n
>  	select SYSCTL
> @@ -67,7 +69,7 @@ config SYSCTL_SYSCALL
>  	  If unsure say N here.
> 
>  config KALLSYMS
> -	 bool "Load all symbols for debugging/ksymoops" if EXPERT
> +	 bool "Load all symbols for debugging/ksymoops"
>  	 default y
>  	 help
>  	   Say Y here to let the kernel print out symbolic crash information and
> @@ -93,7 +95,7 @@ config KALLSYMS_ALL
> 
>  config PRINTK
>  	default y
> -	bool "Enable support for printk" if EXPERT
> +	bool "Enable support for printk"
>  	select IRQ_WORK
>  	help
>  	  This option enables normal printk support. Removing it
> @@ -103,7 +105,7 @@ config PRINTK
>  	  strongly discouraged.
> 
>  config BUG
> -	bool "BUG() support" if EXPERT
> +	bool "BUG() support"
>  	default y
>  	help
>            Disabling this option eliminates support for BUG and WARN, reducing
> @@ -115,13 +117,13 @@ config BUG
>  config ELF_CORE
>  	depends on COREDUMP
>  	default y
> -	bool "Enable ELF core dumps" if EXPERT
> +	bool "Enable ELF core dumps"
>  	help
>  	  Enable support for generating core dumps. Disabling saves about 4k.
> 
> 
>  config PCSPKR_PLATFORM
> -	bool "Enable PC-Speaker support" if EXPERT
> +	bool "Enable PC-Speaker support"
>  	depends on HAVE_PCSPKR_PLATFORM
>  	select I8253_LOCK
>  	default y
> @@ -131,14 +133,14 @@ config PCSPKR_PLATFORM
> 
>  config BASE_FULL
>  	default y
> -	bool "Enable full-sized data structures for core" if EXPERT
> +	bool "Enable full-sized data structures for core"
>  	help
>  	  Disabling this option reduces the size of miscellaneous core
>  	  kernel data structures. This saves memory on small machines,
>  	  but may reduce performance.
> 
>  config FUTEX
> -	bool "Enable futex support" if EXPERT
> +	bool "Enable futex support"
>  	default y
>  	select RT_MUTEXES
>  	help
> @@ -155,7 +157,7 @@ config HAVE_FUTEX_CMPXCHG
>  	  checks.
> 
>  config EPOLL
> -	bool "Enable eventpoll support" if EXPERT
> +	bool "Enable eventpoll support"
>  	default y
>  	select ANON_INODES
>  	help
> @@ -163,7 +165,7 @@ config EPOLL
>  	  support for epoll family of system calls.
> 
>  config SIGNALFD
> -	bool "Enable signalfd() system call" if EXPERT
> +	bool "Enable signalfd() system call"
>  	select ANON_INODES
>  	default y
>  	help
> @@ -173,7 +175,7 @@ config SIGNALFD
>  	  If unsure, say Y.
> 
>  config TIMERFD
> -	bool "Enable timerfd() system call" if EXPERT
> +	bool "Enable timerfd() system call"
>  	select ANON_INODES
>  	default y
>  	help
> @@ -183,7 +185,7 @@ config TIMERFD
>  	  If unsure, say Y.
> 
>  config EVENTFD
> -	bool "Enable eventfd() system call" if EXPERT
> +	bool "Enable eventfd() system call"
>  	select ANON_INODES
>  	default y
>  	help
> @@ -193,7 +195,7 @@ config EVENTFD
>  	  If unsure, say Y.
> 
>  config SHMEM
> -	bool "Use full shmem filesystem" if EXPERT
> +	bool "Use full shmem filesystem"
>  	default y
>  	depends on MMU
>  	help
> @@ -204,7 +206,7 @@ config SHMEM
>  	  which may be appropriate on small systems without swap.
> 
>  config AIO
> -	bool "Enable AIO support" if EXPERT
> +	bool "Enable AIO support"
>  	default y
>  	help
>  	  This option enables POSIX asynchronous I/O which may by used
> @@ -212,7 +214,7 @@ config AIO
>  	  this option saves about 7k.
> 
>  config ADVISE_SYSCALLS
> -	bool "Enable madvise/fadvise syscalls" if EXPERT
> +	bool "Enable madvise/fadvise syscalls"
>  	default y
>  	help
>  	  This option enables the madvise and fadvise syscalls, used by
> @@ -223,9 +225,11 @@ config ADVISE_SYSCALLS
> 
>  config PCI_QUIRKS
>  	default y
> -	bool "Enable PCI quirk workarounds" if EXPERT
> +	bool "Enable PCI quirk workarounds"
>  	depends on PCI
>  	help
>  	  This enables workarounds for various PCI chipset
>  	  bugs/quirks. Disable this only if your target machine is
>  	  unaffected by PCI quirks.
> +
> +endif # showif EXPERT
> diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c
> index b05cc3d..75b7467 100644
> --- a/scripts/kconfig/menu.c
> +++ b/scripts/kconfig/menu.c
> @@ -344,7 +344,9 @@ void menu_finalize(struct menu *parent)
>  		basedep = expr_eliminate_dups(expr_transform(basedep));
>  		last_menu = NULL;
>  		for (menu = parent->next; menu; menu = menu->next) {
> -			dep = menu->prompt ? menu->prompt->visible.expr : menu->dep;
> +			dep = menu->prompt ? menu->prompt->visible.expr
> +			    : menu->visibility ? menu->visibility
> +			    : menu->dep;
>  			if (!expr_contains_symbol(dep, sym))
>  				break;
>  			if (expr_depends_symbol(dep, sym))
> diff --git a/scripts/kconfig/zconf.gperf b/scripts/kconfig/zconf.gperf
> index b6ac02d..fd602b5 100644
> --- a/scripts/kconfig/zconf.gperf
> +++ b/scripts/kconfig/zconf.gperf
> @@ -23,6 +23,7 @@ config,		T_CONFIG,	TF_COMMAND
>  menuconfig,	T_MENUCONFIG,	TF_COMMAND
>  help,		T_HELP,		TF_COMMAND
>  if,		T_IF,		TF_COMMAND|TF_PARAM
> +showif,		T_SHOWIF,	TF_COMMAND
>  endif,		T_ENDIF,	TF_COMMAND
>  depends,	T_DEPENDS,	TF_COMMAND
>  optional,	T_OPTIONAL,	TF_COMMAND
> diff --git a/scripts/kconfig/zconf.hash.c_shipped b/scripts/kconfig/zconf.hash.c_shipped
> index c77a8ef..eab7830 100644
> --- a/scripts/kconfig/zconf.hash.c_shipped
> +++ b/scripts/kconfig/zconf.hash.c_shipped
> @@ -32,7 +32,7 @@
>  struct kconf_id;
> 
>  static const struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len);
> -/* maximum key range = 71, duplicates = 0 */
> +/* maximum key range = 53, duplicates = 0 */
> 
>  #ifdef __GNUC__
>  __inline
> @@ -46,32 +46,32 @@ kconf_id_hash (register const char *str, register unsigned int len)
>  {
>    static const unsigned char asso_values[] =
>      {
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73,  5, 25, 25,
> -       0,  0,  0,  5,  0,  0, 73, 73,  5,  0,
> -      10,  5, 45, 73, 20, 20,  0, 15, 15, 73,
> -      20,  5, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
> -      73, 73, 73, 73, 73, 73
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55,  5, 15, 15,
> +       0,  0,  0,  0,  0,  0, 55, 55, 15, 15,
> +      20,  5, 35, 55,  0,  0,  0, 10, 25, 55,
> +       5,  5, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55, 55, 55, 55, 55,
> +      55, 55, 55, 55, 55, 55
>      };
>    register int hval = len;
> 
> @@ -93,72 +93,74 @@ struct kconf_id_strings_t
>      char kconf_id_strings_str2[sizeof("if")];
>      char kconf_id_strings_str3[sizeof("int")];
>      char kconf_id_strings_str5[sizeof("endif")];
> +    char kconf_id_strings_str6[sizeof("string")];
>      char kconf_id_strings_str7[sizeof("default")];
>      char kconf_id_strings_str8[sizeof("tristate")];
>      char kconf_id_strings_str9[sizeof("endchoice")];
> +    char kconf_id_strings_str11[sizeof("showif")];
>      char kconf_id_strings_str12[sizeof("def_tristate")];
> -    char kconf_id_strings_str13[sizeof("def_bool")];
> +    char kconf_id_strings_str13[sizeof("hex")];
>      char kconf_id_strings_str14[sizeof("defconfig_list")];
> -    char kconf_id_strings_str17[sizeof("on")];
> -    char kconf_id_strings_str18[sizeof("optional")];
> -    char kconf_id_strings_str21[sizeof("option")];
> -    char kconf_id_strings_str22[sizeof("endmenu")];
> -    char kconf_id_strings_str23[sizeof("mainmenu")];
> -    char kconf_id_strings_str25[sizeof("menuconfig")];
> -    char kconf_id_strings_str27[sizeof("modules")];
> -    char kconf_id_strings_str28[sizeof("allnoconfig_y")];
> -    char kconf_id_strings_str29[sizeof("menu")];
> -    char kconf_id_strings_str31[sizeof("select")];
> -    char kconf_id_strings_str32[sizeof("comment")];
> -    char kconf_id_strings_str33[sizeof("env")];
> -    char kconf_id_strings_str35[sizeof("range")];
> -    char kconf_id_strings_str36[sizeof("choice")];
> +    char kconf_id_strings_str16[sizeof("source")];
> +    char kconf_id_strings_str17[sizeof("endmenu")];
> +    char kconf_id_strings_str21[sizeof("select")];
> +    char kconf_id_strings_str22[sizeof("modules")];
> +    char kconf_id_strings_str23[sizeof("def_bool")];
> +    char kconf_id_strings_str25[sizeof("range")];
> +    char kconf_id_strings_str26[sizeof("choice")];
> +    char kconf_id_strings_str27[sizeof("on")];
> +    char kconf_id_strings_str28[sizeof("optional")];
> +    char kconf_id_strings_str31[sizeof("option")];
> +    char kconf_id_strings_str32[sizeof("visible")];
> +    char kconf_id_strings_str33[sizeof("mainmenu")];
> +    char kconf_id_strings_str37[sizeof("comment")];
> +    char kconf_id_strings_str38[sizeof("allnoconfig_y")];
>      char kconf_id_strings_str39[sizeof("bool")];
> -    char kconf_id_strings_str41[sizeof("source")];
> -    char kconf_id_strings_str42[sizeof("visible")];
> -    char kconf_id_strings_str43[sizeof("hex")];
> -    char kconf_id_strings_str46[sizeof("config")];
> +    char kconf_id_strings_str41[sizeof("config")];
> +    char kconf_id_strings_str42[sizeof("depends")];
> +    char kconf_id_strings_str45[sizeof("menuconfig")];
> +    char kconf_id_strings_str46[sizeof("prompt")];
>      char kconf_id_strings_str47[sizeof("boolean")];
> -    char kconf_id_strings_str51[sizeof("string")];
> +    char kconf_id_strings_str49[sizeof("menu")];
> +    char kconf_id_strings_str53[sizeof("env")];
>      char kconf_id_strings_str54[sizeof("help")];
> -    char kconf_id_strings_str56[sizeof("prompt")];
> -    char kconf_id_strings_str72[sizeof("depends")];
>    };
>  static const struct kconf_id_strings_t kconf_id_strings_contents =
>    {
>      "if",
>      "int",
>      "endif",
> +    "string",
>      "default",
>      "tristate",
>      "endchoice",
> +    "showif",
>      "def_tristate",
> -    "def_bool",
> +    "hex",
>      "defconfig_list",
> +    "source",
> +    "endmenu",
> +    "select",
> +    "modules",
> +    "def_bool",
> +    "range",
> +    "choice",
>      "on",
>      "optional",
>      "option",
> -    "endmenu",
> +    "visible",
>      "mainmenu",
> -    "menuconfig",
> -    "modules",
> -    "allnoconfig_y",
> -    "menu",
> -    "select",
>      "comment",
> -    "env",
> -    "range",
> -    "choice",
> +    "allnoconfig_y",
>      "bool",
> -    "source",
> -    "visible",
> -    "hex",
>      "config",
> -    "boolean",
> -    "string",
> -    "help",
> +    "depends",
> +    "menuconfig",
>      "prompt",
> -    "depends"
> +    "boolean",
> +    "menu",
> +    "env",
> +    "help"
>    };
>  #define kconf_id_strings ((const char *) &kconf_id_strings_contents)
>  #ifdef __GNUC__
> @@ -172,11 +174,11 @@ kconf_id_lookup (register const char *str, register unsigned int len)
>  {
>    enum
>      {
> -      TOTAL_KEYWORDS = 33,
> +      TOTAL_KEYWORDS = 34,
>        MIN_WORD_LENGTH = 2,
>        MAX_WORD_LENGTH = 14,
>        MIN_HASH_VALUE = 2,
> -      MAX_HASH_VALUE = 72
> +      MAX_HASH_VALUE = 54
>      };
> 
>    static const struct kconf_id wordlist[] =
> @@ -184,87 +186,83 @@ kconf_id_lookup (register const char *str, register unsigned int len)
>        {-1}, {-1},
>  #line 25 "scripts/kconfig/zconf.gperf"
>        {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2,		T_IF,		TF_COMMAND|TF_PARAM},
> -#line 36 "scripts/kconfig/zconf.gperf"
> +#line 37 "scripts/kconfig/zconf.gperf"
>        {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str3,		T_TYPE,		TF_COMMAND, S_INT},
>        {-1},
> -#line 26 "scripts/kconfig/zconf.gperf"
> +#line 27 "scripts/kconfig/zconf.gperf"
>        {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str5,		T_ENDIF,	TF_COMMAND},
> -      {-1},
> -#line 29 "scripts/kconfig/zconf.gperf"
> +#line 39 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str6,		T_TYPE,		TF_COMMAND, S_STRING},
> +#line 30 "scripts/kconfig/zconf.gperf"
>        {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7,	T_DEFAULT,	TF_COMMAND, S_UNKNOWN},
> -#line 31 "scripts/kconfig/zconf.gperf"
> +#line 32 "scripts/kconfig/zconf.gperf"
>        {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8,	T_TYPE,		TF_COMMAND, S_TRISTATE},
>  #line 20 "scripts/kconfig/zconf.gperf"
>        {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str9,	T_ENDCHOICE,	TF_COMMAND},
> -      {-1}, {-1},
> -#line 32 "scripts/kconfig/zconf.gperf"
> +      {-1},
> +#line 26 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str11,		T_SHOWIF,	TF_COMMAND},
> +#line 33 "scripts/kconfig/zconf.gperf"
>        {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12,	T_DEFAULT,	TF_COMMAND, S_TRISTATE},
> -#line 35 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN},
> -#line 45 "scripts/kconfig/zconf.gperf"
> +#line 38 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13,		T_TYPE,		TF_COMMAND, S_HEX},
> +#line 46 "scripts/kconfig/zconf.gperf"
>        {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14,	T_OPT_DEFCONFIG_LIST,TF_OPTION},
> +      {-1},
> +#line 18 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str16,		T_SOURCE,	TF_COMMAND},
> +#line 17 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17,	T_ENDMENU,	TF_COMMAND},
> +      {-1}, {-1}, {-1},
> +#line 40 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21,		T_SELECT,	TF_COMMAND},
> +#line 45 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22,	T_OPT_MODULES,	TF_OPTION},
> +#line 36 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN},
> +      {-1},
> +#line 41 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str25,		T_RANGE,	TF_COMMAND},
> +#line 19 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str26,		T_CHOICE,	TF_COMMAND},
> +#line 44 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27,		T_ON,		TF_PARAM},
> +#line 29 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28,	T_OPTIONAL,	TF_COMMAND},
>        {-1}, {-1},
>  #line 43 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17,		T_ON,		TF_PARAM},
> -#line 28 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18,	T_OPTIONAL,	TF_COMMAND},
> -      {-1}, {-1},
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31,		T_OPTION,	TF_COMMAND},
>  #line 42 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21,		T_OPTION,	TF_COMMAND},
> -#line 17 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22,	T_ENDMENU,	TF_COMMAND},
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32,	T_VISIBLE,	TF_COMMAND},
>  #line 15 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23,	T_MAINMENU,	TF_COMMAND},
> -      {-1},
> -#line 23 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str25,	T_MENUCONFIG,	TF_COMMAND},
> -      {-1},
> -#line 44 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27,	T_OPT_MODULES,	TF_OPTION},
> -#line 47 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28,	T_OPT_ALLNOCONFIG_Y,TF_OPTION},
> -#line 16 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str29,		T_MENU,		TF_COMMAND},
> -      {-1},
> -#line 39 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31,		T_SELECT,	TF_COMMAND},
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33,	T_MAINMENU,	TF_COMMAND},
> +      {-1}, {-1}, {-1},
>  #line 21 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32,	T_COMMENT,	TF_COMMAND},
> -#line 46 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33,		T_OPT_ENV,	TF_OPTION},
> -      {-1},
> -#line 40 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str35,		T_RANGE,	TF_COMMAND},
> -#line 19 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str36,		T_CHOICE,	TF_COMMAND},
> -      {-1}, {-1},
> -#line 33 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str37,	T_COMMENT,	TF_COMMAND},
> +#line 48 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str38,	T_OPT_ALLNOCONFIG_Y,TF_OPTION},
> +#line 34 "scripts/kconfig/zconf.gperf"
>        {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str39,		T_TYPE,		TF_COMMAND, S_BOOLEAN},
>        {-1},
> -#line 18 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41,		T_SOURCE,	TF_COMMAND},
> -#line 41 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str42,	T_VISIBLE,	TF_COMMAND},
> -#line 37 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str43,		T_TYPE,		TF_COMMAND, S_HEX},
> -      {-1}, {-1},
>  #line 22 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46,		T_CONFIG,	TF_COMMAND},
> -#line 34 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41,		T_CONFIG,	TF_COMMAND},
> +#line 28 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str42,	T_DEPENDS,	TF_COMMAND},
> +      {-1}, {-1},
> +#line 23 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str45,	T_MENUCONFIG,	TF_COMMAND},
> +#line 31 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46,		T_PROMPT,	TF_COMMAND},
> +#line 35 "scripts/kconfig/zconf.gperf"
>        {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str47,	T_TYPE,		TF_COMMAND, S_BOOLEAN},
> +      {-1},
> +#line 16 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str49,		T_MENU,		TF_COMMAND},
>        {-1}, {-1}, {-1},
> -#line 38 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str51,		T_TYPE,		TF_COMMAND, S_STRING},
> -      {-1}, {-1},
> +#line 47 "scripts/kconfig/zconf.gperf"
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str53,		T_OPT_ENV,	TF_OPTION},
>  #line 24 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str54,		T_HELP,		TF_COMMAND},
> -      {-1},
> -#line 30 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str56,		T_PROMPT,	TF_COMMAND},
> -      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
> -      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
> -#line 27 "scripts/kconfig/zconf.gperf"
> -      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str72,	T_DEPENDS,	TF_COMMAND}
> +      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str54,		T_HELP,		TF_COMMAND}
>      };
> 
>    if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
> @@ -285,5 +283,5 @@ kconf_id_lookup (register const char *str, register unsigned int len)
>      }
>    return 0;
>  }
> -#line 48 "scripts/kconfig/zconf.gperf"
> +#line 49 "scripts/kconfig/zconf.gperf"
> 
> diff --git a/scripts/kconfig/zconf.tab.c_shipped b/scripts/kconfig/zconf.tab.c_shipped
> index 0864c7d..c7d6ced 100644
> --- a/scripts/kconfig/zconf.tab.c_shipped
> +++ b/scripts/kconfig/zconf.tab.c_shipped
> @@ -148,27 +148,28 @@ extern int zconfdebug;
>      T_HELP = 267,
>      T_HELPTEXT = 268,
>      T_IF = 269,
> -    T_ENDIF = 270,
> -    T_DEPENDS = 271,
> -    T_OPTIONAL = 272,
> -    T_PROMPT = 273,
> -    T_TYPE = 274,
> -    T_DEFAULT = 275,
> -    T_SELECT = 276,
> -    T_RANGE = 277,
> -    T_VISIBLE = 278,
> -    T_OPTION = 279,
> -    T_ON = 280,
> -    T_WORD = 281,
> -    T_WORD_QUOTE = 282,
> -    T_UNEQUAL = 283,
> -    T_CLOSE_PAREN = 284,
> -    T_OPEN_PAREN = 285,
> -    T_EOL = 286,
> -    T_OR = 287,
> -    T_AND = 288,
> -    T_EQUAL = 289,
> -    T_NOT = 290
> +    T_SHOWIF = 270,
> +    T_ENDIF = 271,
> +    T_DEPENDS = 272,
> +    T_OPTIONAL = 273,
> +    T_PROMPT = 274,
> +    T_TYPE = 275,
> +    T_DEFAULT = 276,
> +    T_SELECT = 277,
> +    T_RANGE = 278,
> +    T_VISIBLE = 279,
> +    T_OPTION = 280,
> +    T_ON = 281,
> +    T_WORD = 282,
> +    T_WORD_QUOTE = 283,
> +    T_UNEQUAL = 284,
> +    T_CLOSE_PAREN = 285,
> +    T_OPEN_PAREN = 286,
> +    T_EOL = 287,
> +    T_OR = 288,
> +    T_AND = 289,
> +    T_EQUAL = 290,
> +    T_NOT = 291
>    };
>  #endif
> 
> @@ -447,21 +448,21 @@ union yyalloc
>  /* YYFINAL -- State number of the termination state.  */
>  #define YYFINAL  11
>  /* YYLAST -- Last index in YYTABLE.  */
> -#define YYLAST   290
> +#define YYLAST   303
> 
>  /* YYNTOKENS -- Number of terminals.  */
> -#define YYNTOKENS  36
> +#define YYNTOKENS  37
>  /* YYNNTS -- Number of nonterminals.  */
> -#define YYNNTS  50
> +#define YYNNTS  53
>  /* YYNRULES -- Number of rules.  */
> -#define YYNRULES  118
> +#define YYNRULES  122
>  /* YYNSTATES -- Number of states.  */
> -#define YYNSTATES  191
> +#define YYNSTATES  199
> 
>  /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
>     by yylex, with out-of-bounds checking.  */
>  #define YYUNDEFTOK  2
> -#define YYMAXUTOK   290
> +#define YYMAXUTOK   291
> 
>  #define YYTRANSLATE(YYX)                                                \
>    ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
> @@ -499,25 +500,26 @@ static const yytype_uint8 yytranslate[] =
>         5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
>        15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
>        25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
> -      35
> +      35,    36
>  };
> 
>  #if YYDEBUG
>    /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
>  static const yytype_uint16 yyrline[] =
>  {
> -       0,   103,   103,   103,   105,   105,   107,   109,   110,   111,
> -     112,   113,   114,   118,   122,   122,   122,   122,   122,   122,
> -     122,   122,   126,   127,   128,   129,   130,   131,   135,   136,
> -     142,   150,   156,   164,   174,   176,   177,   178,   179,   180,
> -     181,   184,   192,   198,   208,   214,   220,   223,   225,   236,
> -     237,   242,   251,   256,   264,   267,   269,   270,   271,   272,
> -     273,   276,   282,   293,   299,   309,   311,   316,   324,   332,
> -     335,   337,   338,   339,   344,   351,   358,   363,   371,   374,
> -     376,   377,   378,   381,   389,   396,   403,   409,   416,   418,
> -     419,   420,   423,   431,   433,   434,   437,   444,   446,   451,
> -     452,   455,   456,   457,   461,   462,   465,   466,   469,   470,
> -     471,   472,   473,   474,   475,   478,   479,   482,   483
> +       0,   104,   104,   104,   106,   106,   108,   110,   111,   112,
> +     113,   114,   115,   119,   123,   123,   123,   123,   123,   123,
> +     123,   123,   127,   128,   129,   130,   131,   132,   133,   137,
> +     138,   144,   152,   158,   166,   176,   178,   179,   180,   181,
> +     182,   183,   186,   194,   200,   210,   216,   222,   225,   227,
> +     238,   239,   244,   253,   258,   266,   269,   271,   272,   273,
> +     274,   275,   278,   284,   295,   301,   311,   313,   318,   326,
> +     334,   342,   350,   353,   356,   358,   359,   360,   365,   372,
> +     379,   384,   392,   395,   397,   398,   399,   402,   410,   417,
> +     424,   430,   437,   439,   440,   441,   444,   452,   454,   455,
> +     458,   465,   467,   472,   473,   476,   477,   478,   482,   483,
> +     486,   487,   490,   491,   492,   493,   494,   495,   496,   499,
> +     500,   503,   504
>  };
>  #endif
> 
> @@ -528,17 +530,18 @@ static const char *const yytname[] =
>  {
>    "$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU",
>    "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG",
> -  "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS",
> -  "T_OPTIONAL", "T_PROMPT", "T_TYPE", "T_DEFAULT", "T_SELECT", "T_RANGE",
> -  "T_VISIBLE", "T_OPTION", "T_ON", "T_WORD", "T_WORD_QUOTE", "T_UNEQUAL",
> -  "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_EOL", "T_OR", "T_AND", "T_EQUAL",
> -  "T_NOT", "$accept", "input", "start", "stmt_list", "option_name",
> -  "common_stmt", "option_error", "config_entry_start", "config_stmt",
> -  "menuconfig_entry_start", "menuconfig_stmt", "config_option_list",
> -  "config_option", "symbol_option", "symbol_option_list",
> -  "symbol_option_arg", "choice", "choice_entry", "choice_end",
> -  "choice_stmt", "choice_option_list", "choice_option", "choice_block",
> -  "if_entry", "if_end", "if_stmt", "if_block", "mainmenu_stmt", "menu",
> +  "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_SHOWIF", "T_ENDIF",
> +  "T_DEPENDS", "T_OPTIONAL", "T_PROMPT", "T_TYPE", "T_DEFAULT", "T_SELECT",
> +  "T_RANGE", "T_VISIBLE", "T_OPTION", "T_ON", "T_WORD", "T_WORD_QUOTE",
> +  "T_UNEQUAL", "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_EOL", "T_OR", "T_AND",
> +  "T_EQUAL", "T_NOT", "$accept", "input", "start", "stmt_list",
> +  "option_name", "common_stmt", "option_error", "config_entry_start",
> +  "config_stmt", "menuconfig_entry_start", "menuconfig_stmt",
> +  "config_option_list", "config_option", "symbol_option",
> +  "symbol_option_list", "symbol_option_arg", "choice", "choice_entry",
> +  "choice_end", "choice_stmt", "choice_option_list", "choice_option",
> +  "choice_block", "if_entry", "showif_entry", "if_end", "showif_end",
> +  "if_stmt", "showif_stmt", "if_block", "mainmenu_stmt", "menu",
>    "menu_entry", "menu_end", "menu_stmt", "menu_block", "source_stmt",
>    "comment", "comment_stmt", "help_start", "help", "depends_list",
>    "depends", "visibility_list", "visible", "prompt_stmt_opt", "prompt",
> @@ -554,16 +557,16 @@ static const yytype_uint16 yytoknum[] =
>         0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
>       265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
>       275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
> -     285,   286,   287,   288,   289,   290
> +     285,   286,   287,   288,   289,   290,   291
>  };
>  # endif
> 
> -#define YYPACT_NINF -90
> +#define YYPACT_NINF -105
> 
>  #define yypact_value_is_default(Yystate) \
> -  (!!((Yystate) == (-90)))
> +  (!!((Yystate) == (-105)))
> 
> -#define YYTABLE_NINF -86
> +#define YYTABLE_NINF -90
> 
>  #define yytable_value_is_error(Yytable_value) \
>    0
> @@ -572,26 +575,26 @@ static const yytype_uint16 yytoknum[] =
>       STATE-NUM.  */
>  static const yytype_int16 yypact[] =
>  {
> -       4,    42,   -90,    96,   -90,   111,   -90,    15,   -90,   -90,
> -      75,   -90,    82,    42,   104,    42,   110,   107,    42,   115,
> -     125,    -4,   121,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
> -     -90,   162,   -90,   163,   -90,   -90,   -90,   -90,   -90,   -90,
> -     -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
> -     -90,   139,   -90,   -90,   138,   -90,   142,   -90,   143,   -90,
> -     152,   -90,   164,   167,   168,   -90,   -90,    -4,    -4,    77,
> -     -18,   -90,   177,   185,    33,    71,   195,   247,   236,    -2,
> -     236,   171,   -90,   -90,   -90,   -90,   -90,   -90,    41,   -90,
> -      -4,    -4,   138,    97,    97,   -90,   -90,   186,   187,   194,
> -      42,    42,    -4,   196,    97,   -90,   219,   -90,   -90,   -90,
> -     -90,   210,   -90,   -90,   204,    42,    42,   199,   -90,   -90,
> -     -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
> -     -90,   222,   -90,   223,   -90,   -90,   -90,   -90,   -90,   -90,
> -     -90,   -90,   -90,   -90,   215,   -90,   -90,   -90,   -90,   -90,
> -      -4,   222,   228,   222,    -5,   222,    97,    35,   229,   -90,
> -     -90,   222,   232,   222,    -4,   -90,   135,   233,   -90,   -90,
> -     234,   235,   222,   240,   -90,   -90,   237,   -90,   239,   -13,
> -     -90,   -90,   -90,   -90,   244,    42,   -90,   -90,   -90,   -90,
> -     -90
> +      15,   -19,  -105,     6,  -105,   125,  -105,    29,  -105,  -105,
> +      13,  -105,    20,   -19,    22,   -19,    33,    30,   -19,    36,
> +      43,    50,    50,    48,  -105,  -105,  -105,  -105,  -105,  -105,
> +    -105,  -105,    90,  -105,    93,  -105,  -105,  -105,  -105,  -105,
> +    -105,  -105,  -105,  -105,  -105,  -105,  -105,  -105,  -105,  -105,
> +    -105,  -105,  -105,  -105,   154,  -105,  -105,    58,  -105,    63,
> +    -105,    86,  -105,    95,  -105,    96,   106,   118,  -105,  -105,
> +      50,    50,    89,   -24,    89,  -105,   121,   124,    19,    92,
> +     214,   271,   257,   257,    24,   257,   189,  -105,  -105,  -105,
> +    -105,  -105,  -105,    55,  -105,    50,    50,    58,    -6,    -6,
> +      58,  -105,  -105,   134,   135,   162,   -19,   -19,    50,   164,
> +      -6,  -105,   200,  -105,  -105,  -105,  -105,   201,  -105,  -105,
> +     170,   -19,   -19,   190,  -105,  -105,  -105,  -105,  -105,  -105,
> +    -105,  -105,  -105,  -105,  -105,  -105,  -105,  -105,  -105,   204,
> +    -105,   243,  -105,  -105,  -105,  -105,  -105,  -105,  -105,  -105,
> +    -105,  -105,   193,  -105,  -105,  -105,  -105,  -105,    50,   204,
> +     207,   204,    39,   204,    -6,    52,   223,  -105,  -105,   204,
> +     224,   204,    50,  -105,   258,   237,  -105,  -105,   242,   246,
> +     204,   248,  -105,  -105,   252,  -105,   256,    49,  -105,  -105,
> +    -105,  -105,   261,   -19,  -105,  -105,  -105,  -105,  -105
>  };
> 
>    /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
> @@ -599,46 +602,48 @@ static const yytype_int16 yypact[] =
>       means the default is an error.  */
>  static const yytype_uint8 yydefact[] =
>  {
> -       6,     0,   104,     0,     3,     0,     6,     6,    99,   100,
> -       0,     1,     0,     0,     0,     0,   117,     0,     0,     0,
> -       0,     0,     0,    14,    18,    15,    16,    20,    17,    19,
> -      21,     0,    22,     0,     7,    34,    25,    34,    26,    55,
> -      65,     8,    70,    23,    93,    79,     9,    27,    88,    24,
> -      10,     0,   105,     2,    74,    13,     0,   101,     0,   118,
> -       0,   102,     0,     0,     0,   115,   116,     0,     0,     0,
> -     108,   103,     0,     0,     0,     0,     0,     0,     0,    88,
> -       0,     0,    75,    83,    51,    84,    30,    32,     0,   112,
> -       0,     0,    67,     0,     0,    11,    12,     0,     0,     0,
> -       0,    97,     0,     0,     0,    47,     0,    40,    39,    35,
> -      36,     0,    38,    37,     0,     0,    97,     0,    59,    60,
> -      56,    58,    57,    66,    54,    53,    71,    73,    69,    72,
> -      68,   106,    95,     0,    94,    80,    82,    78,    81,    77,
> -      90,    91,    89,   111,   113,   114,   110,   109,    29,    86,
> -       0,   106,     0,   106,   106,   106,     0,     0,     0,    87,
> -      63,   106,     0,   106,     0,    96,     0,     0,    41,    98,
> -       0,     0,   106,    49,    46,    28,     0,    62,     0,   107,
> -      92,    42,    43,    44,     0,     0,    48,    61,    64,    45,
> -      50
> +       6,     0,   108,     0,     3,     0,     6,     6,   103,   104,
> +       0,     1,     0,     0,     0,     0,   121,     0,     0,     0,
> +       0,     0,     0,     0,    14,    18,    15,    16,    20,    17,
> +      19,    21,     0,    22,     0,     7,    35,    26,    35,    27,
> +      56,    66,     8,    74,    74,    23,    24,    97,    83,     9,
> +      28,    92,    25,    10,     0,   109,     2,    78,    13,     0,
> +     105,     0,   122,     0,   106,     0,     0,     0,   119,   120,
> +       0,     0,     0,   112,     0,   107,     0,     0,     0,     0,
> +       0,     0,     0,     0,    92,     0,     0,    79,    87,    52,
> +      88,    31,    33,     0,   116,     0,     0,    68,     0,     0,
> +      69,    11,    12,     0,     0,     0,     0,   101,     0,     0,
> +       0,    48,     0,    41,    40,    36,    37,     0,    39,    38,
> +       0,     0,   101,     0,    60,    61,    57,    59,    58,    67,
> +      55,    54,    75,    77,    72,    76,    70,    73,    71,   110,
> +      99,     0,    98,    84,    86,    82,    85,    81,    94,    95,
> +      93,   115,   117,   118,   114,   113,    30,    90,     0,   110,
> +       0,   110,   110,   110,     0,     0,     0,    91,    64,   110,
> +       0,   110,     0,   100,     0,     0,    42,   102,     0,     0,
> +     110,    50,    47,    29,     0,    63,     0,   111,    96,    43,
> +      44,    45,     0,     0,    49,    62,    65,    46,    51
>  };
> 
>    /* YYPGOTO[NTERM-NUM].  */
>  static const yytype_int16 yypgoto[] =
>  {
> -     -90,   -90,   269,   271,   -90,    23,   -70,   -90,   -90,   -90,
> -     -90,   243,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -48,
> -     -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
> -     -90,   -20,   -90,   -90,   -90,   -90,   -90,   206,   205,   -68,
> -     -90,   -90,   169,    -1,    27,    -7,   118,   -66,   -89,   -90
> +    -105,  -105,   287,   289,  -105,   102,   -73,  -105,  -105,  -105,
> +    -105,   259,  -105,  -105,  -105,  -105,  -105,  -105,  -105,    97,
> +    -105,  -105,  -105,  -105,  -105,  -105,  -105,  -105,  -105,   254,
> +    -105,  -105,  -105,  -105,   160,  -105,  -105,  -105,  -105,  -105,
> +     216,   215,   -70,  -105,  -105,   178,    -1,   155,    -8,  -104,
> +     -21,   -95,  -105
>  };
> 
>    /* YYDEFGOTO[NTERM-NUM].  */
>  static const yytype_int16 yydefgoto[] =
>  {
> -      -1,     3,     4,     5,    33,    34,   108,    35,    36,    37,
> -      38,    74,   109,   110,   157,   186,    39,    40,   124,    41,
> -      76,   120,    77,    42,   128,    43,    78,     6,    44,    45,
> -     137,    46,    80,    47,    48,    49,   111,   112,    81,   113,
> -      79,   134,   152,   153,    50,     7,   165,    69,    70,    60
> +      -1,     3,     4,     5,    34,    35,   114,    36,    37,    38,
> +      39,    78,   115,   116,   165,   194,    40,    41,   130,    42,
> +      80,   126,    81,    43,    44,   134,   137,    45,    46,    82,
> +       6,    47,    48,   145,    49,    85,    50,    51,    52,   117,
> +     118,    86,   119,    84,   142,   160,   161,    53,     7,   173,
> +      72,    73,    63
>  };
> 
>    /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
> @@ -646,113 +651,116 @@ static const yytype_int16 yydefgoto[] =
>       number is the opposite.  If YYTABLE_NINF, syntax error.  */
>  static const yytype_int16 yytable[] =
>  {
> -      10,    88,    89,    54,   146,   147,   119,     1,   122,   164,
> -      93,   141,    56,   142,    58,   156,    94,    62,     1,    90,
> -      91,   131,    65,    66,   144,   145,    67,    90,    91,   132,
> -     127,    68,   136,   -31,    97,     2,   154,   -31,   -31,   -31,
> -     -31,   -31,   -31,   -31,   -31,    98,    52,   -31,   -31,    99,
> -     -31,   100,   101,   102,   103,   104,   -31,   105,   129,   106,
> -     138,   173,    92,   141,   107,   142,   174,   172,     8,     9,
> -     143,   -33,    97,    90,    91,   -33,   -33,   -33,   -33,   -33,
> -     -33,   -33,   -33,    98,   166,   -33,   -33,    99,   -33,   100,
> -     101,   102,   103,   104,   -33,   105,    11,   106,   179,   151,
> -     123,   126,   107,   135,   125,   130,     2,   139,     2,    90,
> -      91,    -5,    12,    55,   161,    13,    14,    15,    16,    17,
> -      18,    19,    20,    65,    66,    21,    22,    23,    24,    25,
> -      26,    27,    28,    29,    30,    57,    59,    31,    61,    -4,
> -      12,    63,    32,    13,    14,    15,    16,    17,    18,    19,
> -      20,    64,    71,    21,    22,    23,    24,    25,    26,    27,
> -      28,    29,    30,    72,    73,    31,   180,    90,    91,    52,
> -      32,   -85,    97,    82,    83,   -85,   -85,   -85,   -85,   -85,
> -     -85,   -85,   -85,    84,   190,   -85,   -85,    99,   -85,   -85,
> -     -85,   -85,   -85,   -85,   -85,    85,    97,   106,    86,    87,
> -     -52,   -52,   140,   -52,   -52,   -52,   -52,    98,    95,   -52,
> -     -52,    99,   114,   115,   116,   117,    96,   148,   149,   150,
> -     158,   106,   155,   159,    97,   163,   118,   -76,   -76,   -76,
> -     -76,   -76,   -76,   -76,   -76,   160,   164,   -76,   -76,    99,
> -      13,    14,    15,    16,    17,    18,    19,    20,    91,   106,
> -      21,    22,    14,    15,   140,    17,    18,    19,    20,   168,
> -     175,    21,    22,   177,   181,   182,   183,    32,   187,   167,
> -     188,   169,   170,   171,   185,   189,    53,    51,    32,   176,
> -      75,   178,   121,     0,   133,   162,     0,     0,     0,     0,
> -     184
> +      10,    74,    57,   154,   155,    98,    11,   125,     8,     9,
> +     128,    99,    59,   149,    61,   164,   150,    65,     1,   -32,
> +     103,    68,    69,   -32,   -32,   -32,   -32,   -32,   -32,   -32,
> +     -32,   104,     1,   -32,   -32,   -32,   105,   -32,   106,   107,
> +     108,   109,   110,   -32,   111,     2,   112,     2,   139,    93,
> +      94,   113,    58,   172,    60,   175,   140,   177,   178,   179,
> +      62,    55,    64,    66,    97,   184,   100,   186,   149,   180,
> +      67,   150,    95,    96,   152,   153,   192,    68,    69,   181,
> +      75,    70,    95,    96,   182,   151,    71,   162,    95,    96,
> +      55,    76,   -34,   103,    77,    87,   -34,   -34,   -34,   -34,
> +     -34,   -34,   -34,   -34,   104,   159,   -34,   -34,   -34,   105,
> +     -34,   106,   107,   108,   109,   110,   -34,   111,    88,   112,
> +     169,     2,    95,    96,   113,    -5,    12,    89,    90,    13,
> +      14,    15,    16,    17,    18,    19,    20,   174,    91,    21,
> +      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
> +      92,   187,    32,   101,    -4,    12,   102,    33,    13,    14,
> +      15,    16,    17,    18,    19,    20,   156,   157,    21,    22,
> +      23,    24,    25,    26,    27,    28,    29,    30,    31,   133,
> +     133,    32,   144,   129,   132,   132,    33,   143,   158,   -89,
> +     103,   163,   198,   -89,   -89,   -89,   -89,   -89,   -89,   -89,
> +     -89,   166,   168,   -89,   -89,   -89,   105,   -89,   -89,   -89,
> +     -89,   -89,   -89,   -89,   167,   103,   112,   171,   172,   -53,
> +     -53,   148,   -53,   -53,   -53,   -53,   104,    96,   -53,   -53,
> +     -53,   105,   120,   121,   122,   123,   131,   136,   138,   176,
> +     147,   112,   135,   135,   103,   146,   124,   -80,   -80,   -80,
> +     -80,   -80,   -80,   -80,   -80,   183,   185,   -80,   -80,   -80,
> +     105,    13,    14,    15,    16,    17,    18,    19,    20,   189,
> +     112,    21,    22,    23,   190,   148,    14,    15,   191,    17,
> +      18,    19,    20,   193,   195,    21,    22,    23,   196,    33,
> +     188,    95,    96,   197,    56,    54,   127,    79,    83,   141,
> +     170,     0,     0,    33
>  };
> 
>  static const yytype_int16 yycheck[] =
>  {
> -       1,    67,    68,    10,    93,    94,    76,     3,    76,    14,
> -      28,    81,    13,    81,    15,   104,    34,    18,     3,    32,
> -      33,    23,    26,    27,    90,    91,    30,    32,    33,    31,
> -      78,    35,    80,     0,     1,    31,   102,     4,     5,     6,
> -       7,     8,     9,    10,    11,    12,    31,    14,    15,    16,
> -      17,    18,    19,    20,    21,    22,    23,    24,    78,    26,
> -      80,    26,    69,   133,    31,   133,    31,   156,    26,    27,
> -      29,     0,     1,    32,    33,     4,     5,     6,     7,     8,
> -       9,    10,    11,    12,   150,    14,    15,    16,    17,    18,
> -      19,    20,    21,    22,    23,    24,     0,    26,   164,   100,
> -      77,    78,    31,    80,    77,    78,    31,    80,    31,    32,
> -      33,     0,     1,    31,   115,     4,     5,     6,     7,     8,
> -       9,    10,    11,    26,    27,    14,    15,    16,    17,    18,
> -      19,    20,    21,    22,    23,    31,    26,    26,    31,     0,
> -       1,    26,    31,     4,     5,     6,     7,     8,     9,    10,
> -      11,    26,    31,    14,    15,    16,    17,    18,    19,    20,
> -      21,    22,    23,     1,     1,    26,    31,    32,    33,    31,
> -      31,     0,     1,    31,    31,     4,     5,     6,     7,     8,
> -       9,    10,    11,    31,   185,    14,    15,    16,    17,    18,
> -      19,    20,    21,    22,    23,    31,     1,    26,    31,    31,
> -       5,     6,    31,     8,     9,    10,    11,    12,    31,    14,
> -      15,    16,    17,    18,    19,    20,    31,    31,    31,    25,
> -       1,    26,    26,    13,     1,    26,    31,     4,     5,     6,
> -       7,     8,     9,    10,    11,    31,    14,    14,    15,    16,
> -       4,     5,     6,     7,     8,     9,    10,    11,    33,    26,
> -      14,    15,     5,     6,    31,     8,     9,    10,    11,    31,
> -      31,    14,    15,    31,    31,    31,    31,    31,    31,   151,
> -      31,   153,   154,   155,    34,    31,     7,     6,    31,   161,
> -      37,   163,    76,    -1,    79,   116,    -1,    -1,    -1,    -1,
> -     172
> +       1,    22,    10,    98,    99,    29,     0,    80,    27,    28,
> +      80,    35,    13,    86,    15,   110,    86,    18,     3,     0,
> +       1,    27,    28,     4,     5,     6,     7,     8,     9,    10,
> +      11,    12,     3,    14,    15,    16,    17,    18,    19,    20,
> +      21,    22,    23,    24,    25,    32,    27,    32,    24,    70,
> +      71,    32,    32,    14,    32,   159,    32,   161,   162,   163,
> +      27,    32,    32,    27,    72,   169,    74,   171,   141,   164,
> +      27,   141,    33,    34,    95,    96,   180,    27,    28,    27,
> +      32,    31,    33,    34,    32,    30,    36,   108,    33,    34,
> +      32,     1,     0,     1,     1,    32,     4,     5,     6,     7,
> +       8,     9,    10,    11,    12,   106,    14,    15,    16,    17,
> +      18,    19,    20,    21,    22,    23,    24,    25,    32,    27,
> +     121,    32,    33,    34,    32,     0,     1,    32,    32,     4,
> +       5,     6,     7,     8,     9,    10,    11,   158,    32,    14,
> +      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
> +      32,   172,    27,    32,     0,     1,    32,    32,     4,     5,
> +       6,     7,     8,     9,    10,    11,    32,    32,    14,    15,
> +      16,    17,    18,    19,    20,    21,    22,    23,    24,    82,
> +      83,    27,    85,    81,    82,    83,    32,    85,    26,     0,
> +       1,    27,   193,     4,     5,     6,     7,     8,     9,    10,
> +      11,     1,    32,    14,    15,    16,    17,    18,    19,    20,
> +      21,    22,    23,    24,    13,     1,    27,    27,    14,     5,
> +       6,    32,     8,     9,    10,    11,    12,    34,    14,    15,
> +      16,    17,    18,    19,    20,    21,    81,    82,    83,    32,
> +      85,    27,    82,    83,     1,    85,    32,     4,     5,     6,
> +       7,     8,     9,    10,    11,    32,    32,    14,    15,    16,
> +      17,     4,     5,     6,     7,     8,     9,    10,    11,    32,
> +      27,    14,    15,    16,    32,    32,     5,     6,    32,     8,
> +       9,    10,    11,    35,    32,    14,    15,    16,    32,    32,
> +      32,    33,    34,    32,     7,     6,    80,    38,    44,    84,
> +     122,    -1,    -1,    32
>  };
> 
>    /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
>       symbol of state STATE-NUM.  */
>  static const yytype_uint8 yystos[] =
>  {
> -       0,     3,    31,    37,    38,    39,    63,    81,    26,    27,
> -      79,     0,     1,     4,     5,     6,     7,     8,     9,    10,
> +       0,     3,    32,    38,    39,    40,    67,    85,    27,    28,
> +      83,     0,     1,     4,     5,     6,     7,     8,     9,    10,
>        11,    14,    15,    16,    17,    18,    19,    20,    21,    22,
> -      23,    26,    31,    40,    41,    43,    44,    45,    46,    52,
> -      53,    55,    59,    61,    64,    65,    67,    69,    70,    71,
> -      80,    39,    31,    38,    81,    31,    79,    31,    79,    26,
> -      85,    31,    79,    26,    26,    26,    27,    30,    35,    83,
> -      84,    31,     1,     1,    47,    47,    56,    58,    62,    76,
> -      68,    74,    31,    31,    31,    31,    31,    31,    83,    83,
> -      32,    33,    81,    28,    34,    31,    31,     1,    12,    16,
> -      18,    19,    20,    21,    22,    24,    26,    31,    42,    48,
> -      49,    72,    73,    75,    17,    18,    19,    20,    31,    42,
> -      57,    73,    75,    41,    54,    80,    41,    55,    60,    67,
> -      80,    23,    31,    74,    77,    41,    55,    66,    67,    80,
> -      31,    42,    75,    29,    83,    83,    84,    84,    31,    31,
> -      25,    79,    78,    79,    83,    26,    84,    50,     1,    13,
> -      31,    79,    78,    26,    14,    82,    83,    82,    31,    82,
> -      82,    82,    84,    26,    31,    31,    82,    31,    82,    83,
> -      31,    31,    31,    31,    82,    34,    51,    31,    31,    31,
> -      79
> +      23,    24,    27,    32,    41,    42,    44,    45,    46,    47,
> +      53,    54,    56,    60,    61,    64,    65,    68,    69,    71,
> +      73,    74,    75,    84,    40,    32,    39,    85,    32,    83,
> +      32,    83,    27,    89,    32,    83,    27,    27,    27,    28,
> +      31,    36,    87,    88,    87,    32,     1,     1,    48,    48,
> +      57,    59,    66,    66,    80,    72,    78,    32,    32,    32,
> +      32,    32,    32,    87,    87,    33,    34,    85,    29,    35,
> +      85,    32,    32,     1,    12,    17,    19,    20,    21,    22,
> +      23,    25,    27,    32,    43,    49,    50,    76,    77,    79,
> +      18,    19,    20,    21,    32,    43,    58,    77,    79,    42,
> +      55,    84,    42,    56,    62,    71,    84,    63,    84,    24,
> +      32,    78,    81,    42,    56,    70,    71,    84,    32,    43,
> +      79,    30,    87,    87,    88,    88,    32,    32,    26,    83,
> +      82,    83,    87,    27,    88,    51,     1,    13,    32,    83,
> +      82,    27,    14,    86,    87,    86,    32,    86,    86,    86,
> +      88,    27,    32,    32,    86,    32,    86,    87,    32,    32,
> +      32,    32,    86,    35,    52,    32,    32,    32,    83
>  };
> 
>    /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
>  static const yytype_uint8 yyr1[] =
>  {
> -       0,    36,    37,    37,    38,    38,    39,    39,    39,    39,
> -      39,    39,    39,    39,    40,    40,    40,    40,    40,    40,
> -      40,    40,    41,    41,    41,    41,    41,    41,    42,    42,
> -      43,    44,    45,    46,    47,    47,    47,    47,    47,    47,
> -      47,    48,    48,    48,    48,    48,    49,    50,    50,    51,
> -      51,    52,    53,    54,    55,    56,    56,    56,    56,    56,
> -      56,    57,    57,    57,    57,    58,    58,    59,    60,    61,
> -      62,    62,    62,    62,    63,    64,    65,    66,    67,    68,
> -      68,    68,    68,    69,    70,    71,    72,    73,    74,    74,
> -      74,    74,    75,    76,    76,    76,    77,    78,    78,    79,
> -      79,    80,    80,    80,    81,    81,    82,    82,    83,    83,
> -      83,    83,    83,    83,    83,    84,    84,    85,    85
> +       0,    37,    38,    38,    39,    39,    40,    40,    40,    40,
> +      40,    40,    40,    40,    41,    41,    41,    41,    41,    41,
> +      41,    41,    42,    42,    42,    42,    42,    42,    42,    43,
> +      43,    44,    45,    46,    47,    48,    48,    48,    48,    48,
> +      48,    48,    49,    49,    49,    49,    49,    50,    51,    51,
> +      52,    52,    53,    54,    55,    56,    57,    57,    57,    57,
> +      57,    57,    58,    58,    58,    58,    59,    59,    60,    61,
> +      62,    63,    64,    65,    66,    66,    66,    66,    67,    68,
> +      69,    70,    71,    72,    72,    72,    72,    73,    74,    75,
> +      76,    77,    78,    78,    78,    78,    79,    80,    80,    80,
> +      81,    82,    82,    83,    83,    84,    84,    84,    85,    85,
> +      86,    86,    87,    87,    87,    87,    87,    87,    87,    88,
> +      88,    89,    89
>  };
> 
>    /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
> @@ -760,16 +768,17 @@ static const yytype_uint8 yyr2[] =
>  {
>         0,     2,     2,     1,     2,     1,     0,     2,     2,     2,
>         2,     4,     4,     3,     1,     1,     1,     1,     1,     1,
> -       1,     1,     1,     1,     1,     1,     1,     1,     3,     2,
> -       3,     2,     3,     2,     0,     2,     2,     2,     2,     2,
> -       2,     3,     4,     4,     4,     5,     3,     0,     3,     0,
> -       2,     3,     2,     1,     3,     0,     2,     2,     2,     2,
> -       2,     4,     3,     2,     4,     0,     2,     3,     1,     3,
> -       0,     2,     2,     2,     3,     3,     3,     1,     3,     0,
> -       2,     2,     2,     3,     3,     2,     2,     2,     0,     2,
> -       2,     2,     4,     0,     2,     2,     2,     0,     2,     1,
> -       1,     2,     2,     2,     1,     2,     0,     2,     1,     3,
> -       3,     3,     2,     3,     3,     1,     1,     0,     1
> +       1,     1,     1,     1,     1,     1,     1,     1,     1,     3,
> +       2,     3,     2,     3,     2,     0,     2,     2,     2,     2,
> +       2,     2,     3,     4,     4,     4,     5,     3,     0,     3,
> +       0,     2,     3,     2,     1,     3,     0,     2,     2,     2,
> +       2,     2,     4,     3,     2,     4,     0,     2,     3,     3,
> +       1,     1,     3,     3,     0,     2,     2,     2,     3,     3,
> +       3,     1,     3,     0,     2,     2,     2,     3,     3,     2,
> +       2,     2,     0,     2,     2,     2,     4,     0,     2,     2,
> +       2,     0,     2,     1,     1,     2,     2,     2,     1,     2,
> +       0,     2,     1,     3,     3,     3,     2,     3,     3,     1,
> +       1,     0,     1
>  };
> 
> 
> @@ -1192,7 +1201,18 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
>    YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
>    switch (yytype)
>      {
> -          case 53: /* choice_entry  */
> +          case 54: /* choice_entry  */
> +
> +      {
> +	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
> +		((*yyvaluep).menu)->file->name, ((*yyvaluep).menu)->lineno);
> +	if (current_menu == ((*yyvaluep).menu))
> +		menu_end_menu();
> +}
> +
> +        break;
> +
> +    case 60: /* if_entry  */
> 
>        {
>  	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
> @@ -1203,7 +1223,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
> 
>          break;
> 
> -    case 59: /* if_entry  */
> +    case 61: /* showif_entry  */
> 
>        {
>  	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
> @@ -1214,7 +1234,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
> 
>          break;
> 
> -    case 65: /* menu_entry  */
> +    case 69: /* menu_entry  */
> 
>        {
>  	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
> @@ -1509,19 +1529,19 @@ yyreduce:
> 
>      break;
> 
> -  case 28:
> +  case 29:
> 
>      { zconf_error("unknown option \"%s\"", (yyvsp[-2].string)); }
> 
>      break;
> 
> -  case 29:
> +  case 30:
> 
>      { zconf_error("invalid option"); }
> 
>      break;
> 
> -  case 30:
> +  case 31:
> 
>      {
>  	struct symbol *sym = sym_lookup((yyvsp[-1].string), 0);
> @@ -1532,7 +1552,7 @@ yyreduce:
> 
>      break;
> 
> -  case 31:
> +  case 32:
> 
>      {
>  	menu_end_entry();
> @@ -1541,7 +1561,7 @@ yyreduce:
> 
>      break;
> 
> -  case 32:
> +  case 33:
> 
>      {
>  	struct symbol *sym = sym_lookup((yyvsp[-1].string), 0);
> @@ -1552,7 +1572,7 @@ yyreduce:
> 
>      break;
> 
> -  case 33:
> +  case 34:
> 
>      {
>  	if (current_entry->prompt)
> @@ -1565,7 +1585,7 @@ yyreduce:
> 
>      break;
> 
> -  case 41:
> +  case 42:
> 
>      {
>  	menu_set_type((yyvsp[-2].id)->stype);
> @@ -1576,7 +1596,7 @@ yyreduce:
> 
>      break;
> 
> -  case 42:
> +  case 43:
> 
>      {
>  	menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr));
> @@ -1585,7 +1605,7 @@ yyreduce:
> 
>      break;
> 
> -  case 43:
> +  case 44:
> 
>      {
>  	menu_add_expr(P_DEFAULT, (yyvsp[-2].expr), (yyvsp[-1].expr));
> @@ -1598,7 +1618,7 @@ yyreduce:
> 
>      break;
> 
> -  case 44:
> +  case 45:
> 
>      {
>  	menu_add_symbol(P_SELECT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr));
> @@ -1607,7 +1627,7 @@ yyreduce:
> 
>      break;
> 
> -  case 45:
> +  case 46:
> 
>      {
>  	menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,(yyvsp[-3].symbol), (yyvsp[-2].symbol)), (yyvsp[-1].expr));
> @@ -1616,7 +1636,7 @@ yyreduce:
> 
>      break;
> 
> -  case 48:
> +  case 49:
> 
>      {
>  	const struct kconf_id *id = kconf_id_lookup((yyvsp[-1].string), strlen((yyvsp[-1].string)));
> @@ -1629,19 +1649,19 @@ yyreduce:
> 
>      break;
> 
> -  case 49:
> +  case 50:
> 
>      { (yyval.string) = NULL; }
> 
>      break;
> 
> -  case 50:
> +  case 51:
> 
>      { (yyval.string) = (yyvsp[0].string); }
> 
>      break;
> 
> -  case 51:
> +  case 52:
> 
>      {
>  	struct symbol *sym = sym_lookup((yyvsp[-1].string), SYMBOL_CHOICE);
> @@ -1653,7 +1673,7 @@ yyreduce:
> 
>      break;
> 
> -  case 52:
> +  case 53:
> 
>      {
>  	(yyval.menu) = menu_add_menu();
> @@ -1661,7 +1681,7 @@ yyreduce:
> 
>      break;
> 
> -  case 53:
> +  case 54:
> 
>      {
>  	if (zconf_endtoken((yyvsp[0].id), T_CHOICE, T_ENDCHOICE)) {
> @@ -1672,7 +1692,7 @@ yyreduce:
> 
>      break;
> 
> -  case 61:
> +  case 62:
> 
>      {
>  	menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr));
> @@ -1681,7 +1701,7 @@ yyreduce:
> 
>      break;
> 
> -  case 62:
> +  case 63:
> 
>      {
>  	if ((yyvsp[-2].id)->stype == S_BOOLEAN || (yyvsp[-2].id)->stype == S_TRISTATE) {
> @@ -1695,7 +1715,7 @@ yyreduce:
> 
>      break;
> 
> -  case 63:
> +  case 64:
> 
>      {
>  	current_entry->sym->flags |= SYMBOL_OPTIONAL;
> @@ -1704,7 +1724,7 @@ yyreduce:
> 
>      break;
> 
> -  case 64:
> +  case 65:
> 
>      {
>  	if ((yyvsp[-3].id)->stype == S_UNKNOWN) {
> @@ -1717,7 +1737,7 @@ yyreduce:
> 
>      break;
> 
> -  case 67:
> +  case 68:
> 
>      {
>  	printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
> @@ -1728,7 +1748,18 @@ yyreduce:
> 
>      break;
> 
> -  case 68:
> +  case 69:
> +
> +    {
> +	printd(DEBUG_PARSE, "%s:%d:showif\n", zconf_curname(), zconf_lineno());
> +	menu_add_entry(NULL);
> +	menu_add_visibility((yyvsp[-1].expr));
> +	(yyval.menu) = menu_add_menu();
> +}
> +
> +    break;
> +
> +  case 70:
> 
>      {
>  	if (zconf_endtoken((yyvsp[0].id), T_IF, T_ENDIF)) {
> @@ -1739,7 +1770,18 @@ yyreduce:
> 
>      break;
> 
> -  case 74:
> +  case 71:
> +
> +    {
> +	if (zconf_endtoken((yyvsp[0].id), T_SHOWIF, T_ENDIF)) {
> +		menu_end_menu();
> +		printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
> +	}
> +}
> +
> +    break;
> +
> +  case 78:
> 
>      {
>  	menu_add_prompt(P_MENU, (yyvsp[-1].string), NULL);
> @@ -1747,7 +1789,7 @@ yyreduce:
> 
>      break;
> 
> -  case 75:
> +  case 79:
> 
>      {
>  	menu_add_entry(NULL);
> @@ -1757,7 +1799,7 @@ yyreduce:
> 
>      break;
> 
> -  case 76:
> +  case 80:
> 
>      {
>  	(yyval.menu) = menu_add_menu();
> @@ -1765,7 +1807,7 @@ yyreduce:
> 
>      break;
> 
> -  case 77:
> +  case 81:
> 
>      {
>  	if (zconf_endtoken((yyvsp[0].id), T_MENU, T_ENDMENU)) {
> @@ -1776,7 +1818,7 @@ yyreduce:
> 
>      break;
> 
> -  case 83:
> +  case 87:
> 
>      {
>  	printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string));
> @@ -1785,7 +1827,7 @@ yyreduce:
> 
>      break;
> 
> -  case 84:
> +  case 88:
> 
>      {
>  	menu_add_entry(NULL);
> @@ -1795,7 +1837,7 @@ yyreduce:
> 
>      break;
> 
> -  case 85:
> +  case 89:
> 
>      {
>  	menu_end_entry();
> @@ -1803,7 +1845,7 @@ yyreduce:
> 
>      break;
> 
> -  case 86:
> +  case 90:
> 
>      {
>  	printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
> @@ -1812,7 +1854,7 @@ yyreduce:
> 
>      break;
> 
> -  case 87:
> +  case 91:
> 
>      {
>  	current_entry->help = (yyvsp[0].string);
> @@ -1820,7 +1862,7 @@ yyreduce:
> 
>      break;
> 
> -  case 92:
> +  case 96:
> 
>      {
>  	menu_add_dep((yyvsp[-1].expr));
> @@ -1829,7 +1871,7 @@ yyreduce:
> 
>      break;
> 
> -  case 96:
> +  case 100:
> 
>      {
>  	menu_add_visibility((yyvsp[0].expr));
> @@ -1837,7 +1879,7 @@ yyreduce:
> 
>      break;
> 
> -  case 98:
> +  case 102:
> 
>      {
>  	menu_add_prompt(P_PROMPT, (yyvsp[-1].string), (yyvsp[0].expr));
> @@ -1845,91 +1887,91 @@ yyreduce:
> 
>      break;
> 
> -  case 101:
> +  case 105:
> 
>      { (yyval.id) = (yyvsp[-1].id); }
> 
>      break;
> 
> -  case 102:
> +  case 106:
> 
>      { (yyval.id) = (yyvsp[-1].id); }
> 
>      break;
> 
> -  case 103:
> +  case 107:
> 
>      { (yyval.id) = (yyvsp[-1].id); }
> 
>      break;
> 
> -  case 106:
> +  case 110:
> 
>      { (yyval.expr) = NULL; }
> 
>      break;
> 
> -  case 107:
> +  case 111:
> 
>      { (yyval.expr) = (yyvsp[0].expr); }
> 
>      break;
> 
> -  case 108:
> +  case 112:
> 
>      { (yyval.expr) = expr_alloc_symbol((yyvsp[0].symbol)); }
> 
>      break;
> 
> -  case 109:
> +  case 113:
> 
>      { (yyval.expr) = expr_alloc_comp(E_EQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); }
> 
>      break;
> 
> -  case 110:
> +  case 114:
> 
>      { (yyval.expr) = expr_alloc_comp(E_UNEQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); }
> 
>      break;
> 
> -  case 111:
> +  case 115:
> 
>      { (yyval.expr) = (yyvsp[-1].expr); }
> 
>      break;
> 
> -  case 112:
> +  case 116:
> 
>      { (yyval.expr) = expr_alloc_one(E_NOT, (yyvsp[0].expr)); }
> 
>      break;
> 
> -  case 113:
> +  case 117:
> 
>      { (yyval.expr) = expr_alloc_two(E_OR, (yyvsp[-2].expr), (yyvsp[0].expr)); }
> 
>      break;
> 
> -  case 114:
> +  case 118:
> 
>      { (yyval.expr) = expr_alloc_two(E_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); }
> 
>      break;
> 
> -  case 115:
> +  case 119:
> 
>      { (yyval.symbol) = sym_lookup((yyvsp[0].string), 0); free((yyvsp[0].string)); }
> 
>      break;
> 
> -  case 116:
> +  case 120:
> 
>      { (yyval.symbol) = sym_lookup((yyvsp[0].string), SYMBOL_CONST); free((yyvsp[0].string)); }
> 
>      break;
> 
> -  case 117:
> +  case 121:
> 
>      { (yyval.string) = NULL; }
> 
> @@ -2207,6 +2249,7 @@ static const char *zconf_tokenname(int token)
>  	case T_CHOICE:		return "choice";
>  	case T_ENDCHOICE:	return "endchoice";
>  	case T_IF:		return "if";
> +	case T_SHOWIF:		return "showif";
>  	case T_ENDIF:		return "endif";
>  	case T_DEPENDS:		return "depends";
>  	case T_VISIBLE:		return "visible";
> diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y
> index 0f683cf..bb314bd 100644
> --- a/scripts/kconfig/zconf.y
> +++ b/scripts/kconfig/zconf.y
> @@ -31,7 +31,7 @@ struct symbol *symbol_hash[SYMBOL_HASHSIZE];
>  static struct menu *current_menu, *current_entry;
> 
>  %}
> -%expect 30
> +%expect 31
> 
>  %union
>  {
> @@ -55,6 +55,7 @@ static struct menu *current_menu, *current_entry;
>  %token <id>T_HELP
>  %token <string> T_HELPTEXT
>  %token <id>T_IF
> +%token <id>T_SHOWIF
>  %token <id>T_ENDIF
>  %token <id>T_DEPENDS
>  %token <id>T_OPTIONAL
> @@ -84,7 +85,7 @@ static struct menu *current_menu, *current_entry;
>  %type <expr> if_expr
>  %type <id> end
>  %type <id> option_name
> -%type <menu> if_entry menu_entry choice_entry
> +%type <menu> if_entry showif_entry menu_entry choice_entry
>  %type <string> symbol_option_arg word_opt
> 
>  %destructor {
> @@ -92,7 +93,7 @@ static struct menu *current_menu, *current_entry;
>  		$$->file->name, $$->lineno);
>  	if (current_menu == $$)
>  		menu_end_menu();
> -} if_entry menu_entry choice_entry
> +} if_entry showif_entry menu_entry choice_entry
> 
>  %{
>  /* Include zconf.hash.c here so it can see the token constants. */
> @@ -125,6 +126,7 @@ option_name:
>  common_stmt:
>  	  T_EOL
>  	| if_stmt
> +	| showif_stmt
>  	| comment_stmt
>  	| config_stmt
>  	| menuconfig_stmt
> @@ -321,6 +323,14 @@ if_entry: T_IF expr nl
>  	$$ = menu_add_menu();
>  };
> 
> +showif_entry: T_SHOWIF expr nl
> +{
> +	printd(DEBUG_PARSE, "%s:%d:showif\n", zconf_curname(), zconf_lineno());
> +	menu_add_entry(NULL);
> +	menu_add_visibility($2);
> +	$$ = menu_add_menu();
> +};
> +
>  if_end: end
>  {
>  	if (zconf_endtoken($1, T_IF, T_ENDIF)) {
> @@ -329,9 +339,20 @@ if_end: end
>  	}
>  };
> 
> +showif_end: end
> +{
> +	if (zconf_endtoken($1, T_SHOWIF, T_ENDIF)) {
> +		menu_end_menu();
> +		printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
> +	}
> +};
> +
>  if_stmt: if_entry if_block if_end
>  ;
> 
> +showif_stmt: showif_entry if_block showif_end
> +;
> +
>  if_block:
>  	  /* empty */
>  	| if_block common_stmt
> @@ -524,6 +545,7 @@ static const char *zconf_tokenname(int token)
>  	case T_CHOICE:		return "choice";
>  	case T_ENDCHOICE:	return "endchoice";
>  	case T_IF:		return "if";
> +	case T_SHOWIF:		return "showif";
>  	case T_ENDIF:		return "endif";
>  	case T_DEPENDS:		return "depends";
>  	case T_VISIBLE:		return "visible";
> -- 
> 2.1.4
> 


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/4] init/Kconfig: Fix break in middle of EXPERT menu
  2015-05-14 11:04 ` [PATCH 1/4] init/Kconfig: Fix break in middle of EXPERT menu Paul Bolle
@ 2015-05-14 15:37   ` josh
  0 siblings, 0 replies; 7+ messages in thread
From: josh @ 2015-05-14 15:37 UTC (permalink / raw)
  To: Paul Bolle
  Cc: Michal Marek, linux-kbuild, Ingo Molnar, Andrew Morton,
	Paul E. McKenney, Michal Hocko, Vladimir Davydov,
	Johannes Weiner, Geert Uytterhoeven, Andy Lutomirski,
	Bertrand Jacquin, Luis R. Rodriguez, Iulia Manda, Pranith Kumar,
	Clark Williams, Mel Gorman, Randy Dunlap, linux-kernel

On Thu, May 14, 2015 at 01:04:06PM +0200, Paul Bolle wrote:
> [Adding Michal and linux-kbuild.]
> 
> Hi Josh,
> 
> Could you please resend this series to include Michal and linux-kbuild?
> Don't bother to include Yann. (I almost forwarded the entire series but
> that looked impractical for patches.)

Done.

> Please split 4/4 into two patches, while you're at it. Ie, 5/5 for
> init/Kconfig.expert only, and 4/5 for the changes to scripts/kconfig/.

Done, though I managed to forget to mark it as v2, sorry.  That split
and Paul's ack are the only changes in v2.

- Josh Triplett

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2015-05-14 15:37 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-05-13 23:37 [PATCH 1/4] init/Kconfig: Fix break in middle of EXPERT menu Josh Triplett
2015-05-13 23:37 ` [PATCH 2/4] init/Kconfig: Split expert menu into a separate file, init/Kconfig.expert Josh Triplett
2015-05-13 23:38 ` [PATCH 3/4] kconfig: Regenerate parser with current Bison prior to making changes Josh Triplett
2015-05-13 23:38 ` [PATCH 4/4] kconfig: Introduce "showif" to factor out conditions on visibility Josh Triplett
2015-05-14 12:30   ` Paul E. McKenney
2015-05-14 11:04 ` [PATCH 1/4] init/Kconfig: Fix break in middle of EXPERT menu Paul Bolle
2015-05-14 15:37   ` josh

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.