Any logical expression can be expressed by repeatedly using logical and,
logical or and logical not. But sometimes expressions may look nicer if
common keywords can be factored out, instead of repeating them.
Introduce support for factoring expressions using parenthesis.
For optional config keywords, space means logical and. "|" means logical
or and has precedence over logical and. "!" means invert the following
keyword. Anything enclosed within parenthesis is parsed like a single
keyword.
While at it convert some integers to booleans.
Before example:
dev/foo/foo.c optional a d | b d | c d
After example:
dev/foo/foo.c optional ( a | b | c ) d
MFC after: 1 week
Sponsored by: NVIDIA Networking