FLEXDOC.1
上传用户:datang2001
上传日期:2007-02-01
资源大小:53269k
文件大小:79k
源码类别:

操作系统开发

开发平台:

C/C++

  1. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  2. NAME
  3.      flexdoc - fast lexical analyzer generator
  4. SYNOPSIS
  5.      flex [-bcdfinpstvFILT8 -C[efmF] -Sskeleton] [filename ...]
  6. DESCRIPTION
  7.      flex is a tool for generating scanners: programs which recognized lexical
  8.      patterns  in  text.   flex  reads  the given input files, or its standard
  9.      input if no file names are given, for  a  description  of  a  scanner  to
  10.      generate.  The description is in the form of pairs of regular expressions
  11.      and C code, called rules. flex generates  as  output  a  C  source  file,
  12.      lex.yy.c,  which  defines  a  routine  yylex(). This file is compiled and
  13.      linked with  the  -lfl  library  to  produce  an  executable.   When  the
  14.      executable  is  run, it analyzes its input for occurrences of the regular
  15.      expressions.  Whenever it finds one,  it  executes  the  corresponding  C
  16.      code.
  17. SOME SIMPLE EXAMPLES
  18.      First some simple examples to get the flavor of how one  uses  flex.  The
  19.      following flex input specifies a scanner which whenever it encounters the
  20.      string "username" will replace it with the user's login name:
  21.          %%
  22.          username    printf( "%s", getlogin() );
  23.      By default, any text not matched by a  flex  scanner  is  copied  to  the
  24.      output,  so  the  net effect of this scanner is to copy its input file to
  25.      its output with each occurrence of "username" expanded.  In  this  input,
  26.      there  is  just  one rule.  "username" is the pattern and the "printf" is
  27.      the action. The "%%" marks the beginning of the rules.
  28.      Here's another simple example:
  29.              int num_lines = 0, num_chars = 0;
  30.          %%
  31.          n    ++num_lines; ++num_chars;
  32.          .     ++num_chars;
  33.          %%
  34.          main()
  35.              {
  36.              yylex();
  37.              printf( "# of lines = %d, # of chars = %dn",
  38.                      num_lines, num_chars );
  39.              }
  40.      This scanner counts the number of characters and the number of  lines  in
  41.                                  26 May 1990                                 1
  42. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  43.      its input (it produces no output other  than  the  final  report  on  the
  44.      counts).    The   first   line  declares  two  globals,  "num_lines"  and
  45.      "num_chars", which are accessible both inside yylex() and in  the  main()
  46.      routine  declared  after the second "%%".  There are two rules, one which
  47.      matches a newline ("n") and increments  both  the  line  count  and  the
  48.      character count, and one which matches any character other than a newline
  49.      (indicated by the "." regular expression).
  50.      A somewhat more complicated example:
  51.          /* scanner for a toy Pascal-like language */
  52.          %{
  53.          /* need this for the call to atof() below */
  54.          #include <math.h>
  55.          %}
  56.          DIGIT    [0-9]
  57.          ID       [a-z][a-z0-9]*
  58.          %%
  59.          {DIGIT}+    {
  60.                      printf( "An integer: %s (%d)n", yytext,
  61.                              atoi( yytext ) );
  62.                      }
  63.          {DIGIT}+"."{DIGIT}*        {
  64.                      printf( "A float: %s (%g)n", yytext,
  65.                              atof( yytext ) );
  66.                      }
  67.          if|then|begin|end|procedure|function        {
  68.                      printf( "A keyword: %sn", yytext );
  69.                      }
  70.          {ID}        printf( "An identifier: %sn", yytext );
  71.          "+"|"-"|"*"|"/"   printf( "An operator: %sn", yytext );
  72.          "{"[^}n]*"}"     /* eat up one-line comments */
  73.          [ tn]+          /* eat up whitespace */
  74.          .           printf( "Unrecognized character: %sn", yytext );
  75.          %%
  76.          main( argc, argv )
  77.          int argc;
  78.                                  26 May 1990                                 2
  79. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  80.          char **argv;
  81.              {
  82.              ++argv, --argc;  /* skip over program name */
  83.              if ( argc > 0 )
  84.                      yyin = fopen( argv[0], "r" );
  85.              else
  86.                      yyin = stdin;
  87.              yylex();
  88.              }
  89.      This is the beginnings of a simple scanner for a  language  like  Pascal.
  90.      It identifies different types of tokens and reports on what it has seen.
  91.      The details of this example will be explained in the following sections.
  92. FORMAT OF THE INPUT FILE
  93.      The flex input file consists of three sections, separated by a line  with
  94.      just %% in it:
  95.          definitions
  96.          %%
  97.          rules
  98.          %%
  99.          user code
  100.      The definitions section contains declarations of simple name  definitions
  101.      to   simplify  the  scanner  specification,  and  declarations  of  start
  102.      conditions, which are explained in a later section.
  103.      Name definitions have the form:
  104.          name definition
  105.      The "name" is a word beginning with  a  letter  or  an  underscore  ('_')
  106.      followed  by  zero  or  more  letters,  digits,  '_', or '-' (dash).  The
  107.      definition is taken to  begin  at  the  first  non-white-space  character
  108.      following the name and continuing to the end of the line.  The definition
  109.      can subsequently be referred to using  "{name}",  which  will  expand  to
  110.      "(definition)".  For example,
  111.          DIGIT    [0-9]
  112.          ID       [a-z][a-z0-9]*
  113.      defines "DIGIT" to be a regular expression which matches a single  digit,
  114.      and  "ID"  to  be a regular expression which matches a letter followed by
  115.      zero-or-more letters-or-digits.  A subsequent reference to
  116.          {DIGIT}+"."{DIGIT}*
  117.                                  26 May 1990                                 3
  118. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  119.      is identical to
  120.          ([0-9])+"."([0-9])*
  121.      and matches one-or-more digits followed by a '.' followed by zero-or-more
  122.      digits.
  123.      The rules section of the flex input contains a series  of  rules  of  the
  124.      form:
  125.          pattern   action
  126.      where the pattern must be unindented and the action  must  begin  on  the
  127.      same line.
  128.      See below for a further description of patterns and actions.
  129.      Finally, the user code section is simply copied to lex.yy.c verbatim.  It
  130.      is  used  for companion routines which call or are called by the scanner.
  131.      The presence of this section is optional; if it is missing, the second %%
  132.      in the input file may be skipped, too.
  133.      In the definitions and rules sections, any indented text or text enclosed
  134.      in  %{  and %} is copied verbatim to the output (with the %{}'s removed).
  135.      The %{}'s must appear unindented on lines by themselves.
  136.      In the rules section, any indented or %{} text appearing before the first
  137.      rule  may  be  used  to declare variables which are local to the scanning
  138.      routine and (after  the  declarations)  code  which  is  to  be  executed
  139.      whenever  the scanning routine is entered.  Other indented or %{} text in
  140.      the rule section is still copied to the output, but its  meaning  is  not
  141.      well-defined  and  it may well cause compile-time errors (this feature is
  142.      present for POSIX compliance; see below for other such features).
  143.      In the definitions section, an unindented comment (i.e., a line beginning
  144.      with  "/*")  is  also  copied verbatim to the output up to the next "*/".
  145.      Also, any line in the definitions section beginning with '#' is  ignored,
  146.      though this style of comment is deprecated and may go away in the future.
  147. PATTERNS
  148.      The patterns in the input are written using an extended  set  of  regular
  149.      expressions.  These are:
  150.          x          match the character 'x'
  151.          .          any character except newline
  152.          [xyz]      a "character class"; in this case, the pattern
  153.                       matches either an 'x', a 'y', or a 'z'
  154.          [abj-oZ]   a "character class" with a range in it; matches
  155.                       an 'a', a 'b', any letter from 'j' through 'o',
  156.                       or a 'Z'
  157.                                  26 May 1990                                 4
  158. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  159.          [^A-Z]     a "negated character class", i.e., any character
  160.                       but those in the class.  In this case, any
  161.                       character EXCEPT an uppercase letter.
  162.          [^A-Zn]   any character EXCEPT an uppercase letter or
  163.                       a newline
  164.          r*         zero or more r's, where r is any regular expression
  165.          r+         one or more r's
  166.          r?         zero or one r's (that is, "an optional r")
  167.          r{2,5}     anywhere from two to five r's
  168.          r{2,}      two or more r's
  169.          r{4}       exactly 4 r's
  170.          {name}     the expansion of the "name" definition
  171.                     (see above)
  172.          "[xyz]"foo"
  173.                     the literal string: [xyz]"foo
  174.          X         if X is an 'a', 'b', 'f', 'n', 'r', 't', or 'v',
  175.                       then the ANSI-C interpretation of x.
  176.                       Otherwise, a literal 'X' (used to escape
  177.                       operators such as '*')
  178.          123       the character with octal value 123
  179.          x2a       the character with hexadecimal value 2a
  180.          (r)        match an r; parentheses are used to override
  181.                       precedence (see below)
  182.          rs         the regular expression r followed by the
  183.                       regular expression s; called "concatenation"
  184.          r|s        either an r or an s
  185.          r/s        an r but only if it is followed by an s.  The
  186.                       s is not part of the matched text.  This type
  187.                       of pattern is called as "trailing context".
  188.          ^r         an r, but only at the beginning of a line
  189.          r$         an r, but only at the end of a line.  Equivalent
  190.                       to "r/n".
  191.          <s>r       an r, but only in start condition s (see
  192.                     below for discussion of start conditions)
  193.          <s1,s2,s3>r
  194.                     same, but in any of start conditions s1,
  195.                     s2, or s3
  196.          <<EOF>>    an end-of-file
  197.          <s1,s2><<EOF>>
  198.                     an end-of-file when in start condition s1 or s2
  199.                                  26 May 1990                                 5
  200. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  201.      The regular expressions listed above are grouped according to precedence,
  202.      from  highest  precedence  at  the  top  to  lowest at the bottom.  Those
  203.      grouped together have equal precedence.  For example,
  204.          foo|bar*
  205.      is the same as
  206.          (foo)|(ba(r*))
  207.      since the '*' operator has  higher  precedence  than  concatenation,  and
  208.      concatenation  higher  than  alternation  ('|').   This pattern therefore
  209.      matches either the string "foo" or the string "ba" followed  by  zero-or-
  210.      more r's.  To match "foo" or zero-or-more "bar"'s, use:
  211.          foo|(bar)*
  212.      and to match zero-or-more "foo"'s-or-"bar"'s:
  213.          (foo|bar)*
  214.      Some notes on patterns:
  215.      -    A negated character class such as the example  "[^A-Z]"  above  will
  216.           match  a  newline  unless "n" (or an equivalent escape sequence) is
  217.           one of the characters explicitly present in  the  negated  character
  218.           class  (e.g.,  "[^A-Zn]").   This  is unlike how many other regular
  219.           expression tools treat negated character classes, but  unfortunately
  220.           the  inconsistency  is  historically  entrenched.  Matching newlines
  221.           means  that  a  pattern  like  [^"]*  can  match  an  entire   input
  222.           (overflowing  the  scanner's  input  buffer)  unless there's another
  223.           quote in the input.
  224.      -    A rule can have at most one instance of trailing  context  (the  '/'
  225.           operator  or  the  '$'  operator).   The  start  condition, '^', and
  226.           "<<EOF>>" patterns can only occur at the  beginning  of  a  pattern,
  227.           and,  as  well  as  with  '/'  and  '$',  cannot  be  grouped inside
  228.           parentheses.  A '^' which does not occur at the beginning of a  rule
  229.           or a '$' which does not occur at the end of a rule loses its special
  230.           properties and is treated as a normal character.
  231.           The following are illegal:
  232.               foo/bar$
  233.               <sc1>foo<sc2>bar
  234.           Note that the first of these, can be written "foo/barn".
  235.                                  26 May 1990                                 6
  236. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  237.           The following will result in '$' or '^' being treated  as  a  normal
  238.           character:
  239.               foo|(bar$)
  240.               foo|^bar
  241.           If what's wanted is a  "foo"  or  a  bar-followed-by-a-newline,  the
  242.           following could be used (the special '|' action is explained below):
  243.               foo      |
  244.               bar$     /* action goes here */
  245.           A similar trick will work  for  matching  a  foo  or  a  bar-at-the-
  246.           beginning-of-a-line.
  247. HOW THE INPUT IS MATCHED
  248.      When the generated scanner is run, it  analyzes  its  input  looking  for
  249.      strings  which  match  any  of  its  patterns.  If it finds more than one
  250.      match, it takes the one matching the  most  text  (for  trailing  context
  251.      rules, this includes the length of the trailing part, even though it will
  252.      then be returned to the input).  If it finds two or more matches  of  the
  253.      same length, the rule listed first in the flex input file is chosen.
  254.      Once the match is determined, the text corresponding to the match (called
  255.      the  token) is made available in the global character pointer yytext, and
  256.      its length in the global integer yyleng. The action corresponding to  the
  257.      matched  pattern is then executed (a more detailed description of actions
  258.      follows), and then the remaining input is scanned for another match.
  259.      If no match is found,  then  the  default  rule  is  executed:  the  next
  260.      character  in  the input is considered matched and copied to the standard
  261.      output.  Thus, the simplest legal flex input is:
  262.          %%
  263.      which generates a scanner that simply copies its input (one character  at
  264.      a time) to its output.
  265. ACTIONS
  266.      Each pattern in a rule has a  corresponding  action,  which  can  be  any
  267.      arbitrary  C  statement.   The  pattern  ends  at  the  first non-escaped
  268.      whitespace character; the remainder of the line is its  action.   If  the
  269.      action  is  empty,  then  when  the pattern is matched the input token is
  270.      simply discarded.  For example, here is the specification for  a  program
  271.      which deletes all occurrences of "zap me" from its input:
  272.          %%
  273.          "zap me"
  274.      (It will copy all other characters in the input to the output since  they
  275.                                  26 May 1990                                 7
  276. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  277.      will be matched by the default rule.)
  278.      Here is a program which compresses multiple blanks and  tabs  down  to  a
  279.      single blank, and throws away whitespace found at the end of a line:
  280.          %%
  281.          [ t]+        putchar( ' ' );
  282.          [ t]+$       /* ignore this token */
  283.      If the action contains a '{', then the action spans  till  the  balancing
  284.      '}'  is found, and the action may cross multiple lines.  flex knows about
  285.      C strings and comments and won't be fooled by braces found  within  them,
  286.      but  also allows actions to begin with %{ and will consider the action to
  287.      be all the text up to the next %} (regardless of ordinary  braces  inside
  288.      the action).
  289.      An action consisting solely of a vertical bar ('|') means  "same  as  the
  290.      action for the next rule."  See below for an illustration.
  291.      Actions can include arbitrary C  code,  including  return  statements  to
  292.      return  a  value to whatever routine called yylex(). Each time yylex() is
  293.      called it continues processing tokens from where it last left  off  until
  294.      it  either  reaches  the  end  of the file or executes a return.  Once it
  295.      reaches an end-of-file, however, then any subsequent call to yylex() will
  296.      simply  immediately  return,  unless  yyrestart()  is  first  called (see
  297.      below).
  298.      Actions are not allowed to modify yytext or yyleng.
  299.      There are a number of special directives which can be included within  an
  300.      action:
  301.      -    ECHO copies yytext to the scanner's output.
  302.      -    BEGIN followed by the name of a start condition places  the  scanner
  303.           in the corresponding start condition (see below).
  304.      -    REJECT directs the scanner to proceed on to the "second  best"  rule
  305.           which  matched  the  input  (or a prefix of the input).  The rule is
  306.           chosen as described above in "How the Input is Matched", and  yytext
  307.           and yyleng set up appropriately.  It may either be one which matched
  308.           as much text as the originally chosen rule but  came  later  in  the
  309.           flex  input  file, or one which matched less text.  For example, the
  310.           following will both count the  words  in  the  input  and  call  the
  311.           routine special() whenever "frob" is seen:
  312.                       int word_count = 0;
  313.               %%
  314.                                  26 May 1990                                 8
  315. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  316.               frob        special(); REJECT;
  317.               [^ tn]+   ++word_count;
  318.           Without the REJECT, any "frob"'s in the input would not  be  counted
  319.           as  words,  since  the scanner normally executes only one action per
  320.           token.  Multiple REJECT's are allowed, each  one  finding  the  next
  321.           best  choice  to  the  currently active rule.  For example, when the
  322.           following scanner scans the token "abcd", it will write "abcdabcaba"
  323.           to the output:
  324.               %%
  325.               a        |
  326.               ab       |
  327.               abc      |
  328.               abcd     ECHO; REJECT;
  329.               .|n     /* eat up any unmatched character */
  330.           (The first three rules share the fourth's action since they use  the
  331.           special  '|' action.)  REJECT is a particularly expensive feature in
  332.           terms scanner performance; if it is used in  any  of  the  scanner's
  333.           actions   it   will   slow  down  all  of  the  scanner's  matching.
  334.           Furthermore, REJECT cannot be used with the -f or  -F  options  (see
  335.           below).
  336.           Note also that unlike the other special actions, REJECT is a branch;
  337.           code immediately following it in the action will not be executed.
  338.      -    yymore() tells the scanner that the next time it matches a rule, the
  339.           corresponding  token  should  be  appended onto the current value of
  340.           yytext rather than replacing  it.   For  example,  given  the  input
  341.           "mega-kludge"  the  following  will  write "mega-mega-kludge" to the
  342.           output:
  343.               %%
  344.               mega-    ECHO; yymore();
  345.               kludge   ECHO;
  346.           First "mega-" is matched and echoed to the output.  Then "kludge" is
  347.           matched,  but  the  previous  "mega-" is still hanging around at the
  348.           beginning of yytext so the ECHO for the "kludge" rule will  actually
  349.           write  "mega-kludge".   The  presence  of  yymore() in the scanner's
  350.           action entails a minor performance penalty in the scanner's matching
  351.           speed.
  352.      -    yyless(n) returns all but the first  n  characters  of  the  current
  353.           token  back  to  the input stream, where they will be rescanned when
  354.           the scanner looks  for  the  next  match.   yytext  and  yyleng  are
  355.           adjusted  appropriately (e.g., yyleng will now be equal to n ).  For
  356.           example,  on  the  input  "foobar"  the  following  will  write  out
  357.           "foobarbar":
  358.                                  26 May 1990                                 9
  359. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  360.               %%
  361.               foobar    ECHO; yyless(3);
  362.               [a-z]+    ECHO;
  363.           An argument of 0 to yyless  will  cause  the  entire  current  input
  364.           string  to  be scanned again.  Unless you've changed how the scanner
  365.           will subsequently process its input (using BEGIN, for example), this
  366.           will result in an endless loop.
  367.      -    unput(c) puts the character c back onto the input stream.   It  will
  368.           be  the  next character scanned.  The following action will take the
  369.           current token and cause it to be rescanned enclosed in parentheses.
  370.               {
  371.               int i;
  372.               unput( ')' );
  373.               for ( i = yyleng - 1; i >= 0; --i )
  374.                   unput( yytext[i] );
  375.               unput( '(' );
  376.               }
  377.           Note that since each unput() puts the given character  back  at  the
  378.           beginning  of  the  input  stream, pushing back strings must be done
  379.           back-to-front.
  380.      -    input() reads  the  next  character  from  the  input  stream.   For
  381.           example, the following is one way to eat up C comments:
  382.               %%
  383.               "/*"        {
  384.                           register int c;
  385.                           for ( ; ; )
  386.                               {
  387.                               while ( (c = input()) != '*' &&
  388.                                       c != EOF )
  389.                                   ;    /* eat up text of comment */
  390.                               if ( c == '*' )
  391.                                   {
  392.                                   while ( (c = input()) == '*' )
  393.                                       ;
  394.                                   if ( c == '/' )
  395.                                       break;    /* found the end */
  396.                                   }
  397.                               if ( c == EOF )
  398.                                   {
  399.                                   error( "EOF in comment" );
  400.                                   break;
  401.                                 26 May 1990                                 10
  402. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  403.                                   }
  404.                               }
  405.                           }
  406.           (Note that if the scanner is compiled using  C++,  then  input()  is
  407.           instead  referred  to  as  yyinput(), in order to avoid a name clash
  408.           with the C++ stream by the name of input.)
  409.      -    yyterminate() can be used in  lieu  of  a  return  statement  in  an
  410.           action.   It terminates the scanner and returns a 0 to the scanner's
  411.           caller, indicating "all done".  Subsequent calls to the scanner will
  412.           immediately  return  unless  preceded  by a call to yyrestart() (see
  413.           below).  By default, yyterminate() is also called  when  an  end-of-
  414.           file is encountered.  It is a macro and may be redefined.
  415. THE GENERATED SCANNER
  416.      The output of flex is the file  lex.yy.c,  which  contains  the  scanning
  417.      routine yylex(), a number of tables used by it for matching tokens, and a
  418.      number of auxiliary routines and macros.  By default, yylex() is declared
  419.      as follows:
  420.          int yylex()
  421.              {
  422.              ... various definitions and the actions in here ...
  423.              }
  424.      (If your environment supports function prototypes, then it will  be  "int
  425.      yylex(  void  )".)   This  definition  may  be  changed by redefining the
  426.      "YY_DECL" macro.  For example, you could use:
  427.          #undef YY_DECL
  428.          #define YY_DECL float lexscan( a, b ) float a, b;
  429.      to give the scanning routine the name lexscan,  returning  a  float,  and
  430.      taking  two  floats as arguments.  Note that if you give arguments to the
  431.      scanning routine using a K&R-style/non-prototyped  function  declaration,
  432.      you must terminate the definition with a semi-colon (;).
  433.      Whenever yylex() is called, it scans tokens from the  global  input  file
  434.      yyin  (which defaults to stdin).  It continues until it either reaches an
  435.      end-of-file (at which point it returns the value 0) or one of its actions
  436.      executes  a  return statement.  In the former case, when called again the
  437.      scanner will immediately return unless yyrestart()  is  called  to  point
  438.      yyin  at  the new input file.  ( yyrestart() takes one argument, a FILE *
  439.      pointer.)  In the latter case (i.e., when an action executes  a  return),
  440.      the scanner may then be called again and it will resume scanning where it
  441.      left off.
  442.                                 26 May 1990                                 11
  443. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  444.      By default (and for purposes of efficiency), the scanner uses block-reads
  445.      rather  than simple getc() calls to read characters from yyin. The nature
  446.      of how it gets its input can be controlled  by  redefining  the  YY_INPUT
  447.      macro.   YY_INPUT's  calling sequence is "YY_INPUT(buf,result,max_size)".
  448.      Its action is to place up to max_size characters in the  character  array
  449.      buf  and  return  in  the  integer  variable  result either the number of
  450.      characters read or the constant YY_NULL (0 on Unix systems)  to  indicate
  451.      EOF.  The default YY_INPUT reads from the global file-pointer "yyin".
  452.      A sample redefinition of YY_INPUT (in  the  definitions  section  of  the
  453.      input file):
  454.          %{
  455.          #undef YY_INPUT
  456.          #define YY_INPUT(buf,result,max_size) 
  457.              { 
  458.              int c = getchar(); 
  459.              result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); 
  460.              }
  461.          %}
  462.      This definition will change the input processing to occur  one  character
  463.      at a time.
  464.      You also can add in things like keeping track of the  input  line  number
  465.      this way; but don't expect your scanner to go very fast.
  466.      When the scanner receives an end-of-file  indication  from  YY_INPUT,  it
  467.      then  checks  the  yywrap()  function.  If yywrap() returns false (zero),
  468.      then it is assumed that the function has gone ahead and set  up  yyin  to
  469.      point  to another input file, and scanning continues.  If it returns true
  470.      (non-zero), then the scanner terminates, returning 0 to its caller.
  471.      The default yywrap() always returns 1.  Presently,  to  redefine  it  you
  472.      must  first  "#undef  yywrap", as it is currently implemented as a macro.
  473.      As indicated by the hedging in the previous sentence, it may  be  changed
  474.      to a true function in the near future.
  475.      The scanner writes its ECHO output to the yyout global (default, stdout),
  476.      which  may  be redefined by the user simply by assigning it to some other
  477.      FILE pointer.
  478. START CONDITIONS
  479.      flex provides a mechanism for conditionally activating rules.   Any  rule
  480.      whose  pattern  is  prefixed  with  "<sc>"  will  only be active when the
  481.      scanner is in the start condition named "sc".  For example,
  482.          <STRING>[^"]*        { /* eat up the string body ... */
  483.                      ...
  484.                      }
  485.                                 26 May 1990                                 12
  486. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  487.      will be active only when the scanner is in the "STRING" start  condition,
  488.      and
  489.          <INITIAL,STRING,QUOTE>.        { /* handle an escape ... */
  490.                      ...
  491.                      }
  492.      will be active only when the current start condition is either "INITIAL",
  493.      "STRING", or "QUOTE".
  494.      Start conditions are declared in the definitions (first) section  of  the
  495.      input using unindented lines beginning with either %s or %x followed by a
  496.      list of names.  The  former  declares  inclusive  start  conditions,  the
  497.      latter  exclusive start conditions.  A start condition is activated using
  498.      the BEGIN action.  Until the next BEGIN action is  executed,  rules  with
  499.      the  given  start  condition  will  be  active and rules with other start
  500.      conditions will be inactive.  If the start condition is  inclusive,  then
  501.      rules  with  no  start  conditions  at all will also be active.  If it is
  502.      exclusive, then only rules qualified with the  start  condition  will  be
  503.      active.   A set of rules contingent on the same exclusive start condition
  504.      describe a scanner which is independent of any of the other rules in  the
  505.      flex  input.  Because of this, exclusive start conditions make it easy to
  506.      specify "mini-scanners"  which  scan  portions  of  the  input  that  are
  507.      syntactically different from the rest (e.g., comments).
  508.      If the distinction between inclusive and exclusive  start  conditions  is
  509.      still a little vague, here's a simple example illustrating the connection
  510.      between the two.  The set of rules:
  511.          %s example
  512.          %%
  513.          <example>foo           /* do something */
  514.      is equivalent to
  515.          %x example
  516.          %%
  517.          <INITIAL,example>foo   /* do something */
  518.      The default rule (to ECHO any  unmatched  character)  remains  active  in
  519.      start conditions.
  520.      BEGIN(0) returns to the original state where only the rules with no start
  521.      conditions  are active.  This state can also be referred to as the start-
  522.      condition "INITIAL", so BEGIN(INITIAL) is equivalent  to  BEGIN(0).  (The
  523.      parentheses  around  the  start  condition  name are not required but are
  524.      considered good style.)
  525.                                 26 May 1990                                 13
  526. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  527.      BEGIN actions can also be given as indented code at the beginning of  the
  528.      rules  section.   For  example,  the  following will cause the scanner to
  529.      enter the "SPECIAL" start condition whenever yylex() is  called  and  the
  530.      global variable enter_special is true:
  531.                  int enter_special;
  532.          %x SPECIAL
  533.          %%
  534.                  if ( enter_special )
  535.                      BEGIN(SPECIAL);
  536.          <SPECIAL>blahblahblah
  537.          ...more rules follow...
  538.      To illustrate the uses of start  conditions,  here  is  a  scanner  which
  539.      provides  two  different  interpretations of a string like "123.456".  By
  540.      default it will treat it as as three tokens, the  integer  "123",  a  dot
  541.      ('.'),  and  the integer "456".  But if the string is preceded earlier in
  542.      the line by the string "expect-floats" it  will  treat  it  as  a  single
  543.      token, the floating-point number 123.456:
  544.          %{
  545.          #include <math.h>
  546.          %}
  547.          %s expect
  548.          %%
  549.          expect-floats        BEGIN(expect);
  550.          <expect>[0-9]+"."[0-9]+      {
  551.                      printf( "found a float, = %fn",
  552.                              atof( yytext ) );
  553.                      }
  554.          <expect>n           {
  555.                      /* that's the end of the line, so
  556.                       * we need another "expect-number"
  557.                       * before we'll recognize any more
  558.                       * numbers
  559.                       */
  560.                      BEGIN(INITIAL);
  561.                      }
  562.          [0-9]+      {
  563.                      printf( "found an integer, = %dn",
  564.                              atoi( yytext ) );
  565.                      }
  566.          "."         printf( "found a dotn" );
  567.                                 26 May 1990                                 14
  568. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  569.      Here is a scanner  which  recognizes  (and  discards)  C  comments  while
  570.      maintaining a count of the current input line.
  571.          %x comment
  572.          %%
  573.                  int line_num = 1;
  574.          "/*"         BEGIN(comment);
  575.          <comment>[^*n]*        /* eat anything that's not a '*' */
  576.          <comment>"*"+[^*/n]*   /* eat up '*'s not followed by '/'s */
  577.          <comment>n             ++line_num;
  578.          <comment>"*"+"/"        BEGIN(INITIAL);
  579.      Note that start-conditions names are really integer  values  and  can  be
  580.      stored  as  such.   Thus,  the  above  could be extended in the following
  581.      fashion:
  582.          %x comment foo
  583.          %%
  584.                  int line_num = 1;
  585.                  int comment_caller;
  586.          "/*"         {
  587.                       comment_caller = INITIAL;
  588.                       BEGIN(comment);
  589.                       }
  590.          ...
  591.          <foo>"/*"    {
  592.                       comment_caller = foo;
  593.                       BEGIN(comment);
  594.                       }
  595.          <comment>[^*n]*        /* eat anything that's not a '*' */
  596.          <comment>"*"+[^*/n]*   /* eat up '*'s not followed by '/'s */
  597.          <comment>n             ++line_num;
  598.          <comment>"*"+"/"        BEGIN(comment_caller);
  599.      One can then implement a "stack" of start conditions using  an  array  of
  600.      integers.  (It is likely that such stacks will become a full-fledged flex
  601.      feature in the future.)  Note, though, that start conditions do not  have
  602.      their  own name-space; %s's and %x's declare names in the same fashion as
  603.      #define's.
  604.                                 26 May 1990                                 15
  605. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  606. MULTIPLE INPUT BUFFERS
  607.      Some scanners (such as  those  which  support  "include"  files)  require
  608.      reading  from  several input streams.  As flex scanners do a large amount
  609.      of buffering, one cannot control where the next input will be  read  from
  610.      by  simply writing a YY_INPUT which is sensitive to the scanning context.
  611.      YY_INPUT is only called when the scanner reaches the end of  its  buffer,
  612.      which  may be a long time after scanning a statement such as an "include"
  613.      which requires switching the input source.
  614.      To negotiate these sorts of  problems,  flex  provides  a  mechanism  for
  615.      creating  and  switching between multiple input buffers.  An input buffer
  616.      is created by using:
  617.          YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
  618.      which takes a FILE pointer and a size and  creates  a  buffer  associated
  619.      with  the  given  file  and large enough to hold size characters (when in
  620.      doubt, use YY_BUF_SIZE for  the  size).   It  returns  a  YY_BUFFER_STATE
  621.      handle, which may then be passed to other routines:
  622.          void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
  623.      switches the scanner's input buffer so subsequent tokens will  come  from
  624.      new_buffer.  Note  that  yy_switch_to_buffer() may be used by yywrap() to
  625.      sets things up for continued scanning, instead of opening a new file  and
  626.      pointing yyin at it.
  627.          void yy_delete_buffer( YY_BUFFER_STATE buffer )
  628.      is used to reclaim the storage associated with a buffer.
  629.      yy_new_buffer()  is  an  alias  for  yy_create_buffer(),   provided   for
  630.      compatibility  with  the  C++  use  of  new  and  delete for creating and
  631.      destroying dynamic objects.
  632.      Finally, the YY_CURRENT_BUFFER macro returns a YY_BUFFER_STATE handle  to
  633.      the current buffer.
  634.      Here is an example of using these features for writing  a  scanner  which
  635.      expands include files (the <<EOF>> feature is discussed below):
  636.          /* the "incl" state is used for picking up the name
  637.           * of an include file
  638.           */
  639.          %x incl
  640.          %{
  641.          #define MAX_INCLUDE_DEPTH 10
  642.          YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
  643.          int include_stack_ptr = 0;
  644.                                 26 May 1990                                 16
  645. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  646.          %}
  647.          %%
  648.          include             BEGIN(incl);
  649.          [a-z]+              ECHO;
  650.          [^a-zn]*n?        ECHO;
  651.          <incl>[ t]*      /* eat the whitespace */
  652.          <incl>[^ tn]+   { /* got the include file name */
  653.                  if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
  654.                      {
  655.                      fprintf( stderr, "Includes nested too deeply" );
  656.                      exit( 1 );
  657.                      }
  658.                  include_stack[include_stack_ptr++] =
  659.                      YY_CURRENT_BUFFER;
  660.                  yyin = fopen( yytext, "r" );
  661.                  if ( ! yyin )
  662.                      error( ... );
  663.                  yy_switch_to_buffer(
  664.                      yy_create_buffer( yyin, YY_BUF_SIZE ) );
  665.                  BEGIN(INITIAL);
  666.                  }
  667.          <<EOF>> {
  668.                  if ( --include_stack_ptr < 0 )
  669.                      {
  670.                      yyterminate();
  671.                      }
  672.                  else
  673.                      yy_switch_to_buffer(
  674.                           include_stack[include_stack_ptr] );
  675.                  }
  676. END-OF-FILE RULES
  677.      The special rule "<<EOF>>" indicates actions which are to be  taken  when
  678.      an  end-of-file  is  encountered  and  yywrap()  returns  non-zero (i.e.,
  679.      indicates no further files to process).  The action must finish by  doing
  680.      one of four things:
  681.                                 26 May 1990                                 17
  682. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  683.      -    the special YY_NEW_FILE action, if yyin has been pointed  at  a  new
  684.           file to process;
  685.      -    a return statement;
  686.      -    the special yyterminate() action;
  687.      -    or, switching to a new buffer using yy_switch_to_buffer()  as  shown
  688.           in the example above.
  689.      <<EOF>> rules may not be used with  other  patterns;  they  may  only  be
  690.      qualified  with  a  list  of start conditions.  If an unqualified <<EOF>>
  691.      rule is given, it applies to all start conditions which  do  not  already
  692.      have  <<EOF>>  actions.   To specify an <<EOF>> rule for only the initial
  693.      start condition, use
  694.          <INITIAL><<EOF>>
  695.      These rules are useful for catching things like  unclosed  comments.   An
  696.      example:
  697.          %x quote
  698.          %%
  699.          ...other rules for dealing with quotes...
  700.          <quote><<EOF>>   {
  701.                   error( "unterminated quote" );
  702.                   yyterminate();
  703.                   }
  704.          <<EOF>>  {
  705.                   if ( *++filelist )
  706.                       {
  707.                       yyin = fopen( *filelist, "r" );
  708.                       YY_NEW_FILE;
  709.                       }
  710.                   else
  711.                      yyterminate();
  712.                   }
  713. MISCELLANEOUS MACROS
  714.      The macro YY_USER_ACTION can be redefined to provide an action  which  is
  715.      always  executed  prior  to  the  matched rule's action.  For example, it
  716.      could be #define'd to call a routine to convert yytext to lower-case.
  717.      The macro YY_USER_INIT may be redefined to provide  an  action  which  is
  718.      always  executed before the first scan (and before the scanner's internal
  719.      initializations are done).  For example, it  could  be  used  to  call  a
  720.                                 26 May 1990                                 18
  721. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  722.      routine to read in a data table or open a logging file.
  723.      In the generated scanner, the actions  are  all  gathered  in  one  large
  724.      switch  statement  and  separated using YY_BREAK, which may be redefined.
  725.      By default, it is simply a "break", to separate each rule's  action  from
  726.      the following rule's.  Redefining YY_BREAK allows, for example, C++ users
  727.      to #define YY_BREAK to do nothing (while being very  careful  that  every
  728.      rule  ends  with  a  "break"  or  a  "return"!)  to  avoid suffering from
  729.      unreachable statement warnings where because a rule's  action  ends  with
  730.      "return", the YY_BREAK is inaccessible.
  731. INTERFACING WITH YACC
  732.      One of the main uses of flex is  as  a  companion  to  the  yacc  parser-
  733.      generator.   yacc  parsers expect to call a routine named yylex() to find
  734.      the next input token.  The routine is supposed to return the type of  the
  735.      next  token as well as putting any associated value in the global yylval.
  736.      To use flex with yacc, one specifies the -d option to yacc to instruct it
  737.      to  generate  the  file y.tab.h containing definitions of all the %tokens
  738.      appearing in the yacc input.  This file is  then  included  in  the  flex
  739.      scanner.   For example, if one of the tokens is "TOK_NUMBER", part of the
  740.      scanner might look like:
  741.          %{
  742.          #include "y.tab.h"
  743.          %}
  744.          %%
  745.          [0-9]+        yylval = atoi( yytext ); return TOK_NUMBER;
  746. TRANSLATION TABLE
  747.      In the name of POSIX compliance, flex supports a  translation  table  for
  748.      mapping  input  characters  into  groups.   The table is specified in the
  749.      first section, and its format looks like:
  750.          %t
  751.          1        abcd
  752.          2        ABCDEFGHIJKLMNOPQRSTUVWXYZ
  753.          52       0123456789
  754.          6        t n
  755.          %t
  756.      This example specifies that the characters 'a', 'b', 'c', and 'd' are  to
  757.      all  be  lumped  into group #1, upper-case letters in group #2, digits in
  758.      group #52, tabs, blanks,  and  newlines  into  group  #6,  and  no  other
  759.      characters  will  appear in the patterns.  The group numbers are actually
  760.      disregarded by flex; %t serves,  though,  to  lump  characters  together.
  761.      Given  the  above table, for example, the pattern "a(AA)*5" is equivalent
  762.      to "d(ZQ)*0".  They both say, "match any character in group #1,  followed
  763.                                 26 May 1990                                 19
  764. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  765.      by zero-or-more  pairs  of  characters  from  group  #2,  followed  by  a
  766.      character  from group #52."  Thus %t provides a crude way for introducing
  767.      equivalence classes into the scanner specification.
  768.      Note that the -i option (see below) coupled with the equivalence  classes
  769.      which  flex  automatically  generates  take  care  of  virtually  all the
  770.      instances when one might consider using %t. But what the hell, it's there
  771.      if you want it.
  772. OPTIONS
  773.      flex has the following options:
  774.      -b   Generate backtracking information to lex.backtrack. This is  a  list
  775.           of   scanner   states  which  require  backtracking  and  the  input
  776.           characters on which they do so.  By  adding  rules  one  can  remove
  777.           backtracking  states.  If all backtracking states are eliminated and
  778.           -f or -F is used, the generated scanner will run faster (see the  -p
  779.           flag).  Only users who wish to squeeze every last cycle out of their
  780.           scanners  need  worry  about  this  option.   (See  the  section  on
  781.           PERFORMANCE CONSIDERATIONS below.)
  782.      -c   is a do-nothing, deprecated option included for POSIX compliance.
  783.           NOTE: in previous releases of flex  -c  specified  table-compression
  784.           options.   This  functionality is now given by the -C flag.  To ease
  785.           the the impact of this change, when flex encounters -c, it currently
  786.           issues  a  warning  message and assumes that -C was desired instead.
  787.           In the future this "promotion" of -c to -C will go away in the  name
  788.           of  full  POSIX  compliance  (unless  the  POSIX  meaning is removed
  789.           first).
  790.      -d   makes the generated scanner run in debug mode.  Whenever  a  pattern
  791.           is recognized and the global yy_flex_debug is non-zero (which is the
  792.           default), the scanner will write to stderr a line of the form:
  793.               --accepting rule at line 53 ("the matched text")
  794.           The line number refers to the location  of  the  rule  in  the  file
  795.           defining  the  scanner  (i.e.,  the  file  that  was  fed  to flex).
  796.           Messages are also generated when the scanner backtracks, accepts the
  797.           default  rule,  reaches the end of its input buffer (or encounters a
  798.           NUL; at this point, the two look the same as far  as  the  scanner's
  799.           concerned), or reaches an end-of-file.
  800.      -f   specifies (take your pick) full table  or  fast  scanner.  No  table
  801.           compression  is done.  The result is large but fast.  This option is
  802.           equivalent to -Cf (see below).
  803.                                 26 May 1990                                 20
  804. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  805.      -i   instructs flex to generate a case-insensitive scanner.  The case  of
  806.           letters given in the flex input patterns will be ignored, and tokens
  807.           in the input will be matched regardless of case.  The  matched  text
  808.           given  in  yytext will have the preserved case (i.e., it will not be
  809.           folded).
  810.      -n   is another do-nothing, deprecated option  included  only  for  POSIX
  811.           compliance.
  812.      -p   generates a performance report to stderr.  The  report  consists  of
  813.           comments  regarding features of the flex input file which will cause
  814.           a loss of performance in the resulting scanner.  Note that  the  use
  815.           of  REJECT  and  variable  trailing context (see the BUGS section in
  816.           flex(1)) entails a substantial performance penalty; use of yymore(),
  817.           the ^ operator, and the -I flag entail minor performance penalties.
  818.      -s   causes the default rule (that unmatched scanner input is  echoed  to
  819.           stdout) to be suppressed.  If the scanner encounters input that does
  820.           not match any of its rules, it aborts with an error.  This option is
  821.           useful for finding holes in a scanner's rule set.
  822.      -t   instructs flex to write the scanner it generates to standard  output
  823.           instead of lex.yy.c.
  824.      -v   specifies that flex should write to stderr a summary  of  statistics
  825.           regarding  the  scanner  it  generates.   Most of the statistics are
  826.           meaningless to the casual flex user, but the first  line  identifies
  827.           the  version  of  flex,  which  is useful for figuring out where you
  828.           stand with respect to patches and new releases,  and  the  next  two
  829.           lines  give  the  date when the scanner was created and a summary of
  830.           the flags which were in effect.
  831.      -F   specifies that the fast scanner table representation should be used.
  832.           This   representation   is   about   as   fast  as  the  full  table
  833.           representation  (-f),  and  for  some  sets  of  patterns  will   be
  834.           considerably  smaller  (and for others, larger).  In general, if the
  835.           pattern set contains both "keywords" and a  catch-all,  "identifier"
  836.           rule, such as in the set:
  837.               "case"    return TOK_CASE;
  838.               "switch"  return TOK_SWITCH;
  839.               ...
  840.               "default" return TOK_DEFAULT;
  841.               [a-z]+    return TOK_ID;
  842.           then you're better off using the full table representation.  If only
  843.           the  "identifier"  rule  is present and you then use a hash table or
  844.           some such to detect the keywords, you're better off using -F.
  845.                                 26 May 1990                                 21
  846. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  847.           This option is equivalent to -CF (see below).
  848.      -I   instructs  flex  to  generate  an  interactive  scanner.   Normally,
  849.           scanners  generated  by  flex always look ahead one character before
  850.           deciding that a rule has been matched.  At the cost of some scanning
  851.           overhead,  flex  will generate a scanner which only looks ahead when
  852.           needed.  Such scanners are called interactive because if you want to
  853.           write  a  scanner for an interactive system such as a command shell,
  854.           you will probably want the user's input  to  be  terminated  with  a
  855.           newline,  and  without  -I the user will have to type a character in
  856.           addition to the newline in order to  have  the  newline  recognized.
  857.           This leads to dreadful interactive performance.
  858.           If all this seems to confusing, here's the general rule: if a  human
  859.           will be typing in input to your scanner, use -I, otherwise don't; if
  860.           you don't care about squeezing  the  utmost  performance  from  your
  861.           scanner  and  you don't want to make any assumptions about the input
  862.           to your scanner, use -I.
  863.           Note, -I cannot be used in conjunction with  full  or  fast  tables,
  864.           i.e., the -f, -F, -Cf, or -CF flags.
  865.      -L   instructs flex not  to  generate  #line  directives.   Without  this
  866.           option,  flex peppers the generated scanner with #line directives so
  867.           error messages in the actions will be correctly located with respect
  868.           to  the  original flex input file, and not to the fairly meaningless
  869.           line numbers of lex.yy.c. (Unfortunately  flex  does  not  presently
  870.           generate the necessary directives to "retarget" the line numbers for
  871.           those parts of lex.yy.c which it generated.  So if there is an error
  872.           in the generated code, a meaningless line number is reported.)
  873.      -T   makes flex run in trace mode.  It will generate a lot of messages to
  874.           stdout  concerning  the  form  of  the  input and the resultant non-
  875.           deterministic and deterministic finite  automata.   This  option  is
  876.           mostly for use in maintaining flex.
  877.      -8   instructs flex to generate an 8-bit scanner,  i.e.,  one  which  can
  878.           recognize  8-bit  characters.  On some sites, flex is installed with
  879.           this option as  the  default.   On  others,  the  default  is  7-bit
  880.           characters.  To see which is the case, check the verbose (-v) output
  881.           for "equivalence classes created".  If the denominator of the number
  882.           shown  is  128, then by default flex is generating 7-bit characters.
  883.           If it is 256, then the default is 8-bit characters and the  -8  flag
  884.           is  not  required  (but  may  be  a  good  idea  to keep the scanner
  885.           specification portable).  Feeding a 7-bit scanner  8-bit  characters
  886.           will  result in infinite loops, bus errors, or other such fireworks,
  887.           so when in doubt, use the flag.  Note that  if  equivalence  classes
  888.           are used, 8-bit scanners take only slightly more table space than 7-
  889.           bit scanners (128 bytes, to be exact); if  equivalence  classes  are
  890.           not  used, however, then the tables may grow up to twice their 7-bit
  891.                                 26 May 1990                                 22
  892. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  893.           size.
  894.      -C[efmF]
  895.           controls the degree of table compression.
  896.           -Ce directs flex to construct equivalence  classes,  i.e.,  sets  of
  897.           characters  which have identical lexical properties (for example, if
  898.           the only appearance of digits in the flex input is in the  character
  899.           class  "[0-9]" then the digits '0', '1', ..., '9' will all be put in
  900.           the same  equivalence  class).   Equivalence  classes  usually  give
  901.           dramatic  reductions in the final table/object file sizes (typically
  902.           a factor of 2-5) and are pretty cheap  performance-wise  (one  array
  903.           look-up per character scanned).
  904.           -Cf specifies that the full scanner tables  should  be  generated  -
  905.           flex  should not compress the tables by taking advantages of similar
  906.           transition functions for different states.
  907.           -CF  specifies  that  the  alternate  fast  scanner   representation
  908.           (described above under the -F flag) should be used.
  909.           -Cm directs flex to construct meta-equivalence  classes,  which  are
  910.           sets  of  equivalence classes (or characters, if equivalence classes
  911.           are  not  being  used)  that  are  commonly  used  together.   Meta-
  912.           equivalence  classes  are  often  a  big  win  when using compressed
  913.           tables, but they have a moderate performance impact (one or two "if"
  914.           tests and one array look-up per character scanned).
  915.           A lone -C specifies that the scanner tables should be compressed but
  916.           neither  equivalence  classes nor meta-equivalence classes should be
  917.           used.
  918.           The options -Cf or -CF and -Cm do not make sense together - there is
  919.           no  opportunity  for  meta-equivalence  classes  if the table is not
  920.           being compressed.  Otherwise the options may be freely mixed.
  921.           The default setting  is  -Cem,  which  specifies  that  flex  should
  922.           generate  equivalence  classes  and  meta-equivalence classes.  This
  923.           setting provides the highest degree of table compression.   You  can
  924.           trade  off  faster-executing  scanners  at the cost of larger tables
  925.           with the following generally being true:
  926.               slowest & smallest
  927.                     -Cem
  928.                     -Cm
  929.                     -Ce
  930.                     -C
  931.                     -C{f,F}e
  932.                     -C{f,F}
  933.               fastest & largest
  934.                                 26 May 1990                                 23
  935. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  936.           Note that scanners with the smallest tables  are  usually  generated
  937.           and  compiled  the  quickest, so during development you will usually
  938.           want to use the default, maximal compression.
  939.           -Cfe  is  often  a  good  compromise  between  speed  and  size  for
  940.           production scanners.
  941.           -C options are not cumulative; whenever the flag is encountered, the
  942.           previous -C settings are forgotten.
  943.      -Sskeleton_file
  944.           overrides the default skeleton file from which flex  constructs  its
  945.           scanners.   You'll  never need this option unless you are doing flex
  946.           maintenance or development.
  947. PERFORMANCE CONSIDERATIONS
  948.      The main design  goal  of  flex  is  that  it  generate  high-performance
  949.      scanners.   It  has  been  optimized  for dealing well with large sets of
  950.      rules.  Aside from the effects of  table  compression  on  scanner  speed
  951.      outlined  above,  there  are  a  number  of options/actions which degrade
  952.      performance.  These are, from most expensive to least:
  953.          REJECT
  954.          pattern sets that require backtracking
  955.          arbitrary trailing context
  956.          '^' beginning-of-line operator
  957.          yymore()
  958.      with the first three all being quite expensive and  the  last  two  being
  959.      quite cheap.
  960.      REJECT should be avoided at all costs when performance is important.   It
  961.      is a particularly expensive option.
  962.      Getting rid of backtracking is messy and often may be an enormous  amount
  963.      of work for a complicated scanner.  In principal, one begins by using the
  964.      -b flag to generate a lex.backtrack file.  For example, on the input
  965.          %%
  966.          foo        return TOK_KEYWORD;
  967.          foobar     return TOK_KEYWORD;
  968.      the file looks like:
  969.          State #6 is non-accepting -
  970.           associated rule line numbers:
  971.                 2       3
  972.           out-transitions: [ o ]
  973.                                 26 May 1990                                 24
  974. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  975.           jam-transitions: EOF [ 01-n  p-177 ]
  976.          State #8 is non-accepting -
  977.           associated rule line numbers:
  978.                 3
  979.           out-transitions: [ a ]
  980.           jam-transitions: EOF [ 01-`  b-177 ]
  981.          State #9 is non-accepting -
  982.           associated rule line numbers:
  983.                 3
  984.           out-transitions: [ r ]
  985.           jam-transitions: EOF [ 01-q  s-177 ]
  986.          Compressed tables always backtrack.
  987.      The first few lines tell us that there's a scanner state in which it  can
  988.      make  a  transition on an 'o' but not on any other character, and that in
  989.      that state the currently scanned text does not match any rule.  The state
  990.      occurs when trying to match the rules found at lines 2 and 3 in the input
  991.      file.  If the scanner is in that state and  then  reads  something  other
  992.      than  an  'o', it will have to backtrack to find a rule which is matched.
  993.      With a bit of headscratching one can see that this must be the state it's
  994.      in when it has seen "fo".  When this has happened, if anything other than
  995.      another 'o' is seen, the scanner will have to back up to simply match the
  996.      'f' (by the default rule).
  997.      The comment regarding State #8 indicates there's a  problem  when  "foob"
  998.      has been scanned.  Indeed, on any character other than a 'b', the scanner
  999.      will have to back up to accept "foo".  Similarly, the comment  for  State
  1000.      #9 concerns when "fooba" has been scanned.
  1001.      The final comment reminds us that there's  no  point  going  to  all  the
  1002.      trouble  of removing backtracking from the rules unless we're using -f or
  1003.      -F, since there's no performance gain doing so with compressed scanners.
  1004.      The way to remove the backtracking is to add "error" rules:
  1005.          %%
  1006.          foo         return TOK_KEYWORD;
  1007.          foobar      return TOK_KEYWORD;
  1008.          fooba       |
  1009.          foob        |
  1010.          fo          {
  1011.                      /* false alarm, not really a keyword */
  1012.                      return TOK_ID;
  1013.                      }
  1014.                                 26 May 1990                                 25
  1015. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  1016.      Eliminating backtracking among a list of keywords can also be done  using
  1017.      a "catch-all" rule:
  1018.          %%
  1019.          foo         return TOK_KEYWORD;
  1020.          foobar      return TOK_KEYWORD;
  1021.          [a-z]+      return TOK_ID;
  1022.      This is usually the best solution when appropriate.
  1023.      Backtracking messages tend to cascade.  With a complicated set  of  rules
  1024.      it's not uncommon to get hundreds of messages.  If one can decipher them,
  1025.      though, it often only  takes  a  dozen  or  so  rules  to  eliminate  the
  1026.      backtracking  (though  it's easy to make a mistake and have an error rule
  1027.      accidentally match a valid token.  A possible future flex feature will be
  1028.      to automatically add rules to eliminate backtracking).
  1029.      Variable trailing context (where both the leading and trailing  parts  do
  1030.      not  have  a  fixed  length)  entails almost the same performance loss as
  1031.      REJECT (i.e., substantial).  So when possible a rule like:
  1032.          %%
  1033.          mouse|rat/(cat|dog)   run();
  1034.      is better written:
  1035.          %%
  1036.          mouse/cat|dog         run();
  1037.          rat/cat|dog           run();
  1038.      or as
  1039.          %%
  1040.          mouse|rat/cat         run();
  1041.          mouse|rat/dog         run();
  1042.      Note that here the special '|' action does not provide any  savings,  and
  1043.      can even make things worse (see BUGS in flex(1)).
  1044.      Another area where the user can increase a scanner's performance (and one
  1045.      that's  easier  to  implement)  arises  from the fact that the longer the
  1046.      tokens matched, the faster the scanner will run.  This  is  because  with
  1047.      long  tokens  the  processing of most input characters takes place in the
  1048.      (short) inner scanning loop, and does not often have to  go  through  the
  1049.      additional work of setting up the scanning environment (e.g., yytext) for
  1050.      the action.  Recall the scanner for C comments:
  1051.          %x comment
  1052.          %%
  1053.                                 26 May 1990                                 26
  1054. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  1055.                  int line_num = 1;
  1056.          "/*"         BEGIN(comment);
  1057.          <comment>[^*n]*
  1058.          <comment>"*"+[^*/n]*
  1059.          <comment>n             ++line_num;
  1060.          <comment>"*"+"/"        BEGIN(INITIAL);
  1061.      This could be sped up by writing it as:
  1062.          %x comment
  1063.          %%
  1064.                  int line_num = 1;
  1065.          "/*"         BEGIN(comment);
  1066.          <comment>[^*n]*
  1067.          <comment>[^*n]*n      ++line_num;
  1068.          <comment>"*"+[^*/n]*
  1069.          <comment>"*"+[^*/n]*n ++line_num;
  1070.          <comment>"*"+"/"        BEGIN(INITIAL);
  1071.      Now instead of each newline requiring the processing of  another  action,
  1072.      recognizing  the  newlines  is "distributed" over the other rules to keep
  1073.      the matched text as long as possible.  Note that adding  rules  does  not
  1074.      slow  down  the  scanner!  The speed of the scanner is independent of the
  1075.      number of rules or (modulo the considerations given at the  beginning  of
  1076.      this section) how complicated the rules are with regard to operators such
  1077.      as '*' and '|'.
  1078.      A final example in speeding up  a  scanner:  suppose  you  want  to  scan
  1079.      through a file containing identifiers and keywords, one per line and with
  1080.      no other extraneous  characters,  and  recognize  all  the  keywords.   A
  1081.      natural first approach is:
  1082.          %%
  1083.          asm      |
  1084.          auto     |
  1085.          break    |
  1086.          ... etc ...
  1087.          volatile |
  1088.          while    /* it's a keyword */
  1089.          .|n     /* it's not a keyword */
  1090.      To eliminate the back-tracking, introduce a catch-all rule:
  1091.          %%
  1092.          asm      |
  1093.                                 26 May 1990                                 27
  1094. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  1095.          auto     |
  1096.          break    |
  1097.          ... etc ...
  1098.          volatile |
  1099.          while    /* it's a keyword */
  1100.          [a-z]+   |
  1101.          .|n     /* it's not a keyword */
  1102.      Now, if it's guaranteed that there's exactly one word per line,  then  we
  1103.      can  reduce  the  total  number  of  matches  by a half by merging in the
  1104.      recognition of newlines with that of the other tokens:
  1105.          %%
  1106.          asmn    |
  1107.          auton   |
  1108.          breakn  |
  1109.          ... etc ...
  1110.          volatilen |
  1111.          whilen  /* it's a keyword */
  1112.          [a-z]+n |
  1113.          .|n     /* it's not a keyword */
  1114.      One has to be careful here, as we have now reintroduced backtracking into
  1115.      the  scanner.   In particular, while we know that there will never be any
  1116.      characters in the input stream other than letters or newlines, flex can't
  1117.      figure  this out, and it will plan for possibly needing backtracking when
  1118.      it has scanned a token  like  "auto"  and  then  the  next  character  is
  1119.      something  other  than  a  newline or a letter.  Previously it would then
  1120.      just match the "auto" rule and be done, but now it has  no  "auto"  rule,
  1121.      only  a  "auton" rule.  To eliminate the possibility of backtracking, we
  1122.      could either duplicate all rules but without final newlines, or, since we
  1123.      never  expect  to  encounter  such  an input and therefore don't how it's
  1124.      classified, we can introduce one more  catch-all  rule,  this  one  which
  1125.      doesn't include a newline:
  1126.          %%
  1127.          asmn    |
  1128.          auton   |
  1129.          breakn  |
  1130.          ... etc ...
  1131.          volatilen |
  1132.          whilen  /* it's a keyword */
  1133.          [a-z]+n |
  1134.          [a-z]+   |
  1135.          .|n     /* it's not a keyword */
  1136.      Compiled with -Cf, this is about as fast as one can get a flex scanner to
  1137.                                 26 May 1990                                 28
  1138. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  1139.      go for this particular problem.
  1140.      A final note:  flex is slow when  matching  NUL's,  particularly  when  a
  1141.      token  contains  multiple  NUL's.   It's  best to write rules which match
  1142.      short amounts of text if  it's  anticipated  that  the  text  will  often
  1143.      include NUL's.
  1144. INCOMPATIBILITIES WITH LEX AND POSIX
  1145.      flex is a rewrite of the Unix lex tool (the two  implementations  do  not
  1146.      share any code, though), with some extensions and incompatibilities, both
  1147.      of which are of concern to those who wish to write scanners acceptable to
  1148.      either  implementation.  At present, the POSIX lex draft is very close to
  1149.      the original lex implementation, so some of these  incompatibilities  are
  1150.      also  in conflict with the POSIX draft.  But the intent is that except as
  1151.      noted below, flex  as  it  presently  stands  will  ultimately  be  POSIX
  1152.      conformant  (i.e., that those areas of conflict with the POSIX draft will
  1153.      be resolved in flex's favor).  Please bear in mind that all the  comments
  1154.      which  follow are with regard to the POSIX draft standard of Summer 1989,
  1155.      and not the final document (or subsequent drafts); they are  included  so
  1156.      flex  users  can  be  aware of the standardization issues and those areas
  1157.      where flex may in the near future undergo changes incompatible  with  its
  1158.      current definition.
  1159.      flex is fully compatible with lex with the following exceptions:
  1160.      -    The undocumented lex  scanner  internal  variable  yylineno  is  not
  1161.           supported.   It  is  difficult  to  support this option efficiently,
  1162.           since it requires examining every character scanned and  reexamining
  1163.           the   characters  when  the  scanner  backs  up.   Things  get  more
  1164.           complicated when the end of buffer or file is reached or  a  NUL  is
  1165.           scanned  (since the scan must then be restarted with the proper line
  1166.           number count), or the user uses the  yyless(),  unput(),  or  REJECT
  1167.           actions, or the multiple input buffer functions.
  1168.           The fix is to add rules which,  upon  seeing  a  newline,  increment
  1169.           yylineno.   This is usually an easy process, though it can be a drag
  1170.           if some of the patterns can match multiple newlines along with other
  1171.           characters.
  1172.           yylineno is not part of the POSIX draft.
  1173.      -    The input() routine is not redefinable, though it may be  called  to
  1174.           read  characters  following whatever has been matched by a rule.  If
  1175.           input() encounters an end-of-file the normal yywrap() processing  is
  1176.           done.  A ``real'' end-of-file is returned by input() as EOF.
  1177.           Input is instead controlled by redefining the YY_INPUT macro.
  1178.                                 26 May 1990                                 29
  1179. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  1180.           The  flex  restriction  that  input()  cannot  be  redefined  is  in
  1181.           accordance  with  the  POSIX  draft,  but  YY_INPUT has not yet been
  1182.           accepted into the draft (and probably won't; it looks like the draft
  1183.           will  simply  not specify any way of controlling the scanner's input
  1184.           other than by making an initial assignment to yyin).
  1185.      -    flex scanners do not use stdio for input.   Because  of  this,  when
  1186.           writing  an interactive scanner one must explicitly call fflush() on
  1187.           the stream associated with the terminal after writing out a  prompt.
  1188.           With  lex  such  writes are automatically flushed since lex scanners
  1189.           use getchar() for  their  input.   Also,  when  writing  interactive
  1190.           scanners with flex, the -I flag must be used.
  1191.      -    flex scanners are not as reentrant as lex scanners.  In  particular,
  1192.           if  you  have  an interactive scanner and an interrupt handler which
  1193.           long-jumps out of the  scanner,  and  the  scanner  is  subsequently
  1194.           called again, you may get the following message:
  1195.               fatal flex scanner internal error--end of buffer missed
  1196.           To reenter the scanner, first use
  1197.               yyrestart( yyin );
  1198.      -    output() is not supported.  Output from the ECHO macro  is  done  to
  1199.           the file-pointer yyout (default stdout).
  1200.           The POSIX  draft  mentions  that  an  output()  routine  exists  but
  1201.           currently gives no details as to what it does.
  1202.      -    lex does not support exclusive start conditions  (%x),  though  they
  1203.           are in the current POSIX draft.
  1204.      -    When definitions are expanded, flex encloses  them  in  parentheses.
  1205.           With lex, the following:
  1206.               NAME    [A-Z][A-Z0-9]*
  1207.               %%
  1208.               foo{NAME}?      printf( "Found itn" );
  1209.               %%
  1210.           will not match the string "foo" because when the macro  is  expanded
  1211.           the  rule  is equivalent to "foo[A-Z][A-Z0-9]*?"  and the precedence
  1212.           is such that the '?' is associated with "[A-Z0-9]*".  With flex, the
  1213.           rule  will  be  expanded to "foo([A-Z][A-Z0-9]*)?" and so the string
  1214.           "foo" will match.  Note that because of this, the ^, $, <s>, /,  and
  1215.           <<EOF>> operators cannot be used in a flex definition.
  1216.                                 26 May 1990                                 30
  1217. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  1218.           The POSIX draft interpretation is the same as flex's.
  1219.      -    To specify a character class  which  matches  anything  but  a  left
  1220.           bracket  (']'), in lex one can use "[^]]" but with flex one must use
  1221.           "[^]]".  The latter works with lex, too.
  1222.      -    The lex %r (generate a Ratfor scanner) option is not supported.   It
  1223.           is not part of the POSIX draft.
  1224.      -    If you are providing your own yywrap() routine, you must  include  a
  1225.           "#undef  yywrap"  in the definitions section (section 1).  Note that
  1226.           the "#undef" will have to be enclosed in %{}'s.
  1227.           The POSIX draft specifies that yywrap() is a function  and  this  is
  1228.           very  unlikely  to change; so flex users are warned that yywrap() is
  1229.           likely to be changed to a function in the near future.
  1230.      -    After a call to unput(), yytext and yyleng are undefined  until  the
  1231.           next token is matched.  This is not the case with lex or the present
  1232.           POSIX draft.
  1233.      -    The precedence of the {} (numeric range) operator is different.  lex
  1234.           interprets  "abc{1,3}"  as  "match one, two, or three occurrences of
  1235.           'abc'", whereas flex interprets it as "match 'ab' followed  by  one,
  1236.           two,  or three occurrences of 'c'".  The latter is in agreement with
  1237.           the current POSIX draft.
  1238.      -    The precedence of the  ^  operator  is  different.   lex  interprets
  1239.           "^foo|bar"  as  "match  either  'foo' at the beginning of a line, or
  1240.           'bar' anywhere", whereas flex interprets it as "match  either  'foo'
  1241.           or 'bar' if they come at the beginning of a line".  The latter is in
  1242.           agreement with the current POSIX draft.
  1243.      -    To refer to yytext outside of the scanner source file,  the  correct
  1244.           definition  with  flex  is "extern char *yytext" rather than "extern
  1245.           char yytext[]".  This is contrary to the current POSIX draft  but  a
  1246.           point   on   which   flex   will  not  be  changing,  as  the  array
  1247.           representation entails a serious performance penalty.  It  is  hoped
  1248.           that  the POSIX draft will be emended to support the flex variety of
  1249.           declaration (as this is a fairly painless change to require  of  lex
  1250.           users).
  1251.      -    yyin is initialized by lex to be stdin; flex,  on  the  other  hand,
  1252.           initializes yyin to NULL and then assigns it to stdin the first time
  1253.           the scanner is called, providing yyin has not already been  assigned
  1254.           to  a  non-NULL value.  The difference is subtle, but the net effect
  1255.           is that with flex scanners, yyin does not have a valid  value  until
  1256.           the scanner has been called.
  1257.                                 26 May 1990                                 31
  1258. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  1259.      -    The special table-size declarations such as %a supported by lex  are
  1260.           not required by flex scanners; flex ignores them.
  1261.      -    The name FLEX_SCANNER is #define'd so scanners may  be  written  for
  1262.           use with either flex or lex.
  1263.      The following flex features are not included in lex or  the  POSIX  draft
  1264.      standard:
  1265.          yyterminate()
  1266.          <<EOF>>
  1267.          YY_DECL
  1268.          #line directives
  1269.          %{}'s around actions
  1270.          yyrestart()
  1271.          comments beginning with '#' (deprecated)
  1272.          multiple actions on a line
  1273.      This last feature refers to the fact that with flex you can put  multiple
  1274.      actions on the same line, separated with semi-colons, while with lex, the
  1275.      following
  1276.          foo    handle_foo(); ++num_foos_seen;
  1277.      is (rather surprisingly) truncated to
  1278.          foo    handle_foo();
  1279.      flex does not truncate the action.  Actions  that  are  not  enclosed  in
  1280.      braces are simply terminated at the end of the line.
  1281. DIAGNOSTICS
  1282.      reject_used_but_not_detected  undefined  or  yymore_used_but_not_detected
  1283.      undefined  -  These errors can occur at compile time.  They indicate that
  1284.      the scanner uses REJECT or yymore() but that flex failed  to  notice  the
  1285.      fact,  meaning  that  flex  scanned  the  first  two sections looking for
  1286.      occurrences of these actions and failed to  find  any,  but  somehow  you
  1287.      snuck  some  in  (via  a  #include  file, for example).  Make an explicit
  1288.      reference to the action in your flex input file.  (Note  that  previously
  1289.      flex  supported  a %used/%unused mechanism for dealing with this problem;
  1290.      this feature is still supported but now deprecated, and will go away soon
  1291.      unless  the author hears from people who can argue compellingly that they
  1292.      need it.)
  1293.      flex scanner jammed - a scanner compiled with -s has encountered an input
  1294.      string which wasn't matched by any of its rules.
  1295.      flex input buffer overflowed - a  scanner  rule  matched  a  string  long
  1296.      enough  to  overflow  the  scanner's  internal input buffer (16K bytes by
  1297.      default -  controlled  by  YY_BUF_SIZE  in  "flex.skel".   Note  that  to
  1298.                                 26 May 1990                                 32
  1299. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  1300.      redefine this macro, you must first #undefine it).
  1301.      scanner  requires  -8  flag  -  Your   scanner   specification   includes
  1302.      recognizing  8-bit  characters  and  you did not specify the -8 flag (and
  1303.      your site has not installed flex with -8 as the default).
  1304.      fatal flex scanner internal error--end of buffer missed - This can  occur
  1305.      in  an  scanner  which  is reentered after a long-jump has jumped out (or
  1306.      over) the scanner's activation frame.   Before  reentering  the  scanner,
  1307.      use:
  1308.          yyrestart( yyin );
  1309.      too many %t classes! - You managed to put every single character into its
  1310.      own  %t  class.   flex  requires  that  at least one of the classes share
  1311.      characters.
  1312. DEFICIENCIES / BUGS
  1313.      See flex(1).
  1314. SEE ALSO
  1315.      flex(1), lex(1), yacc(1), sed(1), awk(1).
  1316.      M. E. Lesk and E. Schmidt, LEX - Lexical Analyzer Generator
  1317. AUTHOR
  1318.      Vern Paxson, with the help of many ideas and much  inspiration  from  Van
  1319.      Jacobson.    Original   version   by   Jef  Poskanzer.   The  fast  table
  1320.      representation is a partial  implementation  of  a  design  done  by  Van
  1321.      Jacobson.  The implementation was done by Kevin Gong and Vern Paxson.
  1322.      Thanks to the many  flex  beta-testers,  feedbackers,  and  contributors,
  1323.      especially  Casey  Leedom,  benson@odi.com, Keith Bostic, Frederic Brehm,
  1324.      Nick Christopher, Jason Coughlin, Scott David Daniels, Leo  Eskin,  Chris
  1325.      Faylor,  Eric  Goldman,  Eric  Hughes,  Jeffrey R. Jones, Kevin B. Kenny,
  1326.      Ronald Lamprecht, Greg Lee, Craig Leres, Mohamed el Lozy,  Jim  Meyering,
  1327.      Marc Nozell, Esmond Pitt, Jef Poskanzer, Jim Roskind, Dave Tallman, Frank
  1328.      Whaley, Ken Yap, and those whose names have  slipped  my  marginal  mail-
  1329.      archiving skills but whose contributions are appreciated all the same.
  1330.      Thanks to Keith Bostic, John Gilmore,  Craig  Leres,  Bob  Mulcahy,  Rich
  1331.      Salz, and Richard Stallman for help with various distribution headaches.
  1332.      Thanks to Esmond Pitt and Earle Horton for 8-bit  character  support;  to
  1333.      Benson  Margulies  and Fred Burke for C++ support; to Ove Ewerlid for the
  1334.      basics of support for NUL's; and to Eric Hughes for the basics of support
  1335.      for multiple buffers.
  1336.                                 26 May 1990                                 33
  1337. FLEX(1)                   Minix Programmer's Manual                    FLEX(1)
  1338.      Work is being done on extending flex to generate scanners  in  which  the
  1339.      state  machine  is  directly  represented  in  C code rather than tables.
  1340.      These scanners may well be  substantially  faster  than  those  generated
  1341.      using  -f  or  -F.  If you are working in this area and are interested in
  1342.      comparing notes and seeing whether redundant work can be avoided, contact
  1343.      Ove Ewerlid (ewerlid@mizar.DoCS.UU.SE).
  1344.      This work was primarily done when I was at the Real Time Systems Group at
  1345.      the  Lawrence  Berkeley  Laboratory  in Berkeley, CA.  Many thanks to all
  1346.      there for the support I received.
  1347.      Send comments to:
  1348.           Vern Paxson
  1349.           Computer Science Department
  1350.           4126 Upson Hall
  1351.           Cornell University
  1352.           Ithaca, NY 14853-7501
  1353.           vern@cs.cornell.edu
  1354.           decvax!cornell!vern
  1355.                                 26 May 1990                                 34