flex: Code-Level And API Options
16.3 Code-Level And API Options
===============================
'--ansi-definitions, '%option ansi-definitions''
Deprecated, ignored
'--ansi-prototypes, '%option ansi-prototypes''
Deprecated, ignored
'--bison-bridge, '%option bison-bridge''
instructs flex to generate a C scanner that is meant to be called
by a 'GNU bison' parser. The scanner has minor API changes for
'bison' compatibility. In particular, the declaration of 'yylex'
is modified to take an additional parameter, 'yylval'. ⇒Bison
Bridge.
'--bison-locations, '%option bison-locations''
instruct flex that 'GNU bison' '%locations' are being used. This
means 'yylex' will be passed an additional parameter, 'yylloc'.
This option implies '%option bison-bridge'. ⇒Bison Bridge.
'-L, --noline, '%option noline''
instructs 'flex' not to generate '#line' directives. Without this
option, 'flex' peppers the generated scanner with '#line'
directives so error messages in the actions will be correctly
located with respect to either the original 'flex' input file (if
the errors are due to code in the input file), or 'lex.yy.c' (if
the errors are 'flex''s fault - you should report these sorts of
errors to the email address given in ⇒Reporting Bugs).
'-R, --reentrant, '%option reentrant''
instructs flex to generate a reentrant C scanner. The generated
scanner may safely be used in a multi-threaded environment. The
API for a reentrant scanner is different than for a non-reentrant
scanner ⇒Reentrant). Because of the API difference between
reentrant and non-reentrant 'flex' scanners, non-reentrant flex
code must be modified before it is suitable for use with this
option. This option is not compatible with the '--c++' option.
The option '--reentrant' does not affect the performance of the
scanner.
'-+, --c++, '%option c++''
specifies that you want flex to generate a C++ scanner class.
⇒Cxx, for details.
'--array, '%option array''
specifies that you want yytext to be an array instead of a char*
'--pointer, '%option pointer''
specify that 'yytext' should be a 'char *', not an array. This
default is 'char *'.
'-PPREFIX, --prefix=PREFIX, '%option prefix="PREFIX"''
changes the default 'yy' prefix used by 'flex' for all
globally-visible variable and function names to instead be
'PREFIX'. For example, '--prefix=foo' changes the name of 'yytext'
to 'footext'. It also changes the name of the default output file
from 'lex.yy.c' to 'lex.foo.c'. Here is a partial list of the
names affected:
yy_create_buffer
yy_delete_buffer
yy_flex_debug
yy_init_buffer
yy_flush_buffer
yy_load_buffer_state
yy_switch_to_buffer
yyin
yyleng
yylex
yylineno
yyout
yyrestart
yytext
yywrap
yyalloc
yyrealloc
yyfree
(If you are using a C++ scanner, then only 'yywrap' and
'yyFlexLexer' are affected.) Within your scanner itself, you can
still refer to the global variables and functions using either
version of their name; but externally, they have the modified name.
This option lets you easily link together multiple 'flex' programs
into the same executable. Note, though, that using this option
also renames 'yywrap()', so you now _must_ either provide your own
(appropriately-named) version of the routine for your scanner, or
use '%option noyywrap', as linking with '-lfl' no longer provides
one for you by default.
'--main, '%option main''
directs flex to provide a default 'main()' program for the scanner,
which simply calls 'yylex()'. This option implies 'noyywrap' (see
below).
'--nounistd, '%option nounistd''
suppresses inclusion of the non-ANSI header file 'unistd.h'. This
option is meant to target environments in which 'unistd.h' does not
exist. Be aware that certain options may cause flex to generate
code that relies on functions normally found in 'unistd.h', (e.g.
'isatty()', 'read()'.) If you wish to use these functions, you
will have to inform your compiler where to find them. ⇒
option-always-interactive. ⇒option-read.
'--yyclass=NAME, '%option yyclass="NAME"''
only applies when generating a C++ scanner (the '--c++' option).
It informs 'flex' that you have derived 'NAME' as a subclass of
'yyFlexLexer', so 'flex' will place your actions in the member
function 'foo::yylex()' instead of 'yyFlexLexer::yylex()'. It also
generates a 'yyFlexLexer::yylex()' member function that emits a
run-time error (by invoking 'yyFlexLexer::LexerError())' if called.
⇒Cxx.