Current-Users archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: A couple of config(1) questions
paul%vps1.whooppee.com@localhost (Paul Goyette) writes:
>The man page for config(9) says the syntax for including source files is
> file pathname [attributes [flags]] [rule]
>It doesn't actually describe the syntax for [rule] but examples seem to
>indicate that we can do at least rudimentary boolean expressions, ie
> x & y
> x | y | z
> x & !w
>Just how complex can these expressions be? For example, can I use
> (a | b) & (x | y | z)
>with parentheses?
config uses a yacc grammar (src/usr.bin/config/gram.y):
define_file:
XFILE filename fopts fflags rule { addfile($2, $3, $4, $5); }
/* filename. */
filename:
QSTRING { $$ = $1; }
| PATHNAME { $$ = $1; }
;
/* file options: optional expression of conditions */
fopts:
/* empty */ { $$ = NULL; }
| condexpr { $$ = $1; }
;
/* zero or more flags for a file */
fflags:
/* empty */ { $$ = 0; }
| fflags fflag { $$ = $1 | $2; }
;
/* one flag for a file */
fflag:
NEEDS_COUNT { $$ = FI_NEEDSCOUNT; }
| NEEDS_FLAG { $$ = FI_NEEDSFLAG; }
;
/* extra compile directive for a source file */
rule:
/* empty */ { $$ = NULL; }
| COMPILE_WITH stringvalue { $$ = $2; }
;
So it's the options that can be an expression. [rule] is
the keyword 'compile-with' followed by a string holding
a compiler command that is used in the generated Makefile.
Without a rule, config generates the rule ${NORMAL_<upper-case-suffix>}
I.e. ${NORMAL_C} for a C file. That variable is defined in
sys/conf/Makefile.kern.inc.
The condexpr used for fopts can handle the operators |,& and
! (or,and,not) and allows parenthesis, i.e. (a | b) & (x | y | z)
works fine. But the parser does not handle negations of sub-expressions
like !( a | b ).
/* expression of conditions */
condexpr:
cond_or_expr
;
cond_or_expr:
cond_and_expr
| cond_or_expr '|' cond_and_expr { $$ = MKF2(cx, or, $1, $3); }
;
cond_and_expr:
cond_prefix_expr
| cond_and_expr '&' cond_prefix_expr { $$ = MKF2(cx, and, $1, $3); }
;
cond_prefix_expr:
cond_base_expr
/* XXX notyet - need to strengthen downstream first */
/* | '!' cond_prefix_expr { $$ = MKF1(cx, not, $2); } */
;
cond_base_expr:
condatom { $$ = $1; }
| '!' condatom { $$ = MKF1(cx, not, $2); }
| '(' condexpr ')' { $$ = $2; }
;
/* basic element of config element expression: a config element */
condatom:
WORD { $$ = MKF1(cx, atom, $1); }
;
>Question 2: does config(1) support '\' at the end of a physical line to
>indicate line continuation? (If the complex boolean expression above is
>supported, I'm likely to have a longer-than-80-char command!)
The config parser uses a different syntax to handle continuation
lines. From config(9):
Each device definition file consists of a list of statements, typically
one per line. Comments may be inserted anywhere using the ``#''
character, and any line that begins with white space continues the
previous line.
See also src/usr.bin/config/scan.l:
\n[ \t] {
/*
* Note: newline followed by whitespace is always a
* continuation of the previous line, so do NOT
* return a token in this case.
*/
yyline++;
}
--
--
Michael van Elst
Internet: mlelstv%serpens.de@localhost
"A potential Snark may lurk in every tree."
Home |
Main Index |
Thread Index |
Old Index