\input texinfo.tex @c -*-texinfo-*-
@c %**start of header
@setfilename flex.info
@include version.texi
@settitle Lexical Analysis With Flex, for Flex @value{VERSION}
@set authors Vern Paxson, Will Estes and John Millaway
@c  "Macro Hooks" index
@defindex hk
@c  "Options" index
@defindex op
@dircategory Programming
@direntry
* flex: (flex).      Fast lexical analyzer generator (lex replacement).
@end direntry
@c %**end of header

@copying

The flex manual is placed under the same licensing conditions as the
rest of flex:

Copyright @copyright{} 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2012
The Flex Project.

Copyright @copyright{} 1990, 1997 The Regents of the University of California.
All rights reserved.

This code is derived from software contributed to Berkeley by
Vern Paxson.

The United States Government has rights in this work pursuant
to contract no. DE-AC03-76SF00098 between the United States
Department of Energy and the University of California.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

@enumerate
@item
 Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.

@item
Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
@end enumerate

Neither the name of the University nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.

THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.
@end copying

@titlepage
@title Lexical Analysis with Flex
@subtitle Edition @value{EDITION}, @value{UPDATED}
@author @value{authors}
@page
@vskip 0pt plus 1filll
@insertcopying
@end titlepage
@contents
@ifnottex
@node Top, Copyright, (dir), (dir)
@top flex

This manual describes @code{flex}, a tool for generating programs that
perform pattern-matching on text.  The manual includes both tutorial and
reference sections.

This edition of @cite{The flex Manual} documents @code{flex} version
@value{VERSION}. It was last updated on @value{UPDATED}.

This manual was written by @value{authors}.

@menu
* Copyright::                   
* Reporting Bugs::              
* Introduction::                
* Simple Examples::             
* Format::                      
* Patterns::                    
* Matching::                    
* Actions::                     
* Generated Scanner::           
* Start Conditions::            
* Multiple Input Buffers::      
* EOF::                         
* Misc Macros::                 
* User Values::                 
* Yacc::                        
* Scanner Options::             
* Performance::                 
* Cxx::                         
* Reentrant::                   
* Lex and Posix::               
* Memory Management::           
* Serialized Tables::           
* Diagnostics::                 
* Limitations::                 
* Bibliography::                
* FAQ::                         
* Appendices::                  
* Indices::                     

@detailmenu
 --- The Detailed Node Listing ---

Format of the Input File

* Definitions Section::         
* Rules Section::               
* User Code Section::           
* Comments in the Input::       

Scanner Options

* Options for Specifying Filenames::  
* Options Affecting Scanner Behavior::  
* Code-Level And API Options::  
* Options for Scanner Speed and Size::  
* Debugging Options::           
* Miscellaneous Options::       

Reentrant C Scanners

* Reentrant Uses::              
* Reentrant Overview::          
* Reentrant Example::           
* Reentrant Detail::            
* Reentrant Functions::         

The Reentrant API in Detail

* Specify Reentrant::           
* Extra Reentrant Argument::    
* Global Replacement::          
* Init and Destroy Functions::  
* Accessor Methods::            
* Extra Data::                  
* About yyscan_t::              

Memory Management

* The Default Memory Management::  
* Overriding The Default Memory Management::  
* A Note About yytext And Memory::  

Serialized Tables

* Creating Serialized Tables::  
* Loading and Unloading Serialized Tables::  
* Tables File Format::          

FAQ

* When was flex born?::         
* How do I expand backslash-escape sequences in C-style quoted strings?::  
* Why do flex scanners call fileno if it is not ANSI compatible?::  
* Does flex support recursive pattern definitions?::  
* How do I skip huge chunks of input (tens of megabytes) while using flex?::  
* Flex is not matching my patterns in the same order that I defined them.::  
* My actions are executing out of order or sometimes not at all.::  
* How can I have multiple input sources feed into the same scanner at the same time?::  
* Can I build nested parsers that work with the same input file?::  
* How can I match text only at the end of a file?::  
* How can I make REJECT cascade across start condition boundaries?::  
* Why cant I use fast or full tables with interactive mode?::  
* How much faster is -F or -f than -C?::  
* If I have a simple grammar cant I just parse it with flex?::  
* Why doesn't yyrestart() set the start state back to INITIAL?::  
* How can I match C-style comments?::  
* The period isn't working the way I expected.::  
* Can I get the flex manual in another format?::  
* Does there exist a "faster" NDFA->DFA algorithm?::  
* How does flex compile the DFA so quickly?::  
* How can I use more than 8192 rules?::  
* How do I abandon a file in the middle of a scan and switch to a new file?::  
* How do I execute code only during initialization (only before the first scan)?::  
* How do I execute code at termination?::  
* Where else can I find help?::  
* Can I include comments in the "rules" section of the file?::  
* I get an error about undefined yywrap().::  
* How can I change the matching pattern at run time?::  
* How can I expand macros in the input?::  
* How can I build a two-pass scanner?::  
* How do I match any string not matched in the preceding rules?::  
* I am trying to port code from AT&T lex that uses yysptr and yysbuf.::  
* Is there a way to make flex treat NULL like a regular character?::  
* Whenever flex can not match the input it says "flex scanner jammed".::  
* Why doesn't flex have non-greedy operators like perl does?::  
* Memory leak - 16386 bytes allocated by malloc.::  
* How do I track the byte offset for lseek()?::  
* How do I use my own I/O classes in a C++ scanner?::  
* How do I skip as many chars as possible?::  
* deleteme00::              
* Are certain equivalent patterns faster than others?::              
* Is backing up a big deal?::              
* Can I fake multi-byte character support?::              
* deleteme01::              
* Can you discuss some flex internals?::              
* unput() messes up yy_at_bol::              
* The | operator is not doing what I want::              
* Why can't flex understand this variable trailing context pattern?::              
* The ^ operator isn't working::              
* Trailing context is getting confused with trailing optional patterns::              
* Is flex GNU or not?::              
* ERASEME53::              
* I need to scan if-then-else blocks and while loops::              
* ERASEME55::              
* ERASEME56::              
* ERASEME57::              
* Is there a repository for flex scanners?::              
* How can I conditionally compile or preprocess my flex input file?::              
* Where can I find grammars for lex and yacc?::              
* I get an end-of-buffer message for each character scanned.::              
* unnamed-faq-62::              
* unnamed-faq-63::              
* unnamed-faq-64::              
* unnamed-faq-65::              
* unnamed-faq-66::              
* unnamed-faq-67::              
* unnamed-faq-68::              
* unnamed-faq-69::              
* unnamed-faq-70::              
* unnamed-faq-71::              
* unnamed-faq-72::              
* unnamed-faq-73::              
* unnamed-faq-74::              
* unnamed-faq-75::              
* unnamed-faq-76::              
* unnamed-faq-77::              
* unnamed-faq-78::              
* unnamed-faq-79::              
* unnamed-faq-80::              
* unnamed-faq-81::              
* unnamed-faq-82::              
* unnamed-faq-83::              
* unnamed-faq-84::              
* unnamed-faq-85::              
* unnamed-faq-86::              
* unnamed-faq-87::              
* unnamed-faq-88::              
* unnamed-faq-90::              
* unnamed-faq-91::              
* unnamed-faq-92::              
* unnamed-faq-93::              
* unnamed-faq-94::              
* unnamed-faq-95::              
* unnamed-faq-96::              
* unnamed-faq-97::              
* unnamed-faq-98::              
* unnamed-faq-99::              
* unnamed-faq-100::             
* unnamed-faq-101::             
* What is the difference between YYLEX_PARAM and YY_DECL?::
* Why do I get "conflicting types for yylex" error?::
* How do I access the values set in a Flex action from within a Bison action?::

Appendices

* Makefiles and Flex::          
* Bison Bridge::                
* M4 Dependency::               
* Common Patterns::               

Indices

* Concept Index::               
* Index of Functions and Macros::  
* Index of Variables::          
* Index of Data Types::         
* Index of Hooks::              
* Index of Scanner Options::    

@end detailmenu
@end menu
@end ifnottex
@node Copyright, Reporting Bugs, Top, Top
@chapter Copyright

@cindex copyright of flex
@cindex distributing flex
@insertcopying

@node Reporting Bugs, Introduction, Copyright, Top
@chapter Reporting Bugs

@cindex bugs, reporting
@cindex reporting bugs

If you find a bug in @code{flex}, please report it using
GitHub's issue tracking facility at @url{https://github.com/westes/flex/issues/}

@node Introduction, Simple Examples, Reporting Bugs, Top
@chapter Introduction

@cindex scanner, definition of
@code{flex} is a tool for generating @dfn{scanners}.  A scanner is a
program which recognizes lexical patterns in text.  The @code{flex}
program reads the given input files, or its standard input if no file
names are given, for a description of a scanner to generate.  The
description is in the form of pairs of regular expressions and C code,
called @dfn{rules}. @code{flex} generates as output a C source file,
@file{lex.yy.c} by default, which defines a routine @code{yylex()}.
This file can be compiled and linked with the flex runtime library to
produce an executable.  When the executable is run, it analyzes its
input for occurrences of the regular expressions.  Whenever it finds
one, it executes the corresponding C code.

@node Simple Examples, Format, Introduction, Top
@chapter Some Simple Examples

First some simple examples to get the flavor of how one uses
@code{flex}.

@cindex username expansion
The following @code{flex} input specifies a scanner which, when it
encounters the string @samp{username} will replace it with the user's
login name:

@example
@verbatim
    %%
    username    printf( "%s", getlogin() );
@end verbatim
@end example

@cindex default rule
@cindex rules, default
By default, any text not matched by a @code{flex} scanner is copied to
the output, so the net effect of this scanner is to copy its input file
to its output with each occurrence of @samp{username} expanded.  In this
input, there is just one rule.  @samp{username} is the @dfn{pattern} and
the @samp{printf} is the @dfn{action}.  The @samp{%%} symbol marks the
beginning of the rules.

Here's another simple example:

@cindex counting characters and lines
@example
@verbatim
            int num_lines = 0, num_chars = 0;

    %%
    \n      ++num_lines; ++num_chars;
    .       ++num_chars;

    %%

    int main()
            {
            yylex();
            printf( "# of lines = %d, # of chars = %d\n",
                    num_lines, num_chars );
            }
@end verbatim
@end example

This scanner counts the number of characters and the number of lines in
its input. It produces no output other than the final report on the
character and line counts.  The first line declares two globals,
@code{num_lines} and @code{num_chars}, which are accessible both inside
@code{yylex()} and in the @code{main()} routine declared after the
second @samp{%%}.  There are two rules, one which matches a newline
(@samp{\n}) and increments both the line count and the character count,
and one which matches any character other than a newline (indicated by
the @samp{.} regular expression).

A somewhat more complicated example:

@cindex Pascal-like language
@example
@verbatim
    /* scanner for a toy Pascal-like language */

    %{
    /* need this for the call to atof() below */
    #include <math.h>
    %}

    DIGIT    [0-9]
    ID       [a-z][a-z0-9]*

    %%

    {DIGIT}+    {
                printf( "An integer: %s (%d)\n", yytext,
                        atoi( yytext ) );
                }

    {DIGIT}+"."{DIGIT}*        {
                printf( "A float: %s (%g)\n", yytext,
                        atof( yytext ) );
                }

    if|then|begin|end|procedure|function        {
                printf( "A keyword: %s\n", yytext );
                }

    {ID}        printf( "An identifier: %s\n", yytext );

    "+"|"-"|"*"|"/"   printf( "An operator: %s\n", yytext );

    "{"[^{}\n]*"}"     /* eat up one-line comments */

    [ \t\n]+          /* eat up whitespace */

    .           printf( "Unrecognized character: %s\n", yytext );

    %%

    int main( int argc, char **argv )
        {
        ++argv, --argc;  /* skip over program name */
        if ( argc > 0 )
                yyin = fopen( argv[0], "r" );
        else
                yyin = stdin;

        yylex();
        }
@end verbatim
@end example

This is the beginnings of a simple scanner for a language like Pascal.
It identifies different types of @dfn{tokens} and reports on what it has
seen.

The details of this example will be explained in the following
sections.

@node Format, Patterns, Simple Examples, Top
@chapter Format of the Input File


@cindex format of flex input
@cindex input, format of
@cindex file format
@cindex sections of flex input

The @code{flex} input file consists of three sections, separated by a
line containing only @samp{%%}.

@cindex format of input file
@example
@verbatim
    definitions
    %%
    rules
    %%
    user code
@end verbatim
@end example

@menu
* Definitions Section::         
* Rules Section::               
* User Code Section::           
* Comments in the Input::       
@end menu

@node Definitions Section, Rules Section, Format, Format
@section Format of the Definitions Section

@cindex input file, Definitions section
@cindex Definitions, in flex input
The @dfn{definitions section} contains declarations of simple @dfn{name}
definitions to simplify the scanner specification, and declarations of
@dfn{start conditions}, which are explained in a later section.

@cindex aliases, how to define
@cindex pattern aliases, how to define
Name definitions have the form:

@example
@verbatim
    name definition
@end verbatim
@end example

The @samp{name} is a word beginning with a letter or an underscore
(@samp{_}) followed by zero or more letters, digits, @samp{_}, or
@samp{-} (dash).  The definition is taken to begin at the first
non-whitespace character following the name and continuing to the end of
the line.  The definition can subsequently be referred to using
@samp{@{name@}}, which will expand to @samp{(definition)}.  For example,

@cindex pattern aliases, defining
@cindex defining pattern aliases
@example
@verbatim
    DIGIT    [0-9]
    ID       [a-z][a-z0-9]*
@end verbatim
@end example

Defines @samp{DIGIT} to be a regular expression which matches a single
digit, and @samp{ID} to be a regular expression which matches a letter
followed by zero-or-more letters-or-digits.  A subsequent reference to

@cindex pattern aliases, use of
@example
@verbatim
    {DIGIT}+"."{DIGIT}*
@end verbatim
@end example

is identical to

@example
@verbatim
    ([0-9])+"."([0-9])*
@end verbatim
@end example

and matches one-or-more digits followed by a @samp{.} followed by
zero-or-more digits.

@cindex comments in flex input
An unindented comment (i.e., a line
beginning with @samp{/*}) is copied verbatim to the output up
to the next @samp{*/}.

@cindex %@{ and %@}, in Definitions Section
@cindex embedding C code in flex input
@cindex C code in flex input
Any @emph{indented} text or text enclosed in @samp{%@{} and @samp{%@}}
is also copied verbatim to the output (with the %@{ and %@} symbols
removed).  The %@{ and %@} symbols must appear unindented on lines by
themselves.

@cindex %top

A @code{%top} block is similar to a @samp{%@{} ... @samp{%@}} block, except
that the code in a @code{%top} block is relocated to the @emph{top} of the
generated file, before any flex definitions @footnote{Actually,
@code{yyIN_HEADER} is defined before the @samp{%top} block.}. 
The @code{%top} block is useful when you want certain preprocessor macros to be
defined or certain files to be included before the generated code.
The single characters, @samp{@{}  and @samp{@}} are used to delimit the
@code{%top} block, as show in the example below:

@example
@verbatim
    %top{
        /* This code goes at the "top" of the generated file. */
        #include <stdint.h>
        #include <inttypes.h>
    }
@end verbatim
@end example

Multiple @code{%top} blocks are allowed, and their order is preserved.

@node Rules Section, User Code Section, Definitions Section, Format
@section Format of the Rules Section

@cindex input file, Rules Section
@cindex rules, in flex input
The @dfn{rules} section of the @code{flex} input contains a series of
rules of the form:

@example
@verbatim
    pattern   action
@end verbatim
@end example

where the pattern must be unindented and the action must begin
on the same line.
@xref{Patterns}, for a further description of patterns and actions.

In the rules section, any indented or %@{ %@} enclosed text appearing
before the first rule may be used to declare variables which are local
to the scanning routine and (after the declarations) code which is to be
executed whenever the scanning routine is entered.  Other indented or
%@{ %@} text in the rule section is still copied to the output, but its
meaning is not well-defined and it may well cause compile-time errors
(this feature is present for @acronym{POSIX} compliance. @xref{Lex and
Posix}, for other such features).

Any @emph{indented} text or text enclosed in @samp{%@{} and @samp{%@}}
is copied verbatim to the output (with the %@{ and %@} symbols removed).
The %@{ and %@} symbols must appear unindented on lines by themselves.

@node User Code Section, Comments in the Input, Rules Section, Format
@section Format of the User Code Section

@cindex input file, user code Section
@cindex user code, in flex input
The user code section is simply copied to @file{lex.yy.c} verbatim.  It
is used for companion routines which call or are called by the scanner.
The presence of this section is optional; if it is missing, the second
@samp{%%} in the input file may be skipped, too.

@node Comments in the Input,  , User Code Section, Format
@section Comments in the Input

@cindex comments, syntax of
Flex supports C-style comments, that is, anything between @samp{/*} and
@samp{*/} is
considered a comment. Whenever flex encounters a comment, it copies the
entire comment verbatim to the generated source code. Comments may
appear just about anywhere, but with the following exceptions:

@itemize
@cindex comments, in rules section
@item
Comments may not appear in the Rules Section wherever flex is expecting
a regular expression. This means comments may not appear at the
beginning of a line, or immediately following a list of scanner states.
@item
Comments may not appear on an @samp{%option} line in the Definitions
Section.
@end itemize

If you want to follow a simple rule, then always begin a comment on a
new line, with one or more whitespace characters before the initial
@samp{/*}).  This rule will work anywhere in the input file.

All the comments in the following example are valid:

@cindex comments, valid uses of
@cindex comments in the input
@example
@verbatim
%{
/* code block */
%}

/* Definitions Section */
%x STATE_X

%%
    /* Rules Section */
ruleA   /* after regex */ { /* code block */ } /* after code block */
        /* Rules Section (indented) */
<STATE_X>{
ruleC   ECHO;
ruleD   ECHO;
%{
/* code block */
%}
}
%%
/* User Code Section */

@end verbatim
@end example

@node Patterns, Matching, Format, Top
@chapter Patterns

@cindex patterns, in rules section
@cindex regular expressions, in patterns
The patterns in the input (see @ref{Rules Section}) are written using an
extended set of regular expressions.  These are:

@cindex patterns, syntax
@cindex patterns, syntax
@table @samp
@item x
match the character 'x'

@item .
any character (byte) except newline

@cindex [] in patterns
@cindex character classes in patterns, syntax of
@cindex POSIX, character classes in patterns, syntax of
@item [xyz]
a @dfn{character class}; in this case, the pattern
matches either an 'x', a 'y', or a 'z'

@cindex ranges in patterns
@item [abj-oZ]
a "character class" with a range in it; matches
an 'a', a 'b', any letter from 'j' through 'o',
or a 'Z'

@cindex ranges in patterns, negating
@cindex negating ranges in patterns
@item [^A-Z]
a "negated character class", i.e., any character
but those in the class.  In this case, any
character EXCEPT an uppercase letter.

@item [^A-Z\n]
any character EXCEPT an uppercase letter or
a newline

@item [a-z]@{-@}[aeiou]
the lowercase consonants

@item r*
zero or more r's, where r is any regular expression

@item r+
one or more r's

@item r?
zero or one r's (that is, ``an optional r'')

@cindex braces in patterns
@item r@{2,5@}
anywhere from two to five r's

@item r@{2,@}
two or more r's

@item r@{4@}
exactly 4 r's

@cindex pattern aliases, expansion of
@item @{name@}
the expansion of the @samp{name} definition
(@pxref{Format}).

@cindex literal text in patterns, syntax of
@cindex verbatim text in patterns, syntax of
@item "[xyz]\"foo"
the literal string: @samp{[xyz]"foo}

@cindex escape sequences in patterns, syntax of
@item \X
if X is @samp{a}, @samp{b}, @samp{f}, @samp{n}, @samp{r}, @samp{t}, or
@samp{v}, then the ANSI-C interpretation of @samp{\x}.  Otherwise, a
literal @samp{X} (used to escape operators such as @samp{*})

@cindex NULL character in patterns, syntax of
@item \0
a NUL character (ASCII code 0)

@cindex octal characters in patterns
@item \123
the character with octal value 123

@item \x2a
the character with hexadecimal value 2a

@item (r)
match an @samp{r}; parentheses are used to override precedence (see below)

@item (?r-s:pattern)
apply option @samp{r} and omit option @samp{s} while interpreting pattern.
Options may be zero or more of the characters @samp{i}, @samp{s}, or @samp{x}.

@samp{i} means case-insensitive. @samp{-i} means case-sensitive.

@samp{s} alters the meaning of the @samp{.} syntax to match any single byte whatsoever.
@samp{-s} alters the meaning of @samp{.} to match any byte except @samp{\n}.

@samp{x} ignores comments and whitespace in patterns. Whitespace is ignored unless
it is backslash-escaped, contained within @samp{""}s, or appears inside a 
character class.

The following are all valid:

@verbatim
(?:foo)         same as  (foo)
(?i:ab7)        same as  ([aA][bB]7)
(?-i:ab)        same as  (ab)
(?s:.)          same as  [\x00-\xFF]
(?-s:.)         same as  [^\n]
(?ix-s: a . b)  same as  ([Aa][^\n][bB])
(?x:a  b)       same as  ("ab")
(?x:a\ b)       same as  ("a b")
(?x:a" "b)      same as  ("a b")
(?x:a[ ]b)      same as  ("a b")
(?x:a
    /* comment */
    b
    c)          same as  (abc)
@end verbatim

@item (?# comment )
omit everything within @samp{()}. The first @samp{)}
character encountered ends the pattern. It is not possible to for the comment
to contain a @samp{)} character. The comment may span lines.

@cindex concatenation, in patterns
@item rs
the regular expression @samp{r} followed by the regular expression @samp{s}; called
@dfn{concatenation}

@item r|s
either an @samp{r} or an @samp{s}

@cindex trailing context, in patterns
@item r/s
an @samp{r} but only if it is followed by an @samp{s}.  The text matched by @samp{s} is
included when determining whether this rule is the longest match, but is
then returned to the input before the action is executed.  So the action
only sees the text matched by @samp{r}.  This type of pattern is called
@dfn{trailing context}.  (There are some combinations of @samp{r/s} that flex
cannot match correctly. @xref{Limitations}, regarding dangerous trailing
context.)

@cindex beginning of line, in patterns
@cindex BOL, in patterns
@item ^r
an @samp{r}, but only at the beginning of a line (i.e.,
when just starting to scan, or right after a
newline has been scanned).

@cindex end of line, in patterns
@cindex EOL, in patterns
@item r$
an @samp{r}, but only at the end of a line (i.e., just before a
newline).  Equivalent to @samp{r/\n}.

@cindex newline, matching in patterns
Note that @code{flex}'s notion of ``newline'' is exactly
whatever the C compiler used to compile @code{flex}
interprets @samp{\n} as; in particular, on some DOS
systems you must either filter out @samp{\r}s in the
input yourself, or explicitly use @samp{r/\r\n} for @samp{r$}.

@cindex start conditions, in patterns
@item <s>r
an @samp{r}, but only in start condition @code{s} (see @ref{Start
Conditions} for discussion of start conditions).

@item <s1,s2,s3>r
same, but in any of start conditions @code{s1}, @code{s2}, or @code{s3}.

@item <*>r
an @samp{r} in any start condition, even an exclusive one.

@cindex end of file, in patterns
@cindex EOF in patterns, syntax of
@item <<EOF>>
an end-of-file.

@item <s1,s2><<EOF>>
an end-of-file when in start condition @code{s1} or @code{s2}
@end table

Note that inside of a character class, all regular expression operators
lose their special meaning except escape (@samp{\}) and the character class
operators, @samp{-}, @samp{]]}, and, at the beginning of the class, @samp{^}.

@cindex patterns, precedence of operators
The regular expressions listed above are grouped according to
precedence, from highest precedence at the top to lowest at the bottom.
Those grouped together have equal precedence (see special note on the
precedence of the repeat operator, @samp{@{@}}, under the documentation
for the @samp{--posix} POSIX compliance option).  For example,

@cindex patterns, grouping and precedence
@example
@verbatim
    foo|bar*
@end verbatim
@end example

is the same as

@example
@verbatim
    (foo)|(ba(r*))
@end verbatim
@end example

since the @samp{*} operator has higher precedence than concatenation,
and concatenation higher than alternation (@samp{|}).  This pattern
therefore matches @emph{either} the string @samp{foo} @emph{or} the
string @samp{ba} followed by zero-or-more @samp{r}'s.  To match
@samp{foo} or zero-or-more repetitions of the string @samp{bar}, use:

@example
@verbatim
    foo|(bar)*
@end verbatim
@end example

And to match a sequence of zero or more repetitions of @samp{foo} and
@samp{bar}:

@cindex patterns, repetitions with grouping
@example
@verbatim
    (foo|bar)*
@end verbatim
@end example

@cindex character classes in patterns
In addition to characters and ranges of characters, character classes
can also contain @dfn{character class expressions}.  These are
expressions enclosed inside @samp{[:} and @samp{:]} delimiters (which
themselves must appear between the @samp{[} and @samp{]} of the
character class. Other elements may occur inside the character class,
too).  The valid expressions are:

@cindex patterns, valid character classes
@example
@verbatim
    [:alnum:] [:alpha:] [:blank:]
    [:cntrl:] [:digit:] [:graph:]
    [:lower:] [:print:] [:punct:]
    [:space:] [:upper:] [:xdigit:]
@end verbatim
@end example

These expressions all designate a set of characters equivalent to the
corresponding standard C @code{isXXX} function.  For example,
@samp{[:alnum:]} designates those characters for which @code{isalnum()}
returns true - i.e., any alphabetic or numeric character.  Some systems
don't provide @code{isblank()}, so flex defines @samp{[:blank:]} as a
blank or a tab.

For example, the following character classes are all equivalent:

@cindex character classes, equivalence of
@cindex patterns, character class equivalence
@example
@verbatim
    [[:alnum:]]
    [[:alpha:][:digit:]]
    [[:alpha:][0-9]]
    [a-zA-Z0-9]
@end verbatim
@end example

A word of caution. Character classes are expanded immediately when seen in the @code{flex} input. 
This means the character classes are sensitive to the locale in which @code{flex}
is executed, and the resulting scanner will not be sensitive to the runtime locale.
This may or may not be desirable.


@itemize
@cindex case-insensitive, effect on character classes
@item If your scanner is case-insensitive (the @samp{-i} flag), then
@samp{[:upper:]} and @samp{[:lower:]} are equivalent to
@samp{[:alpha:]}.

@anchor{case and character ranges}
@item Character classes with ranges, such as @samp{[a-Z]}, should be used with
caution in a case-insensitive scanner if the range spans upper or lowercase
characters. Flex does not know if you want to fold all upper and lowercase
characters together, or if you want the literal numeric range specified (with
no case folding). When in doubt, flex will assume that you meant the literal
numeric range, and will issue a warning. The exception to this rule is a
character range such as @samp{[a-z]} or @samp{[S-W]} where it is obvious that you
want case-folding to occur. Here are some examples with the @samp{-i} flag
enabled:

@multitable {@samp{[a-zA-Z]}} {ambiguous} {@samp{[A-Z\[\\\]_`a-t]}} {@samp{[@@A-Z\[\\\]_`abc]}}
@item Range @tab Result @tab Literal Range @tab Alternate Range
@item @samp{[a-t]} @tab ok @tab @samp{[a-tA-T]} @tab
@item @samp{[A-T]} @tab ok @tab @samp{[a-tA-T]} @tab
@item @samp{[A-t]} @tab ambiguous @tab @samp{[A-Z\[\\\]_`a-t]} @tab @samp{[a-tA-T]}
@item @samp{[_-@{]} @tab ambiguous @tab @samp{[_`a-z@{]} @tab @samp{[_`a-zA-Z@{]}
@item @samp{[@@-C]} @tab ambiguous @tab @samp{[@@ABC]} @tab @samp{[@@A-Z\[\\\]_`abc]}
@end multitable

@cindex end of line, in negated character classes
@cindex EOL, in negated character classes
@item
A negated character class such as the example @samp{[^A-Z]} above
@emph{will} match a newline unless @samp{\n} (or an equivalent escape
sequence) is one of the characters explicitly present in the negated
character class (e.g., @samp{[^A-Z\n]}).  This is unlike how many other
regular expression tools treat negated character classes, but
unfortunately the inconsistency is historically entrenched.  Matching
newlines means that a pattern like @samp{[^"]*} can match the entire
input unless there's another quote in the input.

Flex allows negation of character class expressions by prepending @samp{^} to
the POSIX character class name.

@example
@verbatim
    [:^alnum:] [:^alpha:] [:^blank:]
    [:^cntrl:] [:^digit:] [:^graph:]
    [:^lower:] [:^print:] [:^punct:]
    [:^space:] [:^upper:] [:^xdigit:]
@end verbatim
@end example

Flex will issue a warning if the expressions @samp{[:^upper:]} and
@samp{[:^lower:]} appear in a case-insensitive scanner, since their meaning is
unclear. The current behavior is to skip them entirely, but this may change
without notice in future revisions of flex.

@item

The @samp{@{-@}} operator computes the difference of two character classes. For
example, @samp{[a-c]@{-@}[b-z]} represents all the characters in the class
@samp{[a-c]} that are not in the class @samp{[b-z]} (which in this case, is
just the single character @samp{a}). The @samp{@{-@}} operator is left
associative, so @samp{[abc]@{-@}[b]@{-@}[c]} is the same as @samp{[a]}. Be careful
not to accidentally create an empty set, which will never match.

@item

The @samp{@{+@}} operator computes the union of two character classes. For
example, @samp{[a-z]@{+@}[0-9]} is the same as @samp{[a-z0-9]}. This operator
is useful when preceded by the result of a difference operation, as in,
@samp{[[:alpha:]]@{-@}[[:lower:]]@{+@}[q]}, which is equivalent to
@samp{[A-Zq]} in the "C" locale.

@cindex trailing context, limits of
@cindex ^ as non-special character in patterns
@cindex $ as normal character in patterns
@item
A rule can have at most one instance of trailing context (the @samp{/} operator
or the @samp{$} operator).  The start condition, @samp{^}, and @samp{<<EOF>>} patterns
can only occur at the beginning of a pattern, and, as well as with @samp{/} and @samp{$},
cannot be grouped inside parentheses.  A @samp{^} which does not occur at
the beginning of a rule or a @samp{$} which does not occur at the end of
a rule loses its special properties and is treated as a normal character.

@item
The following are invalid:

@cindex patterns, invalid trailing context
@example
@verbatim
    foo/bar$
    <sc1>foo<sc2>bar
@end verbatim
@end example

Note that the first of these can be written @samp{foo/bar\n}.

@item
The following will result in @samp{$} or @samp{^} being treated as a normal character:

@cindex patterns, special characters treated as non-special
@example
@verbatim
    foo|(bar$)
    foo|^bar
@end verbatim
@end example

If the desired meaning is a @samp{foo} or a
@samp{bar}-followed-by-a-newline, the following could be used (the
special @code{|} action is explained below, @pxref{Actions}):

@cindex patterns, end of line
@example
@verbatim
    foo      |
    bar$     /* action goes here */
@end verbatim
@end example

A similar trick will work for matching a @samp{foo} or a
@samp{bar}-at-the-beginning-of-a-line.
@end itemize

@node Matching, Actions, Patterns, Top
@chapter How the Input Is Matched

@cindex patterns, matching
@cindex input, matching
@cindex trailing context, matching
@cindex matching, and trailing context
@cindex matching, length of
@cindex matching, multiple matches
When the generated scanner is run, it analyzes its input looking for
strings which match any of its patterns.  If it finds more than one
match, it takes the one matching the most text (for trailing context
rules, this includes the length of the trailing part, even though it
will then be returned to the input).  If it finds two or more matches of
the same length, the rule listed first in the @code{flex} input file is
chosen.

@cindex token
@cindex yytext
@cindex yyleng
Once the match is determined, the text corresponding to the match
(called the @dfn{token}) is made available in the global character
pointer @code{yytext}, and its length in the global integer
@code{yyleng}.  The @dfn{action} corresponding to the matched pattern is
then executed (@pxref{Actions}), and then the remaining input is scanned
for another match.

@cindex default rule
If no match is found, then the @dfn{default rule} is executed: the next
character in the input is considered matched and copied to the standard
output.  Thus, the simplest valid @code{flex} input is:

@cindex minimal scanner
@example
@verbatim
    %%
@end verbatim
@end example

which generates a scanner that simply copies its input (one character at
a time) to its output.

@cindex yytext, two types of
@cindex %array, use of
@cindex %pointer, use of
@vindex yytext
Note that @code{yytext} can be defined in two different ways: either as
a character @emph{pointer} or as a character @emph{array}. You can
control which definition @code{flex} uses by including one of the
special directives @code{%pointer} or @code{%array} in the first
(definitions) section of your flex input.  The default is
@code{%pointer}, unless you use the @samp{-l} lex compatibility option,
in which case @code{yytext} will be an array.  The advantage of using
@code{%pointer} is substantially faster scanning and no buffer overflow
when matching very large tokens (unless you run out of dynamic memory).
The disadvantage is that you are restricted in how your actions can
modify @code{yytext} (@pxref{Actions}), and calls to the @code{unput()}
function destroys the present contents of @code{yytext}, which can be a
considerable porting headache when moving between different @code{lex}
versions.

@cindex %array, advantages of
The advantage of @code{%array} is that you can then modify @code{yytext}
to your heart's content, and calls to @code{unput()} do not destroy
@code{yytext} (@pxref{Actions}).  Furthermore, existing @code{lex}
programs sometimes access @code{yytext} externally using declarations of
the form:

@example
@verbatim
    extern char yytext[];
@end verbatim
@end example

This definition is erroneous when used with @code{%pointer}, but correct
for @code{%array}.

The @code{%array} declaration defines @code{yytext} to be an array of
@code{YYLMAX} characters, which defaults to a fairly large value.  You
can change the size by simply #define'ing @code{YYLMAX} to a different
value in the first section of your @code{flex} input.  As mentioned
above, with @code{%pointer} yytext grows dynamically to accommodate
large tokens.  While this means your @code{%pointer} scanner can
accommodate very large tokens (such as matching entire blocks of
comments), bear in mind that each time the scanner must resize
@code{yytext} it also must rescan the entire token from the beginning,
so matching such tokens can prove slow.  @code{yytext} presently does
@emph{not} dynamically grow if a call to @code{unput()} results in too
much text being pushed back; instead, a run-time error results.

@cindex %array, with C++
Also note that you cannot use @code{%array} with C++ scanner classes
(@pxref{Cxx}).

@node Actions, Generated Scanner, Matching, Top
@chapter Actions

@cindex actions
Each pattern in a rule has a corresponding @dfn{action}, which can be
any arbitrary C statement.  The pattern ends at the first non-escaped
whitespace character; the remainder of the line is its action.  If the
action is empty, then when the pattern is matched the input token is
simply discarded.  For example, here is the specification for a program
which deletes all occurrences of @samp{zap me} from its input:

@cindex deleting lines from input
@example
@verbatim
    %%
    "zap me"
@end verbatim
@end example

This example will copy all other characters in the input to the output
since they will be matched by the default rule.

Here is a program which compresses multiple blanks and tabs down to a
single blank, and throws away whitespace found at the end of a line:

@cindex whitespace, compressing
@cindex compressing whitespace
@example
@verbatim
    %%
    [ \t]+        putchar( ' ' );
    [ \t]+$       /* ignore this token */
@end verbatim
@end example

@cindex %@{ and %@}, in Rules Section
@cindex actions, use of @{ and @}
@cindex actions, embedded C strings
@cindex C-strings, in actions
@cindex comments, in actions
If the action contains a @samp{@{}, then the action spans till the
balancing @samp{@}} is found, and the action may cross multiple lines.
@code{flex} knows about C strings and comments and won't be fooled by
braces found within them, but also allows actions to begin with
@samp{%@{} and will consider the action to be all the text up to the
next @samp{%@}} (regardless of ordinary braces inside the action).

@cindex |, in actions
An action consisting solely of a vertical bar (@samp{|}) means ``same as the
action for the next rule''.  See below for an illustration.

Actions can include arbitrary C code, including @code{return} statements
to return a value to whatever routine called @code{yylex()}.  Each time
@code{yylex()} is called it continues processing tokens from where it
last left off until it either reaches the end of the file or executes a
return.

@cindex yytext, modification of
Actions are free to modify @code{yytext} except for lengthening it
(adding characters to its end--these will overwrite later characters in
the input stream).  This however does not apply when using @code{%array}
(@pxref{Matching}). In that case, @code{yytext} may be freely modified
in any way.

@cindex yyleng, modification of
@cindex yymore, and yyleng
Actions are free to modify @code{yyleng} except they should not do so if
the action also includes use of @code{yymore()} (see below).

@cindex preprocessor macros, for use in actions
There are a number of special directives which can be included within an
action:

@table @code
@item  ECHO
@cindex ECHO
copies yytext to the scanner's output.

@item  BEGIN
@cindex BEGIN
followed by the name of a start condition places the scanner in the
corresponding start condition (see below).

@item  REJECT
@cindex REJECT
directs the scanner to proceed on to the ``second best'' rule which
matched the input (or a prefix of the input).  The rule is chosen as
described above in @ref{Matching}, and @code{yytext} and @code{yyleng}
set up appropriately.  It may either be one which matched as much text
as the originally chosen rule but came later in the @code{flex} input
file, or one which matched less text.  For example, the following will
both count the words in the input and call the routine @code{special()}
whenever @samp{frob} is seen:

@example
@verbatim
            int word_count = 0;
    %%

    frob        special(); REJECT;
    [^ \t\n]+   ++word_count;
@end verbatim
@end example

Without the @code{REJECT}, any occurrences of @samp{frob} in the input
would not be counted as words, since the scanner normally executes only
one action per token.  Multiple uses of @code{REJECT} are allowed, each
one finding the next best choice to the currently active rule.  For
example, when the following scanner scans the token @samp{abcd}, it will
write @samp{abcdabcaba} to the output:

@cindex REJECT, calling multiple times
@cindex |, use of
@example
@verbatim
    %%
    a        |
    ab       |
    abc      |
    abcd     ECHO; REJECT;
    .|\n     /* eat up any unmatched character */
@end verbatim
@end example

The first three rules share the fourth's action since they use the
special @samp{|} action.

@code{REJECT} is a particularly expensive feature in terms of scanner
performance; if it is used in @emph{any} of the scanner's actions it
will slow down @emph{all} of the scanner's matching.  Furthermore,
@code{REJECT} cannot be used with the @samp{-Cf} or @samp{-CF} options
(@pxref{Scanner Options}).

Note also that unlike the other special actions, @code{REJECT} is a
@emph{branch}.  Code immediately following it in the action will
@emph{not} be executed.

@item  yymore()
@cindex yymore()
tells the scanner that the next time it matches a rule, the
corresponding token should be @emph{appended} onto the current value of
@code{yytext} rather than replacing it.  For example, given the input
@samp{mega-kludge} the following will write @samp{mega-mega-kludge} to
the output:

@cindex yymore(), mega-kludge
@cindex yymore() to append token to previous token
@example
@verbatim
    %%
    mega-    ECHO; yymore();
    kludge   ECHO;
@end verbatim
@end example

First @samp{mega-} is matched and echoed to the output.  Then @samp{kludge}
is matched, but the previous @samp{mega-} is still hanging around at the
beginning of
@code{yytext}
so the
@code{ECHO}
for the @samp{kludge} rule will actually write @samp{mega-kludge}.
@end table

@cindex yymore, performance penalty of
Two notes regarding use of @code{yymore()}.  First, @code{yymore()}
depends on the value of @code{yyleng} correctly reflecting the size of
the current token, so you must not modify @code{yyleng} if you are using
@code{yymore()}.  Second, the presence of @code{yymore()} in the
scanner's action entails a minor performance penalty in the scanner's
matching speed.

@cindex yyless()
@code{yyless(n)} returns all but the first @code{n} characters of the
current token back to the input stream, where they will be rescanned
when the scanner looks for the next match.  @code{yytext} and
@code{yyleng} are adjusted appropriately (e.g., @code{yyleng} will now
be equal to @code{n}).  For example, on the input @samp{foobar} the
following will write out @samp{foobarbar}:

@cindex yyless(), pushing back characters
@cindex pushing back characters with yyless
@example
@verbatim
    %%
    foobar    ECHO; yyless(3);
    [a-z]+    ECHO;
@end verbatim
@end example

An argument of 0 to @code{yyless()} will cause the entire current input
string to be scanned again.  Unless you've changed how the scanner will
subsequently process its input (using @code{BEGIN}, for example), this
will result in an endless loop.

Note that @code{yyless()} is a macro and can only be used in the flex
input file, not from other source files.

@cindex unput()
@cindex pushing back characters with unput
@code{unput(c)} puts the character @code{c} back onto the input stream.
It will be the next character scanned.  The following action will take
the current token and cause it to be rescanned enclosed in parentheses.

@cindex unput(), pushing back characters
@cindex pushing back characters with unput()
@example
@verbatim
    {
    int i;
    /* Copy yytext because unput() trashes yytext */
    char *yycopy = strdup( yytext );
    unput( ')' );
    for ( i = yyleng - 1; i >= 0; --i )
        unput( yycopy[i] );
    unput( '(' );
    free( yycopy );
    }
@end verbatim
@end example

Note that since each @code{unput()} puts the given character back at the
@emph{beginning} of the input stream, pushing back strings must be done
back-to-front.

@cindex %pointer, and unput()
@cindex unput(), and %pointer
An important potential problem when using @code{unput()} is that if you
are using @code{%pointer} (the default), a call to @code{unput()}
@emph{destroys} the contents of @code{yytext}, starting with its
rightmost character and devouring one character to the left with each
call.  If you need the value of @code{yytext} preserved after a call to
@code{unput()} (as in the above example), you must either first copy it
elsewhere, or build your scanner using @code{%array} instead
(@pxref{Matching}).

@cindex pushing back EOF
@cindex EOF, pushing back
Finally, note that you cannot put back @samp{EOF} to attempt to mark the
input stream with an end-of-file.

@cindex input()
@code{input()} reads the next character from the input stream.  For
example, the following is one way to eat up C comments:

@cindex comments, discarding
@cindex discarding C comments
@example
@verbatim
    %%
    "/*"        {
                int c;

                for ( ; ; )
                    {
                    while ( (c = input()) != '*' &&
                            c != EOF )
                        ;    /* eat up text of comment */

                    if ( c == '*' )
                        {
                        while ( (c = input()) == '*' )
                            ;
                        if ( c == '/' )
                            break;    /* found the end */
                        }

                    if ( c == EOF )
                        {
                        error( "EOF in comment" );
                        break;
                        }
                    }
                }
@end verbatim
@end example

@cindex input(), and C++
@cindex yyinput()
(Note that if the scanner is compiled using @code{C++}, then
@code{input()} is instead referred to as @b{yyinput()}, in order to
avoid a name clash with the @code{C++} stream by the name of
@code{input}.)

@cindex flushing the internal buffer
@cindex YY_FLUSH_BUFFER
@code{YY_FLUSH_BUFFER;} flushes the scanner's internal buffer so that
the next time the scanner attempts to match a token, it will first
refill the buffer using @code{YY_INPUT()} (@pxref{Generated Scanner}).
This action is a special case of the more general
@code{yy_flush_buffer;} function, described below (@pxref{Multiple
Input Buffers})

@cindex yyterminate()
@cindex terminating with yyterminate()
@cindex exiting with yyterminate()
@cindex halting with yyterminate()
@code{yyterminate()} can be used in lieu of a return statement in an
action.  It terminates the scanner and returns a 0 to the scanner's
caller, indicating ``all done''.  By default, @code{yyterminate()} is
also called when an end-of-file is encountered.  It is a macro and may
be redefined.

@node Generated Scanner, Start Conditions, Actions, Top
@chapter The Generated Scanner

@cindex yylex(), in generated scanner
The output of @code{flex} is the file @file{lex.yy.c}, which contains
the scanning routine @code{yylex()}, a number of tables used by it for
matching tokens, and a number of auxiliary routines and macros.  By
default, @code{yylex()} is declared as follows:

@example
@verbatim
    int yylex()
        {
        ... various definitions and the actions in here ...
        }
@end verbatim
@end example

@cindex yylex(), overriding
(If your environment supports function prototypes, then it will be
@code{int yylex( void )}.)  This definition may be changed by defining
the @code{YY_DECL} macro.  For example, you could use:

@cindex yylex, overriding the prototype of
@example
@verbatim
    #define YY_DECL float lexscan( a, b ) float a, b;
@end verbatim
@end example

to give the scanning routine the name @code{lexscan}, returning a float,
and taking two floats as arguments.  Note that if you give arguments to
the scanning routine using a K&R-style/non-prototyped function
declaration, you must terminate the definition with a semi-colon (;).

@code{flex} generates @samp{C99} function definitions by
default. Flex used to have the ability to generate obsolete, er,
@samp{traditional}, function definitions. This was to support
bootstrapping gcc on old systems.  Unfortunately, traditional
definitions prevent us from using any standard data types smaller than
int (such as short, char, or bool) as function arguments.  Furthermore,
traditional definitions support added extra complexity in the skeleton file.
For this reason, current versions of @code{flex} generate standard C99 code
only, leaving K&R-style functions to the historians.

@cindex stdin, default for yyin
@cindex yyin
Whenever @code{yylex()} is called, it scans tokens from the global input
file @file{yyin} (which defaults to stdin).  It continues until it
either reaches an end-of-file (at which point it returns the value 0) or
one of its actions executes a @code{return} statement.

@cindex EOF and yyrestart()
@cindex end-of-file, and yyrestart()
@cindex yyrestart()
If the scanner reaches an end-of-file, subsequent calls are undefined
unless either @file{yyin} is pointed at a new input file (in which case
scanning continues from that file), or @code{yyrestart()} is called.
@code{yyrestart()} takes one argument, a @code{FILE *} pointer (which
can be NULL, if you've set up @code{YY_INPUT} to scan from a source other
than @code{yyin}), and initializes @file{yyin} for scanning from that
file.  Essentially there is no difference between just assigning
@file{yyin} to a new input file or using @code{yyrestart()} to do so;
the latter is available for compatibility with previous versions of
@code{flex}, and because it can be used to switch input files in the
middle of scanning.  It can also be used to throw away the current input
buffer, by calling it with an argument of @file{yyin}; but it would be
better to use @code{YY_FLUSH_BUFFER} (@pxref{Actions}).  Note that
@code{yyrestart()} does @emph{not} reset the start condition to
@code{INITIAL} (@pxref{Start Conditions}).

@cindex RETURN, within actions
If @code{yylex()} stops scanning due to executing a @code{return}
statement in one of the actions, the scanner may then be called again
and it will resume scanning where it left off.

@cindex YY_INPUT
By default (and for purposes of efficiency), the scanner uses
block-reads rather than simple @code{getc()} calls to read characters
from @file{yyin}.  The nature of how it gets its input can be controlled
by defining the @code{YY_INPUT} macro.  The calling sequence for
@code{YY_INPUT()} is @code{YY_INPUT(buf,result,max_size)}.  Its action
is to place up to @code{max_size} characters in the character array
@code{buf} and return in the integer variable @code{result} either the
number of characters read or the constant @code{YY_NULL} (0 on Unix
systems) to indicate @samp{EOF}.  The default @code{YY_INPUT} reads from
the global file-pointer @file{yyin}.

@cindex YY_INPUT, overriding
Here is a sample definition of @code{YY_INPUT} (in the definitions
section of the input file):

@example
@verbatim
    %{
    #define YY_INPUT(buf,result,max_size) \
        { \
        int c = getchar(); \
        result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \
        }
    %}
@end verbatim
@end example

This definition will change the input processing to occur one character
at a time.

@cindex yywrap()
When the scanner receives an end-of-file indication from YY_INPUT, it
then checks the @code{yywrap()} function.  If @code{yywrap()} returns
false (zero), then it is assumed that the function has gone ahead and
set up @file{yyin} to point to another input file, and scanning
continues.  If it returns true (non-zero), then the scanner terminates,
returning 0 to its caller.  Note that in either case, the start
condition remains unchanged; it does @emph{not} revert to
@code{INITIAL}.

@cindex yywrap, default for
@cindex noyywrap, %option
@cindex %option noyywrapp
If you do not supply your own version of @code{yywrap()}, then you must
either use @code{%option noyywrap} (in which case the scanner behaves as
though @code{yywrap()} returned 1), or you must link with @samp{-lfl} to
obtain the default version of the routine, which always returns 1.

For scanning from in-memory buffers (e.g., scanning strings), see
@ref{Scanning Strings}. @xref{Multiple Input Buffers}.

@cindex ECHO, and yyout
@cindex yyout
@cindex stdout, as default for yyout
The scanner writes its @code{ECHO} output to the @file{yyout} global
(default, @file{stdout}), which may be redefined by the user simply by
assigning it to some other @code{FILE} pointer.

@node Start Conditions, Multiple Input Buffers, Generated Scanner, Top
@chapter Start Conditions

@cindex start conditions
@code{flex} provides a mechanism for conditionally activating rules.
Any rule whose pattern is prefixed with @samp{<sc>} will only be active
when the scanner is in the @dfn{start condition} named @code{sc}.  For
example,

@example
@verbatim
    <STRING>[^"]*        { /* eat up the string body ... */
                ...
                }
@end verbatim
@end example

will be active only when the scanner is in the @code{STRING} start
condition, and

@cindex start conditions, multiple
@example
@verbatim
    <INITIAL,STRING,QUOTE>\.        { /* handle an escape ... */
                ...
                }
@end verbatim
@end example

will be active only when the current start condition is either
@code{INITIAL}, @code{STRING}, or @code{QUOTE}.

@cindex start conditions, inclusive v.s.@: exclusive
Start conditions are declared in the definitions (first) section of the
input using unindented lines beginning with either @samp{%s} or
@samp{%x} followed by a list of names.  The former declares
@dfn{inclusive} start conditions, the latter @dfn{exclusive} start
conditions.  A start condition is activated using the @code{BEGIN}
action.  Until the next @code{BEGIN} action is executed, rules with the
given start condition will be active and rules with other start
conditions will be inactive.  If the start condition is inclusive, then
rules with no start conditions at all will also be active.  If it is
exclusive, then @emph{only} rules qualified with the start condition
will be active.  A set of rules contingent on the same exclusive start
condition describe a scanner which is independent of any of the other
rules in the @code{flex} input.  Because of this, exclusive start
conditions make it easy to specify ``mini-scanners'' which scan portions
of the input that are syntactically different from the rest (e.g.,
comments).

If the distinction between inclusive and exclusive start conditions
is still a little vague, here's a simple example illustrating the
connection between the two.  The set of rules:

@cindex start conditions, inclusive
@example
@verbatim
    %s example
    %%

    <example>foo   do_something();

    bar            something_else();
@end verbatim
@end example

is equivalent to

@cindex start conditions, exclusive
@example
@verbatim
    %x example
    %%

    <example>foo   do_something();

    <INITIAL,example>bar    something_else();
@end verbatim
@end example

Without the @code{<INITIAL,example>} qualifier, the @code{bar} pattern in
the second example wouldn't be active (i.e., couldn't match) when in
start condition @code{example}.  If we just used @code{<example>} to
qualify @code{bar}, though, then it would only be active in
@code{example} and not in @code{INITIAL}, while in the first example
it's active in both, because in the first example the @code{example}
start condition is an inclusive @code{(%s)} start condition.

@cindex start conditions, special wildcard condition
Also note that the special start-condition specifier
@code{<*>}
matches every start condition.  Thus, the above example could also
have been written:

@cindex start conditions, use of wildcard condition (<*>)
@example
@verbatim
    %x example
    %%

    <example>foo   do_something();

    <*>bar    something_else();
@end verbatim
@end example

The default rule (to @code{ECHO} any unmatched character) remains active
in start conditions.  It is equivalent to:

@cindex start conditions, behavior of default rule
@example
@verbatim
    <*>.|\n     ECHO;
@end verbatim
@end example

@cindex BEGIN, explanation
@findex BEGIN
@vindex INITIAL
@code{BEGIN(0)} returns to the original state where only the rules with
no start conditions are active.  This state can also be referred to as
the start-condition @code{INITIAL}, so @code{BEGIN(INITIAL)} is
equivalent to @code{BEGIN(0)}.  (The parentheses around the start
condition name are not required but are considered good style.)

@code{BEGIN} actions can also be given as indented code at the beginning
of the rules section.  For example, the following will cause the scanner
to enter the @code{SPECIAL} start condition whenever @code{yylex()} is
called and the global variable @code{enter_special} is true:

@cindex start conditions, using BEGIN
@example
@verbatim
            int enter_special;

    %x SPECIAL
    %%
            if ( enter_special )
                BEGIN(SPECIAL);

    <SPECIAL>blahblahblah
    ...more rules follow...
@end verbatim
@end example

To illustrate the uses of start conditions, here is a scanner which
provides two different interpretations of a string like @samp{123.456}.
By default it will treat it as three tokens, the integer @samp{123}, a
dot (@samp{.}), and the integer @samp{456}.  But if the string is
preceded earlier in the line by the string @samp{expect-floats} it will
treat it as a single token, the floating-point number @samp{123.456}:

@cindex start conditions, for different interpretations of same input
@example
@verbatim
    %{
    #include <math.h>
    %}
    %s expect

    %%
    expect-floats        BEGIN(expect);

    <expect>[0-9]+.[0-9]+      {
                printf( "found a float, = %f\n",
                        atof( yytext ) );
                }
    <expect>\n           {
                /* that's the end of the line, so
                 * we need another "expect-number"
                 * before we'll recognize any more
                 * numbers
                 */
                BEGIN(INITIAL);
                }

    [0-9]+      {
                printf( "found an integer, = %d\n",
                        atoi( yytext ) );
                }

    "."         printf( "found a dot\n" );
@end verbatim
@end example

@cindex comments, example of scanning C comments
Here is a scanner which recognizes (and discards) C comments while
maintaining a count of the current input line.

@cindex recognizing C comments
@example
@verbatim
    %x comment
    %%
            int line_num = 1;

    "/*"         BEGIN(comment);

    <comment>[^*\n]*        /* eat anything that's not a '*' */
    <comment>"*"+[^*/\n]*   /* eat up '*'s not followed by '/'s */
    <comment>\n             ++line_num;
    <comment>"*"+"/"        BEGIN(INITIAL);
@end verbatim
@end example

This scanner goes to a bit of trouble to match as much
text as possible with each rule.  In general, when attempting to write
a high-speed scanner try to match as much possible in each rule, as
it's a big win.

Note that start-conditions names are really integer values and
can be stored as such.  Thus, the above could be extended in the
following fashion:

@cindex start conditions, integer values
@cindex using integer values of start condition names
@example
@verbatim
    %x comment foo
    %%
            int line_num = 1;
            int comment_caller;

    "/*"         {
                 comment_caller = INITIAL;
                 BEGIN(comment);
                 }

    ...

    <foo>"/*"    {
                 comment_caller = foo;
                 BEGIN(comment);
                 }

    <comment>[^*\n]*        /* eat anything that's not a '*' */
    <comment>"*"+[^*/\n]*   /* eat up '*'s not followed by '/'s */
    <comment>\n             ++line_num;
    <comment>"*"+"/"        BEGIN(comment_caller);
@end verbatim
@end example

@cindex YY_START, example
Furthermore, you can access the current start condition using the
integer-valued @code{YY_START} macro.  For example, the above
assignments to @code{comment_caller} could instead be written

@cindex getting current start state with YY_START
@example
@verbatim
    comment_caller = YY_START;
@end verbatim
@end example

@vindex YY_START
Flex provides @code{YYSTATE} as an alias for @code{YY_START} (since that
is what's used by AT&T @code{lex}).

For historical reasons, start conditions do not have their own
name-space within the generated scanner. The start condition names are
unmodified in the generated scanner and generated header.
@xref{option-header}. @xref{option-prefix}.



Finally, here's an example of how to match C-style quoted strings using
exclusive start conditions, including expanded escape sequences (but
not including checking for a string that's too long):

@cindex matching C-style double-quoted strings
@example
@verbatim
    %x str

    %%
            char string_buf[MAX_STR_CONST];
            char *string_buf_ptr;


    \"      string_buf_ptr = string_buf; BEGIN(str);

    <str>\"        { /* saw closing quote - all done */
            BEGIN(INITIAL);
            *string_buf_ptr = '\0';
            /* return string constant token type and
             * value to parser
             */
            }

    <str>\n        {
            /* error - unterminated string constant */
            /* generate error message */
            }

    <str>\\[0-7]{1,3} {
            /* octal escape sequence */
            int result;

            (void) sscanf( yytext + 1, "%o", &result );

            if ( result > 0xff )
                    /* error, constant is out-of-bounds */

            *string_buf_ptr++ = result;
            }

    <str>\\[0-9]+ {
            /* generate error - bad escape sequence; something
             * like '\48' or '\0777777'
             */
            }

    <str>\\n  *string_buf_ptr++ = '\n';
    <str>\\t  *string_buf_ptr++ = '\t';
    <str>\\r  *string_buf_ptr++ = '\r';
    <str>\\b  *string_buf_ptr++ = '\b';
    <str>\\f  *string_buf_ptr++ = '\f';

    <str>\\(.|\n)  *string_buf_ptr++ = yytext[1];

    <str>[^\\\n\"]+        {
            char *yptr = yytext;

            while ( *yptr )
                    *string_buf_ptr++ = *yptr++;
            }
@end verbatim
@end example

@cindex start condition, applying to multiple patterns
Often, such as in some of the examples above, you wind up writing a
whole bunch of rules all preceded by the same start condition(s).  Flex
makes this a little easier and cleaner by introducing a notion of start
condition @dfn{scope}.  A start condition scope is begun with:

@example
@verbatim
    <SCs>{
@end verbatim
@end example

where @code{<SCs>} is a list of one or more start conditions.  Inside the
start condition scope, every rule automatically has the prefix
@code{<SCs>} applied to it, until a @samp{@}} which matches the initial
@samp{@{}.  So, for example,

@cindex extended scope of start conditions
@example
@verbatim
    <ESC>{
        "\\n"   return '\n';
        "\\r"   return '\r';
        "\\f"   return '\f';
        "\\0"   return '\0';
    }
@end verbatim
@end example

is equivalent to:

@example
@verbatim
    <ESC>"\\n"  return '\n';
    <ESC>"\\r"  return '\r';
    <ESC>"\\f"  return '\f';
    <ESC>"\\0"  return '\0';
@end verbatim
@end example

Start condition scopes may be nested.

@cindex stacks, routines for manipulating
@cindex start conditions, use of a stack

The following routines are available for manipulating stacks of start conditions:

@deftypefun  void yy_push_state ( int @code{new_state} )
pushes the current start condition onto the top of the start condition
stack and switches to
@code{new_state}
as though you had used
@code{BEGIN new_state}
(recall that start condition names are also integers).
@end deftypefun

@deftypefun void yy_pop_state ()
pops the top of the stack and switches to it via
@code{BEGIN}.
@end deftypefun

@deftypefun int yy_top_state ()
returns the top of the stack without altering the stack's contents.
@end deftypefun

@cindex memory, for start condition stacks
The start condition stack grows dynamically and so has no built-in size
limitation.  If memory is exhausted, program execution aborts.

To use start condition stacks, your scanner must include a @code{%option
stack} directive (@pxref{Scanner Options}).

@node Multiple Input Buffers, EOF, Start Conditions, Top
@chapter Multiple Input Buffers

@cindex multiple input streams
Some scanners (such as those which support ``include'' files) require
reading from several input streams.  As @code{flex} scanners do a large
amount of buffering, one cannot control where the next input will be
read from by simply writing a @code{YY_INPUT()} which is sensitive to
the scanning context.  @code{YY_INPUT()} is only called when the scanner
reaches the end of its buffer, which may be a long time after scanning a
statement such as an @code{include} statement which requires switching
the input source.

To negotiate these sorts of problems, @code{flex} provides a mechanism
for creating and switching between multiple input buffers.  An input
buffer is created by using:

@cindex memory, allocating input buffers
@deftypefun YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size )
@end deftypefun

which takes a @code{FILE} pointer and a size and creates a buffer
associated with the given file and large enough to hold @code{size}
characters (when in doubt, use @code{YY_BUF_SIZE} for the size).  It
returns a @code{YY_BUFFER_STATE} handle, which may then be passed to
other routines (see below).
@tindex YY_BUFFER_STATE
The @code{YY_BUFFER_STATE} type is a
pointer to an opaque @code{struct yy_buffer_state} structure, so you may
safely initialize @code{YY_BUFFER_STATE} variables to @code{((YY_BUFFER_STATE)
0)} if you wish, and also refer to the opaque structure in order to
correctly declare input buffers in source files other than that of your
scanner.  Note that the @code{FILE} pointer in the call to
@code{yy_create_buffer} is only used as the value of @file{yyin} seen by
@code{YY_INPUT}.  If you redefine @code{YY_INPUT()} so it no longer uses
@file{yyin}, then you can safely pass a NULL @code{FILE} pointer to
@code{yy_create_buffer}.  You select a particular buffer to scan from
using:

@deftypefun void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer )
@end deftypefun

The above function switches the scanner's input buffer so subsequent tokens
will come from @code{new_buffer}.  Note that @code{yy_switch_to_buffer()} may
be used by @code{yywrap()} to set things up for continued scanning, instead of
opening a new file and pointing @file{yyin} at it. If you are looking for a
stack of input buffers, then you want to use @code{yypush_buffer_state()}
instead of this function. Note also that switching input sources via either
@code{yy_switch_to_buffer()} or @code{yywrap()} does @emph{not} change the
start condition.

@cindex memory, deleting input buffers
@deftypefun void yy_delete_buffer ( YY_BUFFER_STATE buffer )
@end deftypefun

is used to reclaim the storage associated with a buffer.  (@code{buffer}
can be NULL, in which case the routine does nothing.)  You can also clear
the current contents of a buffer using:

@cindex pushing an input buffer
@cindex stack, input buffer push
@deftypefun void yypush_buffer_state ( YY_BUFFER_STATE buffer )
@end deftypefun

This function pushes the new buffer state onto an internal stack. The pushed
state becomes the new current state. The stack is maintained by flex and will
grow as required. This function is intended to be used instead of
@code{yy_switch_to_buffer}, when you want to change states, but preserve the
current state for later use. 

@cindex popping an input buffer
@cindex stack, input buffer pop
@deftypefun void yypop_buffer_state ( )
@end deftypefun

This function removes the current state from the top of the stack, and deletes
it by calling @code{yy_delete_buffer}.  The next state on the stack, if any,
becomes the new current state.

@cindex clearing an input buffer
@cindex flushing an input buffer
@deftypefun void yy_flush_buffer ( YY_BUFFER_STATE buffer )
@end deftypefun

This function discards the buffer's contents,
so the next time the scanner attempts to match a token from the
buffer, it will first fill the buffer anew using
@code{YY_INPUT()}.

@deftypefun YY_BUFFER_STATE yy_new_buffer ( FILE *file, int size )
@end deftypefun

is an alias for @code{yy_create_buffer()},
provided for compatibility with the C++ use of @code{new} and
@code{delete} for creating and destroying dynamic objects.

@cindex YY_CURRENT_BUFFER, and multiple buffers Finally, the macro
@code{YY_CURRENT_BUFFER} macro returns a @code{YY_BUFFER_STATE} handle to the
current buffer. It should not be used as an lvalue.

@cindex EOF, example using multiple input buffers
Here are two examples of using these features for writing a scanner
which expands include files (the
@code{<<EOF>>}
feature is discussed below).

This first example uses yypush_buffer_state and yypop_buffer_state. Flex
maintains the stack internally.

@cindex handling include files with multiple input buffers
@example
@verbatim
    /* the "incl" state is used for picking up the name
     * of an include file
     */
    %x incl
    %%
    include             BEGIN(incl);

    [a-z]+              ECHO;
    [^a-z\n]*\n?        ECHO;

    <incl>[ \t]*      /* eat the whitespace */
    <incl>[^ \t\n]+   { /* got the include file name */
            yyin = fopen( yytext, "r" );

            if ( ! yyin )
                error( ... );

			yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));

            BEGIN(INITIAL);
            }

    <<EOF>> {
			yypop_buffer_state();

            if ( !YY_CURRENT_BUFFER )
                {
                yyterminate();
                }
            }
@end verbatim
@end example

The second example, below, does the same thing as the previous example did, but
manages its own input buffer stack manually (instead of letting flex do it).

@cindex handling include files with multiple input buffers
@example
@verbatim
    /* the "incl" state is used for picking up the name
     * of an include file
     */
    %x incl

    %{
    #define MAX_INCLUDE_DEPTH 10
    YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
    int include_stack_ptr = 0;
    %}

    %%
    include             BEGIN(incl);

    [a-z]+              ECHO;
    [^a-z\n]*\n?        ECHO;

    <incl>[ \t]*      /* eat the whitespace */
    <incl>[^ \t\n]+   { /* got the include file name */
            if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
                {
                fprintf( stderr, "Includes nested too deeply" );
                exit( 1 );
                }

            include_stack[include_stack_ptr++] =
                YY_CURRENT_BUFFER;

            yyin = fopen( yytext, "r" );

            if ( ! yyin )
                error( ... );

            yy_switch_to_buffer(
                yy_create_buffer( yyin, YY_BUF_SIZE ) );

            BEGIN(INITIAL);
            }

    <<EOF>> {
            if ( --include_stack_ptr  0 )
                {
                yyterminate();
                }

            else
                {
                yy_delete_buffer( YY_CURRENT_BUFFER );
                yy_switch_to_buffer(
                     include_stack[include_stack_ptr] );
                }
            }
@end verbatim
@end example

@anchor{Scanning Strings}
@cindex strings, scanning strings instead of files
The following routines are available for setting up input buffers for
scanning in-memory strings instead of files.  All of them create a new
input buffer for scanning the string, and return a corresponding
@code{YY_BUFFER_STATE} handle (which you should delete with
@code{yy_delete_buffer()} when done with it).  They also switch to the
new buffer using @code{yy_switch_to_buffer()}, so the next call to
@code{yylex()} will start scanning the string.

@deftypefun YY_BUFFER_STATE yy_scan_string ( const char *str )
scans a NUL-terminated string.
@end deftypefun

@deftypefun YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len )
scans @code{len} bytes (including possibly @code{NUL}s) starting at location
@code{bytes}.
@end deftypefun

Note that both of these functions create and scan a @emph{copy} of the
string or bytes.  (This may be desirable, since @code{yylex()} modifies
the contents of the buffer it is scanning.)  You can avoid the copy by
using:

@vindex YY_END_OF_BUFFER_CHAR
@deftypefun YY_BUFFER_STATE yy_scan_buffer (char *base, yy_size_t size)
which scans in place the buffer starting at @code{base}, consisting of
@code{size} bytes, the last two bytes of which @emph{must} be
@code{YY_END_OF_BUFFER_CHAR} (ASCII NUL).  These last two bytes are not
scanned; thus, scanning consists of @code{base[0]} through
@code{base[size-2]}, inclusive.
@end deftypefun

If you fail to set up @code{base} in this manner (i.e., forget the final
two @code{YY_END_OF_BUFFER_CHAR} bytes), then @code{yy_scan_buffer()}
returns a NULL pointer instead of creating a new input buffer.

@deftp  {Data type} yy_size_t
is an integral type to which you can cast an integer expression
reflecting the size of the buffer.
@end deftp

@node EOF, Misc Macros, Multiple Input Buffers, Top
@chapter End-of-File Rules

@cindex EOF, explanation
The special rule @code{<<EOF>>} indicates
actions which are to be taken when an end-of-file is
encountered and @code{yywrap()} returns non-zero (i.e., indicates
no further files to process).  The action must finish
by doing one of the following things:

@itemize
@item
@findex YY_NEW_FILE  (now obsolete)
assigning @file{yyin} to a new input file (in previous versions of
@code{flex}, after doing the assignment you had to call the special
action @code{YY_NEW_FILE}.  This is no longer necessary.)

@item
executing a @code{return} statement;

@item
executing the special @code{yyterminate()} action.

@item
or, switching to a new buffer using @code{yy_switch_to_buffer()} as
shown in the example above.
@end itemize

<<EOF>> rules may not be used with other patterns; they may only be
qualified with a list of start conditions.  If an unqualified <<EOF>>
rule is given, it applies to @emph{all} start conditions which do not
already have <<EOF>> actions.  To specify an <<EOF>> rule for only the
initial start condition, use:

@example
@verbatim
    <INITIAL><<EOF>>
@end verbatim
@end example

These rules are useful for catching things like unclosed comments.  An
example:

@cindex <<EOF>>, use of
@example
@verbatim
    %x quote
    %%

    ...other rules for dealing with quotes...

    <quote><<EOF>>   {
             error( "unterminated quote" );
             yyterminate();
             }
   <<EOF>>  {
             if ( *++filelist )
                 yyin = fopen( *filelist, "r" );
             else
                yyterminate();
             }
@end verbatim
@end example

@node Misc Macros, User Values, EOF, Top
@chapter Miscellaneous Macros

@hkindex YY_USER_ACTION
The macro @code{YY_USER_ACTION} can be defined to provide an action
which is always executed prior to the matched rule's action.  For
example, it could be #define'd to call a routine to convert yytext to
lower-case.  When @code{YY_USER_ACTION} is invoked, the variable
@code{yy_act} gives the number of the matched rule (rules are numbered
starting with 1).  Suppose you want to profile how often each of your
rules is matched.  The following would do the trick:

@cindex YY_USER_ACTION to track each time a rule is matched
@example
@verbatim
    #define YY_USER_ACTION ++ctr[yy_act]
@end verbatim
@end example

@vindex YY_NUM_RULES
where @code{ctr} is an array to hold the counts for the different rules.
Note that the macro @code{YY_NUM_RULES} gives the total number of rules
(including the default rule), even if you use @samp{-s)}, so a correct
declaration for @code{ctr} is:

@example
@verbatim
    int ctr[YY_NUM_RULES];
@end verbatim
@end example

@hkindex YY_USER_INIT
The macro @code{YY_USER_INIT} may be defined to provide an action which
is always executed before the first scan (and before the scanner's
internal initializations are done).  For example, it could be used to
call a routine to read in a data table or open a logging file.

@findex yy_set_interactive
The macro @code{yy_set_interactive(is_interactive)} can be used to
control whether the current buffer is considered @dfn{interactive}.  An
interactive buffer is processed more slowly, but must be used when the
scanner's input source is indeed interactive to avoid problems due to
waiting to fill buffers (see the discussion of the @samp{-I} flag in
@ref{Scanner Options}).  A non-zero value in the macro invocation marks
the buffer as interactive, a zero value as non-interactive.  Note that
use of this macro overrides @code{%option always-interactive} or
@code{%option never-interactive} (@pxref{Scanner Options}).
@code{yy_set_interactive()} must be invoked prior to beginning to scan
the buffer that is (or is not) to be considered interactive.

@cindex BOL, setting it
@findex yy_set_bol
The macro @code{yy_set_bol(at_bol)} can be used to control whether the
current buffer's scanning context for the next token match is done as
though at the beginning of a line.  A non-zero macro argument makes
rules anchored with @samp{^} active, while a zero argument makes
@samp{^} rules inactive.

@cindex BOL, checking the BOL flag
@findex YY_AT_BOL
The macro @code{YY_AT_BOL()} returns true if the next token scanned from
the current buffer will have @samp{^} rules active, false otherwise.

@cindex actions, redefining YY_BREAK
@hkindex YY_BREAK
In the generated scanner, the actions are all gathered in one large
switch statement and separated using @code{YY_BREAK}, which may be
redefined.  By default, it is simply a @code{break}, to separate each
rule's action from the following rule's.  Redefining @code{YY_BREAK}
allows, for example, C++ users to #define YY_BREAK to do nothing (while
being very careful that every rule ends with a @code{break} or a
@code{return}!) to avoid suffering from unreachable statement warnings
where because a rule's action ends with @code{return}, the
@code{YY_BREAK} is inaccessible.

@node User Values, Yacc, Misc Macros, Top
@chapter Values Available To the User

This chapter summarizes the various values available to the user in the
rule actions.

@table @code
@vindex yytext
@item  char *yytext
holds the text of the current token.  It may be modified but not
lengthened (you cannot append characters to the end).

@cindex yytext, default array size
@cindex array, default size for yytext
@vindex YYLMAX
If the special directive @code{%array} appears in the first section of
the scanner description, then @code{yytext} is instead declared
@code{char yytext[YYLMAX]}, where @code{YYLMAX} is a macro definition
that you can redefine in the first section if you don't like the default
value (generally 8KB).  Using @code{%array} results in somewhat slower
scanners, but the value of @code{yytext} becomes immune to calls to
@code{unput()}, which potentially destroy its value when @code{yytext} is
a character pointer.  The opposite of @code{%array} is @code{%pointer},
which is the default.

@cindex C++ and %array
You cannot use @code{%array} when generating C++ scanner classes (the
@samp{-+} flag).

@vindex yyleng
@item  int yyleng
holds the length of the current token.

@vindex yyin
@item  FILE *yyin
is the file which by default @code{flex} reads from.  It may be
redefined but doing so only makes sense before scanning begins or after
an EOF has been encountered.  Changing it in the midst of scanning will
have unexpected results since @code{flex} buffers its input; use
@code{yyrestart()} instead.  Once scanning terminates because an
end-of-file has been seen, you can assign @file{yyin} at the new input
file and then call the scanner again to continue scanning.

@findex yyrestart
@item  void yyrestart( FILE *new_file )
may be called to point @file{yyin} at the new input file.  The
switch-over to the new file is immediate (any previously buffered-up
input is lost).  Note that calling @code{yyrestart()} with @file{yyin}
as an argument thus throws away the current input buffer and continues
scanning the same input file.

@vindex yyout
@item  FILE *yyout
is the file to which @code{ECHO} actions are done.  It can be reassigned
by the user.

@vindex YY_CURRENT_BUFFER
@item  YY_CURRENT_BUFFER
returns a @code{YY_BUFFER_STATE} handle to the current buffer.

@vindex YY_START
@item  YY_START
returns an integer value corresponding to the current start condition.
You can subsequently use this value with @code{BEGIN} to return to that
start condition.
@end table

@node Yacc, Scanner Options, User Values, Top
@chapter Interfacing with Yacc

@cindex yacc, interface

@vindex yylval, with yacc
One of the main uses of @code{flex} is as a companion to the @code{yacc}
parser-generator.  @code{yacc} parsers expect to call a routine named
@code{yylex()} to find the next input token.  The routine is supposed to
return the type of the next token as well as putting any associated
value in the global @code{yylval}.  To use @code{flex} with @code{yacc},
one specifies the @samp{-d} option to @code{yacc} to instruct it to
generate the file @file{y.tab.h} containing definitions of all the
@code{%tokens} appearing in the @code{yacc} input.  This file is then
included in the @code{flex} scanner.  For example, if one of the tokens
is @code{TOK_NUMBER}, part of the scanner might look like:

@cindex yacc interface
@example
@verbatim
    %{
    #include "y.tab.h"
    %}

    %%

    [0-9]+        yylval = atoi( yytext ); return TOK_NUMBER;
@end verbatim
@end example

@node Scanner Options, Performance, Yacc, Top
@chapter Scanner Options

@cindex command-line options
@cindex options, command-line
@cindex arguments, command-line

The various @code{flex} options are categorized by function in the following
menu. If you want to lookup a particular option by name, @xref{Index of Scanner Options}.

@menu
* Options for Specifying Filenames::  
* Options Affecting Scanner Behavior::  
* Code-Level And API Options::  
* Options for Scanner Speed and Size::  
* Debugging Options::           
* Miscellaneous Options::       
@end menu

Even though there are many scanner options, a typical scanner might only
specify the following options:

@example
@verbatim
%option   8bit reentrant bison-bridge
%option   warn nodefault
%option   yylineno
%option   outfile="scanner.c" header-file="scanner.h"
@end verbatim
@end example

The first line specifies the general type of scanner we want. The second line
specifies that we are being careful. The third line asks flex to track line
numbers. The last line tells flex what to name the files. (The options can be
specified in any order. We just divided them.)

@code{flex} also provides a mechanism for controlling options within the
scanner specification itself, rather than from the flex command-line.
This is done by including @code{%option} directives in the first section
of the scanner specification.  You can specify multiple options with a
single @code{%option} directive, and multiple directives in the first
section of your flex input file.

Most options are given simply as names, optionally preceded by the
word @samp{no} (with no intervening whitespace) to negate their meaning.
The names are the same as their long-option equivalents (but without the
leading @samp{--} ).

@code{flex} scans your rule actions to determine whether you use the
@code{REJECT} or @code{yymore()} features.  The @code{REJECT} and
@code{yymore} options are available to override its decision as to
whether you use the options, either by setting them (e.g., @code{%option
reject)} to indicate the feature is indeed used, or unsetting them to
indicate it actually is not used (e.g., @code{%option noyymore)}.


A number of options are available for lint purists who want to suppress
the appearance of unneeded routines in the generated scanner.  Each of
the following, if unset (e.g., @code{%option nounput}), results in the
corresponding routine not appearing in the generated scanner:

@example
@verbatim
    input, unput
    yy_push_state, yy_pop_state, yy_top_state
    yy_scan_buffer, yy_scan_bytes, yy_scan_string

    yyget_extra, yyset_extra, yyget_leng, yyget_text,
    yyget_lineno, yyset_lineno, yyget_in, yyset_in,
    yyget_out, yyset_out, yyget_lval, yyset_lval,
    yyget_lloc, yyset_lloc, yyget_debug, yyset_debug
@end verbatim
@end example

(though @code{yy_push_state()} and friends won't appear anyway unless
you use @code{%option stack)}.

@node Options for Specifying Filenames, Options Affecting Scanner Behavior, Scanner Options, Scanner Options
@section Options for Specifying Filenames

@table @samp

@anchor{option-header}
@opindex ---header-file
@opindex header-file
@item --header-file=FILE, @code{%option header-file="FILE"}
instructs flex to write a C header to @file{FILE}. This file contains
function prototypes, extern variables, and types used by the scanner.
Only the external API is exported by the header file. Many macros that
are usable from within scanner actions are not exported to the header
file. This is due to namespace problems and the goal of a clean
external API.

While in the header, the macro @code{yyIN_HEADER} is defined, where @samp{yy}
is substituted with the appropriate prefix.

The @samp{--header-file} option is not compatible with the @samp{--c++} option,
since the C++ scanner provides its own header in @file{yyFlexLexer.h}.



@anchor{option-outfile}
@opindex -o
@opindex ---outfile
@opindex outfile
@item -oFILE, --outfile=FILE, @code{%option outfile="FILE"}
directs flex to write the scanner to the file @file{FILE} instead of
@file{lex.yy.c}.  If you combine @samp{--outfile} with the @samp{--stdout} option,
then the scanner is written to @file{stdout} but its @code{#line}
directives (see the @samp{-l} option above) refer to the file
@file{FILE}.



@anchor{option-stdout}
@opindex -t
@opindex ---stdout
@opindex stdout
@item -t, --stdout, @code{%option stdout}
instructs @code{flex} to write the scanner it generates to standard
output instead of @file{lex.yy.c}.



@opindex ---skel
@item -SFILE, --skel=FILE
overrides the default skeleton file from which
@code{flex}
constructs its scanners.  You'll never need this option unless you are doing
@code{flex}
maintenance or development.

@opindex ---tables-file
@opindex tables-file
@item --tables-file=FILE
Write serialized scanner dfa tables to FILE. The generated scanner will not
contain the tables, and requires them to be loaded at runtime.
@xref{serialization}.

@opindex ---tables-verify
@opindex tables-verify
@item --tables-verify
This option is for flex development. We document it here in case you stumble
upon it by accident or in case you suspect some inconsistency in the serialized
tables.  Flex will serialize the scanner dfa tables but will also generate the
in-code tables as it normally does. At runtime, the scanner will verify that
the serialized tables match the in-code tables, instead of loading them. 

@end table

@node Options Affecting Scanner Behavior, Code-Level And API Options, Options for Specifying Filenames, Scanner Options
@section Options Affecting Scanner Behavior

@table @samp
@anchor{option-case-insensitive}
@opindex -i
@opindex ---case-insensitive
@opindex case-insensitive
@item -i, --case-insensitive, @code{%option case-insensitive}
instructs @code{flex} to generate a @dfn{case-insensitive} scanner.  The
case of letters given in the @code{flex} input patterns will be ignored,
and tokens in the input will be matched regardless of case.  The matched
text given in @code{yytext} will have the preserved case (i.e., it will
not be folded).  For tricky behavior, see @ref{case and character ranges}.



@anchor{option-lex-compat}
@opindex -l
@opindex ---lex-compat
@opindex lex-compat
@item -l, --lex-compat, @code{%option lex-compat}
turns on maximum compatibility with the original AT&T @code{lex}
implementation.  Note that this does not mean @emph{full} compatibility.
Use of this option costs a considerable amount of performance, and it
cannot be used with the @samp{--c++}, @samp{--full}, @samp{--fast}, @samp{-Cf}, or
@samp{-CF} options.  For details on the compatibilities it provides, see
@ref{Lex and Posix}.  This option also results in the name
@code{YY_FLEX_LEX_COMPAT} being @code{#define}'d in the generated scanner.



@anchor{option-batch}
@opindex -B
@opindex ---batch
@opindex batch
@item -B, --batch, @code{%option batch}
instructs @code{flex} to generate a @dfn{batch} scanner, the opposite of
@emph{interactive} scanners generated by @samp{--interactive} (see below).  In
general, you use @samp{-B} when you are @emph{certain} that your scanner
will never be used interactively, and you want to squeeze a
@emph{little} more performance out of it.  If your goal is instead to
squeeze out a @emph{lot} more performance, you should be using the
@samp{-Cf} or @samp{-CF} options, which turn on @samp{--batch} automatically
anyway.



@anchor{option-interactive}
@opindex -I
@opindex ---interactive
@opindex interactive
@item -I, --interactive, @code{%option interactive}
instructs @code{flex} to generate an @i{interactive} scanner.  An
interactive scanner is one that only looks ahead to decide what token
has been matched if it absolutely must.  It turns out that always
looking one extra character ahead, even if the scanner has already seen
enough text to disambiguate the current token, is a bit faster than only
looking ahead when necessary.  But scanners that always look ahead give
dreadful interactive performance; for example, when a user types a
newline, it is not recognized as a newline token until they enter
@emph{another} token, which often means typing in another whole line.

@code{flex} scanners default to @code{interactive} unless you use the
@samp{-Cf} or @samp{-CF} table-compression options
(@pxref{Performance}).  That's because if you're looking for
high-performance you should be using one of these options, so if you
didn't, @code{flex} assumes you'd rather trade off a bit of run-time
performance for intuitive interactive behavior.  Note also that you
@emph{cannot} use @samp{--interactive} in conjunction with @samp{-Cf} or
@samp{-CF}.  Thus, this option is not really needed; it is on by default
for all those cases in which it is allowed.

You can force a scanner to
@emph{not}
be interactive by using
@samp{--batch}



@anchor{option-7bit}
@opindex -7
@opindex ---7bit
@opindex 7bit
@item -7, --7bit, @code{%option 7bit}
instructs @code{flex} to generate a 7-bit scanner, i.e., one which can
only recognize 7-bit characters in its input.  The advantage of using
@samp{--7bit} is that the scanner's tables can be up to half the size of
those generated using the @samp{--8bit}.  The disadvantage is that such
scanners often hang or crash if their input contains an 8-bit character.

Note, however, that unless you generate your scanner using the
@samp{-Cf} or @samp{-CF} table compression options, use of @samp{--7bit}
will save only a small amount of table space, and make your scanner
considerably less portable.  @code{Flex}'s default behavior is to
generate an 8-bit scanner unless you use the @samp{-Cf} or @samp{-CF},
in which case @code{flex} defaults to generating 7-bit scanners unless
your site was always configured to generate 8-bit scanners (as will
often be the case with non-USA sites).  You can tell whether flex
generated a 7-bit or an 8-bit scanner by inspecting the flag summary in
the @samp{--verbose} output as described above.

Note that if you use @samp{-Cfe} or @samp{-CFe} @code{flex} still
defaults to generating an 8-bit scanner, since usually with these
compression options full 8-bit tables are not much more expensive than
7-bit tables.



@anchor{option-8bit}
@opindex -8
@opindex ---8bit
@opindex 8bit
@item -8, --8bit, @code{%option 8bit}
instructs @code{flex} to generate an 8-bit scanner, i.e., one which can
recognize 8-bit characters.  This flag is only needed for scanners
generated using @samp{-Cf} or @samp{-CF}, as otherwise flex defaults to
generating an 8-bit scanner anyway.

See the discussion of
@samp{--7bit}
above for @code{flex}'s default behavior and the tradeoffs between 7-bit
and 8-bit scanners.



@anchor{option-default}
@opindex ---default
@opindex default
@item --default, @code{%option default}
generate the default rule.



@anchor{option-always-interactive}
@opindex ---always-interactive
@opindex always-interactive
@item --always-interactive, @code{%option always-interactive}
instructs flex to generate a scanner which always considers its input
@emph{interactive}.  Normally, on each new input file the scanner calls
@code{isatty()} in an attempt to determine whether the scanner's input
source is interactive and thus should be read a character at a time.
When this option is used, however, then no such call is made.



@opindex ---never-interactive
@item --never-interactive, @code{--never-interactive}
instructs flex to generate a scanner which never considers its input
interactive.  This is the opposite of @code{always-interactive}.


@anchor{option-posix}
@opindex -X
@opindex ---posix
@opindex posix
@item -X, --posix, @code{%option posix}
turns on maximum compatibility with the POSIX 1003.2-1992 definition of
@code{lex}.  Since @code{flex} was originally designed to implement the
POSIX definition of @code{lex} this generally involves very few changes
in behavior.  At the current writing the known differences between
@code{flex} and the POSIX standard are:

@itemize
@item
In POSIX and AT&T @code{lex}, the repeat operator, @samp{@{@}}, has lower
precedence than concatenation (thus @samp{ab@{3@}} yields @samp{ababab}).
Most POSIX utilities use an Extended Regular Expression (ERE) precedence
that has the precedence of the repeat operator higher than concatenation
(which causes @samp{ab@{3@}} to yield @samp{abbb}).  By default, @code{flex}
places the precedence of the repeat operator higher than concatenation
which matches the ERE processing of other POSIX utilities.  When either
@samp{--posix} or @samp{-l} are specified, @code{flex} will use the
traditional AT&T and POSIX-compliant precedence for the repeat operator
where concatenation has higher precedence than the repeat operator.
@end itemize


@anchor{option-stack}
@opindex ---stack
@opindex stack
@item --stack, @code{%option stack}
enables the use of
start condition stacks (@pxref{Start Conditions}).



@anchor{option-stdinit}
@opindex ---stdinit
@opindex stdinit
@item --stdinit, @code{%option stdinit}
if set (i.e., @b{%option stdinit)} initializes @code{yyin} and
@code{yyout} to @file{stdin} and @file{stdout}, instead of the default of
@file{NULL}.  Some existing @code{lex} programs depend on this behavior,
even though it is not compliant with ANSI C, which does not require
@file{stdin} and @file{stdout} to be compile-time constant. In a
reentrant scanner, however, this is not a problem since initialization
is performed in @code{yylex_init} at runtime.



@anchor{option-yylineno}
@opindex ---yylineno
@opindex yylineno
@item --yylineno, @code{%option yylineno}
directs @code{flex} to generate a scanner
that maintains the number of the current line read from its input in the
global variable @code{yylineno}.  This option is implied by @code{%option
lex-compat}.  In a reentrant C scanner, the macro @code{yylineno} is
accessible regardless of the value of @code{%option yylineno}, however, its
value is not modified by @code{flex} unless @code{%option yylineno} is enabled.



@anchor{option-yywrap}
@opindex ---yywrap
@opindex yywrap
@item --yywrap, @code{%option yywrap}
if unset (i.e., @code{--noyywrap)}, makes the scanner not call
@code{yywrap()} upon an end-of-file, but simply assume that there are no
more files to scan (until the user points @file{yyin} at a new file and
calls @code{yylex()} again).

@end table

@node Code-Level And API Options, Options for Scanner Speed and Size, Options Affecting Scanner Behavior, Scanner Options
@section Code-Level And API Options

@table @samp

@anchor{option-ansi-definitions}
@opindex ---option-ansi-definitions
@opindex ansi-definitions
@item --ansi-definitions, @code{%option ansi-definitions}
Deprecated, ignored

@anchor{option-ansi-prototypes}
@opindex ---option-ansi-prototypes
@opindex ansi-prototypes
@item --ansi-prototypes, @code{%option ansi-prototypes}
Deprecated, ignored

@anchor{option-bison-bridge}
@opindex ---bison-bridge
@opindex bison-bridge
@item --bison-bridge, @code{%option bison-bridge}
instructs flex to generate a C scanner that is
meant to be called by a
@code{GNU bison}
parser. The scanner has minor API changes for
@code{bison}
compatibility. In particular, the declaration of
@code{yylex}
is modified to take an additional parameter,
@code{yylval}.
@xref{Bison Bridge}.

@anchor{option-bison-locations}
@opindex ---bison-locations
@opindex bison-locations
@item --bison-locations, @code{%option bison-locations}
instruct flex that 
@code{GNU bison} @code{%locations} are being used.
This means @code{yylex} will be passed
an additional parameter, @code{yylloc}. This option
implies @code{%option bison-bridge}.
@xref{Bison Bridge}.

@anchor{option-noline}
@opindex -L
@opindex ---noline
@opindex noline
@item -L, --noline, @code{%option noline}
instructs
@code{flex}
not to generate
@code{#line}
directives.  Without this option,
@code{flex}
peppers the generated scanner
with @code{#line} directives so error messages in the actions will be correctly
located with respect to either the original
@code{flex}
input file (if the errors are due to code in the input file), or
@file{lex.yy.c}
(if the errors are
@code{flex}'s
fault -- you should report these sorts of errors to the email address
given in @ref{Reporting Bugs}).



@anchor{option-reentrant}
@opindex -R
@opindex ---reentrant
@opindex reentrant
@item -R, --reentrant, @code{%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
@pxref{Reentrant}).  Because of the API difference between
reentrant and non-reentrant @code{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 @samp{--c++} option.

The option @samp{--reentrant} does not affect the performance of
the scanner.



@anchor{option-c++}
@opindex -+
@opindex ---c++
@opindex c++
@item -+, --c++, @code{%option c++}
specifies that you want flex to generate a C++
scanner class.  @xref{Cxx}, for
details.



@anchor{option-array}
@opindex ---array
@opindex array
@item --array, @code{%option array}
specifies that you want yytext to be an array instead of a char*



@anchor{option-pointer}
@opindex ---pointer
@opindex pointer
@item --pointer, @code{%option pointer}
specify that  @code{yytext} should be a @code{char *}, not an array.
This default is @code{char *}.



@anchor{option-prefix}
@opindex -P
@opindex ---prefix
@opindex prefix
@item -PPREFIX, --prefix=PREFIX, @code{%option prefix="PREFIX"}
changes the default @samp{yy} prefix used by @code{flex} for all
globally-visible variable and function names to instead be
@samp{PREFIX}.  For example, @samp{--prefix=foo} changes the name of
@code{yytext} to @code{footext}.  It also changes the name of the default
output file from @file{lex.yy.c} to @file{lex.foo.c}.  Here is a partial
list of the names affected:

@example
@verbatim
    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
@end verbatim
@end example

(If you are using a C++ scanner, then only @code{yywrap} and
@code{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
@code{flex}
programs into the same executable.  Note, though, that using this
option also renames
@code{yywrap()},
so you now
@emph{must}
either
provide your own (appropriately-named) version of the routine for your
scanner, or use
@code{%option noyywrap},
as linking with
@samp{-lfl}
no longer provides one for you by default.



@anchor{option-main}
@opindex ---main
@opindex main
@item --main, @code{%option main}
 directs flex to provide a default @code{main()} program for the
scanner, which simply calls @code{yylex()}.  This option implies
@code{noyywrap} (see below).



@anchor{option-nounistd}
@opindex ---nounistd
@opindex nounistd
@item --nounistd, @code{%option nounistd}
suppresses inclusion of the non-ANSI header file @file{unistd.h}. This option
is meant to target environments in which @file{unistd.h} does not exist. Be aware
that certain options may cause flex to generate code that relies on functions
normally found in @file{unistd.h}, (e.g. @code{isatty()}, @code{read()}.)
If you wish to use these functions, you will have to inform your compiler where
to find them.
@xref{option-always-interactive}. @xref{option-read}.



@anchor{option-yyclass}
@opindex ---yyclass
@opindex yyclass
@item --yyclass=NAME, @code{%option yyclass="NAME"}
only applies when generating a C++ scanner (the @samp{--c++} option).  It
informs @code{flex} that you have derived @code{NAME} as a subclass of
@code{yyFlexLexer}, so @code{flex} will place your actions in the member
function @code{foo::yylex()} instead of @code{yyFlexLexer::yylex()}.  It
also generates a @code{yyFlexLexer::yylex()} member function that emits
a run-time error (by invoking @code{yyFlexLexer::LexerError())} if
called.  @xref{Cxx}.

@end table

@node Options for Scanner Speed and Size, Debugging Options, Code-Level And API Options, Scanner Options
@section Options for Scanner Speed and Size

@table @samp

@item -C[aefFmr]
controls the degree of table compression and, more generally, trade-offs
between small scanners and fast scanners.

@table @samp
@opindex -C
@item -C
A lone @samp{-C} specifies that the scanner tables should be compressed
but neither equivalence classes nor meta-equivalence classes should be
used.

@anchor{option-align}
@opindex -Ca
@opindex ---align
@opindex align
@item -Ca, --align, @code{%option align}
(``align'') instructs flex to trade off larger tables in the
generated scanner for faster performance because the elements of
the tables are better aligned for memory access and computation.  On some
RISC architectures, fetching and manipulating longwords is more efficient
than with smaller-sized units such as shortwords.  This option can
quadruple the size of the tables used by your scanner.

@anchor{option-ecs}
@opindex -Ce
@opindex ---ecs
@opindex ecs
@item -Ce, --ecs, @code{%option ecs}
directs @code{flex} to construct @dfn{equivalence classes}, i.e., sets
of characters which have identical lexical properties (for example, if
the only appearance of digits in the @code{flex} input is in the
character class ``[0-9]'' then the digits '0', '1', ..., '9' will all be
put in the same equivalence class).  Equivalence classes usually give
dramatic reductions in the final table/object file sizes (typically a
factor of 2-5) and are pretty cheap performance-wise (one array look-up
per character scanned).

@opindex -Cf
@item -Cf
specifies that the @dfn{full} scanner tables should be generated -
@code{flex} should not compress the tables by taking advantages of
similar transition functions for different states.

@opindex -CF
@item -CF
specifies that the alternate fast scanner representation (described
above under the @samp{--fast} flag) should be used.  This option cannot be
used with @samp{--c++}.

@anchor{option-meta-ecs}
@opindex -Cm
@opindex ---meta-ecs
@opindex meta-ecs
@item -Cm, --meta-ecs, @code{%option meta-ecs}
directs
@code{flex}
to construct
@dfn{meta-equivalence classes},
which are sets of equivalence classes (or characters, if equivalence
classes are not being used) that are commonly used together.  Meta-equivalence
classes are often a big win when using compressed tables, but they
have a moderate performance impact (one or two @code{if} tests and one
array look-up per character scanned).

@anchor{option-read}
@opindex -Cr
@opindex ---read
@opindex read
@item -Cr, --read, @code{%option read}
causes the generated scanner to @emph{bypass} use of the standard I/O
library (@code{stdio}) for input.  Instead of calling @code{fread()} or
@code{getc()}, the scanner will use the @code{read()} system call,
resulting in a performance gain which varies from system to system, but
in general is probably negligible unless you are also using @samp{-Cf}
or @samp{-CF}.  Using @samp{-Cr} can cause strange behavior if, for
example, you read from @file{yyin} using @code{stdio} prior to calling
the scanner (because the scanner will miss whatever text your previous
reads left in the @code{stdio} input buffer).  @samp{-Cr} has no effect
if you define @code{YY_INPUT()} (@pxref{Generated Scanner}).
@end table

The options @samp{-Cf} or @samp{-CF} and @samp{-Cm} do not make sense
together - there is no opportunity for meta-equivalence classes if the
table is not being compressed.  Otherwise the options may be freely
mixed, and are cumulative.

The default setting is @samp{-Cem}, which specifies that @code{flex}
should generate equivalence classes and meta-equivalence classes.  This
setting provides the highest degree of table compression.  You can trade
off faster-executing scanners at the cost of larger tables with the
following generally being true:

@example
@verbatim
    slowest & smallest
          -Cem
          -Cm
          -Ce
          -C
          -C{f,F}e
          -C{f,F}
          -C{f,F}a
    fastest & largest
@end verbatim
@end example

Note that scanners with the smallest tables are usually generated and
compiled the quickest, so during development you will usually want to
use the default, maximal compression.

@samp{-Cfe} is often a good compromise between speed and size for
production scanners.

@anchor{option-full}
@opindex -f
@opindex ---full
@opindex full
@item -f, --full, @code{%option full}
specifies
@dfn{fast scanner}.
No table compression is done and @code{stdio} is bypassed.
The result is large but fast.  This option is equivalent to
@samp{--Cfr}


@anchor{option-fast}
@opindex -F
@opindex ---fast
@opindex fast
@item -F, --fast, @code{%option fast}
specifies that the @emph{fast} scanner table representation should be
used (and @code{stdio} bypassed).  This representation is about as fast
as the full table representation @samp{--full}, and for some sets of
patterns will be considerably smaller (and for others, larger).  In
general, if the pattern set contains both @emph{keywords} and a
catch-all, @emph{identifier} rule, such as in the set:

@example
@verbatim
    "case"    return TOK_CASE;
    "switch"  return TOK_SWITCH;
    ...
    "default" return TOK_DEFAULT;
    [a-z]+    return TOK_ID;
@end verbatim
@end example

then you're better off using the full table representation.  If only
the @emph{identifier} rule is present and you then use a hash table or some such
to detect the keywords, you're better off using
@samp{--fast}.

This option is equivalent to @samp{-CFr}.  It cannot be used
with @samp{--c++}.

@end table

@node Debugging Options, Miscellaneous Options, Options for Scanner Speed and Size, Scanner Options
@section Debugging Options

@table @samp

@anchor{option-backup}
@opindex -b
@opindex ---backup
@opindex backup
@item -b, --backup, @code{%option backup}
Generate backing-up information to @file{lex.backup}.  This is a list of
scanner states which require backing up and the input characters on
which they do so.  By adding rules one can remove backing-up states.  If
@emph{all} backing-up states are eliminated and @samp{-Cf} or @code{-CF}
is used, the generated scanner will run faster (see the @samp{--perf-report} flag).
Only users who wish to squeeze every last cycle out of their scanners
need worry about this option.  (@pxref{Performance}).



@anchor{option-debug}
@opindex -d
@opindex ---debug
@opindex debug
@item -d, --debug, @code{%option debug}
makes the generated scanner run in @dfn{debug} mode.  Whenever a pattern
is recognized and the global variable @code{yy_flex_debug} is non-zero
(which is the default), the scanner will write to @file{stderr} a line
of the form:

@example
@verbatim
    -accepting rule at line 53 ("the matched text")
@end verbatim
@end example

The line number refers to the location of the rule in the file defining
the scanner (i.e., the file that was fed to flex).  Messages are also
generated when the scanner backs up, accepts the default rule, reaches
the end of its input buffer (or encounters a NUL; at this point, the two
look the same as far as the scanner's concerned), or reaches an
end-of-file.



@anchor{option-perf-report}
@opindex -p
@opindex ---perf-report
@opindex perf-report
@item -p, --perf-report, @code{%option perf-report}
generates a performance report to @file{stderr}.  The report consists of
comments regarding features of the @code{flex} input file which will
cause a serious loss of performance in the resulting scanner.  If you
give the flag twice, you will also get comments regarding features that
lead to minor performance losses.

Note that the use of @code{REJECT}, and
variable trailing context (@pxref{Limitations}) entails a substantial
performance penalty; use of @code{yymore()}, the @samp{^} operator, and
the @samp{--interactive} flag entail minor performance penalties.



@anchor{option-nodefault}
@opindex -s
@opindex ---nodefault
@opindex nodefault
@item -s, --nodefault, @code{%option nodefault}
causes the @emph{default rule} (that unmatched scanner input is echoed
to @file{stdout)} to be suppressed.  If the scanner encounters input
that does not match any of its rules, it aborts with an error.  This
option is useful for finding holes in a scanner's rule set.



@anchor{option-trace}
@opindex -T
@opindex ---trace
@opindex trace
@item -T, --trace, @code{%option trace}
makes @code{flex} run in @dfn{trace} mode.  It will generate a lot of
messages to @file{stderr} concerning the form of the input and the
resultant non-deterministic and deterministic finite automata.  This
option is mostly for use in maintaining @code{flex}.



@anchor{option-nowarn}
@opindex -w
@opindex ---nowarn
@opindex nowarn
@item -w, --nowarn, @code{%option nowarn}
suppresses warning messages.



@anchor{option-verbose}
@opindex -v
@opindex ---verbose
@opindex verbose
@item -v, --verbose, @code{%option verbose}
specifies that @code{flex} should write to @file{stderr} a summary of
statistics regarding the scanner it generates.  Most of the statistics
are meaningless to the casual @code{flex} user, but the first line
identifies the version of @code{flex} (same as reported by @samp{--version}),
and the next line the flags used when generating the scanner, including
those that are on by default.



@anchor{option-warn}
@opindex ---warn
@opindex warn
@item --warn, @code{%option warn}
warn about certain things. In particular, if the default rule can be
matched but no default rule has been given, the flex will warn you.
We recommend using this option always.

@end table

@node Miscellaneous Options,  , Debugging Options, Scanner Options
@section Miscellaneous Options

@table @samp
@opindex -c
@item -c
A do-nothing option included for POSIX compliance.

@opindex -h
@opindex ---help
@item -h, -?, --help
generates a ``help'' summary of @code{flex}'s options to @file{stdout}
and then exits.

@opindex -n
@item -n
Another do-nothing option included for
POSIX compliance.

@opindex -V
@opindex ---version
@item -V, --version
prints the version number to @file{stdout} and exits.

@end table


@node Performance, Cxx, Scanner Options, Top
@chapter Performance Considerations

@cindex performance, considerations
The main design goal of @code{flex} is that it generate high-performance
scanners.  It has been optimized for dealing well with large sets of
rules.  Aside from the effects on scanner speed of the table compression
@samp{-C} options outlined above, there are a number of options/actions
which degrade performance.  These are, from most expensive to least:

@cindex REJECT, performance costs
@cindex yylineno, performance costs
@cindex trailing context, performance costs
@example
@verbatim
    REJECT
    arbitrary trailing context

    pattern sets that require backing up
    %option yylineno
    %array

    %option interactive
    %option always-interactive

    ^ beginning-of-line operator
    yymore()
@end verbatim
@end example

with the first two all being quite expensive and the last two being
quite cheap.  Note also that @code{unput()} is implemented as a routine
call that potentially does quite a bit of work, while @code{yyless()} is
a quite-cheap macro. So if you are just putting back some excess text
you scanned, use @code{yyless()}.

@code{REJECT} should be avoided at all costs when performance is
important.  It is a particularly expensive option.

There is one case when @code{%option yylineno} can be expensive. That is when
your patterns match long tokens that could @emph{possibly} contain a newline
character. There is no performance penalty for rules that can not possibly
match newlines, since flex does not need to check them for newlines.  In
general, you should avoid rules such as @code{[^f]+}, which match very long
tokens, including newlines, and may possibly match your entire file! A better
approach is to separate @code{[^f]+} into two rules:

@example
@verbatim
%option yylineno
%%
    [^f\n]+
    \n+
@end verbatim
@end example

The above scanner does not incur a performance penalty.

@cindex patterns, tuning for performance
@cindex performance, backing up
@cindex backing up, example of eliminating
Getting rid of backing up is messy and often may be an enormous amount
of work for a complicated scanner.  In principal, one begins by using
the @samp{-b} flag to generate a @file{lex.backup} file.  For example,
on the input:

@cindex backing up, eliminating
@example
@verbatim
    %%
    foo        return TOK_KEYWORD;
    foobar     return TOK_KEYWORD;
@end verbatim
@end example

the file looks like:

@example
@verbatim
    State #6 is non-accepting -
     associated rule line numbers:
           2       3
     out-transitions: [ o ]
     jam-transitions: EOF [ \001-n  p-\177 ]

    State #8 is non-accepting -
     associated rule line numbers:
           3
     out-transitions: [ a ]
     jam-transitions: EOF [ \001-`  b-\177 ]

    State #9 is non-accepting -
     associated rule line numbers:
           3
     out-transitions: [ r ]
     jam-transitions: EOF [ \001-q  s-\177 ]

    Compressed tables always back up.
@end verbatim
@end example

The first few lines tell us that there's a scanner state in which it can
make a transition on an 'o' but not on any other character, and that in
that state the currently scanned text does not match any rule.  The
state occurs when trying to match the rules found at lines 2 and 3 in
the input file.  If the scanner is in that state and then reads
something other than an 'o', it will have to back up to find a rule
which is matched.  With a bit of headscratching one can see that this
must be the state it's in when it has seen @samp{fo}.  When this has
happened, if anything other than another @samp{o} is seen, the scanner
will have to back up to simply match the @samp{f} (by the default rule).

The comment regarding State #8 indicates there's a problem when
@samp{foob} has been scanned.  Indeed, on any character other than an
@samp{a}, the scanner will have to back up to accept "foo".  Similarly,
the comment for State #9 concerns when @samp{fooba} has been scanned and
an @samp{r} does not follow.

The final comment reminds us that there's no point going to all the
trouble of removing backing up from the rules unless we're using
@samp{-Cf} or @samp{-CF}, since there's no performance gain doing so
with compressed scanners.

@cindex error rules, to eliminate backing up
The way to remove the backing up is to add ``error'' rules:

@cindex backing up, eliminating by adding error rules
@example
@verbatim
    %%
    foo         return TOK_KEYWORD;
    foobar      return TOK_KEYWORD;

    fooba       |
    foob        |
    fo          {
                /* false alarm, not really a keyword */
                return TOK_ID;
                }
@end verbatim
@end example

Eliminating backing up among a list of keywords can also be done using a
``catch-all'' rule:

@cindex backing up, eliminating with catch-all rule
@example
@verbatim
    %%
    foo         return TOK_KEYWORD;
    foobar      return TOK_KEYWORD;

    [a-z]+      return TOK_ID;
@end verbatim
@end example

This is usually the best solution when appropriate.

Backing up messages tend to cascade.  With a complicated set of rules
it's not uncommon to get hundreds of messages.  If one can decipher
them, though, it often only takes a dozen or so rules to eliminate the
backing up (though it's easy to make a mistake and have an error rule
accidentally match a valid token.  A possible future @code{flex} feature
will be to automatically add rules to eliminate backing up).

It's important to keep in mind that you gain the benefits of eliminating
backing up only if you eliminate @emph{every} instance of backing up.
Leaving just one means you gain nothing.

@emph{Variable} trailing context (where both the leading and trailing
parts do not have a fixed length) entails almost the same performance
loss as @code{REJECT} (i.e., substantial).  So when possible a rule
like:

@cindex trailing context, variable length
@example
@verbatim
    %%
    mouse|rat/(cat|dog)   run();
@end verbatim
@end example

is better written:

@example
@verbatim
    %%
    mouse/cat|dog         run();
    rat/cat|dog           run();
@end verbatim
@end example

or as

@example
@verbatim
    %%
    mouse|rat/cat         run();
    mouse|rat/dog         run();
@end verbatim
@end example

Note that here the special '|' action does @emph{not} provide any
savings, and can even make things worse (@pxref{Limitations}).

Another area where the user can increase a scanner's performance (and
one that's easier to implement) arises from the fact that the longer the
tokens matched, the faster the scanner will run.  This is because with
long tokens the processing of most input characters takes place in the
(short) inner scanning loop, and does not often have to go through the
additional work of setting up the scanning environment (e.g.,
@code{yytext}) for the action.  Recall the scanner for C comments:

@cindex performance optimization, matching longer tokens
@example
@verbatim
    %x comment
    %%
            int line_num = 1;

    "/*"         BEGIN(comment);

    <comment>[^*\n]*
    <comment>"*"+[^*/\n]*
    <comment>\n             ++line_num;
    <comment>"*"+"/"        BEGIN(INITIAL);
@end verbatim
@end example

This could be sped up by writing it as:

@example
@verbatim
    %x comment
    %%
            int line_num = 1;

    "/*"         BEGIN(comment);

    <comment>[^*\n]*
    <comment>[^*\n]*\n      ++line_num;
    <comment>"*"+[^*/\n]*
    <comment>"*"+[^*/\n]*\n ++line_num;
    <comment>"*"+"/"        BEGIN(INITIAL);
@end verbatim
@end example

Now instead of each newline requiring the processing of another action,
recognizing the newlines is distributed over the other rules to keep the
matched text as long as possible.  Note that @emph{adding} rules does
@emph{not} slow down the scanner!  The speed of the scanner is
independent of the number of rules or (modulo the considerations given
at the beginning of this section) how complicated the rules are with
regard to operators such as @samp{*} and @samp{|}.

@cindex keywords, for performance
@cindex performance, using keywords
A final example in speeding up a scanner: suppose you want to scan
through a file containing identifiers and keywords, one per line
and with no other extraneous characters, and recognize all the
keywords.  A natural first approach is:

@cindex performance optimization, recognizing keywords
@example
@verbatim
    %%
    asm      |
    auto     |
    break    |
    ... etc ...
    volatile |
    while    /* it's a keyword */

    .|\n     /* it's not a keyword */
@end verbatim
@end example

To eliminate the back-tracking, introduce a catch-all rule:

@example
@verbatim
    %%
    asm      |
    auto     |
    break    |
    ... etc ...
    volatile |
    while    /* it's a keyword */

    [a-z]+   |
    .|\n     /* it's not a keyword */
@end verbatim
@end example

Now, if it's guaranteed that there's exactly one word per line, then we
can reduce the total number of matches by a half by merging in the
recognition of newlines with that of the other tokens:

@example
@verbatim
    %%
    asm\n    |
    auto\n   |
    break\n  |
    ... etc ...
    volatile\n |
    while\n  /* it's a keyword */

    [a-z]+\n |
    .|\n     /* it's not a keyword */
@end verbatim
@end example

One has to be careful here, as we have now reintroduced backing up
into the scanner.  In particular, while
@emph{we}
know that there will never be any characters in the input stream
other than letters or newlines,
@code{flex}
can't figure this out, and it will plan for possibly needing to back up
when it has scanned a token like @samp{auto} and then the next character
is something other than a newline or a letter.  Previously it would
then just match the @samp{auto} rule and be done, but now it has no @samp{auto}
rule, only a @samp{auto\n} rule.  To eliminate the possibility of backing up,
we could either duplicate all rules but without final newlines, or,
since we never expect to encounter such an input and therefore don't
how it's classified, we can introduce one more catch-all rule, this
one which doesn't include a newline:

@example
@verbatim
    %%
    asm\n    |
    auto\n   |
    break\n  |
    ... etc ...
    volatile\n |
    while\n  /* it's a keyword */

    [a-z]+\n |
    [a-z]+   |
    .|\n     /* it's not a keyword */
@end verbatim
@end example

Compiled with @samp{-Cf}, this is about as fast as one can get a
@code{flex} scanner to go for this particular problem.

A final note: @code{flex} is slow when matching @code{NUL}s,
particularly when a token contains multiple @code{NUL}s.  It's best to
write rules which match @emph{short} amounts of text if it's anticipated
that the text will often include @code{NUL}s.

Another final note regarding performance: as mentioned in
@ref{Matching}, dynamically resizing @code{yytext} to accommodate huge
tokens is a slow process because it presently requires that the (huge)
token be rescanned from the beginning.  Thus if performance is vital,
you should attempt to match ``large'' quantities of text but not
``huge'' quantities, where the cutoff between the two is at about 8K
characters per token.

@node Cxx, Reentrant, Performance, Top
@chapter Generating C++ Scanners

@cindex c++, experimental form of scanner class
@cindex experimental form of c++ scanner class
@strong{IMPORTANT}: the present form of the scanning class is @emph{experimental}
and may change considerably between major releases.

@cindex C++
@cindex member functions, C++
@cindex methods, c++
@code{flex} provides two different ways to generate scanners for use
with C++.  The first way is to simply compile a scanner generated by
@code{flex} using a C++ compiler instead of a C compiler.  You should
not encounter any compilation errors (@pxref{Reporting Bugs}).  You can
then use C++ code in your rule actions instead of C code.  Note that the
default input source for your scanner remains @file{yyin}, and default
echoing is still done to @file{yyout}.  Both of these remain @code{FILE
*} variables and not C++ @emph{streams}.

You can also use @code{flex} to generate a C++ scanner class, using the
@samp{-+} option (or, equivalently, @code{%option c++)}, which is
automatically specified if the name of the @code{flex} executable ends
in a '+', such as @code{flex++}.  When using this option, @code{flex}
defaults to generating the scanner to the file @file{lex.yy.cc} instead
of @file{lex.yy.c}.  The generated scanner includes the header file
@file{FlexLexer.h}, which defines the interface to two C++ classes.

The first class in @file{FlexLexer.h}, @code{FlexLexer},
provides an abstract base class defining the general scanner class
interface.  It provides the following member functions:

@table @code
@findex YYText (C++ only)
@item const char* YYText()
returns the text of the most recently matched token, the equivalent of
@code{yytext}.

@findex YYLeng (C++ only)
@item int YYLeng()
returns the length of the most recently matched token, the equivalent of
@code{yyleng}.

@findex lineno (C++ only)
@item int lineno() const
returns the current input line number (see @code{%option yylineno)}, or
@code{1} if @code{%option yylineno} was not used.

@findex set_debug (C++ only)
@item void set_debug( int flag )
sets the debugging flag for the scanner, equivalent to assigning to
@code{yy_flex_debug} (@pxref{Scanner Options}).  Note that you must build
the scanner using @code{%option debug} to include debugging information
in it.

@findex  debug (C++ only)
@item int debug() const
returns the current setting of the debugging flag.
@end table

Also provided are member functions equivalent to
@code{yy_switch_to_buffer()}, @code{yy_create_buffer()} (though the
first argument is an @code{istream&} object reference and not a
@code{FILE*)}, @code{yy_flush_buffer()}, @code{yy_delete_buffer()}, and
@code{yyrestart()} (again, the first argument is a @code{istream&}
object reference).

@tindex yyFlexLexer (C++ only)
@tindex FlexLexer (C++ only)
The second class defined in @file{FlexLexer.h} is @code{yyFlexLexer},
which is derived from @code{FlexLexer}.  It defines the following
additional member functions:

@table @code
@findex yyFlexLexer constructor (C++ only)
@item yyFlexLexer( istream* arg_yyin = 0, ostream* arg_yyout = 0 )
@item yyFlexLexer( istream& arg_yyin, ostream& arg_yyout )
constructs a @code{yyFlexLexer} object using the given streams for input
and output.  If not specified, the streams default to @code{cin} and
@code{cout}, respectively.  @code{yyFlexLexer} does not take ownership of
its stream arguments.  It's up to the user to ensure the streams pointed
to remain alive at least as long as the @code{yyFlexLexer} instance.

@findex yylex (C++ version)
@item virtual int yylex()
performs the same role is @code{yylex()} does for ordinary @code{flex}
scanners: it scans the input stream, consuming tokens, until a rule's
action returns a value.  If you derive a subclass @code{S} from
@code{yyFlexLexer} and want to access the member functions and variables
of @code{S} inside @code{yylex()}, then you need to use @code{%option
yyclass="S"} to inform @code{flex} that you will be using that subclass
instead of @code{yyFlexLexer}.  In this case, rather than generating
@code{yyFlexLexer::yylex()}, @code{flex} generates @code{S::yylex()}
(and also generates a dummy @code{yyFlexLexer::yylex()} that calls
@code{yyFlexLexer::LexerError()} if called).

@findex switch_streams (C++ only)
@item virtual void switch_streams(istream* new_in = 0, ostream* new_out = 0)
@item virtual void switch_streams(istream& new_in, ostream& new_out)
reassigns @code{yyin} to @code{new_in} (if non-null) and @code{yyout} to
@code{new_out} (if non-null), deleting the previous input buffer if
@code{yyin} is reassigned.

@item int yylex( istream* new_in, ostream* new_out = 0 )
@item int yylex( istream& new_in, ostream& new_out )
first switches the input streams via @code{switch_streams( new_in,
new_out )} and then returns the value of @code{yylex()}.
@end table

In addition, @code{yyFlexLexer} defines the following protected virtual
functions which you can redefine in derived classes to tailor the
scanner:

@table @code
@findex LexerInput (C++ only)
@item virtual int LexerInput( char* buf, int max_size )
reads up to @code{max_size} characters into @code{buf} and returns the
number of characters read.  To indicate end-of-input, return 0
characters.  Note that @code{interactive} scanners (see the @samp{-B}
and @samp{-I} flags in @ref{Scanner Options}) define the macro
@code{YY_INTERACTIVE}.  If you redefine @code{LexerInput()} and need to
take different actions depending on whether or not the scanner might be
scanning an interactive input source, you can test for the presence of
this name via @code{#ifdef} statements.

@findex LexerOutput (C++ only)
@item virtual void LexerOutput( const char* buf, int size )
writes out @code{size} characters from the buffer @code{buf}, which, while
@code{NUL}-terminated, may also contain internal @code{NUL}s if the
scanner's rules can match text with @code{NUL}s in them.

@cindex error reporting, in C++
@findex LexerError (C++ only)
@item virtual void LexerError( const char* msg )
reports a fatal error message.  The default version of this function
writes the message to the stream @code{cerr} and exits.
@end table

Note that a @code{yyFlexLexer} object contains its @emph{entire}
scanning state.  Thus you can use such objects to create reentrant
scanners, but see also @ref{Reentrant}.  You can instantiate multiple
instances of the same @code{yyFlexLexer} class, and you can also combine
multiple C++ scanner classes together in the same program using the
@samp{-P} option discussed above.

Finally, note that the @code{%array} feature is not available to C++
scanner classes; you must use @code{%pointer} (the default).

Here is an example of a simple C++ scanner:

@cindex C++ scanners, use of
@example
@verbatim
     // An example of using the flex C++ scanner class.

    %{
    #include <iostream>
    using namespace std;
    int mylineno = 0;
    %}

    %option noyywrap c++

    string  \"[^\n"]+\"

    ws      [ \t]+

    alpha   [A-Za-z]
    dig     [0-9]
    name    ({alpha}|{dig}|\$)({alpha}|{dig}|[_.\-/$])*
    num1    [-+]?{dig}+\.?([eE][-+]?{dig}+)?
    num2    [-+]?{dig}*\.{dig}+([eE][-+]?{dig}+)?
    number  {num1}|{num2}

    %%

    {ws}    /* skip blanks and tabs */

    "/*"    {
            int c;

            while((c = yyinput()) != 0)
                {
                if(c == '\n')
                    ++mylineno;

                else if(c == '*')
                    {
                    if((c = yyinput()) == '/')
                        break;
                    else
                        unput(c);
                    }
                }
            }

    {number}  cout << "number " << YYText() << '\n';

    \n        mylineno++;

    {name}    cout << "name " << YYText() << '\n';

    {string}  cout << "string " << YYText() << '\n';

    %%

	// This include is required if main() is an another source file.
	//#include <FlexLexer.h>

    int main( int /* argc */, char** /* argv */ )
    {
        FlexLexer* lexer = new yyFlexLexer;
        while(lexer->yylex() != 0)
            ;
        return 0;
    }
@end verbatim
@end example

@cindex C++, multiple different scanners
If you want to create multiple (different) lexer classes, you use the
@samp{-P} flag (or the @code{prefix=} option) to rename each
@code{yyFlexLexer} to some other @samp{xxFlexLexer}.  You then can
include @file{<FlexLexer.h>} in your other sources once per lexer class,
first renaming @code{yyFlexLexer} as follows:

@cindex include files, with C++
@cindex header files, with C++
@cindex C++ scanners, including multiple scanners
@example
@verbatim
    #undef yyFlexLexer
    #define yyFlexLexer xxFlexLexer
    #include <FlexLexer.h>

    #undef yyFlexLexer
    #define yyFlexLexer zzFlexLexer
    #include <FlexLexer.h>
@end verbatim
@end example

if, for example, you used @code{%option prefix="xx"} for one of your
scanners and @code{%option prefix="zz"} for the other.

@node Reentrant, Lex and Posix, Cxx, Top
@chapter Reentrant C Scanners

@cindex reentrant, explanation
@code{flex} has the ability to generate a reentrant C scanner. This is
accomplished by specifying @code{%option reentrant} (@samp{-R}) The generated
scanner is both portable, and safe to use in one or more separate threads of
control.  The most common use for reentrant scanners is from within
multi-threaded applications.  Any thread may create and execute a reentrant
@code{flex} scanner without the need for synchronization with other threads.

@menu
* Reentrant Uses::              
* Reentrant Overview::          
* Reentrant Example::           
* Reentrant Detail::            
* Reentrant Functions::         
@end menu

@node Reentrant Uses, Reentrant Overview, Reentrant, Reentrant
@section Uses for Reentrant Scanners

However, there are other uses for a reentrant scanner.  For example, you
could scan two or more files simultaneously to implement a @code{diff} at
the token level (i.e., instead of at the character level):

@cindex reentrant scanners, multiple interleaved scanners
@example
@verbatim
    /* Example of maintaining more than one active scanner. */

    do {
        int tok1, tok2;

        tok1 = yylex( scanner_1 );
        tok2 = yylex( scanner_2 );

        if( tok1 != tok2 )
            printf("Files are different.");

   } while ( tok1 && tok2 );
@end verbatim
@end example

Another use for a reentrant scanner is recursion.
(Note that a recursive scanner can also be created using a non-reentrant scanner and
buffer states. @xref{Multiple Input Buffers}.)

The following crude scanner supports the @samp{eval} command by invoking
another instance of itself.

@cindex reentrant scanners, recursive invocation
@example
@verbatim
    /* Example of recursive invocation. */

    %option reentrant

    %%
    "eval(".+")"  {
                      yyscan_t scanner;
                      YY_BUFFER_STATE buf;

                      yylex_init( &scanner );
                      yytext[yyleng-1] = ' ';

                      buf = yy_scan_string( yytext + 5, scanner );
                      yylex( scanner );

                      yy_delete_buffer(buf,scanner);
                      yylex_destroy( scanner );
                 }
    ...
    %%
@end verbatim
@end example

@node Reentrant Overview, Reentrant Example, Reentrant Uses, Reentrant
@section An Overview of the Reentrant API

@cindex reentrant, API explanation
The API for reentrant scanners is different than for non-reentrant
scanners. Here is a quick overview of the API:

@itemize
@code{%option reentrant} must be specified.

@item
All functions take one additional argument: @code{yyscanner}

@item
All global variables are replaced by their macro equivalents.
(We tell you this because it may be important to you during debugging.)

@item
@code{yylex_init} and @code{yylex_destroy} must be called before and
after @code{yylex}, respectively.

@item
Accessor methods (get/set functions) provide access to common
@code{flex} variables.

@item
User-specific data can be stored in @code{yyextra}.
@end itemize

@node Reentrant Example, Reentrant Detail, Reentrant Overview, Reentrant
@section Reentrant Example

First, an example of a reentrant scanner:
@cindex reentrant, example of
@example
@verbatim
    /* This scanner prints "//" comments. */

    %option reentrant stack noyywrap
    %x COMMENT

    %%

    "//"                 yy_push_state( COMMENT, yyscanner);
    .|\n

    <COMMENT>\n          yy_pop_state( yyscanner );
    <COMMENT>[^\n]+      fprintf( yyout, "%s\n", yytext);

    %%

    int main ( int argc, char * argv[] )
    {
        yyscan_t scanner;

        yylex_init ( &scanner );
        yylex ( scanner );
        yylex_destroy ( scanner );
    return 0;
   }
@end verbatim
@end example

@node Reentrant Detail, Reentrant Functions, Reentrant Example, Reentrant
@section The Reentrant API in Detail

Here are the things you need to do or know to use the reentrant C API of
@code{flex}.

@menu
* Specify Reentrant::           
* Extra Reentrant Argument::    
* Global Replacement::          
* Init and Destroy Functions::  
* Accessor Methods::            
* Extra Data::                  
* About yyscan_t::              
@end menu

@node Specify Reentrant, Extra Reentrant Argument, Reentrant Detail, Reentrant Detail
@subsection Declaring a Scanner As Reentrant

 %option reentrant (--reentrant) must be specified.

Notice that @code{%option reentrant} is specified in the above example
(@pxref{Reentrant Example}. Had this option not been specified,
@code{flex} would have happily generated a non-reentrant scanner without
complaining. You may explicitly specify @code{%option noreentrant}, if
you do @emph{not} want a reentrant scanner, although it is not
necessary. The default is to generate a non-reentrant scanner.

@node Extra Reentrant Argument, Global Replacement, Specify Reentrant, Reentrant Detail
@subsection The Extra Argument

@cindex reentrant, calling functions
@vindex yyscanner (reentrant only)
All functions take one additional argument: @code{yyscanner}.

Notice that the calls to @code{yy_push_state} and @code{yy_pop_state}
both have an argument, @code{yyscanner} , that is not present in a
non-reentrant scanner.  Here are the declarations of
@code{yy_push_state} and @code{yy_pop_state} in the reentrant scanner:

@example
@verbatim
    static void yy_push_state  ( int new_state , yyscan_t yyscanner ) ;
    static void yy_pop_state  ( yyscan_t yyscanner  ) ;
@end verbatim
@end example

Notice that the argument @code{yyscanner} appears in the declaration of
both functions.  In fact, all @code{flex} functions in a reentrant
scanner have this additional argument.  It is always the last argument
in the argument list, it is always of type @code{yyscan_t} (which is
typedef'd to @code{void *}) and it is
always named @code{yyscanner}.  As you may have guessed,
@code{yyscanner} is a pointer to an opaque data structure encapsulating
the current state of the scanner.  For a list of function declarations,
see @ref{Reentrant Functions}. Note that preprocessor macros, such as
@code{BEGIN}, @code{ECHO}, and @code{REJECT}, do not take this
additional argument.

@node Global Replacement, Init and Destroy Functions, Extra Reentrant Argument, Reentrant Detail
@subsection Global Variables Replaced By Macros

@cindex reentrant, accessing flex variables
All global variables in traditional flex have been replaced by macro equivalents.

Note that in the above example, @code{yyout} and @code{yytext} are
not plain variables. These are macros that will expand to their equivalent lvalue.
All of the familiar @code{flex} globals have been replaced by their macro
equivalents. In particular, @code{yytext}, @code{yyleng}, @code{yylineno},
@code{yyin}, @code{yyout}, @code{yyextra}, @code{yylval}, and @code{yylloc}
are macros. You may safely use these macros in actions as if they were plain
variables. We only tell you this so you don't expect to link to these variables
externally. Currently, each macro expands to a member of an internal struct, e.g.,

@example
@verbatim
#define yytext (((struct yyguts_t*)yyscanner)->yytext_r)
@end verbatim
@end example

One important thing to remember about
@code{yytext}
and friends is that
@code{yytext}
is not a global variable in a reentrant
scanner, you can not access it directly from outside an action or from
other functions. You must use an accessor method, e.g.,
@code{yyget_text},
to accomplish this. (See below).

@node Init and Destroy Functions, Accessor Methods, Global Replacement, Reentrant Detail
@subsection Init and Destroy Functions

@cindex memory, considerations for reentrant scanners
@cindex reentrant, initialization
@findex yylex_init
@findex yylex_destroy

@code{yylex_init} and @code{yylex_destroy} must be called before and
after @code{yylex}, respectively.

@example
@verbatim
    int yylex_init ( yyscan_t * ptr_yy_globals ) ;
    int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t * ptr_yy_globals ) ;
    int yylex ( yyscan_t yyscanner ) ;
    int yylex_destroy ( yyscan_t yyscanner ) ;
@end verbatim
@end example

The function @code{yylex_init} must be called before calling any other
function. The argument to @code{yylex_init} is the address of an
uninitialized pointer to be filled in by @code{yylex_init}, overwriting
any previous contents. The function @code{yylex_init_extra} may be used
instead, taking as its first argument a variable of type @code{YY_EXTRA_TYPE}.
See the section on yyextra, below, for more details.

The value stored in @code{ptr_yy_globals} should
thereafter be passed to @code{yylex} and @code{yylex_destroy}.  Flex
does not save the argument passed to @code{yylex_init}, so it is safe to
pass the address of a local pointer to @code{yylex_init} so long as it remains
in scope for the duration of all calls to the scanner, up to and including
the call to @code{yylex_destroy}.

The function
@code{yylex} should be familiar to you by now. The reentrant version
takes one argument, which is the value returned (via an argument) by
@code{yylex_init}.  Otherwise, it behaves the same as the non-reentrant
version of @code{yylex}.

Both @code{yylex_init} and @code{yylex_init_extra} returns 0 (zero) on success,
or non-zero on failure, in which case errno is set to one of the following values:

@itemize
@item ENOMEM
Memory allocation error. @xref{memory-management}.
@item EINVAL
Invalid argument.
@end itemize


The function @code{yylex_destroy} should be
called to free resources used by the scanner. After @code{yylex_destroy}
is called, the contents of @code{yyscanner} should not be used.  Of
course, there is no need to destroy a scanner if you plan to reuse it.
A @code{flex} scanner (both reentrant and non-reentrant) may be
restarted by calling @code{yyrestart}.

Below is an example of a program that creates a scanner, uses it, then destroys
it when done:

@example
@verbatim
    int main ()
    {
        yyscan_t scanner;
        int tok;

        yylex_init(&scanner);

        while ((tok=yylex(scanner)) > 0)
            printf("tok=%d  yytext=%s\n", tok, yyget_text(scanner));

        yylex_destroy(scanner);
        return 0;
    }
@end verbatim
@end example

@node Accessor Methods, Extra Data, Init and Destroy Functions, Reentrant Detail
@subsection Accessing Variables with Reentrant Scanners

@cindex reentrant, accessor functions
Accessor methods (get/set functions) provide access to common
@code{flex} variables.

Many scanners that you build will be part of a larger project. Portions
of your project will need access to @code{flex} values, such as
@code{yytext}.  In a non-reentrant scanner, these values are global, so
there is no problem accessing them. However, in a reentrant scanner, there are no
global @code{flex} values. You can not access them directly.  Instead,
you must access @code{flex} values using accessor methods (get/set
functions). Each accessor method is named @code{yyget_NAME} or
@code{yyset_NAME}, where @code{NAME} is the name of the @code{flex}
variable you want. For example:

@cindex accessor functions, use of
@example
@verbatim
    /* Set the last character of yytext to NULL. */
    void chop ( yyscan_t scanner )
    {
        int len = yyget_leng( scanner );
        yyget_text( scanner )[len - 1] = '\0';
    }
@end verbatim
@end example

The above code may be called from within an action like this:

@example
@verbatim
    %%
    .+\n    { chop( yyscanner );}
@end verbatim
@end example

You may find that @code{%option header-file} is particularly useful for generating
prototypes of all the accessor functions. @xref{option-header}.

@node Extra Data, About yyscan_t, Accessor Methods, Reentrant Detail
@subsection Extra Data

@cindex reentrant, extra data
@vindex yyextra
User-specific data can be stored in @code{yyextra}.

In a reentrant scanner, it is unwise to use global variables to
communicate with or maintain state between different pieces of your program.
However, you may need access to external data or invoke external functions
from within the scanner actions.
Likewise, you may need to pass information to your scanner
(e.g., open file descriptors, or database connections).
In a non-reentrant scanner, the only way to do this would be through the
use of global variables.
@code{Flex} allows you to store arbitrary, ``extra'' data in a scanner.
This data is accessible through the accessor methods
@code{yyget_extra} and @code{yyset_extra}
from outside the scanner, and through the shortcut macro
@code{yyextra}
from within the scanner itself. They are defined as follows:

@tindex YY_EXTRA_TYPE (reentrant only)
@findex yyget_extra
@findex yyset_extra
@example
@verbatim
    #define YY_EXTRA_TYPE  void*
    YY_EXTRA_TYPE  yyget_extra ( yyscan_t scanner );
    void           yyset_extra ( YY_EXTRA_TYPE arbitrary_data , yyscan_t scanner);
@end verbatim
@end example

In addition, an extra form of @code{yylex_init} is provided,
@code{yylex_init_extra}. This function is provided so that the yyextra value can
be accessed from within the very first yyalloc, used to allocate
the scanner itself.

By default, @code{YY_EXTRA_TYPE} is defined as type @code{void *}.  You
may redefine this type using @code{%option extra-type="your_type"} in 
the scanner:

@cindex YY_EXTRA_TYPE, defining your own type
@example
@verbatim
    /* An example of overriding YY_EXTRA_TYPE. */
    %{
    #include <sys/stat.h>
    #include <unistd.h>
    %}
    %option reentrant
    %option extra-type="struct stat *"
    %%

    __filesize__     printf( "%ld", yyextra->st_size  );
    __lastmod__      printf( "%ld", yyextra->st_mtime );
    %%
    void scan_file( char* filename )
    {
        yyscan_t scanner;
        struct stat buf;
        FILE *in;

        in = fopen( filename, "r" );
        stat( filename, &buf );

        yylex_init_extra( buf, &scanner );
        yyset_in( in, scanner );
        yylex( scanner );
        yylex_destroy( scanner );

        fclose( in );
   }
@end verbatim
@end example


@node About yyscan_t,  , Extra Data, Reentrant Detail
@subsection About yyscan_t

@tindex yyscan_t (reentrant only)
@code{yyscan_t} is defined as:

@example
@verbatim
     typedef void* yyscan_t;
@end verbatim
@end example

It is initialized by @code{yylex_init()} to point to
an internal structure. You should never access this value
directly. In particular, you should never attempt to free it
(use @code{yylex_destroy()} instead.)

@node Reentrant Functions,  , Reentrant Detail, Reentrant
@section Functions and Macros Available in Reentrant C Scanners

The following Functions are available in a reentrant scanner:

@findex yyget_text
@findex yyget_leng
@findex yyget_in
@findex yyget_out
@findex yyget_lineno
@findex yyset_in
@findex yyset_out
@findex yyset_lineno
@findex yyget_debug
@findex yyset_debug
@findex yyget_extra
@findex yyset_extra

@example
@verbatim
    char *yyget_text ( yyscan_t scanner );
    int yyget_leng ( yyscan_t scanner );
    FILE *yyget_in ( yyscan_t scanner );
    FILE *yyget_out ( yyscan_t scanner );
    int yyget_lineno ( yyscan_t scanner );
    YY_EXTRA_TYPE yyget_extra ( yyscan_t scanner );
    int  yyget_debug ( yyscan_t scanner );

    void yyset_debug ( int flag, yyscan_t scanner );
    void yyset_in  ( FILE * in_str , yyscan_t scanner );
    void yyset_out  ( FILE * out_str , yyscan_t scanner );
    void yyset_lineno ( int line_number , yyscan_t scanner );
    void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t scanner );
@end verbatim
@end example

There are no ``set'' functions for yytext and yyleng. This is intentional.

The following Macro shortcuts are available in actions in a reentrant
scanner:

@example
@verbatim
    yytext
    yyleng
    yyin
    yyout
    yylineno
    yyextra
    yy_flex_debug
@end verbatim
@end example

@cindex yylineno, in a reentrant scanner
In a reentrant C scanner, support for yylineno is always present
(i.e., you may access yylineno), but the value is never modified by
@code{flex} unless @code{%option yylineno} is enabled. This is to allow
the user to maintain the line count independently of @code{flex}.

@anchor{bison-functions}
The following functions and macros are made available when @code{%option
bison-bridge} (@samp{--bison-bridge}) is specified:

@example
@verbatim
    YYSTYPE * yyget_lval ( yyscan_t scanner );
    void yyset_lval ( YYSTYPE * yylvalp , yyscan_t scanner );
    yylval
@end verbatim
@end example

The following functions and macros are made available
when @code{%option bison-locations} (@samp{--bison-locations}) is specified:

@example
@verbatim
    YYLTYPE *yyget_lloc ( yyscan_t scanner );
    void yyset_lloc ( YYLTYPE * yyllocp , yyscan_t scanner );
    yylloc
@end verbatim
@end example

Support for yylval assumes that @code{YYSTYPE} is a valid type.  Support for
yylloc assumes that @code{YYSLYPE} is a valid type.  Typically, these types are
generated by @code{bison}, and are included in section 1 of the @code{flex}
input.

@node Lex and Posix, Memory Management, Reentrant, Top
@chapter Incompatibilities with Lex and Posix

@cindex POSIX and lex
@cindex lex (traditional) and POSIX

@code{flex} is a rewrite of the AT&T Unix @emph{lex} tool (the two
implementations do not share any code, though), with some extensions and
incompatibilities, both of which are of concern to those who wish to
write scanners acceptable to both implementations.  @code{flex} is fully
compliant with the POSIX @code{lex} specification, except that when
using @code{%pointer} (the default), a call to @code{unput()} destroys
the contents of @code{yytext}, which is counter to the POSIX
specification.  In this section we discuss all of the known areas of
incompatibility between @code{flex}, AT&T @code{lex}, and the POSIX
specification.  @code{flex}'s @samp{-l} option turns on maximum
compatibility with the original AT&T @code{lex} implementation, at the
cost of a major loss in the generated scanner's performance.  We note
below which incompatibilities can be overcome using the @samp{-l}
option.  @code{flex} is fully compatible with @code{lex} with the
following exceptions:

@itemize
@item
The undocumented @code{lex} scanner internal variable @code{yylineno} is
not supported unless @samp{-l} or @code{%option yylineno} is used.

@item
@code{yylineno} should be maintained on a per-buffer basis, rather than
a per-scanner (single global variable) basis.

@item
@code{yylineno} is not part of the POSIX specification.

@item
The @code{input()} routine is not redefinable, though it may be called
to read characters following whatever has been matched by a rule.  If
@code{input()} encounters an end-of-file the normal @code{yywrap()}
processing is done.  A ``real'' end-of-file is returned by
@code{input()} as @code{EOF}.

@item
Input is instead controlled by defining the @code{YY_INPUT()} macro.

@item
The @code{flex} restriction that @code{input()} cannot be redefined is
in accordance with the POSIX specification, which simply does not
specify any way of controlling the scanner's input other than by making
an initial assignment to @file{yyin}.

@item
The @code{unput()} routine is not redefinable.  This restriction is in
accordance with POSIX.

@item
@code{flex} scanners are not as reentrant as @code{lex} scanners.  In
particular, if you have an interactive scanner and an interrupt handler
which long-jumps out of the scanner, and the scanner is subsequently
called again, you may get the following message:

@cindex error messages, end of buffer missed
@example
@verbatim
    fatal flex scanner internal error--end of buffer missed
@end verbatim
@end example

To reenter the scanner, first use:

@cindex restarting the scanner
@example
@verbatim
    yyrestart( yyin );
@end verbatim
@end example

Note that this call will throw away any buffered input; usually this
isn't a problem with an interactive scanner. @xref{Reentrant}, for
@code{flex}'s reentrant API.

@item
Also note that @code{flex} C++ scanner classes
@emph{are}
reentrant, so if using C++ is an option for you, you should use
them instead.  @xref{Cxx}, and @ref{Reentrant}  for details.

@item
@code{output()} is not supported.  Output from the @b{ECHO} macro is
done to the file-pointer @code{yyout} (default @file{stdout)}.

@item
@code{output()} is not part of the POSIX specification.

@item
@code{lex} does not support exclusive start conditions (%x), though they
are in the POSIX specification.

@item
When definitions are expanded, @code{flex} encloses them in parentheses.
With @code{lex}, the following:

@cindex name definitions, not POSIX
@example
@verbatim
    NAME    [A-Z][A-Z0-9]*
    %%
    foo{NAME}?      printf( "Found it\n" );
    %%
@end verbatim
@end example

will not match the string @samp{foo} because when the macro is expanded
the rule is equivalent to @samp{foo[A-Z][A-Z0-9]*?}  and the precedence
is such that the @samp{?} is associated with @samp{[A-Z0-9]*}.  With
@code{flex}, the rule will be expanded to @samp{foo([A-Z][A-Z0-9]*)?}
and so the string @samp{foo} will match.

@item
Note that if the definition begins with @samp{^} or ends with @samp{$}
then it is @emph{not} expanded with parentheses, to allow these
operators to appear in definitions without losing their special
meanings.  But the @samp{<s>}, @samp{/}, and @code{<<EOF>>} operators
cannot be used in a @code{flex} definition.

@item
Using @samp{-l} results in the @code{lex} behavior of no parentheses
around the definition.

@item
The POSIX specification is that the definition be enclosed in parentheses.

@item
Some implementations of @code{lex} allow a rule's action to begin on a
separate line, if the rule's pattern has trailing whitespace:

@cindex patterns and actions on different lines
@example
@verbatim
    %%
    foo|bar<space here>
      { foobar_action();}
@end verbatim
@end example

@code{flex} does not support this feature.

@item
The @code{lex} @code{%r} (generate a Ratfor scanner) option is not
supported.  It is not part of the POSIX specification.

@item
After a call to @code{unput()}, @emph{yytext} is undefined until the
next token is matched, unless the scanner was built using @code{%array}.
This is not the case with @code{lex} or the POSIX specification.  The
@samp{-l} option does away with this incompatibility.

@item
The precedence of the @samp{@{,@}} (numeric range) operator is
different.  The AT&T and POSIX specifications of @code{lex}
interpret @samp{abc@{1,3@}} as match one, two,
or three occurrences of @samp{abc}'', whereas @code{flex} interprets it
as ``match @samp{ab} followed by one, two, or three occurrences of
@samp{c}''.  The @samp{-l} and @samp{--posix} options do away with this
incompatibility.

@item
The precedence of the @samp{^} operator is different.  @code{lex}
interprets @samp{^foo|bar} as ``match either 'foo' at the beginning of a
line, or 'bar' anywhere'', whereas @code{flex} interprets it as ``match
either @samp{foo} or @samp{bar} if they come at the beginning of a
line''.  The latter is in agreement with the POSIX specification.

@item
The special table-size declarations such as @code{%a} supported by
@code{lex} are not required by @code{flex} scanners..  @code{flex}
ignores them.
@item
The name @code{FLEX_SCANNER} is @code{#define}'d so scanners may be
written for use with either @code{flex} or @code{lex}.  Scanners also
include @code{YY_FLEX_MAJOR_VERSION},  @code{YY_FLEX_MINOR_VERSION}
and @code{YY_FLEX_SUBMINOR_VERSION}
indicating which version of @code{flex} generated the scanner. For
example, for the 2.5.22 release, these defines would be 2,  5 and 22
respectively. If the version of @code{flex} being used is a beta
version, then the symbol @code{FLEX_BETA} is defined.

@item
The symbols @samp{[[} and @samp{]]} in the code sections of the input
may conflict with the m4 delimiters. @xref{M4 Dependency}.


@end itemize

@cindex POSIX comp;compliance
@cindex non-POSIX features of flex
The following @code{flex} features are not included in @code{lex} or the
POSIX specification:

@itemize
@item
C++ scanners
@item
%option
@item
start condition scopes
@item
start condition stacks
@item
interactive/non-interactive scanners
@item
yy_scan_string() and friends
@item
yyterminate()
@item
yy_set_interactive()
@item
yy_set_bol()
@item
YY_AT_BOL()
   <<EOF>>
@item
<*>
@item
YY_DECL
@item
YY_START
@item
YY_USER_ACTION
@item
YY_USER_INIT
@item
#line directives
@item
%@{@}'s around actions
@item
reentrant C API
@item
multiple actions on a line
@item
almost all of the @code{flex} command-line options
@end itemize

The feature ``multiple actions on a line''
refers to the fact that with @code{flex} you can put multiple actions on
the same line, separated with semi-colons, while with @code{lex}, the
following:

@example
@verbatim
    foo    handle_foo(); ++num_foos_seen;
@end verbatim
@end example

is (rather surprisingly) truncated to

@example
@verbatim
    foo    handle_foo();
@end verbatim
@end example

@code{flex} does not truncate the action.  Actions that are not enclosed
in braces are simply terminated at the end of the line.

@node Memory Management, Serialized Tables, Lex and Posix, Top
@chapter Memory Management

@cindex memory management
@anchor{memory-management}
This chapter describes how flex handles dynamic memory, and how you can
override the default behavior.

@menu
* The Default Memory Management::  
* Overriding The Default Memory Management::  
* A Note About yytext And Memory::  
@end menu

@node The Default Memory Management, Overriding The Default Memory Management, Memory Management, Memory Management
@section The Default Memory Management

Flex allocates dynamic memory during initialization, and once in a while from
within a call to yylex(). Initialization takes place during the first call to
yylex(). Thereafter, flex may reallocate more memory if it needs to enlarge a
buffer. As of version 2.5.9 Flex will clean up all memory when you call @code{yylex_destroy}
@xref{faq-memory-leak}.

Flex allocates dynamic memory for four purposes, listed below @footnote{The
quantities given here are approximate, and may vary due to host architecture,
compiler configuration, or due to future enhancements to flex.} 

@table @asis

@item 16kB for the input buffer.
Flex allocates memory for the character buffer used to perform pattern
matching.  Flex must read ahead from the input stream and store it in a large
character buffer.  This buffer is typically the largest chunk of dynamic memory
flex consumes. This buffer will grow if necessary, doubling the size each time.
Flex frees this memory when you call yylex_destroy().  The default size of this
buffer (16384 bytes) is almost always too large.  The ideal size for this
buffer is the length of the longest token expected, in bytes, plus a little more.  Flex will allocate a few
extra bytes for housekeeping. Currently, to override the size of the input buffer
you must @code{#define YY_BUF_SIZE} to whatever number of bytes you want. We don't plan
to change this in the near future, but we reserve the right to do so if we ever add a more robust memory management
API. 

@item 64kb for the REJECT state. This will only be allocated if you use REJECT.
The size is  large enough to hold the same number of states as characters in the input buffer. If you override the size of the
input buffer (via @code{YY_BUF_SIZE}), then you automatically override the size of this buffer as well.

@item 100 bytes for the start condition stack.
Flex allocates memory for the start condition stack. This is the stack used
for pushing start states, i.e., with yy_push_state(). It will grow if
necessary.  Since the states are simply integers, this stack doesn't consume
much memory.  This stack is not present if @code{%option stack} is not
specified.  You will rarely need to tune this buffer. The ideal size for this
stack is the maximum depth expected.  The memory for this stack is
automatically destroyed when you call yylex_destroy(). @xref{option-stack}.

@item 40 bytes for each YY_BUFFER_STATE.
Flex allocates memory for each YY_BUFFER_STATE. The buffer state itself
is about 40 bytes, plus an additional large character buffer (described above.)
The initial buffer state is created during initialization, and with each call
to yy_create_buffer(). You can't tune the size of this, but you can tune the
character buffer as described above. Any buffer state that you explicitly
create by calling yy_create_buffer() is @emph{NOT} destroyed automatically. You
must call yy_delete_buffer() to free the memory. The exception to this rule is
that flex will delete the current buffer automatically when you call
yylex_destroy(). If you delete the current buffer, be sure to set it to NULL.
That way, flex will not try to delete the buffer a second time (possibly
crashing your program!) At the time of this writing, flex does not provide a
growable stack for the buffer states.  You have to manage that yourself.
@xref{Multiple Input Buffers}.

@item 84 bytes for the reentrant scanner guts
Flex allocates about 84 bytes for the reentrant scanner structure when
you call yylex_init(). It is destroyed when the user calls yylex_destroy().

@end table


@node Overriding The Default Memory Management, A Note About yytext And Memory, The Default Memory Management, Memory Management
@section Overriding The Default Memory Management

@cindex yyalloc, overriding
@cindex yyrealloc, overriding
@cindex yyfree, overriding

Flex calls the functions @code{yyalloc}, @code{yyrealloc}, and @code{yyfree}
when it needs to allocate or free memory. By default, these functions are
wrappers around the standard C functions, @code{malloc}, @code{realloc}, and
@code{free}, respectively. You can override the default implementations by telling
flex that you will provide your own implementations.

To override the default implementations, you must do two things:

@enumerate

@item Suppress the default implementations by specifying one or more of the
following options:

@itemize
@opindex noyyalloc
@item @code{%option noyyalloc}
@item @code{%option noyyrealloc}
@item @code{%option noyyfree}.
@end itemize

@item Provide your own implementation of the following functions: @footnote{It
is not necessary to override all (or any) of the memory management routines.
You may, for example, override @code{yyrealloc}, but not @code{yyfree} or
@code{yyalloc}.}

@example
@verbatim
// For a non-reentrant scanner
void * yyalloc (size_t bytes);
void * yyrealloc (void * ptr, size_t bytes);
void   yyfree (void * ptr);

// For a reentrant scanner
void * yyalloc (size_t bytes, void * yyscanner);
void * yyrealloc (void * ptr, size_t bytes, void * yyscanner);
void   yyfree (void * ptr, void * yyscanner);
@end verbatim
@end example

@end enumerate

In the following example, we will override all three memory routines. We assume
that there is a custom allocator with garbage collection. In order to make this
example interesting, we will use a reentrant scanner, passing a pointer to the
custom allocator through @code{yyextra}.

@cindex overriding the memory routines
@example
@verbatim
%{
#include "some_allocator.h"
%}

/* Suppress the default implementations. */
%option noyyalloc noyyrealloc noyyfree
%option reentrant

/* Initialize the allocator. */
%{
#define YY_EXTRA_TYPE  struct allocator*
#define YY_USER_INIT  yyextra = allocator_create();
%}

%%
.|\n   ;
%%

/* Provide our own implementations. */
void * yyalloc (size_t bytes, void* yyscanner) {
    return allocator_alloc (yyextra, bytes);
}

void * yyrealloc (void * ptr, size_t bytes, void* yyscanner) {
    return allocator_realloc (yyextra, bytes);
}

void yyfree (void * ptr, void * yyscanner) {      
    /* Do nothing -- we leave it to the garbage collector. */
}

@end verbatim
@end example


@node A Note About yytext And Memory,  , Overriding The Default Memory Management, Memory Management
@section A Note About yytext And Memory

@cindex yytext, memory considerations

When flex finds a match, @code{yytext} points to the first character of the
match in the input buffer. The string itself is part of the input buffer, and
is @emph{NOT} allocated separately. The value of yytext will be overwritten the next
time yylex() is called. In short, the value of yytext is only valid from within
the matched rule's action.

Often, you want the value of yytext to persist for later processing, i.e., by a
parser with non-zero lookahead. In order to preserve yytext, you will have to
copy it with strdup() or a similar function. But this introduces some headache
because your parser is now responsible for freeing the copy of yytext. If you
use a yacc or bison parser, (commonly used with flex), you will discover that
the error recovery mechanisms can cause memory to be leaked.

To prevent memory leaks from strdup'd yytext, you will have to track the memory
somehow. Our experience has shown that a garbage collection mechanism or a
pooled memory mechanism will save you a lot of grief when writing parsers.

@node Serialized Tables, Diagnostics, Memory Management, Top
@chapter Serialized Tables
@cindex serialization
@cindex memory, serialized tables

@anchor{serialization}
A @code{flex} scanner has the ability to save the DFA tables to a file, and
load them at runtime when needed.  The motivation for this feature is to reduce
the runtime memory footprint.  Traditionally, these tables have been compiled into
the scanner as C arrays, and are sometimes quite large.  Since the tables are
compiled into the scanner, the memory used by the tables can never be freed.
This is a waste of memory, especially if an application uses several scanners,
but none of them at the same time.

The serialization feature allows the tables to be loaded at runtime, before
scanning begins. The tables may be discarded when scanning is finished.

@menu
* Creating Serialized Tables::  
* Loading and Unloading Serialized Tables::  
* Tables File Format::          
@end menu

@node Creating Serialized Tables, Loading and Unloading Serialized Tables, Serialized Tables, Serialized Tables
@section Creating Serialized Tables
@cindex tables, creating serialized
@cindex serialization of tables

You may create a scanner with serialized tables by specifying:

@example
@verbatim
    %option tables-file=FILE
or
    --tables-file=FILE
@end verbatim
@end example

These options instruct flex to save the DFA tables to the file @var{FILE}. The tables
will @emph{not} be embedded in the generated scanner. The scanner will not
function on its own. The scanner will be dependent upon the serialized tables. You must
load the tables from this file at runtime before you can scan anything. 

If you do not specify a filename to @code{--tables-file}, the tables will be
saved to @file{lex.yy.tables}, where @samp{yy} is the appropriate prefix.

If your project uses several different scanners, you can concatenate the
serialized tables into one file, and flex will find the correct set of tables,
using the scanner prefix as part of the lookup key. An example follows:

@cindex serialized tables, multiple scanners
@example
@verbatim
$ flex --tables-file --prefix=cpp cpp.l
$ flex --tables-file --prefix=c   c.l
$ cat lex.cpp.tables lex.c.tables  >  all.tables
@end verbatim
@end example

The above example created two scanners, @samp{cpp}, and @samp{c}. Since we did
not specify a filename, the tables were serialized to @file{lex.c.tables} and
@file{lex.cpp.tables}, respectively. Then, we concatenated the two files
together into @file{all.tables}, which we will distribute with our project. At
runtime, we will open the file and tell flex to load the tables from it.  Flex
will find the correct tables automatically. (See next section).

@node Loading and Unloading Serialized Tables, Tables File Format, Creating Serialized Tables, Serialized Tables
@section Loading and Unloading Serialized Tables
@cindex tables, loading and unloading
@cindex loading tables at runtime
@cindex tables, freeing
@cindex freeing tables
@cindex memory, serialized tables

If you've built your scanner with @code{%option tables-file}, then you must
load the scanner tables at runtime. This can be accomplished with the following
function:

@deftypefun int yytables_fload (FILE* @var{fp} [, yyscan_t @var{scanner}])
Locates scanner tables in the stream pointed to by @var{fp} and loads them.
Memory for the tables is allocated via @code{yyalloc}.  You must call this
function before the first call to @code{yylex}. The argument @var{scanner}
only appears in the reentrant scanner.
This function returns @samp{0} (zero) on success, or non-zero on error.
@end deftypefun

The loaded tables are @strong{not} automatically destroyed (unloaded) when you
call @code{yylex_destroy}. The reason is that you may create several scanners
of the same type (in a reentrant scanner), each of which needs access to these
tables.  To avoid a nasty memory leak, you must call the following function:

@deftypefun int yytables_destroy ([yyscan_t @var{scanner}])
Unloads the scanner tables. The tables must be loaded again before you can scan
any more data.  The argument @var{scanner} only appears in the reentrant
scanner.  This function returns @samp{0} (zero) on success, or non-zero on
error.
@end deftypefun

@strong{The functions @code{yytables_fload} and @code{yytables_destroy} are not
thread-safe.} You must ensure that these functions are called exactly once (for
each scanner type) in a threaded program, before any thread calls @code{yylex}.
After the tables are loaded, they are never written to, and no thread
protection is required thereafter -- until you destroy them.

@node Tables File Format,  , Loading and Unloading Serialized Tables, Serialized Tables
@section Tables File Format
@cindex tables, file format
@cindex file format, serialized tables

This section defines the file format of serialized @code{flex} tables.

The tables format allows for one or more sets of tables to be
specified, where each set corresponds to a given scanner. Scanners are
indexed by name, as described below. The file format is as follows:

@example
@verbatim
                 TABLE SET 1
                +-------------------------------+
        Header  | uint32          th_magic;     |
                | uint32          th_hsize;     |
                | uint32          th_ssize;     |
                | uint16          th_flags;     |
                | char            th_version[]; |
                | char            th_name[];    |
                | uint8           th_pad64[];   |
                +-------------------------------+
        Table 1 | uint16          td_id;        |
                | uint16          td_flags;     |
                | uint32          td_hilen;     |
                | uint32          td_lolen;     |
                | void            td_data[];    |
                | uint8           td_pad64[];   |
                +-------------------------------+
        Table 2 |                               |
           .    .                               .
           .    .                               .
           .    .                               .
           .    .                               .
        Table n |                               |
                +-------------------------------+
                 TABLE SET 2
                      .
                      .
                      .
                 TABLE SET N
@end verbatim
@end example

The above diagram shows that a complete set of tables consists of a header
followed by multiple individual tables. Furthermore, multiple complete sets may
be present in the same file, each set with its own header and tables. The sets
are contiguous in the file. The only way to know if another set follows is to
check the next four bytes for the magic number (or check for EOF). The header
and tables sections are padded to 64-bit boundaries. Below we describe each
field in detail. This format does not specify how the scanner will expand the
given data, i.e., data may be serialized as int8, but expanded to an int32
array at runtime. This is to reduce the size of the serialized data where
possible.  Remember, @emph{all integer values are in network byte order}. 

@noindent
Fields of a table header:

@table @code
@item th_magic
Magic number, always 0xF13C57B1.

@item th_hsize
Size of this entire header, in bytes, including all fields plus any padding.

@item th_ssize
Size of this entire set, in bytes, including the header, all tables, plus
any padding.

@item th_flags
Bit flags for this table set. Currently unused.

@item th_version[]
Flex version in NULL-terminated string format. e.g., @samp{2.5.13a}. This is
the version of flex that was used to create the serialized tables.

@item th_name[]
Contains the name of this table set. The default is @samp{yytables},
and is prefixed accordingly, e.g., @samp{footables}. Must be NULL-terminated.

@item th_pad64[]
Zero or more NULL bytes, padding the entire header to the next 64-bit boundary
as calculated from the beginning of the header.
@end table

@noindent
Fields of a table:

@table @code
@item td_id
Specifies the table identifier. Possible values are:
@table @code
@item YYTD_ID_ACCEPT (0x01)
@code{yy_accept}
@item YYTD_ID_BASE   (0x02)
@code{yy_base}
@item YYTD_ID_CHK    (0x03)
@code{yy_chk}
@item YYTD_ID_DEF    (0x04)
@code{yy_def}
@item YYTD_ID_EC     (0x05)
@code{yy_ec }
@item YYTD_ID_META   (0x06)
@code{yy_meta}
@item YYTD_ID_NUL_TRANS (0x07)
@code{yy_NUL_trans}
@item YYTD_ID_NXT (0x08)
@code{yy_nxt}. This array may be two dimensional. See the @code{td_hilen}
field below.
@item YYTD_ID_RULE_CAN_MATCH_EOL (0x09)
@code{yy_rule_can_match_eol}
@item YYTD_ID_START_STATE_LIST (0x0A)
@code{yy_start_state_list}. This array is handled specially because it is an
array of pointers to structs. See the @code{td_flags} field below.
@item YYTD_ID_TRANSITION (0x0B)
@code{yy_transition}. This array is handled specially because it is an array of
structs. See the @code{td_lolen} field below.
@item YYTD_ID_ACCLIST (0x0C)
@code{yy_acclist}
@end table

@item td_flags
Bit flags describing how to interpret the data in @code{td_data}.
The data arrays are one-dimensional by default, but may be
two dimensional as specified in the @code{td_hilen} field.

@table @code
@item YYTD_DATA8 (0x01)
The data is serialized as an array of type int8.
@item YYTD_DATA16 (0x02)
The data is serialized as an array of type int16.
@item YYTD_DATA32 (0x04)
The data is serialized as an array of type int32.
@item YYTD_PTRANS (0x08)
The data is a list of indexes of entries in the expanded @code{yy_transition}
array.  Each index should be expanded to a pointer to the corresponding entry
in the @code{yy_transition} array. We count on the fact that the
@code{yy_transition} array has already been seen.
@item YYTD_STRUCT (0x10)
The data is a list of yy_trans_info structs, each of which consists of
two integers. There is no padding between struct elements or between structs.
The type of each member is determined by the @code{YYTD_DATA*} bits.
@end table

@item td_hilen
If @code{td_hilen} is non-zero, then the data is a two-dimensional array.
Otherwise, the data is a one-dimensional array. @code{td_hilen} contains the
number of elements in the higher dimensional array, and @code{td_lolen} contains
the number of elements in the lowest dimension.

Conceptually, @code{td_data} is either @code{sometype td_data[td_lolen]}, or
@code{sometype td_data[td_hilen][td_lolen]}, where @code{sometype} is specified
by the @code{td_flags} field.  It is possible for both @code{td_lolen} and
@code{td_hilen} to be zero, in which case @code{td_data} is a zero length
array, and no data is loaded, i.e., this table is simply skipped. Flex does not
currently generate tables of zero length.

@item td_lolen
Specifies the number of elements in the lowest dimension array. If this is
a one-dimensional array, then it is simply the number of elements in this array.
The element size is determined by the @code{td_flags} field.

@item td_data[]
The table data. This array may be a one- or two-dimensional array, of type
@code{int8}, @code{int16}, @code{int32}, @code{struct yy_trans_info}, or
@code{struct yy_trans_info*},  depending upon the values in the
@code{td_flags}, @code{td_hilen}, and @code{td_lolen} fields.

@item td_pad64[]
Zero or more NULL bytes, padding the entire table to the next 64-bit boundary as
calculated from the beginning of this table.
@end table

@node Diagnostics, Limitations, Serialized Tables, Top
@chapter Diagnostics

@cindex error reporting, diagnostic messages
@cindex warnings, diagnostic messages

The following is a list of @code{flex} diagnostic messages:

@itemize
@item
@samp{warning, rule cannot be matched} indicates that the given rule
cannot be matched because it follows other rules that will always match
the same text as it.  For example, in the following @samp{foo} cannot be
matched because it comes after an identifier ``catch-all'' rule:

@cindex warning, rule cannot be matched
@example
@verbatim
    [a-z]+    got_identifier();
    foo       got_foo();
@end verbatim
@end example

Using @code{REJECT} in a scanner suppresses this warning.

@item
@samp{warning, -s option given but default rule can be matched} means
that it is possible (perhaps only in a particular start condition) that
the default rule (match any single character) is the only one that will
match a particular input.  Since @samp{-s} was given, presumably this is
not intended.

@item
@code{reject_used_but_not_detected undefined} or
@code{yymore_used_but_not_detected undefined}. These errors can occur
at compile time.  They indicate that the scanner uses @code{REJECT} or
@code{yymore()} but that @code{flex} failed to notice the fact, meaning
that @code{flex} scanned the first two sections looking for occurrences
of these actions and failed to find any, but somehow you snuck some in
(via a #include file, for example).  Use @code{%option reject} or
@code{%option yymore} to indicate to @code{flex} that you really do use
these features.

@item
@samp{flex scanner jammed}. a scanner compiled with
@samp{-s} has encountered an input string which wasn't matched by any of
its rules.  This error can also occur due to internal problems.

@item
@samp{token too large, exceeds YYLMAX}. your scanner uses @code{%array}
and one of its rules matched a string longer than the @code{YYLMAX}
constant (8K bytes by default).  You can increase the value by
#define'ing @code{YYLMAX} in the definitions section of your @code{flex}
input.

@item
@samp{scanner requires -8 flag to use the character 'x'}. Your scanner
specification includes recognizing the 8-bit character @samp{'x'} and
you did not specify the -8 flag, and your scanner defaulted to 7-bit
because you used the @samp{-Cf} or @samp{-CF} table compression options.
See the discussion of the @samp{-7} flag, @ref{Scanner Options}, for
details.

@item
@samp{flex scanner push-back overflow}. you used @code{unput()} to push
back so much text that the scanner's buffer could not hold both the
pushed-back text and the current token in @code{yytext}.  Ideally the
scanner should dynamically resize the buffer in this case, but at
present it does not.

@item
@samp{input buffer overflow, can't enlarge buffer because scanner uses
REJECT}.  the scanner was working on matching an extremely large token
and needed to expand the input buffer.  This doesn't work with scanners
that use @code{REJECT}.

@item
@samp{fatal flex scanner internal error--end of buffer missed}. This can
occur in a scanner which is reentered after a long-jump has jumped out
(or over) the scanner's activation frame.  Before reentering the
scanner, use:
@example
@verbatim
    yyrestart( yyin );
@end verbatim
@end example
or, as noted above, switch to using the C++ scanner class.

@item
@samp{too many start conditions in <> construct!}  you listed more start
conditions in a <> construct than exist (so you must have listed at
least one of them twice).
@end itemize

@node Limitations, Bibliography, Diagnostics, Top
@chapter Limitations

@cindex limitations of flex

Some trailing context patterns cannot be properly matched and generate
warning messages (@samp{dangerous trailing context}).  These are
patterns where the ending of the first part of the rule matches the
beginning of the second part, such as @samp{zx*/xy*}, where the 'x*'
matches the 'x' at the beginning of the trailing context.  (Note that
the POSIX draft states that the text matched by such patterns is
undefined.)  For some trailing context rules, parts which are actually
fixed-length are not recognized as such, leading to the abovementioned
performance loss.  In particular, parts using @samp{|} or @samp{@{n@}}
(such as @samp{foo@{3@}}) are always considered variable-length.
Combining trailing context with the special @samp{|} action can result
in @emph{fixed} trailing context being turned into the more expensive
@emph{variable} trailing context.  For example, in the following:

@cindex warning, dangerous trailing context
@example
@verbatim
    %%
    abc      |
    xyz/def
@end verbatim
@end example

Use of @code{unput()} invalidates yytext and yyleng, unless the
@code{%array} directive or the @samp{-l} option has been used.
Pattern-matching of @code{NUL}s is substantially slower than matching
other characters.  Dynamic resizing of the input buffer is slow, as it
entails rescanning all the text matched so far by the current (generally
huge) token.  Due to both buffering of input and read-ahead, you cannot
intermix calls to @file{<stdio.h>} routines, such as, @b{getchar()},
with @code{flex} rules and expect it to work.  Call @code{input()}
instead.  The total table entries listed by the @samp{-v} flag excludes
the number of table entries needed to determine what rule has been
matched.  The number of entries is equal to the number of DFA states if
the scanner does not use @code{REJECT}, and somewhat greater than the
number of states if it does.  @code{REJECT} cannot be used with the
@samp{-f} or @samp{-F} options.

The @code{flex} internal algorithms need documentation.

@node Bibliography, FAQ, Limitations, Top
@chapter Additional Reading

You may wish to read more about the following programs:
@itemize
@item lex
@item yacc
@item sed
@item awk
@end itemize

The following books may contain material of interest:

John Levine, Tony Mason, and Doug Brown,
@emph{Lex & Yacc},
O'Reilly and Associates.  Be sure to get the 2nd edition.

M. E. Lesk and E. Schmidt,
@emph{LEX -- Lexical Analyzer Generator}

Alfred Aho, Ravi Sethi and Jeffrey Ullman, @emph{Compilers: Principles,
Techniques and Tools}, Addison-Wesley (1986).  Describes the
pattern-matching techniques used by @code{flex} (deterministic finite
automata).

@node FAQ, Appendices, Bibliography, Top
@unnumbered FAQ

From time to time, the @code{flex} maintainer receives certain
questions. Rather than repeat answers to well-understood problems, we
publish them here.

@menu
* When was flex born?::         
* How do I expand backslash-escape sequences in C-style quoted strings?::  
* Why do flex scanners call fileno if it is not ANSI compatible?::  
* Does flex support recursive pattern definitions?::  
* How do I skip huge chunks of input (tens of megabytes) while using flex?::  
* Flex is not matching my patterns in the same order that I defined them.::  
* My actions are executing out of order or sometimes not at all.::  
* How can I have multiple input sources feed into the same scanner at the same time?::  
* Can I build nested parsers that work with the same input file?::  
* How can I match text only at the end of a file?::  
* How can I make REJECT cascade across start condition boundaries?::  
* Why cant I use fast or full tables with interactive mode?::  
* How much faster is -F or -f than -C?::  
* If I have a simple grammar cant I just parse it with flex?::  
* Why doesn't yyrestart() set the start state back to INITIAL?::  
* How can I match C-style comments?::  
* The period isn't working the way I expected.::  
* Can I get the flex manual in another format?::  
* Does there exist a "faster" NDFA->DFA algorithm?::  
* How does flex compile the DFA so quickly?::  
* How can I use more than 8192 rules?::  
* How do I abandon a file in the middle of a scan and switch to a new file?::  
* How do I execute code only during initialization (only before the first scan)?::  
* How do I execute code at termination?::  
* Where else can I find help?::  
* Can I include comments in the "rules" section of the file?::  
* I get an error about undefined yywrap().::  
* How can I change the matching pattern at run time?::  
* How can I expand macros in the input?::  
* How can I build a two-pass scanner?::  
* How do I match any string not matched in the preceding rules?::  
* I am trying to port code from AT&T lex that uses yysptr and yysbuf.::  
* Is there a way to make flex treat NULL like a regular character?::  
* Whenever flex can not match the input it says "flex scanner jammed".::  
* Why doesn't flex have non-greedy operators like perl does?::  
* Memory leak - 16386 bytes allocated by malloc.::  
* How do I track the byte offset for lseek()?::  
* How do I use my own I/O classes in a C++ scanner?::  
* How do I skip as many chars as possible?::  
* deleteme00::              
* Are certain equivalent patterns faster than others?::              
* Is backing up a big deal?::              
* Can I fake multi-byte character support?::              
* deleteme01::              
* Can you discuss some flex internals?::              
* unput() messes up yy_at_bol::              
* The | operator is not doing what I want::              
* Why can't flex understand this variable trailing context pattern?::              
* The ^ operator isn't working::              
* Trailing context is getting confused with trailing optional patterns::              
* Is flex GNU or not?::              
* ERASEME53::              
* I need to scan if-then-else blocks and while loops::              
* ERASEME55::              
* ERASEME56::              
* ERASEME57::              
* Is there a repository for flex scanners?::              
* How can I conditionally compile or preprocess my flex input file?::              
* Where can I find grammars for lex and yacc?::              
* I get an end-of-buffer message for each character scanned.::              
* unnamed-faq-62::              
* unnamed-faq-63::              
* unnamed-faq-64::              
* unnamed-faq-65::              
* unnamed-faq-66::              
* unnamed-faq-67::              
* unnamed-faq-68::              
* unnamed-faq-69::              
* unnamed-faq-70::              
* unnamed-faq-71::              
* unnamed-faq-72::              
* unnamed-faq-73::              
* unnamed-faq-74::              
* unnamed-faq-75::              
* unnamed-faq-76::              
* unnamed-faq-77::              
* unnamed-faq-78::              
* unnamed-faq-79::              
* unnamed-faq-80::              
* unnamed-faq-81::              
* unnamed-faq-82::              
* unnamed-faq-83::              
* unnamed-faq-84::              
* unnamed-faq-85::              
* unnamed-faq-86::              
* unnamed-faq-87::              
* unnamed-faq-88::              
* unnamed-faq-90::              
* unnamed-faq-91::              
* unnamed-faq-92::              
* unnamed-faq-93::              
* unnamed-faq-94::              
* unnamed-faq-95::              
* unnamed-faq-96::              
* unnamed-faq-97::              
* unnamed-faq-98::              
* unnamed-faq-99::              
* unnamed-faq-100::             
* unnamed-faq-101::             
* What is the difference between YYLEX_PARAM and YY_DECL?::
* Why do I get "conflicting types for yylex" error?::
* How do I access the values set in a Flex action from within a Bison action?::
@end menu

@node  When was flex born?
@unnumberedsec When was flex born?

Vern Paxson took over
the @cite{Software Tools} lex project from Jef Poskanzer in 1982.  At that point it
was written in Ratfor.  Around 1987 or so, Paxson translated it into C, and
a legend was born :-).

@node How do I expand backslash-escape sequences in C-style quoted strings?
@unnumberedsec How do I expand backslash-escape sequences in C-style quoted strings?

A key point when scanning quoted strings is that you cannot (easily) write
a single rule that will precisely match the string if you allow things
like embedded escape sequences and newlines.  If you try to match strings
with a single rule then you'll wind up having to rescan the string anyway
to find any escape sequences.

Instead you can use exclusive start conditions and a set of rules, one for
matching non-escaped text, one for matching a single escape, one for
matching an embedded newline, and one for recognizing the end of the
string.  Each of these rules is then faced with the question of where to
put its intermediary results.  The best solution is for the rules to
append their local value of @code{yytext} to the end of a ``string literal''
buffer.  A rule like the escape-matcher will append to the buffer the
meaning of the escape sequence rather than the literal text in @code{yytext}.
In this way, @code{yytext} does not need to be modified at all.

@node  Why do flex scanners call fileno if it is not ANSI compatible?
@unnumberedsec Why do flex scanners call fileno if it is not ANSI compatible?

Flex scanners call @code{fileno()} in order to get the file descriptor
corresponding to @code{yyin}. The file descriptor may be passed to
@code{isatty()} or @code{read()}, depending upon which @code{%options} you specified.
If your system does not have @code{fileno()} support, to get rid of the
@code{read()} call, do not specify @code{%option read}. To get rid of the @code{isatty()}
call, you must specify one of @code{%option always-interactive} or
@code{%option never-interactive}.

@node  Does flex support recursive pattern definitions?
@unnumberedsec Does flex support recursive pattern definitions?

e.g.,

@example
@verbatim
%%
block   "{"({block}|{statement})*"}"
@end verbatim
@end example

No. You cannot have recursive definitions.  The pattern-matching power of
regular expressions in general (and therefore flex scanners, too) is
limited.  In particular, regular expressions cannot ``balance'' parentheses
to an arbitrary degree.  For example, it's impossible to write a regular
expression that matches all strings containing the same number of '@{'s
as '@}'s.  For more powerful pattern matching, you need a parser, such
as @cite{GNU bison}.

@node  How do I skip huge chunks of input (tens of megabytes) while using flex?
@unnumberedsec How do I skip huge chunks of input (tens of megabytes) while using flex?

Use @code{fseek()} (or @code{lseek()}) to position yyin, then call @code{yyrestart()}.

@node  Flex is not matching my patterns in the same order that I defined them.
@unnumberedsec Flex is not matching my patterns in the same order that I defined them.

@code{flex} picks the
rule that matches the most text (i.e., the longest possible input string).
This is because @code{flex} uses an entirely different matching technique
(``deterministic finite automata'') that actually does all of the matching
simultaneously, in parallel.  (Seems impossible, but it's actually a fairly
simple technique once you understand the principles.)

A side-effect of this parallel matching is that when the input matches more
than one rule, @code{flex} scanners pick the rule that matched the @emph{most} text. This
is explained further in the manual, in the section @xref{Matching}.

If you want @code{flex} to choose a shorter match, then you can work around this
behavior by expanding your short
rule to match more text, then put back the extra:

@example
@verbatim
data_.*        yyless( 5 ); BEGIN BLOCKIDSTATE;
@end verbatim
@end example

Another fix would be to make the second rule active only during the
@code{<BLOCKIDSTATE>} start condition, and make that start condition exclusive
by declaring it with @code{%x} instead of @code{%s}.

A final fix is to change the input language so that the ambiguity for
@samp{data_} is removed, by adding characters to it that don't match the
identifier rule, or by removing characters (such as @samp{_}) from the
identifier rule so it no longer matches @samp{data_}.  (Of course, you might
also not have the option of changing the input language.)

@node  My actions are executing out of order or sometimes not at all.
@unnumberedsec My actions are executing out of order or sometimes not at all.

Most likely, you have (in error) placed the opening @samp{@{} of the action
block on a different line than the rule, e.g.,

@example
@verbatim
^(foo|bar)
{  <<<--- WRONG!

}
@end verbatim
@end example

@code{flex} requires that the opening @samp{@{} of an action associated with a rule
begin on the same line as does the rule.  You need instead to write your rules
as follows:

@example
@verbatim
^(foo|bar)   {  // CORRECT!

}
@end verbatim
@end example

@node  How can I have multiple input sources feed into the same scanner at the same time?
@unnumberedsec How can I have multiple input sources feed into the same scanner at the same time?

If @dots{}
@itemize
@item
your scanner is free of backtracking (verified using @code{flex}'s @samp{-b} flag),
@item
AND you run your scanner interactively (@samp{-I} option; default unless using special table
compression options),
@item
AND you feed it one character at a time by redefining @code{YY_INPUT} to do so,
@end itemize

then every time it matches a token, it will have exhausted its input
buffer (because the scanner is free of backtracking).  This means you
can safely use @code{select()} at the point and only call @code{yylex()} for another
token if @code{select()} indicates there's data available.

That is, move the @code{select()} out from the input function to a point where
it determines whether @code{yylex()} gets called for the next token.

With this approach, you will still have problems if your input can arrive
piecemeal; @code{select()} could inform you that the beginning of a token is
available, you call @code{yylex()} to get it, but it winds up blocking waiting
for the later characters in the token.

Here's another way:  Move your input multiplexing inside of @code{YY_INPUT}.  That
is, whenever @code{YY_INPUT} is called, it @code{select()}'s to see where input is
available.  If input is available for the scanner, it reads and returns the
next byte.  If input is available from another source, it calls whatever
function is responsible for reading from that source.  (If no input is
available, it blocks until some input is available.)  I've used this technique in an
interpreter I wrote that both reads keyboard input using a @code{flex} scanner and
IPC traffic from sockets, and it works fine.

@node  Can I build nested parsers that work with the same input file?
@unnumberedsec Can I build nested parsers that work with the same input file?

This is not going to work without some additional effort.  The reason is
that @code{flex} block-buffers the input it reads from @code{yyin}.  This means that the
``outermost'' @code{yylex()}, when called, will automatically slurp up the first 8K
of input available on yyin, and subsequent calls to other @code{yylex()}'s won't
see that input.  You might be tempted to work around this problem by
redefining @code{YY_INPUT} to only return a small amount of text, but it turns out
that that approach is quite difficult.  Instead, the best solution is to
combine all of your scanners into one large scanner, using a different
exclusive start condition for each.

@node  How can I match text only at the end of a file?
@unnumberedsec How can I match text only at the end of a file?

There is no way to write a rule which is ``match this text, but only if
it comes at the end of the file''.  You can fake it, though, if you happen
to have a character lying around that you don't allow in your input.
Then you redefine @code{YY_INPUT} to call your own routine which, if it sees
an @samp{EOF}, returns the magic character first (and remembers to return a
real @code{EOF} next time it's called).  Then you could write:

@example
@verbatim
<COMMENT>(.|\n)*{EOF_CHAR}    /* saw comment at EOF */
@end verbatim
@end example

@node  How can I make REJECT cascade across start condition boundaries?
@unnumberedsec How can I make REJECT cascade across start condition boundaries?

You can do this as follows.  Suppose you have a start condition @samp{A}, and
after exhausting all of the possible matches in @samp{<A>}, you want to try
matches in @samp{<INITIAL>}.  Then you could use the following:

@example
@verbatim
%x A
%%
<A>rule_that_is_long    ...; REJECT;
<A>rule                 ...; REJECT; /* shorter rule */
<A>etc.
...
<A>.|\n  {
/* Shortest and last rule in <A>, so
* cascaded REJECTs will eventually
* wind up matching this rule.  We want
* to now switch to the initial state
* and try matching from there instead.
*/
yyless(0);    /* put back matched text */
BEGIN(INITIAL);
}
@end verbatim
@end example

@node  Why cant I use fast or full tables with interactive mode?
@unnumberedsec Why can't I use fast or full tables with interactive mode?

One of the assumptions
flex makes is that interactive applications are inherently slow (they're
waiting on a human after all).
It has to do with how the scanner detects that it must be finished scanning
a token.  For interactive scanners, after scanning each character the current
state is looked up in a table (essentially) to see whether there's a chance
of another input character possibly extending the length of the match.  If
not, the scanner halts.  For non-interactive scanners, the end-of-token test
is much simpler, basically a compare with 0, so no memory bus cycles.  Since
the test occurs in the innermost scanning loop, one would like to make it go
as fast as possible.

Still, it seems reasonable to allow the user to choose to trade off a bit
of performance in this area to gain the corresponding flexibility.  There
might be another reason, though, why fast scanners don't support the
interactive option.

@node  How much faster is -F or -f than -C?
@unnumberedsec How much faster is -F or -f than -C?

Much faster (factor of 2-3).

@node  If I have a simple grammar cant I just parse it with flex?
@unnumberedsec If I have a simple grammar can't I just parse it with flex?

Is your grammar recursive? That's almost always a sign that you're
better off using a parser/scanner rather than just trying to use a scanner
alone.

@node  Why doesn't yyrestart() set the start state back to INITIAL?
@unnumberedsec Why doesn't yyrestart() set the start state back to INITIAL?

There are two reasons.  The first is that there might
be programs that rely on the start state not changing across file changes.
The second is that beginning with @code{flex} version 2.4, use of @code{yyrestart()} is no longer required,
so fixing the problem there doesn't solve the more general problem.

@node  How can I match C-style comments?
@unnumberedsec How can I match C-style comments?

You might be tempted to try something like this:

@example
@verbatim
"/*".*"*/"       // WRONG!
@end verbatim
@end example

or, worse, this:

@example
@verbatim
"/*"(.|\n)"*/"   // WRONG!
@end verbatim
@end example

The above rules will eat too much input, and blow up on things like:

@example
@verbatim
/* a comment */ do_my_thing( "oops */" );
@end verbatim
@end example

Here is one way which allows you to track line information:

@example
@verbatim
<INITIAL>{
"/*"              BEGIN(IN_COMMENT);
}
<IN_COMMENT>{
"*/"      BEGIN(INITIAL);
[^*\n]+   // eat comment in chunks
"*"       // eat the lone star
\n        yylineno++;
}
@end verbatim
@end example

@node  The period isn't working the way I expected.
@unnumberedsec The '.' isn't working the way I expected.

Here are some tips for using @samp{.}:

@itemize
@item
A common mistake is to place the grouping parenthesis AFTER an operator, when
you really meant to place the parenthesis BEFORE the operator, e.g., you
probably want this @code{(foo|bar)+} and NOT this @code{(foo|bar+)}.

The first pattern matches the words @samp{foo} or @samp{bar} any number of
times, e.g., it matches the text @samp{barfoofoobarfoo}. The
second pattern matches a single instance of @code{foo} or a single instance of
@code{bar} followed by one or more @samp{r}s, e.g., it matches the text @code{barrrr} .
@item
A @samp{.} inside @samp{[]}'s just means a literal@samp{.} (period),
and NOT ``any character except newline''.
@item
Remember that @samp{.} matches any character EXCEPT @samp{\n} (and @samp{EOF}).
If you really want to match ANY character, including newlines, then use @code{(.|\n)}
Beware that the regex @code{(.|\n)+} will match your entire input!
@item
Finally, if you want to match a literal @samp{.} (a period), then use @samp{[.]} or @samp{"."}
@end itemize

@node  Can I get the flex manual in another format?
@unnumberedsec Can I get the flex manual in another format?

The @code{flex} source distribution  includes a texinfo manual. You are
free to convert that texinfo into whatever format you desire. The
@code{texinfo} package includes tools for conversion to a number of formats.

@node  Does there exist a "faster" NDFA->DFA algorithm?
@unnumberedsec Does there exist a "faster" NDFA->DFA algorithm?

There's no way around the potential exponential running time - it
can take you exponential time just to enumerate all of the DFA states.
In practice, though, the running time is closer to linear, or sometimes
quadratic.

@node  How does flex compile the DFA so quickly?
@unnumberedsec How does flex compile the DFA so quickly?

There are two big speed wins that @code{flex} uses:

@enumerate
@item
It analyzes the input rules to construct equivalence classes for those
characters that always make the same transitions.  It then rewrites the NFA
using equivalence classes for transitions instead of characters.  This cuts
down the NFA->DFA computation time dramatically, to the point where, for
uncompressed DFA tables, the DFA generation is often I/O bound in writing out
the tables.
@item
It maintains hash values for previously computed DFA states, so testing
whether a newly constructed DFA state is equivalent to a previously constructed
state can be done very quickly, by first comparing hash values.
@end enumerate

@node  How can I use more than 8192 rules?
@unnumberedsec How can I use more than 8192 rules?

@code{Flex} is compiled with an upper limit of 8192 rules per scanner.
If you need more than 8192 rules in your scanner, you'll have to recompile @code{flex}
with the following changes in @file{flexdef.h}:

@example
@verbatim
<    #define YY_TRAILING_MASK 0x2000
<    #define YY_TRAILING_HEAD_MASK 0x4000
--
>    #define YY_TRAILING_MASK 0x20000000
>    #define YY_TRAILING_HEAD_MASK 0x40000000
@end verbatim
@end example

This should work okay as long as your C compiler uses 32 bit integers.
But you might want to think about whether using such a huge number of rules
is the best way to solve your problem.

The following may also be relevant:

With luck, you should be able to increase the definitions in flexdef.h for:

@example
@verbatim
#define JAMSTATE -32766 /* marks a reference to the state that always jams */
#define MAXIMUM_MNS 31999
#define BAD_SUBSCRIPT -32767
@end verbatim
@end example

recompile everything, and it'll all work.  Flex only has these 16-bit-like
values built into it because a long time ago it was developed on a machine
with 16-bit ints.  I've given this advice to others in the past but haven't
heard back from them whether it worked okay or not...

@node  How do I abandon a file in the middle of a scan and switch to a new file?
@unnumberedsec How do I abandon a file in the middle of a scan and switch to a new file?

Just call @code{yyrestart(newfile)}. Be sure to reset the start state if you want a
``fresh start, since @code{yyrestart} does NOT reset the start state back to @code{INITIAL}.

@node  How do I execute code only during initialization (only before the first scan)?
@unnumberedsec How do I execute code only during initialization (only before the first scan)?

You can specify an initial action by defining the macro @code{YY_USER_INIT} (though
note that @code{yyout} may not be available at the time this macro is executed).  Or you
can add to the beginning of your rules section:

@example
@verbatim
%%
    /* Must be indented! */
    static int did_init = 0;

    if ( ! did_init ){
do_my_init();
        did_init = 1;
    }
@end verbatim
@end example

@node  How do I execute code at termination?
@unnumberedsec How do I execute code at termination?

You can specify an action for the @code{<<EOF>>} rule.

@node  Where else can I find help?
@unnumberedsec Where else can I find help?

You can find the flex homepage on the web at
@uref{http://flex.sourceforge.net/}. See that page for details about flex
mailing lists as well.

@node  Can I include comments in the "rules" section of the file?
@unnumberedsec Can I include comments in the "rules" section of the file?

Yes, just about anywhere you want to. See the manual for the specific syntax.

@node  I get an error about undefined yywrap().
@unnumberedsec I get an error about undefined yywrap().

You must supply a @code{yywrap()} function of your own, or link to @file{libfl.a}
(which provides one), or use

@example
@verbatim
%option noyywrap
@end verbatim
@end example

in your source to say you don't want a @code{yywrap()} function.

@node  How can I change the matching pattern at run time?
@unnumberedsec How can I change the matching pattern at run time?

You can't, it's compiled into a static table when flex builds the scanner.

@node How can I expand macros in the input?
@unnumberedsec How can I expand macros in the input?

The best way to approach this problem is at a higher level, e.g., in the parser.

However, you can do this using multiple input buffers.

@example
@verbatim
%%
macro/[a-z]+	{
/* Saw the macro "macro" followed by extra stuff. */
main_buffer = YY_CURRENT_BUFFER;
expansion_buffer = yy_scan_string(expand(yytext));
yy_switch_to_buffer(expansion_buffer);
}

<<EOF>>	{
if ( expansion_buffer )
{
// We were doing an expansion, return to where
// we were.
yy_switch_to_buffer(main_buffer);
yy_delete_buffer(expansion_buffer);
expansion_buffer = 0;
}
else
yyterminate();
}
@end verbatim
@end example

You probably will want a stack of expansion buffers to allow nested macros.
From the above though hopefully the idea is clear.

@node How can I build a two-pass scanner?
@unnumberedsec How can I build a two-pass scanner?

One way to do it is to filter the first pass to a temporary file,
then process the temporary file on the second pass. You will probably see a
performance hit, due to all the disk I/O.

When you need to look ahead far forward like this, it almost always means
that the right solution is to build a parse tree of the entire input, then
walk it after the parse in order to generate the output.  In a sense, this
is a two-pass approach, once through the text and once through the parse
tree, but the performance hit for the latter is usually an order of magnitude
smaller, since everything is already classified, in binary format, and
residing in memory.

@node How do I match any string not matched in the preceding rules?
@unnumberedsec How do I match any string not matched in the preceding rules?

One way to assign precedence, is to place the more specific rules first. If
two rules would match the same input (same sequence of characters) then the
first rule listed in the @code{flex} input wins, e.g.,

@example
@verbatim
%%
foo[a-zA-Z_]+    return FOO_ID;
bar[a-zA-Z_]+    return BAR_ID;
[a-zA-Z_]+       return GENERIC_ID;
@end verbatim
@end example

Note that the rule @code{[a-zA-Z_]+} must come *after* the others.  It will match the
same amount of text as the more specific rules, and in that case the
@code{flex} scanner will pick the first rule listed in your scanner as the
one to match.

@node I am trying to port code from AT&T lex that uses yysptr and yysbuf.
@unnumberedsec I am trying to port code from AT&T lex that uses yysptr and yysbuf.

Those are internal variables pointing into the AT&T scanner's input buffer.  I
imagine they're being manipulated in user versions of the @code{input()} and @code{unput()}
functions.  If so, what you need to do is analyze those functions to figure out
what they're doing, and then replace @code{input()} with an appropriate definition of
@code{YY_INPUT}.  You shouldn't need to (and must not) replace
@code{flex}'s @code{unput()} function.

@node Is there a way to make flex treat NULL like a regular character?
@unnumberedsec Is there a way to make flex treat NULL like a regular character?

Yes, @samp{\0} and @samp{\x00} should both do the trick.  Perhaps you have an ancient
version of @code{flex}.  The latest release is version @value{VERSION}.

@node Whenever flex can not match the input it says "flex scanner jammed".
@unnumberedsec Whenever flex can not match the input it says "flex scanner jammed".

You need to add a rule that matches the otherwise-unmatched text,
e.g.,

@example
@verbatim
%option yylineno
%%
[[a bunch of rules here]]

.	printf("bad input character '%s' at line %d\n", yytext, yylineno);
@end verbatim
@end example

See @code{%option default} for more information.

@node Why doesn't flex have non-greedy operators like perl does?
@unnumberedsec Why doesn't flex have non-greedy operators like perl does?

A DFA can do a non-greedy match by stopping
the first time it enters an accepting state, instead of consuming input until
it determines that no further matching is possible (a ``jam'' state).  This
is actually easier to implement than longest leftmost match (which flex does).

But it's also much less useful than longest leftmost match.  In general,
when you find yourself wishing for non-greedy matching, that's usually a
sign that you're trying to make the scanner do some parsing.  That's
generally the wrong approach, since it lacks the power to do a decent job.
Better is to either introduce a separate parser, or to split the scanner
into multiple scanners using (exclusive) start conditions.

You might have
a separate start state once you've seen the @samp{BEGIN}. In that state, you
might then have a regex that will match @samp{END} (to kick you out of the
state), and perhaps @samp{(.|\n)} to get a single character within the chunk ...

This approach also has much better error-reporting properties.

@node Memory leak - 16386 bytes allocated by malloc.
@unnumberedsec Memory leak - 16386 bytes allocated by malloc.
@anchor{faq-memory-leak}

UPDATED 2002-07-10: As of @code{flex} version 2.5.9, this leak means that you did not
call @code{yylex_destroy()}. If you are using an earlier version of @code{flex}, then read
on.

The leak is about 16426 bytes.  That is, (8192 * 2 + 2) for the read-buffer, and
about 40 for @code{struct yy_buffer_state} (depending upon alignment). The leak is in
the non-reentrant C scanner only (NOT in the reentrant scanner, NOT in the C++
scanner). Since @code{flex} doesn't know when you are done, the buffer is never freed.

However, the leak won't multiply since the buffer is reused no matter how many
times you call @code{yylex()}.

If you want to reclaim the memory when you are completely done scanning, then
you might try this:

@example
@verbatim
/* For non-reentrant C scanner only. */
yy_delete_buffer(YY_CURRENT_BUFFER);
yy_init = 1;
@end verbatim
@end example

Note: @code{yy_init} is an "internal variable", and hasn't been tested in this
situation. It is possible that some other globals may need resetting as well.

@node How do I track the byte offset for lseek()?
@unnumberedsec How do I track the byte offset for lseek()?

@example
@verbatim
>   We thought that it would be possible to have this number through the
>   evaluation of the following expression:
>
>   seek_position = (no_buffers)*YY_READ_BUF_SIZE + yy_c_buf_p - YY_CURRENT_BUFFER->yy_ch_buf
@end verbatim
@end example

While this is the right idea, it has two problems.  The first is that
it's possible that @code{flex} will request less than @code{YY_READ_BUF_SIZE} during
an invocation of @code{YY_INPUT} (or that your input source will return less
even though @code{YY_READ_BUF_SIZE} bytes were requested).  The second problem
is that when refilling its internal buffer, @code{flex} keeps some characters
from the previous buffer (because usually it's in the middle of a match,
and needs those characters to construct @code{yytext} for the match once it's
done).  Because of this, @code{yy_c_buf_p - YY_CURRENT_BUFFER->yy_ch_buf} won't
be exactly the number of characters already read from the current buffer.

An alternative solution is to count the number of characters you've matched
since starting to scan.  This can be done by using @code{YY_USER_ACTION}.  For
example,

@example
@verbatim
#define YY_USER_ACTION num_chars += yyleng;
@end verbatim
@end example

(You need to be careful to update your bookkeeping if you use @code{yymore(}),
@code{yyless()}, @code{unput()}, or @code{input()}.)

@node How do I use my own I/O classes in a C++ scanner?
@section How do I use my own I/O classes in a C++ scanner?

When the flex C++ scanning class rewrite finally happens, then this sort of thing should become much easier.

@cindex LexerOutput, overriding
@cindex LexerInput, overriding
@cindex overriding LexerOutput
@cindex overriding LexerInput
@cindex customizing I/O in C++ scanners
@cindex C++ I/O, customizing
You can do this by passing the various functions (such as @code{LexerInput()}
and @code{LexerOutput()}) NULL @code{iostream*}'s, and then
dealing with your own I/O classes surreptitiously (i.e., stashing them in
special member variables).  This works because the only assumption about
the lexer regarding what's done with the iostream's is that they're
ultimately passed to @code{LexerInput()} and @code{LexerOutput}, which then do whatever
is necessary with them.

@c faq edit stopped here
@node How do I skip as many chars as possible?
@unnumberedsec How do I skip as many chars as possible?

How do I skip as many chars as possible -- without interfering with the other
patterns?

In the example below, we want to skip over characters until we see the phrase
"endskip". The following will @emph{NOT} work correctly (do you see why not?)

@example
@verbatim
/* INCORRECT SCANNER */
%x SKIP
%%
<INITIAL>startskip   BEGIN(SKIP);
...
<SKIP>"endskip"       BEGIN(INITIAL);
<SKIP>.*             ;
@end verbatim
@end example

The problem is that the pattern .* will eat up the word "endskip."
The simplest (but slow) fix is:

@example
@verbatim
<SKIP>"endskip"      BEGIN(INITIAL);
<SKIP>.              ;
@end verbatim
@end example

The fix involves making the second rule match more, without
making it match "endskip" plus something else.  So for example:

@example
@verbatim
<SKIP>"endskip"     BEGIN(INITIAL);
<SKIP>[^e]+         ;
<SKIP>.		        ;/* so you eat up e's, too */
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node deleteme00
@unnumberedsec deleteme00
@example
@verbatim
QUESTION:
When was flex born?

Vern Paxson took over
the Software Tools lex project from Jef Poskanzer in 1982.  At that point it
was written in Ratfor.  Around 1987 or so, Paxson translated it into C, and
a legend was born :-).
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node Are certain equivalent patterns faster than others?
@unnumberedsec Are certain equivalent patterns faster than others?
@example
@verbatim
To: Adoram Rogel <adoram@orna.hybridge.com>
Subject: Re: Flex 2.5.2 performance questions
In-reply-to: Your message of Wed, 18 Sep 96 11:12:17 EDT.
Date: Wed, 18 Sep 96 10:51:02 PDT
From: Vern Paxson <vern>

[Note, the most recent flex release is 2.5.4, which you can get from
ftp.ee.lbl.gov.  It has bug fixes over 2.5.2 and 2.5.3.]

> 1. Using the pattern
>    ([Ff](oot)?)?[Nn](ote)?(\.)?
>    instead of
>    (((F|f)oot(N|n)ote)|((N|n)ote)|((N|n)\.)|((F|f)(N|n)(\.)))
>    (in a very complicated flex program) caused the program to slow from
>    300K+/min to 100K/min (no other changes were done).

These two are not equivalent.  For example, the first can match "footnote."
but the second can only match "footnote".  This is almost certainly the
cause in the discrepancy - the slower scanner run is matching more tokens,
and/or having to do more backing up.

> 2. Which of these two are better: [Ff]oot or (F|f)oot ?

From a performance point of view, they're equivalent (modulo presumably
minor effects such as memory cache hit rates; and the presence of trailing
context, see below).  From a space point of view, the first is slightly
preferable.

> 3. I have a pattern that look like this:
>    pats {p1}|{p2}|{p3}|...|{p50}     (50 patterns ORd)
>
>    running yet another complicated program that includes the following rule:
>    <snext>{and}/{no4}{bb}{pats}
>
>    gets me to "too complicated - over 32,000 states"...

I can't tell from this example whether the trailing context is variable-length
or fixed-length (it could be the latter if {and} is fixed-length).  If it's
variable length, which flex -p will tell you, then this reflects a basic
performance problem, and if you can eliminate it by restructuring your
scanner, you will see significant improvement.

>    so I divided {pats} to {pats1}, {pats2},..., {pats5} each consists of about
>    10 patterns and changed the rule to be 5 rules.
>    This did compile, but what is the rule of thumb here ?

The rule is to avoid trailing context other than fixed-length, in which for
a/b, either the 'a' pattern or the 'b' pattern have a fixed length.  Use
of the '|' operator automatically makes the pattern variable length, so in
this case '[Ff]oot' is preferred to '(F|f)oot'.

> 4. I changed a rule that looked like this:
>    <snext8>{and}{bb}/{ROMAN}[^A-Za-z] { BEGIN...
>
>    to the next 2 rules:
>    <snext8>{and}{bb}/{ROMAN}[A-Za-z] { ECHO;}
>    <snext8>{and}{bb}/{ROMAN}         { BEGIN...
>
>    Again, I understand the using [^...] will cause a great performance loss

Actually, it doesn't cause any sort of performance loss.  It's a surprising
fact about regular expressions that they always match in linear time
regardless of how complex they are.

>    but are there any specific rules about it ?

See the "Performance Considerations" section of the man page, and also
the example in MISC/fastwc/.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node Is backing up a big deal?
@unnumberedsec Is backing up a big deal?
@example
@verbatim
To: Adoram Rogel <adoram@hybridge.com>
Subject: Re: Flex 2.5.2 performance questions
In-reply-to: Your message of Thu, 19 Sep 96 10:16:04 EDT.
Date: Thu, 19 Sep 96 09:58:00 PDT
From: Vern Paxson <vern>

> a lot about the backing up problem.
> I believe that there lies my biggest problem, and I'll try to improve
> it.

Since you have variable trailing context, this is a bigger performance
problem.  Fixing it is usually easier than fixing backing up, which in a
complicated scanner (yours seems to fit the bill) can be extremely
difficult to do correctly.

You also don't mention what flags you are using for your scanner.
-f makes a large speed difference, and -Cfe buys you nearly as much
speed but the resulting scanner is considerably smaller.

> I have an | operator in {and} and in {pats} so both of them are variable
> length.

-p should have reported this.

> Is changing one of them to fixed-length is enough ?

Yes.

> Is it possible to change the 32,000 states limit ?

Yes.  I've appended instructions on how.  Before you make this change,
though, you should think about whether there are ways to fundamentally
simplify your scanner - those are certainly preferable!

		Vern

To increase the 32K limit (on a machine with 32 bit integers), you increase
the magnitude of the following in flexdef.h:

#define JAMSTATE -32766 /* marks a reference to the state that always jams */
#define MAXIMUM_MNS 31999
#define BAD_SUBSCRIPT -32767
#define MAX_SHORT 32700

Adding a 0 or two after each should do the trick.
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node Can I fake multi-byte character support?
@unnumberedsec Can I fake multi-byte character support?
@example
@verbatim
To: Heeman_Lee@hp.com
Subject: Re: flex - multi-byte support?
In-reply-to: Your message of Thu, 03 Oct 1996 17:24:04 PDT.
Date: Fri, 04 Oct 1996 11:42:18 PDT
From: Vern Paxson <vern>

>      I assume as long as my *.l file defines the
>      range of expected character code values (in octal format), flex will
>      scan the file and read multi-byte characters correctly. But I have no
>      confidence in this assumption.

Your lack of confidence is justified - this won't work.

Flex has in it a widespread assumption that the input is processed
one byte at a time.  Fixing this is on the to-do list, but is involved,
so it won't happen any time soon.  In the interim, the best I can suggest
(unless you want to try fixing it yourself) is to write your rules in
terms of pairs of bytes, using definitions in the first section:

	X	\xfe\xc2
	...
	%%
	foo{X}bar	found_foo_fe_c2_bar();

etc.  Definitely a pain - sorry about that.

By the way, the email address you used for me is ancient, indicating you
have a very old version of flex.  You can get the most recent, 2.5.4, from
ftp.ee.lbl.gov.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node deleteme01
@unnumberedsec deleteme01
@example
@verbatim
To: moleary@primus.com
Subject: Re: Flex / Unicode compatibility question
In-reply-to: Your message of Tue, 22 Oct 1996 10:15:42 PDT.
Date: Tue, 22 Oct 1996 11:06:13 PDT
From: Vern Paxson <vern>

Unfortunately flex at the moment has a widespread assumption within it
that characters are processed 8 bits at a time.  I don't see any easy
fix for this (other than writing your rules in terms of double characters -
a pain).  I also don't know of a wider lex, though you might try surfing
the Plan 9 stuff because I know it's a Unicode system, and also the PCCT
toolkit (try searching say Alta Vista for "Purdue Compiler Construction
Toolkit").

Fixing flex to handle wider characters is on the long-term to-do list.
But since flex is a strictly spare-time project these days, this probably
won't happen for quite a while, unless someone else does it first.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node Can you discuss some flex internals?
@unnumberedsec Can you discuss some flex internals?
@example
@verbatim
To: Johan Linde <jl@theophys.kth.se>
Subject: Re: translation of flex
In-reply-to: Your message of Sun, 10 Nov 1996 09:16:36 PST.
Date: Mon, 11 Nov 1996 10:33:50 PST
From: Vern Paxson <vern>

> I'm working for the Swedish team translating GNU program, and I'm currently
> working with flex. I have a few questions about some of the messages which
> I hope you can answer.

All of the things you're wondering about, by the way, concerning flex
internals - probably the only person who understands what they mean in
English is me!  So I wouldn't worry too much about getting them right.
That said ...

> #: main.c:545
> msgid "  %d protos created\n"
>
> Does proto mean prototype?

Yes - prototypes of state compression tables.

> #: main.c:539
> msgid "  %d/%d (peak %d) template nxt-chk entries created\n"
>
> Here I'm mainly puzzled by 'nxt-chk'. I guess it means 'next-check'. (?)
> However, 'template next-check entries' doesn't make much sense to me. To be
> able to find a good translation I need to know a little bit more about it.

There is a scheme in the Aho/Sethi/Ullman compiler book for compressing
scanner tables.  It involves creating two pairs of tables.  The first has
"base" and "default" entries, the second has "next" and "check" entries.
The "base" entry is indexed by the current state and yields an index into
the next/check table.  The "default" entry gives what to do if the state
transition isn't found in next/check.  The "next" entry gives the next
state to enter, but only if the "check" entry verifies that this entry is
correct for the current state.  Flex creates templates of series of
next/check entries and then encodes differences from these templates as a
way to compress the tables.

> #: main.c:533
> msgid "  %d/%d base-def entries created\n"
>
> The same problem here for 'base-def'.

See above.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unput() messes up yy_at_bol
@unnumberedsec unput() messes up yy_at_bol
@example
@verbatim
To: Xinying Li <xli@npac.syr.edu>
Subject: Re: FLEX ?
In-reply-to: Your message of Wed, 13 Nov 1996 17:28:38 PST.
Date: Wed, 13 Nov 1996 19:51:54 PST
From: Vern Paxson <vern>

> "unput()" them to input flow, question occurs. If I do this after I scan
> a carriage, the variable "YY_CURRENT_BUFFER->yy_at_bol" is changed. That
> means the carriage flag has gone.

You can control this by calling yy_set_bol().  It's described in the manual.

>      And if in pre-reading it goes to the end of file, is anything done
> to control the end of curren buffer and end of file?

No, there's no way to put back an end-of-file.

>      By the way I am using flex 2.5.2 and using the "-l".

The latest release is 2.5.4, by the way.  It fixes some bugs in 2.5.2 and
2.5.3.  You can get it from ftp.ee.lbl.gov.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node The | operator is not doing what I want
@unnumberedsec The | operator is not doing what I want
@example
@verbatim
To: Alain.ISSARD@st.com
Subject: Re: Start condition with FLEX
In-reply-to: Your message of Mon, 18 Nov 1996 09:45:02 PST.
Date: Mon, 18 Nov 1996 10:41:34 PST
From: Vern Paxson <vern>

> I am not able to use the start condition scope and to use the | (OR) with
> rules having start conditions.

The problem is that if you use '|' as a regular expression operator, for
example "a|b" meaning "match either 'a' or 'b'", then it must *not* have
any blanks around it.  If you instead want the special '|' *action* (which
from your scanner appears to be the case), which is a way of giving two
different rules the same action:

	foo	|
	bar	matched_foo_or_bar();

then '|' *must* be separated from the first rule by whitespace and *must*
be followed by a new line.  You *cannot* write it as:

	foo | bar	matched_foo_or_bar();

even though you might think you could because yacc supports this syntax.
The reason for this unfortunately incompatibility is historical, but it's
unlikely to be changed.

Your problems with start condition scope are simply due to syntax errors
from your use of '|' later confusing flex.

Let me know if you still have problems.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node Why can't flex understand this variable trailing context pattern?
@unnumberedsec Why can't flex understand this variable trailing context pattern?
@example
@verbatim
To: Gregory Margo <gmargo@newton.vip.best.com>
Subject: Re: flex-2.5.3 bug report
In-reply-to: Your message of Sat, 23 Nov 1996 16:50:09 PST.
Date: Sat, 23 Nov 1996 17:07:32 PST
From: Vern Paxson <vern>

> Enclosed is a lex file that "real" lex will process, but I cannot get
> flex to process it.  Could you try it and maybe point me in the right direction?

Your problem is that some of the definitions in the scanner use the '/'
trailing context operator, and have it enclosed in ()'s.  Flex does not
allow this operator to be enclosed in ()'s because doing so allows undefined
regular expressions such as "(a/b)+".  So the solution is to remove the
parentheses.  Note that you must also be building the scanner with the -l
option for AT&T lex compatibility.  Without this option, flex automatically
encloses the definitions in parentheses.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node The ^ operator isn't working
@unnumberedsec The ^ operator isn't working
@example
@verbatim
To: Thomas Hadig <hadig@toots.physik.rwth-aachen.de>
Subject: Re: Flex Bug ?
In-reply-to: Your message of Tue, 26 Nov 1996 14:35:01 PST.
Date: Tue, 26 Nov 1996 11:15:05 PST
From: Vern Paxson <vern>

> In my lexer code, i have the line :
> ^\*.*          { }
>
> Thus all lines starting with an astrix (*) are comment lines.
> This does not work !

I can't get this problem to reproduce - it works fine for me.  Note
though that if what you have is slightly different:

	COMMENT	^\*.*
	%%
	{COMMENT}	{ }

then it won't work, because flex pushes back macro definitions enclosed
in ()'s, so the rule becomes

	(^\*.*)		{ }

and now that the '^' operator is not at the immediate beginning of the
line, it's interpreted as just a regular character.  You can avoid this
behavior by using the "-l" lex-compatibility flag, or "%option lex-compat".

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node Trailing context is getting confused with trailing optional patterns
@unnumberedsec Trailing context is getting confused with trailing optional patterns
@example
@verbatim
To: Adoram Rogel <adoram@hybridge.com>
Subject: Re: Flex 2.5.4 BOF ???
In-reply-to: Your message of Tue, 26 Nov 1996 16:10:41 PST.
Date: Wed, 27 Nov 1996 10:56:25 PST
From: Vern Paxson <vern>

>     Organization(s)?/[a-z]
>
> This matched "Organizations" (looking in debug mode, the trailing s
> was matched with trailing context instead of the optional (s) in the
> end of the word.

That should only happen with lex.  Flex can properly match this pattern.
(That might be what you're saying, I'm just not sure.)

> Is there a way to avoid this dangerous trailing context problem ?

Unfortunately, there's no easy way.  On the other hand, I don't see why
it should be a problem.  Lex's matching is clearly wrong, and I'd hope
that usually the intent remains the same as expressed with the pattern,
so flex's matching will be correct.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node Is flex GNU or not?
@unnumberedsec Is flex GNU or not?
@example
@verbatim
To: Cameron MacKinnon <mackin@interlog.com>
Subject: Re: Flex documentation bug
In-reply-to: Your message of Mon, 02 Dec 1996 00:07:08 PST.
Date: Sun, 01 Dec 1996 22:29:39 PST
From: Vern Paxson <vern>

> I'm not sure how or where to submit bug reports (documentation or
> otherwise) for the GNU project stuff ...

Well, strictly speaking flex isn't part of the GNU project.  They just
distribute it because no one's written a decent GPL'd lex replacement.
So you should send bugs directly to me.  Those sent to the GNU folks
sometimes find there way to me, but some may drop between the cracks.

> In GNU Info, under the section 'Start Conditions', and also in the man
> page (mine's dated April '95) is a nice little snippet showing how to
> parse C quoted strings into a buffer, defined to be MAX_STR_CONST in
> size. Unfortunately, no overflow checking is ever done ...

This is already mentioned in the manual:

Finally, here's an example of how to  match  C-style  quoted
strings using exclusive start conditions, including expanded
escape sequences (but not including checking  for  a  string
that's too long):

The reason for not doing the overflow checking is that it will needlessly
clutter up an example whose main purpose is just to demonstrate how to
use flex.

The latest release is 2.5.4, by the way, available from ftp.ee.lbl.gov.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node ERASEME53
@unnumberedsec ERASEME53
@example
@verbatim
To: tsv@cs.UManitoba.CA
Subject: Re: Flex (reg)..
In-reply-to: Your message of Thu, 06 Mar 1997 23:50:16 PST.
Date: Thu, 06 Mar 1997 15:54:19 PST
From: Vern Paxson <vern>

> [:alpha:] ([:alnum:] | \\_)*

If your rule really has embedded blanks as shown above, then it won't
work, as the first blank delimits the rule from the action.  (It wouldn't
even compile ...)  You need instead:

[:alpha:]([:alnum:]|\\_)*

and that should work fine - there's no restriction on what can go inside
of ()'s except for the trailing context operator, '/'.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node I need to scan if-then-else blocks and while loops
@unnumberedsec I need to scan if-then-else blocks and while loops
@example
@verbatim
To: "Mike Stolnicki" <mstolnic@ford.com>
Subject: Re: FLEX help
In-reply-to: Your message of Fri, 30 May 1997 13:33:27 PDT.
Date: Fri, 30 May 1997 10:46:35 PDT
From: Vern Paxson <vern>

> We'd like to add "if-then-else", "while", and "for" statements to our
> language ...
> We've investigated many possible solutions.  The one solution that seems
> the most reasonable involves knowing the position of a TOKEN in yyin.

I strongly advise you to instead build a parse tree (abstract syntax tree)
and loop over that instead.  You'll find this has major benefits in keeping
your interpreter simple and extensible.

That said, the functionality you mention for get_position and set_position
have been on the to-do list for a while.  As flex is a purely spare-time
project for me, no guarantees when this will be added (in particular, it
for sure won't be for many months to come).

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node ERASEME55
@unnumberedsec ERASEME55
@example
@verbatim
To: Colin Paul Adams <colin@colina.demon.co.uk>
Subject: Re: Flex C++ classes and Bison
In-reply-to: Your message of 09 Aug 1997 17:11:41 PDT.
Date: Fri, 15 Aug 1997 10:48:19 PDT
From: Vern Paxson <vern>

> #define YY_DECL   int yylex (YYSTYPE *lvalp, struct parser_control
> *parm)
>
> I have been trying  to get this to work as a C++ scanner, but it does
> not appear to be possible (warning that it matches no declarations in
> yyFlexLexer, or something like that).
>
> Is this supposed to be possible, or is it being worked on (I DID
> notice the comment that scanner classes are still experimental, so I'm
> not too hopeful)?

What you need to do is derive a subclass from yyFlexLexer that provides
the above yylex() method, squirrels away lvalp and parm into member
variables, and then invokes yyFlexLexer::yylex() to do the regular scanning.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node ERASEME56
@unnumberedsec ERASEME56
@example
@verbatim
To: Mikael.Latvala@lmf.ericsson.se
Subject: Re: Possible mistake in Flex v2.5 document
In-reply-to: Your message of Fri, 05 Sep 1997 16:07:24 PDT.
Date: Fri, 05 Sep 1997 10:01:54 PDT
From: Vern Paxson <vern>

> In that example you show how to count comment lines when using
> C style /* ... */ comments. My question is, shouldn't you take into
> account a scenario where end of a comment marker occurs inside
> character or string literals?

The scanner certainly needs to also scan character and string literals.
However it does that (there's an example in the man page for strings), the
lexer will recognize the beginning of the literal before it runs across the
embedded "/*".  Consequently, it will finish scanning the literal before it
even considers the possibility of matching "/*".

Example:

	'([^']*|{ESCAPE_SEQUENCE})'

will match all the text between the ''s (inclusive).  So the lexer
considers this as a token beginning at the first ', and doesn't even
attempt to match other tokens inside it.

I thinnk this subtlety is not worth putting in the manual, as I suspect
it would confuse more people than it would enlighten.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node ERASEME57
@unnumberedsec ERASEME57
@example
@verbatim
To: "Marty Leisner" <leisner@sdsp.mc.xerox.com>
Subject: Re: flex limitations
In-reply-to: Your message of Sat, 06 Sep 1997 11:27:21 PDT.
Date: Mon, 08 Sep 1997 11:38:08 PDT
From: Vern Paxson <vern>

> %%
> [a-zA-Z]+       /* skip a line */
>                 {  printf("got %s\n", yytext); }
> %%

What version of flex are you using?  If I feed this to 2.5.4, it complains:

	"bug.l", line 5: EOF encountered inside an action
	"bug.l", line 5: unrecognized rule
	"bug.l", line 5: fatal parse error

Not the world's greatest error message, but it manages to flag the problem.

(With the introduction of start condition scopes, flex can't accommodate
an action on a separate line, since it's ambiguous with an indented rule.)

You can get 2.5.4 from ftp.ee.lbl.gov.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node Is there a repository for flex scanners?
@unnumberedsec Is there a repository for flex scanners?

Not that we know of. You might try asking on comp.compilers.

@c TODO: Evaluate this faq.
@node How can I conditionally compile or preprocess my flex input file?
@unnumberedsec How can I conditionally compile or preprocess my flex input file?


Flex doesn't have a preprocessor like C does.  You might try using m4, or the C
preprocessor plus a sed script to clean up the result.


@c TODO: Evaluate this faq.
@node Where can I find grammars for lex and yacc?
@unnumberedsec Where can I find grammars for lex and yacc?

In the sources for flex and bison.

@c TODO: Evaluate this faq.
@node I get an end-of-buffer message for each character scanned.
@unnumberedsec I get an end-of-buffer message for each character scanned.

This will happen if your LexerInput() function returns only one character
at a time, which can happen either if you're scanner is "interactive", or
if the streams library on your platform always returns 1 for yyin->gcount().

Solution: override LexerInput() with a version that returns whole buffers.

@c TODO: Evaluate this faq.
@node unnamed-faq-62
@unnumberedsec unnamed-faq-62
@example
@verbatim
To: Georg.Rehm@CL-KI.Uni-Osnabrueck.DE
Subject: Re: Flex maximums
In-reply-to: Your message of Mon, 17 Nov 1997 17:16:06 PST.
Date: Mon, 17 Nov 1997 17:16:15 PST
From: Vern Paxson <vern>

> I took a quick look into the flex-sources and altered some #defines in
> flexdefs.h:
>
> 	#define INITIAL_MNS 64000
> 	#define MNS_INCREMENT 1024000
> 	#define MAXIMUM_MNS 64000

The things to fix are to add a couple of zeroes to:

#define JAMSTATE -32766 /* marks a reference to the state that always jams */
#define MAXIMUM_MNS 31999
#define BAD_SUBSCRIPT -32767
#define MAX_SHORT 32700

and, if you get complaints about too many rules, make the following change too:

	#define YY_TRAILING_MASK 0x200000
	#define YY_TRAILING_HEAD_MASK 0x400000

- Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-63
@unnumberedsec unnamed-faq-63
@example
@verbatim
To: jimmey@lexis-nexis.com (Jimmey Todd)
Subject: Re: FLEX question regarding istream vs ifstream
In-reply-to: Your message of Mon, 08 Dec 1997 15:54:15 PST.
Date: Mon, 15 Dec 1997 13:21:35 PST
From: Vern Paxson <vern>

>         stdin_handle = YY_CURRENT_BUFFER;
>         ifstream fin( "aFile" );
>         yy_switch_to_buffer( yy_create_buffer( fin, YY_BUF_SIZE ) );
>
> What I'm wanting to do, is pass the contents of a file thru one set
> of rules and then pass stdin thru another set... It works great if, I
> don't use the C++ classes. But since everything else that I'm doing is
> in C++, I thought I'd be consistent.
>
> The problem is that 'yy_create_buffer' is expecting an istream* as it's
> first argument (as stated in the man page). However, fin is a ifstream
> object. Any ideas on what I might be doing wrong? Any help would be
> appreciated. Thanks!!

You need to pass &fin, to turn it into an ifstream* instead of an ifstream.
Then its type will be compatible with the expected istream*, because ifstream
is derived from istream.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-64
@unnumberedsec unnamed-faq-64
@example
@verbatim
To: Enda Fadian <fadiane@piercom.ie>
Subject: Re: Question related to Flex man page?
In-reply-to: Your message of Tue, 16 Dec 1997 15:17:34 PST.
Date: Tue, 16 Dec 1997 14:17:09 PST
From: Vern Paxson <vern>

> Can you explain to me what is ment by a long-jump in relation to flex?

Using the longjmp() function while inside yylex() or a routine called by it.

> what is the flex activation frame.

Just yylex()'s stack frame.

> As far as I can see yyrestart will bring me back to the sart of the input
> file and using flex++ isnot really an option!

No, yyrestart() doesn't imply a rewind, even though its name might sound
like it does.  It tells the scanner to flush its internal buffers and
start reading from the given file at its present location.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-65
@unnumberedsec unnamed-faq-65
@example
@verbatim
To: hassan@larc.info.uqam.ca (Hassan Alaoui)
Subject: Re: Need urgent Help
In-reply-to: Your message of Sat, 20 Dec 1997 19:38:19 PST.
Date: Sun, 21 Dec 1997 21:30:46 PST
From: Vern Paxson <vern>

> /usr/lib/yaccpar: In function `int yyparse()':
> /usr/lib/yaccpar:184: warning: implicit declaration of function `int yylex(...)'
>
> ld: Undefined symbol
>    _yylex
>    _yyparse
>    _yyin

This is a known problem with Solaris C++ (and/or Solaris yacc).  I believe
the fix is to explicitly insert some 'extern "C"' statements for the
corresponding routines/symbols.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-66
@unnumberedsec unnamed-faq-66
@example
@verbatim
To: mc0307@mclink.it
Cc: gnu@prep.ai.mit.edu
Subject: Re: [mc0307@mclink.it: Help request]
In-reply-to: Your message of Fri, 12 Dec 1997 17:57:29 PST.
Date: Sun, 21 Dec 1997 22:33:37 PST
From: Vern Paxson <vern>

> This is my definition for float and integer types:
> . . .
> NZD          [1-9]
> ...
> I've tested my program on other lex version (on UNIX Sun Solaris an HP
> UNIX) and it work well, so I think that my definitions are correct.
> There are any differences between Lex and Flex?

There are indeed differences, as discussed in the man page.  The one
you are probably running into is that when flex expands a name definition,
it puts parentheses around the expansion, while lex does not.  There's
an example in the man page of how this can lead to different matching.
Flex's behavior complies with the POSIX standard (or at least with the
last POSIX draft I saw).

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-67
@unnumberedsec unnamed-faq-67
@example
@verbatim
To: hassan@larc.info.uqam.ca (Hassan Alaoui)
Subject: Re: Thanks
In-reply-to: Your message of Mon, 22 Dec 1997 16:06:35 PST.
Date: Mon, 22 Dec 1997 14:35:05 PST
From: Vern Paxson <vern>

> Thank you very much for your help. I compile and link well with C++ while
> declaring 'yylex ...' extern, But a little problem remains. I get a
> segmentation default when executing ( I linked with lfl library) while it
> works well when using LEX instead of flex. Do you have some ideas about the
> reason for this ?

The one possible reason for this that comes to mind is if you've defined
yytext as "extern char yytext[]" (which is what lex uses) instead of
"extern char *yytext" (which is what flex uses).  If it's not that, then
I'm afraid I don't know what the problem might be.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-68
@unnumberedsec unnamed-faq-68
@example
@verbatim
To: "Bart Niswonger" <NISWONGR@almaden.ibm.com>
Subject: Re: flex 2.5: c++ scanners & start conditions
In-reply-to: Your message of Tue, 06 Jan 1998 10:34:21 PST.
Date: Tue, 06 Jan 1998 19:19:30 PST
From: Vern Paxson <vern>

> The problem is that when I do this (using %option c++) start
> conditions seem to not apply.

The BEGIN macro modifies the yy_start variable.  For C scanners, this
is a static with scope visible through the whole file.  For C++ scanners,
it's a member variable, so it only has visible scope within a member
function.  Your lexbegin() routine is not a member function when you
build a C++ scanner, so it's not modifying the correct yy_start.  The
diagnostic that indicates this is that you found you needed to add
a declaration of yy_start in order to get your scanner to compile when
using C++; instead, the correct fix is to make lexbegin() a member
function (by deriving from yyFlexLexer).

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-69
@unnumberedsec unnamed-faq-69
@example
@verbatim
To: "Boris Zinin" <boris@ippe.rssi.ru>
Subject: Re: current position in flex buffer
In-reply-to: Your message of Mon, 12 Jan 1998 18:58:23 PST.
Date: Mon, 12 Jan 1998 12:03:15 PST
From: Vern Paxson <vern>

> The problem is how to determine the current position in flex active
> buffer when a rule is matched....

You will need to keep track of this explicitly, such as by redefining
YY_USER_ACTION to count the number of characters matched.

The latest flex release, by the way, is 2.5.4, available from ftp.ee.lbl.gov.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-70
@unnumberedsec unnamed-faq-70
@example
@verbatim
To: Bik.Dhaliwal@bis.org
Subject: Re: Flex question
In-reply-to: Your message of Mon, 26 Jan 1998 13:05:35 PST.
Date: Tue, 27 Jan 1998 22:41:52 PST
From: Vern Paxson <vern>

> That requirement involves knowing
> the character position at which a particular token was matched
> in the lexer.

The way you have to do this is by explicitly keeping track of where
you are in the file, by counting the number of characters scanned
for each token (available in yyleng).  It may prove convenient to
do this by redefining YY_USER_ACTION, as described in the manual.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-71
@unnumberedsec unnamed-faq-71
@example
@verbatim
To: Vladimir Alexiev <vladimir@cs.ualberta.ca>
Subject: Re: flex: how to control start condition from parser?
In-reply-to: Your message of Mon, 26 Jan 1998 05:50:16 PST.
Date: Tue, 27 Jan 1998 22:45:37 PST
From: Vern Paxson <vern>

> It seems useful for the parser to be able to tell the lexer about such
> context dependencies, because then they don't have to be limited to
> local or sequential context.

One way to do this is to have the parser call a stub routine that's
included in the scanner's .l file, and consequently that has access ot
BEGIN.  The only ugliness is that the parser can't pass in the state
it wants, because those aren't visible - but if you don't have many
such states, then using a different set of names doesn't seem like
to much of a burden.

While generating a .h file like you suggests is certainly cleaner,
flex development has come to a virtual stand-still :-(, so a workaround
like the above is much more pragmatic than waiting for a new feature.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-72
@unnumberedsec unnamed-faq-72
@example
@verbatim
To: Barbara Denny <denny@3com.com>
Subject: Re: freebsd flex bug?
In-reply-to: Your message of Fri, 30 Jan 1998 12:00:43 PST.
Date: Fri, 30 Jan 1998 12:42:32 PST
From: Vern Paxson <vern>

> lex.yy.c:1996: parse error before `='

This is the key, identifying this error.  (It may help to pinpoint
it by using flex -L, so it doesn't generate #line directives in its
output.)  I will bet you heavy money that you have a start condition
name that is also a variable name, or something like that; flex spits
out #define's for each start condition name, mapping them to a number,
so you can wind up with:

	%x foo
	%%
		...
	%%
	void bar()
		{
		int foo = 3;
		}

and the penultimate will turn into "int 1 = 3" after C preprocessing,
since flex will put "#define foo 1" in the generated scanner.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-73
@unnumberedsec unnamed-faq-73
@example
@verbatim
To: Maurice Petrie <mpetrie@infoscigroup.com>
Subject: Re: Lost flex .l file
In-reply-to: Your message of Mon, 02 Feb 1998 14:10:01 PST.
Date: Mon, 02 Feb 1998 11:15:12 PST
From: Vern Paxson <vern>

> I am curious as to
> whether there is a simple way to backtrack from the generated source to
> reproduce the lost list of tokens we are searching on.

In theory, it's straight-forward to go from the DFA representation
back to a regular-expression representation - the two are isomorphic.
In practice, a huge headache, because you have to unpack all the tables
back into a single DFA representation, and then write a program to munch
on that and translate it into an RE.

Sorry for the less-than-happy news ...

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-74
@unnumberedsec unnamed-faq-74
@example
@verbatim
To: jimmey@lexis-nexis.com (Jimmey Todd)
Subject: Re: Flex performance question
In-reply-to: Your message of Thu, 19 Feb 1998 11:01:17 PST.
Date: Thu, 19 Feb 1998 08:48:51 PST
From: Vern Paxson <vern>

> What I have found, is that the smaller the data chunk, the faster the
> program executes. This is the opposite of what I expected. Should this be
> happening this way?

This is exactly what will happen if your input file has embedded NULs.
From the man page:

A final note: flex is slow when matching NUL's, particularly
when  a  token  contains multiple NUL's.  It's best to write
rules which match short amounts of text if it's  anticipated
that the text will often include NUL's.

So that's the first thing to look for.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-75
@unnumberedsec unnamed-faq-75
@example
@verbatim
To: jimmey@lexis-nexis.com (Jimmey Todd)
Subject: Re: Flex performance question
In-reply-to: Your message of Thu, 19 Feb 1998 11:01:17 PST.
Date: Thu, 19 Feb 1998 15:42:25 PST
From: Vern Paxson <vern>

So there are several problems.

First, to go fast, you want to match as much text as possible, which
your scanners don't in the case that what they're scanning is *not*
a <RN> tag.  So you want a rule like:

	[^<]+

Second, C++ scanners are particularly slow if they're interactive,
which they are by default.  Using -B speeds it up by a factor of 3-4
on my workstation.

Third, C++ scanners that use the istream interface are slow, because
of how poorly implemented istream's are.  I built two versions of
the following scanner:

	%%
	.*\n
	.*
	%%

and the C version inhales a 2.5MB file on my workstation in 0.8 seconds.
The C++ istream version, using -B, takes 3.8 seconds.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-76
@unnumberedsec unnamed-faq-76
@example
@verbatim
To: "Frescatore, David (CRD, TAD)" <frescatore@exc01crdge.crd.ge.com>
Subject: Re: FLEX 2.5 & THE YEAR 2000
In-reply-to: Your message of Wed, 03 Jun 1998 11:26:22 PDT.
Date: Wed, 03 Jun 1998 10:22:26 PDT
From: Vern Paxson <vern>

> I am researching the Y2K problem with General Electric R&D
> and need to know if there are any known issues concerning
> the above mentioned software and Y2K regardless of version.

There shouldn't be, all it ever does with the date is ask the system
for it and then print it out.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-77
@unnumberedsec unnamed-faq-77
@example
@verbatim
To: "Hans Dermot Doran" <htd@ibhdoran.com>
Subject: Re: flex problem
In-reply-to: Your message of Wed, 15 Jul 1998 21:30:13 PDT.
Date: Tue, 21 Jul 1998 14:23:34 PDT
From: Vern Paxson <vern>

> To overcome this, I gets() the stdin into a string and lex the string. The
> string is lexed OK except that the end of string isn't lexed properly
> (yy_scan_string()), that is the lexer dosn't recognise the end of string.

Flex doesn't contain mechanisms for recognizing buffer endpoints.  But if
you use fgets instead (which you should anyway, to protect against buffer
overflows), then the final \n will be preserved in the string, and you can
scan that in order to find the end of the string.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-78
@unnumberedsec unnamed-faq-78
@example
@verbatim
To: soumen@almaden.ibm.com
Subject: Re: Flex++ 2.5.3 instance member vs. static member
In-reply-to: Your message of Mon, 27 Jul 1998 02:10:04 PDT.
Date: Tue, 28 Jul 1998 01:10:34 PDT
From: Vern Paxson <vern>

> %{
> int mylineno = 0;
> %}
> ws      [ \t]+
> alpha   [A-Za-z]
> dig     [0-9]
> %%
>
> Now you'd expect mylineno to be a member of each instance of class
> yyFlexLexer, but is this the case?  A look at the lex.yy.cc file seems to
> indicate otherwise; unless I am missing something the declaration of
> mylineno seems to be outside any class scope.
>
> How will this work if I want to run a multi-threaded application with each
> thread creating a FlexLexer instance?

Derive your own subclass and make mylineno a member variable of it.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-79
@unnumberedsec unnamed-faq-79
@example
@verbatim
To: Adoram Rogel <adoram@hybridge.com>
Subject: Re: More than 32K states change hangs
In-reply-to: Your message of Tue, 04 Aug 1998 16:55:39 PDT.
Date: Tue, 04 Aug 1998 22:28:45 PDT
From: Vern Paxson <vern>

> Vern Paxson,
>
> I followed your advice, posted on Usenet bu you, and emailed to me
> personally by you, on how to overcome the 32K states limit. I'm running
> on Linux machines.
> I took the full source of version 2.5.4 and did the following changes in
> flexdef.h:
> #define JAMSTATE -327660
> #define MAXIMUM_MNS 319990
> #define BAD_SUBSCRIPT -327670
> #define MAX_SHORT 327000
>
> and compiled.
> All looked fine, including check and bigcheck, so I installed.

Hmmm, you shouldn't increase MAX_SHORT, though looking through my email
archives I see that I did indeed recommend doing so.  Try setting it back
to 32700; that should suffice that you no longer need -Ca.  If it still
hangs, then the interesting question is - where?

> Compiling the same hanged program with a out-of-the-box (RedHat 4.2
> distribution of Linux)
> flex 2.5.4 binary works.

Since Linux comes with source code, you should diff it against what
you have to see what problems they missed.

> Should I always compile with the -Ca option now ? even short and simple
> filters ?

No, definitely not.  It's meant to be for those situations where you
absolutely must squeeze every last cycle out of your scanner.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-80
@unnumberedsec unnamed-faq-80
@example
@verbatim
To: "Schmackpfeffer, Craig" <Craig.Schmackpfeffer@usa.xerox.com>
Subject: Re: flex output for static code portion
In-reply-to: Your message of Tue, 11 Aug 1998 11:55:30 PDT.
Date: Mon, 17 Aug 1998 23:57:42 PDT
From: Vern Paxson <vern>

> I would like to use flex under the hood to generate a binary file
> containing the data structures that control the parse.

This has been on the wish-list for a long time.  In principle it's
straight-forward - you redirect mkdata() et al's I/O to another file,
and modify the skeleton to have a start-up function that slurps these
into dynamic arrays.  The concerns are (1) the scanner generation code
is hairy and full of corner cases, so it's easy to get surprised when
going down this path :-( ; and (2) being careful about buffering so
that when the tables change you make sure the scanner starts in the
correct state and reading at the right point in the input file.

> I was wondering if you know of anyone who has used flex in this way.

I don't - but it seems like a reasonable project to undertake (unlike
numerous other flex tweaks :-).

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-81
@unnumberedsec unnamed-faq-81
@example
@verbatim
Received: from 131.173.17.11 (131.173.17.11 [131.173.17.11])
	by ee.lbl.gov (8.9.1/8.9.1) with ESMTP id AAA03838
	for <vern@ee.lbl.gov>; Thu, 20 Aug 1998 00:47:57 -0700 (PDT)
Received: from hal.cl-ki.uni-osnabrueck.de (hal.cl-ki.Uni-Osnabrueck.DE [131.173.141.2])
	by deimos.rz.uni-osnabrueck.de (8.8.7/8.8.8) with ESMTP id JAA34694
	for <vern@ee.lbl.gov>; Thu, 20 Aug 1998 09:47:55 +0200
Received: (from georg@localhost) by hal.cl-ki.uni-osnabrueck.de (8.6.12/8.6.12) id JAA34834 for vern@ee.lbl.gov; Thu, 20 Aug 1998 09:47:54 +0200
From: Georg Rehm <georg@hal.cl-ki.uni-osnabrueck.de>
Message-Id: <199808200747.JAA34834@hal.cl-ki.uni-osnabrueck.de>
Subject: "flex scanner push-back overflow"
To: vern@ee.lbl.gov
Date: Thu, 20 Aug 1998 09:47:54 +0200 (MEST)
Reply-To: Georg.Rehm@CL-KI.Uni-Osnabrueck.DE
X-NoJunk: Do NOT send commercial mail, spam or ads to this address!
X-URL: http://www.cl-ki.uni-osnabrueck.de/~georg/
X-Mailer: ELM [version 2.4ME+ PL28 (25)]
MIME-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit

Hi Vern,

Yesterday, I encountered a strange problem: I use the macro processor m4
to include some lengthy lists into a .l file. Following is a flex macro
definition that causes some serious pain in my neck:

AUTHOR           ("A. Boucard / L. Boucard"|"A. Dastarac / M. Levent"|"A.Boucaud / L.Boucaud"|"Abderrahim Lamchichi"|"Achmat Dangor"|"Adeline Toullier"|"Adewale Maja-Pearce"|"Ahmed Ziri"|"Akram Ellyas"|"Alain Bihr"|"Alain Gresh"|"Alain Guillemoles"|"Alain Joxe"|"Alain Morice"|"Alain Renon"|"Alain Zecchini"|"Albert Memmi"|"Alberto Manguel"|"Alex De Waal"|"Alfonso Artico"| [...])

The complete list contains about 10kB. When I try to "flex" this file
(on a Solaris 2.6 machine, using a modified flex 2.5.4 (I only increased
some of the predefined values in flexdefs.h) I get the error:

myflex/flex -8  sentag.tmp.l
flex scanner push-back overflow

When I remove the slashes in the macro definition everything works fine.
As I understand it, the double quotes escape the slash-character so it
really means "/" and not "trailing context". Furthermore, I tried to
escape the slashes with backslashes, but with no use, the same error message
appeared when flexing the code.

Do you have an idea what's going on here?

Greetings from Germany,
	Georg
--
Georg Rehm                                     georg@cl-ki.uni-osnabrueck.de
Institute for Semantic Information Processing, University of Osnabrueck, FRG
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-82
@unnumberedsec unnamed-faq-82
@example
@verbatim
To: Georg.Rehm@CL-KI.Uni-Osnabrueck.DE
Subject: Re: "flex scanner push-back overflow"
In-reply-to: Your message of Thu, 20 Aug 1998 09:47:54 PDT.
Date: Thu, 20 Aug 1998 07:05:35 PDT
From: Vern Paxson <vern>

> myflex/flex -8  sentag.tmp.l
> flex scanner push-back overflow

Flex itself uses a flex scanner.  That scanner is running out of buffer
space when it tries to unput() the humongous macro you've defined.  When
you remove the '/'s, you make it small enough so that it fits in the buffer;
removing spaces would do the same thing.

The fix is to either rethink how come you're using such a big macro and
perhaps there's another/better way to do it; or to rebuild flex's own
scan.c with a larger value for

	#define YY_BUF_SIZE 16384

- Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-83
@unnumberedsec unnamed-faq-83
@example
@verbatim
To: Jan Kort <jan@research.techforce.nl>
Subject: Re: Flex
In-reply-to: Your message of Fri, 04 Sep 1998 12:18:43 +0200.
Date: Sat, 05 Sep 1998 00:59:49 PDT
From: Vern Paxson <vern>

> %%
>
> "TEST1\n"       { fprintf(stderr, "TEST1\n"); yyless(5); }
> ^\n             { fprintf(stderr, "empty line\n"); }
> .               { }
> \n              { fprintf(stderr, "new line\n"); }
>
> %%
> -- input ---------------------------------------
> TEST1
> -- output --------------------------------------
> TEST1
> empty line
> ------------------------------------------------

IMHO, it's not clear whether or not this is in fact a bug.  It depends
on whether you view yyless() as backing up in the input stream, or as
pushing new characters onto the beginning of the input stream.  Flex
interprets it as the latter (for implementation convenience, I'll admit),
and so considers the newline as in fact matching at the beginning of a
line, as after all the last token scanned an entire line and so the
scanner is now at the beginning of a new line.

I agree that this is counter-intuitive for yyless(), given its
functional description (it's less so for unput(), depending on whether
you're unput()'ing new text or scanned text).  But I don't plan to
change it any time soon, as it's a pain to do so.  Consequently,
you do indeed need to use yy_set_bol() and YY_AT_BOL() to tweak
your scanner into the behavior you desire.

Sorry for the less-than-completely-satisfactory answer.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-84
@unnumberedsec unnamed-faq-84
@example
@verbatim
To: Patrick Krusenotto <krusenot@mac-info-link.de>
Subject: Re: Problems with restarting flex-2.5.2-generated scanner
In-reply-to: Your message of Thu, 24 Sep 1998 10:14:07 PDT.
Date: Thu, 24 Sep 1998 23:28:43 PDT
From: Vern Paxson <vern>

> I am using flex-2.5.2 and bison 1.25 for Solaris and I am desperately
> trying to make my scanner restart with a new file after my parser stops
> with a parse error. When my compiler restarts, the parser always
> receives the token after the token (in the old file!) that caused the
> parser error.

I suspect the problem is that your parser has read ahead in order
to attempt to resolve an ambiguity, and when it's restarted it picks
up with that token rather than reading a fresh one.  If you're using
yacc, then the special "error" production can sometimes be used to
consume tokens in an attempt to get the parser into a consistent state.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-85
@unnumberedsec unnamed-faq-85
@example
@verbatim
To: Henric Jungheim <junghelh@pe-nelson.com>
Subject: Re: flex 2.5.4a
In-reply-to: Your message of Tue, 27 Oct 1998 16:41:42 PST.
Date: Tue, 27 Oct 1998 16:50:14 PST
From: Vern Paxson <vern>

> This brings up a feature request:  How about a command line
> option to specify the filename when reading from stdin?  That way one
> doesn't need to create a temporary file in order to get the "#line"
> directives to make sense.

Use -o combined with -t (per the man page description of -o).

> P.S., Is there any simple way to use non-blocking IO to parse multiple
> streams?

Simple, no.

One approach might be to return a magic character on EWOULDBLOCK and
have a rule

	.*<magic-character>	// put back .*, eat magic character

This is off the top of my head, not sure it'll work.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-86
@unnumberedsec unnamed-faq-86
@example
@verbatim
To: "Repko, Billy D" <billy.d.repko@intel.com>
Subject: Re: Compiling scanners
In-reply-to: Your message of Wed, 13 Jan 1999 10:52:47 PST.
Date: Thu, 14 Jan 1999 00:25:30 PST
From: Vern Paxson <vern>

> It appears that maybe it cannot find the lfl library.

The Makefile in the distribution builds it, so you should have it.
It's exceedingly trivial, just a main() that calls yylex() and
a yyrap() that always returns 1.

> %%
>       \n      ++num_lines; ++num_chars;
>       .       ++num_chars;

You can't indent your rules like this - that's where the errors are coming
from.  Flex copies indented text to the output file, it's how you do things
like

	int num_lines_seen = 0;

to declare local variables.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-87
@unnumberedsec unnamed-faq-87
@example
@verbatim
To: Erick Branderhorst <Erick.Branderhorst@asml.nl>
Subject: Re: flex input buffer
In-reply-to: Your message of Tue, 09 Feb 1999 13:53:46 PST.
Date: Tue, 09 Feb 1999 21:03:37 PST
From: Vern Paxson <vern>

> In the flex.skl file the size of the default input buffers is set.  Can you
> explain why this size is set and why it is such a high number.

It's large to optimize performance when scanning large files.  You can
safely make it a lot lower if needed.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-88
@unnumberedsec unnamed-faq-88
@example
@verbatim
To: "Guido Minnen" <guidomi@cogs.susx.ac.uk>
Subject: Re: Flex error message
In-reply-to: Your message of Wed, 24 Feb 1999 15:31:46 PST.
Date: Thu, 25 Feb 1999 00:11:31 PST
From: Vern Paxson <vern>

> I'm extending a larger scanner written in Flex and I keep running into
> problems. More specifically, I get the error message:
> "flex: input rules are too complicated (>= 32000 NFA states)"

Increase the definitions in flexdef.h for:

#define JAMSTATE -32766 /* marks a reference to the state that always j
ams */
#define MAXIMUM_MNS 31999
#define BAD_SUBSCRIPT -32767

recompile everything, and it should all work.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-90
@unnumberedsec unnamed-faq-90
@example
@verbatim
To: "Dmitriy Goldobin" <gold@ems.chel.su>
Subject: Re: FLEX trouble
In-reply-to: Your message of Mon, 31 May 1999 18:44:49 PDT.
Date: Tue, 01 Jun 1999 00:15:07 PDT
From: Vern Paxson <vern>

>   I have a trouble with FLEX. Why rule "/*".*"*/" work properly,=20
> but rule "/*"(.|\n)*"*/" don't work ?

The second of these will have to scan the entire input stream (because
"(.|\n)*" matches an arbitrary amount of any text) in order to see if
it ends with "*/", terminating the comment.  That potentially will overflow
the input buffer.

>   More complex rule "/*"([^*]|(\*/[^/]))*"*/ give an error
> 'unrecognized rule'.

You can't use the '/' operator inside parentheses.  It's not clear
what "(a/b)*" actually means.

>   I now use workaround with state <comment>, but single-rule is
> better, i think.

Single-rule is nice but will always have the problem of either setting
restrictions on comments (like not allowing multi-line comments) and/or
running the risk of consuming the entire input stream, as noted above.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-91
@unnumberedsec unnamed-faq-91
@example
@verbatim
Received: from mc-qout4.whowhere.com (mc-qout4.whowhere.com [209.185.123.18])
	by ee.lbl.gov (8.9.3/8.9.3) with SMTP id IAA05100
	for <vern@ee.lbl.gov>; Tue, 15 Jun 1999 08:56:06 -0700 (PDT)
Received: from Unknown/Local ([?.?.?.?]) by my-deja.com; Tue Jun 15 08:55:43 1999
To: vern@ee.lbl.gov
Date: Tue, 15 Jun 1999 08:55:43 -0700
From: "Aki Niimura" <neko@my-deja.com>
Message-ID: <KNONDOHDOBGAEAAA@my-deja.com>
Mime-Version: 1.0
Cc:
X-Sent-Mail: on
Reply-To:
X-Mailer: MailCity Service
Subject: A question on flex C++ scanner
X-Sender-Ip: 12.72.207.61
Organization: My Deja Email  (http://www.my-deja.com:80)
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Dear Dr. Paxon,

I have been using flex for years.
It works very well on many projects.
Most case, I used it to generate a scanner on C language.
However, one project I needed to generate  a scanner
on C++ lanuage. Thanks to your enhancement, flex did
the job.

Currently, I'm working on enhancing my previous project.
I need to deal with multiple input streams (recursive
inclusion) in this scanner (C++).
I did similar thing for another scanner (C) as you
explained in your documentation.

The generated scanner (C++) has necessary methods:
- switch_to_buffer(struct yy_buffer_state *b)
- yy_create_buffer(istream *is, int sz)
- yy_delete_buffer(struct yy_buffer_state *b)

However, I couldn't figure out how to access current
buffer (yy_current_buffer).

yy_current_buffer is a protected member of yyFlexLexer.
I can't access it directly.
Then, I thought yy_create_buffer() with is = 0 might
return current stream buffer. But it seems not as far
as I checked the source. (flex 2.5.4)

I went through the Web in addition to Flex documentation.
However, it hasn't been successful, so far.

It is not my intention to bother you, but, can you
comment about how to obtain the current stream buffer?

Your response would be highly appreciated.

Best regards,
Aki Niimura

--== Sent via Deja.com http://www.deja.com/ ==--
Share what you know. Learn what you don't.
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-92
@unnumberedsec unnamed-faq-92
@example
@verbatim
To: neko@my-deja.com
Subject: Re: A question on flex C++ scanner
In-reply-to: Your message of Tue, 15 Jun 1999 08:55:43 PDT.
Date: Tue, 15 Jun 1999 09:04:24 PDT
From: Vern Paxson <vern>

> However, I couldn't figure out how to access current
> buffer (yy_current_buffer).

Derive your own subclass from yyFlexLexer.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-93
@unnumberedsec unnamed-faq-93
@example
@verbatim
To: "Stones, Darren" <Darren.Stones@nectech.co.uk>
Subject: Re: You're the man to see?
In-reply-to: Your message of Wed, 23 Jun 1999 11:10:29 PDT.
Date: Wed, 23 Jun 1999 09:01:40 PDT
From: Vern Paxson <vern>

> I hope you can help me.  I am using Flex and Bison to produce an interpreted
> language.  However all goes well until I try to implement an IF statement or
> a WHILE.  I cannot get this to work as the parser parses all the conditions
> eg. the TRUE and FALSE conditons to check for a rule match.  So I cannot
> make a decision!!

You need to use the parser to build a parse tree (= abstract syntax trwee),
and when that's all done you recursively evaluate the tree, binding variables
to values at that time.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-94
@unnumberedsec unnamed-faq-94
@example
@verbatim
To: Petr Danecek <petr@ics.cas.cz>
Subject: Re: flex - question
In-reply-to: Your message of Mon, 28 Jun 1999 19:21:41 PDT.
Date: Fri, 02 Jul 1999 16:52:13 PDT
From: Vern Paxson <vern>

> file, it takes an enormous amount of time. It is funny, because the
> source code has only 12 rules!!! I think it looks like an exponencial
> growth.

Right, that's the problem - some patterns (those with a lot of
ambiguity, where yours has because at any given time the scanner can
be in the middle of all sorts of combinations of the different
rules) blow up exponentially.

For your rules, there is an easy fix.  Change the ".*" that comes fater
the directory name to "[^ ]*".  With that in place, the rules are no
longer nearly so ambiguous, because then once one of the directories
has been matched, no other can be matched (since they all require a
leading blank).

If that's not an acceptable solution, then you can enter a start state
to pick up the .*\n after each directory is matched.

Also note that for speed, you'll want to add a ".*" rule at the end,
otherwise rules that don't match any of the patterns will be matched
very slowly, a character at a time.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-95
@unnumberedsec unnamed-faq-95
@example
@verbatim
To: Tielman Koekemoer <tielman@spi.co.za>
Subject: Re: Please help.
In-reply-to: Your message of Thu, 08 Jul 1999 13:20:37 PDT.
Date: Thu, 08 Jul 1999 08:20:39 PDT
From: Vern Paxson <vern>

> I was hoping you could help me with my problem.
>
> I tried compiling (gnu)flex on a Solaris 2.4 machine
> but when I ran make (after configure) I got an error.
>
> --------------------------------------------------------------
> gcc -c -I. -I. -g -O parse.c
> ./flex -t -p  ./scan.l >scan.c
> sh: ./flex: not found
> *** Error code 1
> make: Fatal error: Command failed for target `scan.c'
> -------------------------------------------------------------
>
> What's strange to me is that I'm only
> trying to install flex now. I then edited the Makefile to
> and changed where it says "FLEX = flex" to "FLEX = lex"
> ( lex: the native Solaris one ) but then it complains about
> the "-p" option. Is there any way I can compile flex without
> using flex or lex?
>
> Thanks so much for your time.

You managed to step on the bootstrap sequence, which first copies
initscan.c to scan.c in order to build flex.  Try fetching a fresh
distribution from ftp.ee.lbl.gov.  (Or you can first try removing
".bootstrap" and doing a make again.)

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-96
@unnumberedsec unnamed-faq-96
@example
@verbatim
To: Tielman Koekemoer <tielman@spi.co.za>
Subject: Re: Please help.
In-reply-to: Your message of Fri, 09 Jul 1999 09:16:14 PDT.
Date: Fri, 09 Jul 1999 00:27:20 PDT
From: Vern Paxson <vern>

> First I removed .bootstrap (and ran make) - no luck. I downloaded the
> software but I still have the same problem. Is there anything else I
> could try.

Try:

	cp initscan.c scan.c
	touch scan.c
	make scan.o

If this last tries to first build scan.c from scan.l using ./flex, then
your "make" is broken, in which case compile scan.c to scan.o by hand.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-97
@unnumberedsec unnamed-faq-97
@example
@verbatim
To: Sumanth Kamenani <skamenan@crl.nmsu.edu>
Subject: Re: Error
In-reply-to: Your message of Mon, 19 Jul 1999 23:08:41 PDT.
Date: Tue, 20 Jul 1999 00:18:26 PDT
From: Vern Paxson <vern>

> I am getting a compilation error. The error is given as "unknown symbol- yylex".

The parser relies on calling yylex(), but you're instead using the C++ scanning
class, so you need to supply a yylex() "glue" function that calls an instance
scanner of the scanner (e.g., "scanner->yylex()").

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-98
@unnumberedsec unnamed-faq-98
@example
@verbatim
To: daniel@synchrods.synchrods.COM (Daniel Senderowicz)
Subject: Re: lex
In-reply-to: Your message of Mon, 22 Nov 1999 11:19:04 PST.
Date: Tue, 23 Nov 1999 15:54:30 PST
From: Vern Paxson <vern>

Well, your problem is the

switch (yybgin-yysvec-1) {      /* witchcraft */

at the beginning of lex rules.  "witchcraft" == "non-portable".  It's
assuming knowledge of the AT&T lex's internal variables.

For flex, you can probably do the equivalent using a switch on YYSTATE.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-99
@unnumberedsec unnamed-faq-99
@example
@verbatim
To: archow@hss.hns.com
Subject: Re: Regarding distribution of flex and yacc based grammars
In-reply-to: Your message of Sun, 19 Dec 1999 17:50:24 +0530.
Date: Wed, 22 Dec 1999 01:56:24 PST
From: Vern Paxson <vern>

> When we provide the customer with an object code distribution, is it
> necessary for us to provide source
> for the generated C files from flex and bison since they are generated by
> flex and bison ?

For flex, no.  I don't know what the current state of this is for bison.

> Also, is there any requrirement for us to neccessarily  provide source for
> the grammar files which are fed into flex and bison ?

Again, for flex, no.

See the file "COPYING" in the flex distribution for the legalese.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-100
@unnumberedsec unnamed-faq-100
@example
@verbatim
To: Martin Gallwey <gallweym@hyperion.moe.ul.ie>
Subject: Re: Flex, and self referencing rules
In-reply-to: Your message of Sun, 20 Feb 2000 01:01:21 PST.
Date: Sat, 19 Feb 2000 18:33:16 PST
From: Vern Paxson <vern>

> However, I do not use unput anywhere. I do use self-referencing
> rules like this:
>
> UnaryExpr               ({UnionExpr})|("-"{UnaryExpr})

You can't do this - flex is *not* a parser like yacc (which does indeed
allow recursion), it is a scanner that's confined to regular expressions.

		Vern
@end verbatim
@end example

@c TODO: Evaluate this faq.
@node unnamed-faq-101
@unnumberedsec unnamed-faq-101
@example
@verbatim
To: slg3@lehigh.edu (SAMUEL L. GULDEN)
Subject: Re: Flex problem
In-reply-to: Your message of Thu, 02 Mar 2000 12:29:04 PST.
Date: Thu, 02 Mar 2000 23:00:46 PST
From: Vern Paxson <vern>

If this is exactly your program:

> digit [0-9]
> digits {digit}+
> whitespace [ \t\n]+
>
> %%
> "[" { printf("open_brac\n");}
> "]" { printf("close_brac\n");}
> "+" { printf("addop\n");}
> "*" { printf("multop\n");}
> {digits} { printf("NUMBER = %s\n", yytext);}
> whitespace ;

then the problem is that the last rule needs to be "{whitespace}" !

		Vern
@end verbatim
@end example

@node What is the difference between YYLEX_PARAM and YY_DECL?
@unnumberedsec What is the difference between YYLEX_PARAM and YY_DECL?

YYLEX_PARAM is not a flex symbol. It is for Bison. It tells Bison to pass extra
params when it calls yylex() from the parser.

YY_DECL is the Flex declaration of yylex. The default is similar to this:

@example
@verbatim
#define int yy_lex ()
@end verbatim
@end example


@node Why do I get "conflicting types for yylex" error?
@unnumberedsec Why do I get "conflicting types for yylex" error?

This is a compiler error regarding a generated Bison parser, not a Flex scanner.
It means you need a prototype of yylex() in the top of the Bison file.
Be sure the prototype matches YY_DECL.

@node How do I access the values set in a Flex action from within a Bison action?
@unnumberedsec How do I access the values set in a Flex action from within a Bison action?

With $1, $2, $3, etc. These are called "Semantic Values" in the Bison manual.
See @ref{Top, , , bison, the GNU Bison Manual}.

@node Appendices, Indices, FAQ, Top
@appendix Appendices

@menu
* Makefiles and Flex::          
* Bison Bridge::                
* M4 Dependency::               
* Common Patterns::               
@end menu

@node Makefiles and Flex, Bison Bridge, Appendices, Appendices
@appendixsec Makefiles and Flex

@cindex Makefile, syntax

In this appendix, we provide tips for writing Makefiles to build your scanners.

In a traditional build environment, we say that the @file{.c} files are the
sources, and the @file{.o} files are the intermediate files. When using
@code{flex}, however, the @file{.l} files are the sources, and the generated
@file{.c} files (along with the @file{.o} files) are the intermediate files.
This requires you to carefully plan your Makefile.

Modern @command{make} programs understand that @file{foo.l} is intended to
generate @file{lex.yy.c} or @file{foo.c}, and will behave
accordingly@footnote{GNU @command{make} and GNU @command{automake} are two such
programs that provide implicit rules for flex-generated scanners.}@footnote{GNU @command{automake}
may generate code to execute flex in lex-compatible mode, or to stdout. If this is not what you want,
then you should provide an explicit rule in your Makefile.am}.  The
following Makefile does not explicitly instruct @command{make} how to build
@file{foo.c} from @file{foo.l}. Instead, it relies on the implicit rules of the
@command{make} program to build the intermediate file, @file{scan.c}:

@cindex Makefile, example of implicit rules
@example
@verbatim
    # Basic Makefile -- relies on implicit rules
    # Creates "myprogram" from "scan.l" and "myprogram.c"
    #
    LEX=flex
    myprogram: scan.o myprogram.o
    scan.o: scan.l

@end verbatim
@end example


For simple cases, the above may be sufficient. For other cases,
you may have to explicitly instruct @command{make} how to build your scanner.
The following is an example of a Makefile containing explicit rules:

@cindex Makefile, explicit example
@example
@verbatim
    # Basic Makefile -- provides explicit rules
    # Creates "myprogram" from "scan.l" and "myprogram.c"
    #
    LEX=flex
    myprogram: scan.o myprogram.o
            $(CC) -o $@  $(LDFLAGS) $^

    myprogram.o: myprogram.c
            $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $^

    scan.o: scan.c
            $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $^

    scan.c: scan.l
            $(LEX) $(LFLAGS) -o $@ $^

    clean:
            $(RM) *.o scan.c

@end verbatim
@end example

Notice in the above example that @file{scan.c} is in the @code{clean} target.
This is because we consider the file @file{scan.c} to be an intermediate file.

Finally, we provide a realistic example of a @code{flex} scanner used with a
@code{bison} parser@footnote{This example also applies to yacc parsers.}.
There is a tricky problem we have to deal with. Since a @code{flex} scanner
will typically include a header file (e.g., @file{y.tab.h}) generated by the
parser, we need to be sure that the header file is generated BEFORE the scanner
is compiled. We handle this case in the following example:

@example
@verbatim
    # Makefile example -- scanner and parser.
    # Creates "myprogram" from "scan.l", "parse.y", and "myprogram.c"
    #
    LEX     = flex
    YACC    = bison -y
    YFLAGS  = -d
    objects = scan.o parse.o myprogram.o

    myprogram: $(objects)
    scan.o: scan.l parse.c
    parse.o: parse.y
    myprogram.o: myprogram.c

@end verbatim
@end example

In the above example, notice the line,

@example
@verbatim
    scan.o: scan.l parse.c
@end verbatim
@end example

, which lists the file @file{parse.c} (the generated parser) as a dependency of
@file{scan.o}. We want to ensure that the parser is created before the scanner
is compiled, and the above line seems to do the trick. Feel free to experiment
with your specific implementation of @command{make}.


For more details on writing Makefiles, see @ref{Top, , , make, The
GNU Make Manual}.

@node Bison Bridge, M4 Dependency, Makefiles and Flex, Appendices
@section C Scanners with Bison Parsers

@cindex bison, bridging with flex
@vindex yylval
@vindex yylloc
@tindex YYLTYPE
@tindex YYSTYPE

This section describes the @code{flex} features useful when integrating
@code{flex} with @code{GNU bison}@footnote{The features described here are
purely optional, and are by no means the only way to use flex with bison.
We merely provide some glue to ease development of your parser-scanner pair.}.
Skip this section if you are not using
@code{bison} with your scanner.  Here we discuss only the @code{flex}
half of the @code{flex} and @code{bison} pair.  We do not discuss
@code{bison} in any detail.  For more information about generating
@code{bison} parsers, see @ref{Top, , , bison, the GNU Bison Manual}.

A compatible @code{bison} scanner is generated by declaring @samp{%option
bison-bridge} or by supplying @samp{--bison-bridge} when invoking @code{flex}
from the command line.  This instructs @code{flex} that the macro
@code{yylval} may be used. The data type for
@code{yylval}, @code{YYSTYPE},
is typically defined in a header file, included in section 1 of the
@code{flex} input file.  For a list of functions and macros
available, @xref{bison-functions}.

The declaration of yylex becomes,

@findex yylex (reentrant version)
@example
@verbatim
      int yylex ( YYSTYPE * lvalp, yyscan_t scanner );
@end verbatim
@end example

If @code{%option bison-locations} is specified, then the declaration
becomes,

@findex yylex (reentrant version)
@example
@verbatim
      int yylex ( YYSTYPE * lvalp, YYLTYPE * llocp, yyscan_t scanner );
@end verbatim
@end example

Note that the macros @code{yylval} and @code{yylloc} evaluate to pointers.
Support for @code{yylloc} is optional in @code{bison}, so it is optional in
@code{flex} as well. The following is an example of a @code{flex} scanner that
is compatible with @code{bison}.

@cindex bison, scanner to be called from bison
@example
@verbatim
    /* Scanner for "C" assignment statements... sort of. */
    %{
    #include "y.tab.h"  /* Generated by bison. */
    %}

    %option bison-bridge bison-locations
    %

    [[:digit:]]+  { yylval->num = atoi(yytext);   return NUMBER;}
    [[:alnum:]]+  { yylval->str = strdup(yytext); return STRING;}
    "="|";"       { return yytext[0];}
    .  {}
    %
@end verbatim
@end example

As you can see, there really is no magic here. We just use
@code{yylval} as we would any other variable. The data type of
@code{yylval} is generated by @code{bison}, and included in the file
@file{y.tab.h}. Here is the corresponding @code{bison} parser:

@cindex bison, parser
@example
@verbatim
    /* Parser to convert "C" assignments to lisp. */
    %{
    /* Pass the argument to yyparse through to yylex. */
    #define YYPARSE_PARAM scanner
    #define YYLEX_PARAM   scanner
    %}
    %locations
    %pure_parser
    %union {
        int num;
        char* str;
    }
    %token <str> STRING
    %token <num> NUMBER
    %%
    assignment:
        STRING '=' NUMBER ';' {
            printf( "(setf %s %d)", $1, $3 );
       }
    ;
@end verbatim
@end example

@node M4 Dependency, Common Patterns, Bison Bridge, Appendices
@section M4 Dependency
@cindex m4
The macro processor @code{m4}@footnote{The use of m4 is subject to change in
future revisions of flex. It is not part of the public API of flex. Do not depend on it.}
must be installed wherever flex is installed.
@code{flex} invokes @samp{m4}, found by searching the directories in the
@code{PATH} environment variable. Any code you place in section 1 or in the
actions will be sent through m4. Please follow these rules to protect your
code from unwanted @code{m4} processing.

@itemize

@item Do not use symbols that begin with, @samp{m4_}, such as, @samp{m4_define},
or @samp{m4_include}, since those are reserved for @code{m4} macro names. If for 
some reason you need m4_ as a prefix, use a preprocessor #define to get your
symbol past m4 unmangled.

@item Do not use the strings @samp{[[} or @samp{]]} anywhere in your code. The
former is not valid in C, except within comments and strings, but the latter is valid in
code such as @code{x[y[z]]}. The solution is simple. To get the literal string 
@code{"]]"}, use @code{"]""]"}. To get the array notation @code{x[y[z]]},
use @code{x[y[z] ]}. Flex will attempt to detect these sequences in user code, and
escape them. However, it's best to avoid this complexity where possible, by
removing such sequences from your code.

@end itemize

@code{m4} is only required at the time you run @code{flex}. The generated
scanner is ordinary C or C++, and does @emph{not} require @code{m4}.

@node Common Patterns, ,M4 Dependency, Appendices
@section Common Patterns
@cindex patterns, common

This appendix provides examples of common regular expressions you might use
in your scanner.

@menu
* Numbers::         
* Identifiers::         
* Quoted Constructs::       
* Addresses::       
@end menu


@node Numbers, Identifiers, ,Common Patterns
@subsection Numbers

@table @asis

@item C99 decimal constant
@code{([[:digit:]]@{-@}[0])[[:digit:]]*}

@item C99 hexadecimal constant
@code{0[xX][[:xdigit:]]+}

@item C99 octal constant
@code{0[01234567]*}

@item C99 floating point constant
@verbatim
 {dseq}      ([[:digit:]]+)
 {dseq_opt}  ([[:digit:]]*)
 {frac}      (({dseq_opt}"."{dseq})|{dseq}".")
 {exp}       ([eE][+-]?{dseq})
 {exp_opt}   ({exp}?)
 {fsuff}     [flFL]
 {fsuff_opt} ({fsuff}?)
 {hpref}     (0[xX])
 {hdseq}     ([[:xdigit:]]+)
 {hdseq_opt} ([[:xdigit:]]*)
 {hfrac}     (({hdseq_opt}"."{hdseq})|({hdseq}"."))
 {bexp}      ([pP][+-]?{dseq})
 {dfc}       (({frac}{exp_opt}{fsuff_opt})|({dseq}{exp}{fsuff_opt}))
 {hfc}       (({hpref}{hfrac}{bexp}{fsuff_opt})|({hpref}{hdseq}{bexp}{fsuff_opt}))

 {c99_floating_point_constant}  ({dfc}|{hfc})
@end verbatim

See C99 section 6.4.4.2 for the gory details.

@end table

@node Identifiers, Quoted Constructs, Numbers, Common Patterns
@subsection Identifiers

@table @asis

@item C99 Identifier
@verbatim
ucn        ((\\u([[:xdigit:]]{4}))|(\\U([[:xdigit:]]{8})))
nondigit    [_[:alpha:]]
c99_id     ([_[:alpha:]]|{ucn})([_[:alnum:]]|{ucn})*
@end verbatim

Technically, the above pattern does not encompass all possible C99 identifiers, since C99 allows for
"implementation-defined" characters. In practice, C compilers follow the above pattern, with the
addition of the @samp{$} character.

@item UTF-8 Encoded Unicode Code Point
@verbatim
[\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF]([\x80-\xBF]{2})|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF]([\x80-\xBF]{2})|[\xF1-\xF3]([\x80-\xBF]{3})|\xF4[\x80-\x8F]([\x80-\xBF]{2})
@end verbatim

@end table

@node Quoted Constructs, Addresses, Identifiers, Common Patterns
@subsection Quoted Constructs

@table @asis
@item C99 String Literal
@code{L?\"([^\"\\\n]|(\\['\"?\\abfnrtv])|(\\([0123456]@{1,3@}))|(\\x[[:xdigit:]]+)|(\\u([[:xdigit:]]@{4@}))|(\\U([[:xdigit:]]@{8@})))*\"}

@item C99 Comment
@code{("/*"([^*]|"*"[^/])*"*/")|("/"(\\\n)*"/"[^\n]*)}

Note that in C99, a @samp{//}-style comment may be split across lines,  and, contrary to popular belief,
does not include the trailing @samp{\n} character.

A better way to scan @samp{/* */} comments is by line, rather than matching
possibly huge comments all at once. This will allow you to scan comments of
unlimited length, as long as line breaks appear at sane intervals. This is also
more efficient when used with automatic line number processing. @xref{option-yylineno}.

@verbatim
<INITIAL>{
    "/*"      BEGIN(COMMENT);
}
<COMMENT>{
    "*/"      BEGIN(0);
    [^*\n]+   ;
    "*"[^/]   ;
    \n        ;
}
@end verbatim

@end table

@node Addresses, ,Quoted Constructs, Common Patterns
@subsection Addresses

@table @asis

@item IPv4 Address
@verbatim
dec-octet     [0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]
IPv4address   {dec-octet}\.{dec-octet}\.{dec-octet}\.{dec-octet}
@end verbatim

@item IPv6 Address
@verbatim
h16           [0-9A-Fa-f]{1,4}
ls32          {h16}:{h16}|{IPv4address}
IPv6address   ({h16}:){6}{ls32}|
              ::({h16}:){5}{ls32}|
              ({h16})?::({h16}:){4}{ls32}|
              (({h16}:){0,1}{h16})?::({h16}:){3}{ls32}|
              (({h16}:){0,2}{h16})?::({h16}:){2}{ls32}|
              (({h16}:){0,3}{h16})?::{h16}:{ls32}|
              (({h16}:){0,4}{h16})?::{ls32}|
              (({h16}:){0,5}{h16})?::{h16}|
              (({h16}:){0,6}{h16})?::
@end verbatim

See @uref{http://www.ietf.org/rfc/rfc2373.txt, RFC 2373} for details.
Note that you have to fold the definition of @code{IPv6address} into one
line and that it also matches the ``unspecified address'' ``::''.

@item URI
@code{(([^:/?#]+):)?("//"([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?}

This pattern is nearly useless, since it allows just about any character
to appear in a URI, including spaces and control characters.  See
@uref{http://www.ietf.org/rfc/rfc2396.txt, RFC 2396} for details.

@end table


@node Indices,  , Appendices, Top
@unnumbered Indices

@menu
* Concept Index::               
* Index of Functions and Macros::  
* Index of Variables::          
* Index of Data Types::         
* Index of Hooks::              
* Index of Scanner Options::    
@end menu

@node Concept Index, Index of Functions and Macros, Indices, Indices
@unnumberedsec Concept Index

@printindex cp

@node Index of Functions and Macros, Index of Variables, Concept Index, Indices
@unnumberedsec Index of Functions and Macros

This is an index of functions and preprocessor macros that look like functions.
For macros that expand to variables or constants, see @ref{Index of Variables}.

@printindex fn

@node Index of Variables, Index of Data Types, Index of Functions and Macros, Indices
@unnumberedsec Index of Variables

This is an index of variables, constants, and preprocessor macros
that expand to variables or constants.

@printindex vr

@node Index of Data Types, Index of Hooks, Index of Variables, Indices
@unnumberedsec Index of Data Types
@printindex tp

@node Index of Hooks, Index of Scanner Options, Index of Data Types, Indices
@unnumberedsec Index of Hooks

This is an index of "hooks" that the user may define. These hooks typically  correspond
to specific locations in the generated scanner, and may be used to insert arbitrary code.

@printindex hk

@node Index of Scanner Options,  , Index of Hooks, Indices
@unnumberedsec Index of Scanner Options

@printindex op

@c A vim script to name the faq entries. delete this when faqs are no longer
@c named "unnamed-faq-XXX".
@c
@c fu! Faq2 () range abort
@c     let @r=input("Rename to: ")
@c     exe "%s/" . @w . "/" . @r . "/g"
@c     normal 'f
@c endf
@c nnoremap <F5>  1G/@node\s\+unnamed-faq-\d\+<cr>mfww"wy5ezt:call Faq2()<cr>

@bye
