Annotation of 43BSDReno/pgrm/lex/flexdoc.1, revision 1.1.1.1

1.1       root        1: .TH FLEX 1 "26 May 1990" "Version 2.3"
                      2: .SH NAME
                      3: flex - fast lexical analyzer generator
                      4: .SH SYNOPSIS
                      5: .B flex
                      6: .B [-bcdfinpstvFILT8 -C[efmF] -Sskeleton]
                      7: .I [filename ...]
                      8: .SH DESCRIPTION
                      9: .I flex
                     10: is a tool for generating
                     11: .I scanners:
                     12: programs which recognized lexical patterns in text.
                     13: .I flex
                     14: reads
                     15: the given input files, or its standard input if no file names are given,
                     16: for a description of a scanner to generate.  The description is in
                     17: the form of pairs
                     18: of regular expressions and C code, called
                     19: .I rules.  flex
                     20: generates as output a C source file,
                     21: .B lex.yy.c,
                     22: which defines a routine
                     23: .B yylex().
                     24: This file is compiled and linked with the
                     25: .B -lfl
                     26: library to produce an executable.  When the executable is run,
                     27: it analyzes its input for occurrences
                     28: of the regular expressions.  Whenever it finds one, it executes
                     29: the corresponding C code.
                     30: .SH SOME SIMPLE EXAMPLES
                     31: .LP
                     32: First some simple examples to get the flavor of how one uses
                     33: .I flex.
                     34: The following
                     35: .I flex
                     36: input specifies a scanner which whenever it encounters the string
                     37: "username" will replace it with the user's login name:
                     38: .nf
                     39: 
                     40:     %%
                     41:     username    printf( "%s", getlogin() );
                     42: 
                     43: .fi
                     44: By default, any text not matched by a
                     45: .I flex
                     46: scanner
                     47: is copied to the output, so the net effect of this scanner is
                     48: to copy its input file to its output with each occurrence
                     49: of "username" expanded.
                     50: In this input, there is just one rule.  "username" is the
                     51: .I pattern
                     52: and the "printf" is the
                     53: .I action.
                     54: The "%%" marks the beginning of the rules.
                     55: .LP
                     56: Here's another simple example:
                     57: .nf
                     58: 
                     59:         int num_lines = 0, num_chars = 0;
                     60: 
                     61:     %%
                     62:     \\n    ++num_lines; ++num_chars;
                     63:     .     ++num_chars;
                     64: 
                     65:     %%
                     66:     main()
                     67:         {
                     68:         yylex();
                     69:         printf( "# of lines = %d, # of chars = %d\\n",
                     70:                 num_lines, num_chars );
                     71:         }
                     72: 
                     73: .fi
                     74: This scanner counts the number of characters and the number
                     75: of lines in its input (it produces no output other than the
                     76: final report on the counts).  The first line
                     77: declares two globals, "num_lines" and "num_chars", which are accessible
                     78: both inside
                     79: .B yylex()
                     80: and in the
                     81: .B main()
                     82: routine declared after the second "%%".  There are two rules, one
                     83: which matches a newline ("\\n") and increments both the line count and
                     84: the character count, and one which matches any character other than
                     85: a newline (indicated by the "." regular expression).
                     86: .LP
                     87: A somewhat more complicated example:
                     88: .nf
                     89: 
                     90:     /* scanner for a toy Pascal-like language */
                     91: 
                     92:     %{
                     93:     /* need this for the call to atof() below */
                     94:     #include <math.h>
                     95:     %}
                     96: 
                     97:     DIGIT    [0-9]
                     98:     ID       [a-z][a-z0-9]*
                     99: 
                    100:     %%
                    101: 
                    102:     {DIGIT}+    {
                    103:                 printf( "An integer: %s (%d)\\n", yytext,
                    104:                         atoi( yytext ) );
                    105:                 }
                    106: 
                    107:     {DIGIT}+"."{DIGIT}*        {
                    108:                 printf( "A float: %s (%d)\\n", yytext,
                    109:                         atof( yytext ) );
                    110:                 }
                    111: 
                    112:     if|then|begin|end|procedure|function        {
                    113:                 printf( "A keyword: %s\\n", yytext );
                    114:                 }
                    115: 
                    116:     {ID}        printf( "An identifier: %s\\n", yytext );
                    117: 
                    118:     "+"|"-"|"*"|"/"   printf( "An operator: %s\\n", yytext );
                    119: 
                    120:     "{"[^}\\n]*"}"     /* eat up one-line comments */
                    121: 
                    122:     [ \\t\\n]+          /* eat up whitespace */
                    123: 
                    124:     .           printf( "Unrecognized character: %s\\n", yytext );
                    125: 
                    126:     %%
                    127: 
                    128:     main( argc, argv )
                    129:     int argc;
                    130:     char **argv;
                    131:         {
                    132:         ++argv, --argc;  /* skip over program name */
                    133:         if ( argc > 0 )
                    134:                 yyin = fopen( argv[0], "r" );
                    135:         else
                    136:                 yyin = stdin;
                    137:         
                    138:         yylex();
                    139:         }
                    140: 
                    141: .fi
                    142: This is the beginnings of a simple scanner for a language like
                    143: Pascal.  It identifies different types of
                    144: .I tokens
                    145: and reports on what it has seen.
                    146: .LP
                    147: The details of this example will be explained in the following
                    148: sections.
                    149: .SH FORMAT OF THE INPUT FILE
                    150: The
                    151: .I flex
                    152: input file consists of three sections, separated by a line with just
                    153: .B %%
                    154: in it:
                    155: .nf
                    156: 
                    157:     definitions
                    158:     %%
                    159:     rules
                    160:     %%
                    161:     user code
                    162: 
                    163: .fi
                    164: The
                    165: .I definitions
                    166: section contains declarations of simple
                    167: .I name
                    168: definitions to simplify the scanner specification, and declarations of
                    169: .I start conditions,
                    170: which are explained in a later section.
                    171: .LP
                    172: Name definitions have the form:
                    173: .nf
                    174: 
                    175:     name definition
                    176: 
                    177: .fi
                    178: The "name" is a word beginning with a letter or an underscore ('_')
                    179: followed by zero or more letters, digits, '_', or '-' (dash).
                    180: The definition is taken to begin at the first non-white-space character
                    181: following the name and continuing to the end of the line.
                    182: The definition can subsequently be referred to using "{name}", which
                    183: will expand to "(definition)".  For example,
                    184: .nf
                    185: 
                    186:     DIGIT    [0-9]
                    187:     ID       [a-z][a-z0-9]*
                    188: 
                    189: .fi
                    190: defines "DIGIT" to be a regular expression which matches a
                    191: single digit, and
                    192: "ID" to be a regular expression which matches a letter
                    193: followed by zero-or-more letters-or-digits.
                    194: A subsequent reference to
                    195: .nf
                    196: 
                    197:     {DIGIT}+"."{DIGIT}*
                    198: 
                    199: .fi
                    200: is identical to
                    201: .nf
                    202: 
                    203:     ([0-9])+"."([0-9])*
                    204: 
                    205: .fi
                    206: and matches one-or-more digits followed by a '.' followed
                    207: by zero-or-more digits.
                    208: .LP
                    209: The
                    210: .I rules
                    211: section of the
                    212: .I flex
                    213: input contains a series of rules of the form:
                    214: .nf
                    215: 
                    216:     pattern   action
                    217: 
                    218: .fi
                    219: where the pattern must be unindented and the action must begin
                    220: on the same line.
                    221: .LP
                    222: See below for a further description of patterns and actions.
                    223: .LP
                    224: Finally, the user code section is simply copied to
                    225: .B lex.yy.c
                    226: verbatim.
                    227: It is used for companion routines which call or are called
                    228: by the scanner.  The presence of this section is optional;
                    229: if it is missing, the second
                    230: .B %%
                    231: in the input file may be skipped, too.
                    232: .LP
                    233: In the definitions and rules sections, any
                    234: .I indented
                    235: text or text enclosed in
                    236: .B %{
                    237: and
                    238: .B %}
                    239: is copied verbatim to the output (with the %{}'s removed).
                    240: The %{}'s must appear unindented on lines by themselves.
                    241: .LP
                    242: In the rules section,
                    243: any indented or %{} text appearing before the
                    244: first rule may be used to declare variables
                    245: which are local to the scanning routine and (after the declarations)
                    246: code which is to be executed whenever the scanning routine is entered.
                    247: Other indented or %{} text in the rule section is still copied to the output,
                    248: but its meaning is not well-defined and it may well cause compile-time
                    249: errors (this feature is present for
                    250: .I POSIX
                    251: compliance; see below for other such features).
                    252: .LP
                    253: In the definitions section, an unindented comment (i.e., a line
                    254: beginning with "/*") is also copied verbatim to the output up
                    255: to the next "*/".  Also, any line in the definitions section
                    256: beginning with '#' is ignored, though this style of comment is
                    257: deprecated and may go away in the future.
                    258: .SH PATTERNS
                    259: The patterns in the input are written using an extended set of regular
                    260: expressions.  These are:
                    261: .nf
                    262: 
                    263:     x          match the character 'x'
                    264:     .          any character except newline
                    265:     [xyz]      a "character class"; in this case, the pattern
                    266:                  matches either an 'x', a 'y', or a 'z'
                    267:     [abj-oZ]   a "character class" with a range in it; matches
                    268:                  an 'a', a 'b', any letter from 'j' through 'o',
                    269:                  or a 'Z'
                    270:     [^A-Z]     a "negated character class", i.e., any character
                    271:                  but those in the class.  In this case, any
                    272:                  character EXCEPT an uppercase letter.
                    273:     [^A-Z\\n]   any character EXCEPT an uppercase letter or
                    274:                  a newline
                    275:     r*         zero or more r's, where r is any regular expression
                    276:     r+         one or more r's
                    277:     r?         zero or one r's (that is, "an optional r")
                    278:     r{2,5}     anywhere from two to five r's
                    279:     r{2,}      two or more r's
                    280:     r{4}       exactly 4 r's
                    281:     {name}     the expansion of the "name" definition
                    282:                (see above)
                    283:     "[xyz]\\"foo"
                    284:                the literal string: [xyz]"foo
                    285:     \\X         if X is an 'a', 'b', 'f', 'n', 'r', 't', or 'v',
                    286:                  then the ANSI-C interpretation of \\x.
                    287:                  Otherwise, a literal 'X' (used to escape
                    288:                  operators such as '*')
                    289:     \\123       the character with octal value 123
                    290:     \\x2a       the character with hexadecimal value 2a
                    291:     (r)        match an r; parentheses are used to override
                    292:                  precedence (see below)
                    293: 
                    294: 
                    295:     rs         the regular expression r followed by the
                    296:                  regular expression s; called "concatenation"
                    297: 
                    298: 
                    299:     r|s        either an r or an s
                    300: 
                    301: 
                    302:     r/s        an r but only if it is followed by an s.  The
                    303:                  s is not part of the matched text.  This type
                    304:                  of pattern is called as "trailing context".
                    305:     ^r         an r, but only at the beginning of a line
                    306:     r$         an r, but only at the end of a line.  Equivalent
                    307:                  to "r/\\n".
                    308: 
                    309: 
                    310:     <s>r       an r, but only in start condition s (see
                    311:                below for discussion of start conditions)
                    312:     <s1,s2,s3>r
                    313:                same, but in any of start conditions s1,
                    314:                s2, or s3
                    315: 
                    316: 
                    317:     <<EOF>>    an end-of-file
                    318:     <s1,s2><<EOF>>
                    319:                an end-of-file when in start condition s1 or s2
                    320: 
                    321: .fi
                    322: The regular expressions listed above are grouped according to
                    323: precedence, from highest precedence at the top to lowest at the bottom.
                    324: Those grouped together have equal precedence.  For example,
                    325: .nf
                    326: 
                    327:     foo|bar*
                    328: 
                    329: .fi
                    330: is the same as
                    331: .nf
                    332: 
                    333:     (foo)|(ba(r*))
                    334: 
                    335: .fi
                    336: since the '*' operator has higher precedence than concatenation,
                    337: and concatenation higher than alternation ('|').  This pattern
                    338: therefore matches
                    339: .I either
                    340: the string "foo"
                    341: .I or
                    342: the string "ba" followed by zero-or-more r's.
                    343: To match "foo" or zero-or-more "bar"'s, use:
                    344: .nf
                    345: 
                    346:     foo|(bar)*
                    347: 
                    348: .fi
                    349: and to match zero-or-more "foo"'s-or-"bar"'s:
                    350: .nf
                    351: 
                    352:     (foo|bar)*
                    353: 
                    354: .fi
                    355: .LP
                    356: Some notes on patterns:
                    357: .IP -
                    358: A negated character class such as the example "[^A-Z]"
                    359: above
                    360: .I will match a newline
                    361: unless "\\n" (or an equivalent escape sequence) is one of the
                    362: characters explicitly present in the negated character class
                    363: (e.g., "[^A-Z\\n]").  This is unlike how many other regular
                    364: expression tools treat negated character classes, but unfortunately
                    365: the inconsistency is historically entrenched.
                    366: Matching newlines means that a pattern like [^"]* can match an entire
                    367: input (overflowing the scanner's input buffer) unless there's another
                    368: quote in the input.
                    369: .IP -
                    370: A rule can have at most one instance of trailing context (the '/' operator
                    371: or the '$' operator).  The start condition, '^', and "<<EOF>>" patterns
                    372: can only occur at the beginning of a pattern, and, as well as with '/' and '$',
                    373: cannot be grouped inside parentheses.  A '^' which does not occur at
                    374: the beginning of a rule or a '$' which does not occur at the end of
                    375: a rule loses its special properties and is treated as a normal character.
                    376: .IP
                    377: The following are illegal:
                    378: .nf
                    379: 
                    380:     foo/bar$
                    381:     <sc1>foo<sc2>bar
                    382: 
                    383: .fi
                    384: Note that the first of these, can be written "foo/bar\\n".
                    385: .IP
                    386: The following will result in '$' or '^' being treated as a normal character:
                    387: .nf
                    388: 
                    389:     foo|(bar$)
                    390:     foo|^bar
                    391: 
                    392: .fi
                    393: If what's wanted is a "foo" or a bar-followed-by-a-newline, the following
                    394: could be used (the special '|' action is explained below):
                    395: .nf
                    396: 
                    397:     foo      |
                    398:     bar$     /* action goes here */
                    399: 
                    400: .fi
                    401: A similar trick will work for matching a foo or a
                    402: bar-at-the-beginning-of-a-line.
                    403: .SH HOW THE INPUT IS MATCHED
                    404: When the generated scanner is run, it analyzes its input looking
                    405: for strings which match any of its patterns.  If it finds more than
                    406: one match, it takes the one matching the most text (for trailing
                    407: context rules, this includes the length of the trailing part, even
                    408: though it will then be returned to the input).  If it finds two
                    409: or more matches of the same length, the
                    410: rule listed first in the
                    411: .I flex
                    412: input file is chosen.
                    413: .LP
                    414: Once the match is determined, the text corresponding to the match
                    415: (called the
                    416: .I token)
                    417: is made available in the global character pointer
                    418: .B yytext,
                    419: and its length in the global integer
                    420: .B yyleng.
                    421: The
                    422: .I action
                    423: corresponding to the matched pattern is then executed (a more
                    424: detailed description of actions follows), and then the remaining
                    425: input is scanned for another match.
                    426: .LP
                    427: If no match is found, then the
                    428: .I default rule
                    429: is executed: the next character in the input is considered matched and
                    430: copied to the standard output.  Thus, the simplest legal
                    431: .I flex
                    432: input is:
                    433: .nf
                    434: 
                    435:     %%
                    436: 
                    437: .fi
                    438: which generates a scanner that simply copies its input (one character
                    439: at a time) to its output.
                    440: .SH ACTIONS
                    441: Each pattern in a rule has a corresponding action, which can be any
                    442: arbitrary C statement.  The pattern ends at the first non-escaped
                    443: whitespace character; the remainder of the line is its action.  If the
                    444: action is empty, then when the pattern is matched the input token
                    445: is simply discarded.  For example, here is the specification for a program
                    446: which deletes all occurrences of "zap me" from its input:
                    447: .nf
                    448: 
                    449:     %%
                    450:     "zap me"
                    451: 
                    452: .fi
                    453: (It will copy all other characters in the input to the output since
                    454: they will be matched by the default rule.)
                    455: .LP
                    456: Here is a program which compresses multiple blanks and tabs down to
                    457: a single blank, and throws away whitespace found at the end of a line:
                    458: .nf
                    459: 
                    460:     %%
                    461:     [ \\t]+        putchar( ' ' );
                    462:     [ \\t]+$       /* ignore this token */
                    463: 
                    464: .fi
                    465: .LP
                    466: If the action contains a '{', then the action spans till the balancing '}'
                    467: is found, and the action may cross multiple lines.
                    468: .I flex 
                    469: knows about C strings and comments and won't be fooled by braces found
                    470: within them, but also allows actions to begin with
                    471: .B %{
                    472: and will consider the action to be all the text up to the next
                    473: .B %}
                    474: (regardless of ordinary braces inside the action).
                    475: .LP
                    476: An action consisting solely of a vertical bar ('|') means "same as
                    477: the action for the next rule."  See below for an illustration.
                    478: .LP
                    479: Actions can include arbitrary C code, including
                    480: .B return
                    481: statements to return a value to whatever routine called
                    482: .B yylex().
                    483: Each time
                    484: .B yylex()
                    485: is called it continues processing tokens from where it last left
                    486: off until it either reaches
                    487: the end of the file or executes a return.  Once it reaches an end-of-file,
                    488: however, then any subsequent call to
                    489: .B yylex()
                    490: will simply immediately return, unless
                    491: .B yyrestart()
                    492: is first called (see below).
                    493: .LP
                    494: Actions are not allowed to modify yytext or yyleng.
                    495: .LP
                    496: There are a number of special directives which can be included within
                    497: an action:
                    498: .IP -
                    499: .B ECHO
                    500: copies yytext to the scanner's output.
                    501: .IP -
                    502: .B BEGIN
                    503: followed by the name of a start condition places the scanner in the
                    504: corresponding start condition (see below).
                    505: .IP -
                    506: .B REJECT
                    507: directs the scanner to proceed on to the "second best" rule which matched the
                    508: input (or a prefix of the input).  The rule is chosen as described
                    509: above in "How the Input is Matched", and
                    510: .B yytext
                    511: and
                    512: .B yyleng
                    513: set up appropriately.
                    514: It may either be one which matched as much text
                    515: as the originally chosen rule but came later in the
                    516: .I flex
                    517: input file, or one which matched less text.
                    518: For example, the following will both count the
                    519: words in the input and call the routine special() whenever "frob" is seen:
                    520: .nf
                    521: 
                    522:             int word_count = 0;
                    523:     %%
                    524: 
                    525:     frob        special(); REJECT;
                    526:     [^ \\t\\n]+   ++word_count;
                    527: 
                    528: .fi
                    529: Without the
                    530: .B REJECT,
                    531: any "frob"'s in the input would not be counted as words, since the
                    532: scanner normally executes only one action per token.
                    533: Multiple
                    534: .B REJECT's
                    535: are allowed, each one finding the next best choice to the currently
                    536: active rule.  For example, when the following scanner scans the token
                    537: "abcd", it will write "abcdabcaba" to the output:
                    538: .nf
                    539: 
                    540:     %%
                    541:     a        |
                    542:     ab       |
                    543:     abc      |
                    544:     abcd     ECHO; REJECT;
                    545:     .|\\n     /* eat up any unmatched character */
                    546: 
                    547: .fi
                    548: (The first three rules share the fourth's action since they use
                    549: the special '|' action.)
                    550: .B REJECT
                    551: is a particularly expensive feature in terms scanner performance;
                    552: if it is used in
                    553: .I any
                    554: of the scanner's actions it will slow down
                    555: .I all
                    556: of the scanner's matching.  Furthermore,
                    557: .B REJECT
                    558: cannot be used with the
                    559: .I -f
                    560: or
                    561: .I -F
                    562: options (see below).
                    563: .IP
                    564: Note also that unlike the other special actions,
                    565: .B REJECT
                    566: is a
                    567: .I branch;
                    568: code immediately following it in the action will
                    569: .I not
                    570: be executed.
                    571: .IP -
                    572: .B yymore()
                    573: tells the scanner that the next time it matches a rule, the corresponding
                    574: token should be
                    575: .I appended
                    576: onto the current value of
                    577: .B yytext
                    578: rather than replacing it.  For example, given the input "mega-kludge"
                    579: the following will write "mega-mega-kludge" to the output:
                    580: .nf
                    581: 
                    582:     %%
                    583:     mega-    ECHO; yymore();
                    584:     kludge   ECHO;
                    585: 
                    586: .fi
                    587: First "mega-" is matched and echoed to the output.  Then "kludge"
                    588: is matched, but the previous "mega-" is still hanging around at the
                    589: beginning of
                    590: .B yytext
                    591: so the
                    592: .B ECHO
                    593: for the "kludge" rule will actually write "mega-kludge".
                    594: The presence of
                    595: .B yymore()
                    596: in the scanner's action entails a minor performance penalty in the
                    597: scanner's matching speed.
                    598: .IP -
                    599: .B yyless(n)
                    600: returns all but the first
                    601: .I n
                    602: characters of the current token back to the input stream, where they
                    603: will be rescanned when the scanner looks for the next match.
                    604: .B yytext
                    605: and
                    606: .B yyleng
                    607: are adjusted appropriately (e.g.,
                    608: .B yyleng
                    609: will now be equal to
                    610: .I n
                    611: ).  For example, on the input "foobar" the following will write out
                    612: "foobarbar":
                    613: .nf
                    614: 
                    615:     %%
                    616:     foobar    ECHO; yyless(3);
                    617:     [a-z]+    ECHO;
                    618: 
                    619: .fi
                    620: An argument of 0 to
                    621: .B yyless
                    622: will cause the entire current input string to be scanned again.  Unless you've
                    623: changed how the scanner will subsequently process its input (using
                    624: .B BEGIN,
                    625: for example), this will result in an endless loop.
                    626: .IP -
                    627: .B unput(c)
                    628: puts the character
                    629: .I c
                    630: back onto the input stream.  It will be the next character scanned.
                    631: The following action will take the current token and cause it
                    632: to be rescanned enclosed in parentheses.
                    633: .nf
                    634: 
                    635:     {
                    636:     int i;
                    637:     unput( ')' );
                    638:     for ( i = yyleng - 1; i >= 0; --i )
                    639:         unput( yytext[i] );
                    640:     unput( '(' );
                    641:     }
                    642: 
                    643: .fi
                    644: Note that since each
                    645: .B unput()
                    646: puts the given character back at the
                    647: .I beginning
                    648: of the input stream, pushing back strings must be done back-to-front.
                    649: .IP -
                    650: .B input()
                    651: reads the next character from the input stream.  For example,
                    652: the following is one way to eat up C comments:
                    653: .nf
                    654: 
                    655:     %%
                    656:     "/*"        {
                    657:                 register int c;
                    658: 
                    659:                 for ( ; ; )
                    660:                     {
                    661:                     while ( (c = input()) != '*' &&
                    662:                             c != EOF )
                    663:                         ;    /* eat up text of comment */
                    664: 
                    665:                     if ( c == '*' )
                    666:                         {
                    667:                         while ( (c = input()) == '*' )
                    668:                             ;
                    669:                         if ( c == '/' )
                    670:                             break;    /* found the end */
                    671:                         }
                    672: 
                    673:                     if ( c == EOF )
                    674:                         {
                    675:                         error( "EOF in comment" );
                    676:                         break;
                    677:                         }
                    678:                     }
                    679:                 }
                    680: 
                    681: .fi
                    682: (Note that if the scanner is compiled using
                    683: .B C++,
                    684: then
                    685: .B input()
                    686: is instead referred to as
                    687: .B yyinput(),
                    688: in order to avoid a name clash with the
                    689: .B C++
                    690: stream by the name of
                    691: .I input.)
                    692: .IP -
                    693: .B yyterminate()
                    694: can be used in lieu of a return statement in an action.  It terminates
                    695: the scanner and returns a 0 to the scanner's caller, indicating "all done".
                    696: Subsequent calls to the scanner will immediately return unless preceded
                    697: by a call to
                    698: .B yyrestart()
                    699: (see below).
                    700: By default,
                    701: .B yyterminate()
                    702: is also called when an end-of-file is encountered.  It is a macro and
                    703: may be redefined.
                    704: .SH THE GENERATED SCANNER
                    705: The output of
                    706: .I flex
                    707: is the file
                    708: .B lex.yy.c,
                    709: which contains the scanning routine
                    710: .B yylex(),
                    711: a number of tables used by it for matching tokens, and a number
                    712: of auxiliary routines and macros.  By default,
                    713: .B yylex()
                    714: is declared as follows:
                    715: .nf
                    716: 
                    717:     int yylex()
                    718:         {
                    719:         ... various definitions and the actions in here ...
                    720:         }
                    721: 
                    722: .fi
                    723: (If your environment supports function prototypes, then it will
                    724: be "int yylex( void )".)  This definition may be changed by redefining
                    725: the "YY_DECL" macro.  For example, you could use:
                    726: .nf
                    727: 
                    728:     #undef YY_DECL
                    729:     #define YY_DECL float lexscan( a, b ) float a, b;
                    730: 
                    731: .fi
                    732: to give the scanning routine the name
                    733: .I lexscan,
                    734: returning a float, and taking two floats as arguments.  Note that
                    735: if you give arguments to the scanning routine using a
                    736: K&R-style/non-prototyped function declaration, you must terminate
                    737: the definition with a semi-colon (;).
                    738: .LP
                    739: Whenever
                    740: .B yylex()
                    741: is called, it scans tokens from the global input file
                    742: .I yyin
                    743: (which defaults to stdin).  It continues until it either reaches
                    744: an end-of-file (at which point it returns the value 0) or
                    745: one of its actions executes a
                    746: .I return
                    747: statement.
                    748: In the former case, when called again the scanner will immediately
                    749: return unless
                    750: .B yyrestart()
                    751: is called to point
                    752: .I yyin
                    753: at the new input file.  (
                    754: .B yyrestart()
                    755: takes one argument, a
                    756: .B FILE *
                    757: pointer.)
                    758: In the latter case (i.e., when an action
                    759: executes a return), the scanner may then be called again and it
                    760: will resume scanning where it left off.
                    761: .LP
                    762: By default (and for purposes of efficiency), the scanner uses
                    763: block-reads rather than simple
                    764: .I getc()
                    765: calls to read characters from
                    766: .I yyin.
                    767: The nature of how it gets its input can be controlled by redefining the
                    768: .B YY_INPUT
                    769: macro.
                    770: YY_INPUT's calling sequence is "YY_INPUT(buf,result,max_size)".  Its
                    771: action is to place up to
                    772: .I max_size
                    773: characters in the character array
                    774: .I buf
                    775: and return in the integer variable
                    776: .I result
                    777: either the
                    778: number of characters read or the constant YY_NULL (0 on Unix systems)
                    779: to indicate EOF.  The default YY_INPUT reads from the
                    780: global file-pointer "yyin".
                    781: .LP
                    782: A sample redefinition of YY_INPUT (in the definitions
                    783: section of the input file):
                    784: .nf
                    785: 
                    786:     %{
                    787:     #undef YY_INPUT
                    788:     #define YY_INPUT(buf,result,max_size) \\
                    789:         result = ((buf[0] = getchar()) == EOF) ? YY_NULL : 1;
                    790:     %}
                    791: 
                    792: .fi
                    793: This definition will change the input processing to occur
                    794: one character at a time.
                    795: .LP
                    796: You also can add in things like keeping track of the
                    797: input line number this way; but don't expect your scanner to
                    798: go very fast.
                    799: .LP
                    800: When the scanner receives an end-of-file indication from YY_INPUT,
                    801: it then checks the
                    802: .B yywrap()
                    803: function.  If
                    804: .B yywrap()
                    805: returns false (zero), then it is assumed that the
                    806: function has gone ahead and set up
                    807: .I yyin
                    808: to point to another input file, and scanning continues.  If it returns
                    809: true (non-zero), then the scanner terminates, returning 0 to its
                    810: caller.
                    811: .LP
                    812: The default
                    813: .B yywrap()
                    814: always returns 1.  Presently, to redefine it you must first
                    815: "#undef yywrap", as it is currently implemented as a macro.  As indicated
                    816: by the hedging in the previous sentence, it may be changed to
                    817: a true function in the near future.
                    818: .LP
                    819: The scanner writes its
                    820: .B ECHO
                    821: output to the
                    822: .I yyout
                    823: global (default, stdout), which may be redefined by the user simply
                    824: by assigning it to some other
                    825: .B FILE
                    826: pointer.
                    827: .SH START CONDITIONS
                    828: .I flex
                    829: provides a mechanism for conditionally activating rules.  Any rule
                    830: whose pattern is prefixed with "<sc>" will only be active when
                    831: the scanner is in the start condition named "sc".  For example,
                    832: .nf
                    833: 
                    834:     <STRING>[^"]*        { /* eat up the string body ... */
                    835:                 ...
                    836:                 }
                    837: 
                    838: .fi
                    839: will be active only when the scanner is in the "STRING" start
                    840: condition, and
                    841: .nf
                    842: 
                    843:     <INITIAL,STRING,QUOTE>\\.        { /* handle an escape ... */
                    844:                 ...
                    845:                 }
                    846: 
                    847: .fi
                    848: will be active only when the current start condition is
                    849: either "INITIAL", "STRING", or "QUOTE".
                    850: .LP
                    851: Start conditions
                    852: are declared in the definitions (first) section of the input
                    853: using unindented lines beginning with either
                    854: .B %s
                    855: or
                    856: .B %x
                    857: followed by a list of names.
                    858: The former declares
                    859: .I inclusive
                    860: start conditions, the latter
                    861: .I exclusive
                    862: start conditions.  A start condition is activated using the
                    863: .B BEGIN
                    864: action.  Until the next
                    865: .B BEGIN
                    866: action is executed, rules with the given start
                    867: condition will be active and
                    868: rules with other start conditions will be inactive.
                    869: If the start condition is
                    870: .I inclusive,
                    871: then rules with no start conditions at all will also be active.
                    872: If it is
                    873: .I exclusive,
                    874: then
                    875: .I only
                    876: rules qualified with the start condition will be active.
                    877: A set of rules contingent on the same exclusive start condition
                    878: describe a scanner which is independent of any of the other rules in the
                    879: .I flex
                    880: input.  Because of this,
                    881: exclusive start conditions make it easy to specify "mini-scanners"
                    882: which scan portions of the input that are syntactically different
                    883: from the rest (e.g., comments).
                    884: .LP
                    885: If the distinction between inclusive and exclusive start conditions
                    886: is still a little vague, here's a simple example illustrating the
                    887: connection between the two.  The set of rules:
                    888: .nf
                    889: 
                    890:     %s example
                    891:     %%
                    892:     <example>foo           /* do something */
                    893: 
                    894: .fi
                    895: is equivalent to
                    896: .nf
                    897: 
                    898:     %x example
                    899:     %%
                    900:     <INITIAL,example>foo   /* do something */
                    901: 
                    902: .fi
                    903: .LP
                    904: The default rule (to
                    905: .B ECHO
                    906: any unmatched character) remains active in start conditions.
                    907: .LP
                    908: .B BEGIN(0)
                    909: returns to the original state where only the rules with
                    910: no start conditions are active.  This state can also be
                    911: referred to as the start-condition "INITIAL", so
                    912: .B BEGIN(INITIAL)
                    913: is equivalent to
                    914: .B BEGIN(0).
                    915: (The parentheses around the start condition name are not required but
                    916: are considered good style.)
                    917: .LP
                    918: .B BEGIN
                    919: actions can also be given as indented code at the beginning
                    920: of the rules section.  For example, the following will cause
                    921: the scanner to enter the "SPECIAL" start condition whenever
                    922: .I yylex()
                    923: is called and the global variable
                    924: .I enter_special
                    925: is true:
                    926: .nf
                    927: 
                    928:             int enter_special;
                    929: 
                    930:     %x SPECIAL
                    931:     %%
                    932:             if ( enter_special )
                    933:                 BEGIN(SPECIAL);
                    934: 
                    935:     <SPECIAL>blahblahblah
                    936:     ...more rules follow...
                    937: 
                    938: .fi
                    939: .LP
                    940: To illustrate the uses of start conditions,
                    941: here is a scanner which provides two different interpretations
                    942: of a string like "123.456".  By default it will treat it as
                    943: as three tokens, the integer "123", a dot ('.'), and the integer "456".
                    944: But if the string is preceded earlier in the line by the string
                    945: "expect-floats"
                    946: it will treat it as a single token, the floating-point number
                    947: 123.456:
                    948: .nf
                    949: 
                    950:     %{
                    951:     #include <math.h>
                    952:     %}
                    953:     %s expect
                    954: 
                    955:     %%
                    956:     expect-floats        BEGIN(expect);
                    957: 
                    958:     <expect>[0-9]+"."[0-9]+      {
                    959:                 printf( "found a float, = %f\\n",
                    960:                         atof( yytext ) );
                    961:                 }
                    962:     <expect>\\n           {
                    963:                 /* that's the end of the line, so
                    964:                  * we need another "expect-number"
                    965:                  * before we'll recognize any more
                    966:                  * numbers
                    967:                  */
                    968:                 BEGIN(INITIAL);
                    969:                 }
                    970: 
                    971:     [0-9]+      {
                    972:                 printf( "found an integer, = %d\\n",
                    973:                         atoi( yytext ) );
                    974:                 }
                    975: 
                    976:     "."         printf( "found a dot\\n" );
                    977: 
                    978: .fi
                    979: Here is a scanner which recognizes (and discards) C comments while
                    980: maintaining a count of the current input line.
                    981: .nf
                    982: 
                    983:     %x comment
                    984:     %%
                    985:             int line_num = 1;
                    986: 
                    987:     "/*"         BEGIN(comment);
                    988: 
                    989:     <comment>[^*\\n]*        /* eat anything that's not a '*' */
                    990:     <comment>"*"+[^*/\\n]*   /* eat up '*'s not followed by '/'s */
                    991:     <comment>\\n             ++line_num;
                    992:     <comment>"*"+"/"        BEGIN(INITIAL);
                    993: 
                    994: .fi
                    995: Note that start-conditions names are really integer values and
                    996: can be stored as such.  Thus, the above could be extended in the
                    997: following fashion:
                    998: .nf
                    999: 
                   1000:     %x comment foo
                   1001:     %%
                   1002:             int line_num = 1;
                   1003:             int comment_caller;
                   1004: 
                   1005:     "/*"         {
                   1006:                  comment_caller = INITIAL;
                   1007:                  BEGIN(comment);
                   1008:                  }
                   1009: 
                   1010:     ...
                   1011: 
                   1012:     <foo>"/*"    {
                   1013:                  comment_caller = foo;
                   1014:                  BEGIN(comment);
                   1015:                  }
                   1016: 
                   1017:     <comment>[^*\\n]*        /* eat anything that's not a '*' */
                   1018:     <comment>"*"+[^*/\\n]*   /* eat up '*'s not followed by '/'s */
                   1019:     <comment>\\n             ++line_num;
                   1020:     <comment>"*"+"/"        BEGIN(comment_caller);
                   1021: 
                   1022: .fi
                   1023: One can then implement a "stack" of start conditions using an
                   1024: array of integers.  (It is likely that such stacks will become
                   1025: a full-fledged
                   1026: .I flex
                   1027: feature in the future.)  Note, though, that
                   1028: start conditions do not have their own name-space; %s's and %x's
                   1029: declare names in the same fashion as #define's.
                   1030: .SH MULTIPLE INPUT BUFFERS
                   1031: Some scanners (such as those which support "include" files)
                   1032: require reading from several input streams.  As
                   1033: .I flex
                   1034: scanners do a large amount of buffering, one cannot control
                   1035: where the next input will be read from by simply writing a
                   1036: .B YY_INPUT
                   1037: which is sensitive to the scanning context.
                   1038: .B YY_INPUT
                   1039: is only called when the scanner reaches the end of its buffer, which
                   1040: may be a long time after scanning a statement such as an "include"
                   1041: which requires switching the input source.
                   1042: .LP
                   1043: To negotiate these sorts of problems,
                   1044: .I flex
                   1045: provides a mechanism for creating and switching between multiple
                   1046: input buffers.  An input buffer is created by using:
                   1047: .nf
                   1048: 
                   1049:     YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
                   1050: 
                   1051: .fi
                   1052: which takes a
                   1053: .I FILE
                   1054: pointer and a size and creates a buffer associated with the given
                   1055: file and large enough to hold
                   1056: .I size
                   1057: characters (when in doubt, use
                   1058: .B YY_BUF_SIZE
                   1059: for the size).  It returns a
                   1060: .B YY_BUFFER_STATE
                   1061: handle, which may then be passed to other routines:
                   1062: .nf
                   1063: 
                   1064:     void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
                   1065: 
                   1066: .fi
                   1067: switches the scanner's input buffer so subsequent tokens will
                   1068: come from
                   1069: .I new_buffer.
                   1070: Note that
                   1071: .B yy_switch_to_buffer()
                   1072: may be used by yywrap() to sets things up for continued scanning, instead
                   1073: of opening a new file and pointing
                   1074: .I yyin
                   1075: at it.
                   1076: .nf
                   1077: 
                   1078:     void yy_delete_buffer( YY_BUFFER_STATE buffer )
                   1079: 
                   1080: .fi
                   1081: is used to reclaim the storage associated with a buffer.
                   1082: .LP
                   1083: .B yy_new_buffer()
                   1084: is an alias for
                   1085: .B yy_create_buffer(),
                   1086: provided for compatibility with the C++ use of
                   1087: .I new
                   1088: and
                   1089: .I delete
                   1090: for creating and destroying dynamic objects.
                   1091: .LP
                   1092: Finally, the
                   1093: .B YY_CURRENT_BUFFER
                   1094: macro returns a
                   1095: .B YY_BUFFER_STATE
                   1096: handle to the current buffer.
                   1097: .LP
                   1098: Here is an example of using these features for writing a scanner
                   1099: which expands include files (the
                   1100: .B <<EOF>>
                   1101: feature is discussed below):
                   1102: .nf
                   1103: 
                   1104:     /* the "incl" state is used for picking up the name
                   1105:      * of an include file
                   1106:      */
                   1107:     %x incl
                   1108: 
                   1109:     %{
                   1110:     #define MAX_INCLUDE_DEPTH 10
                   1111:     YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
                   1112:     int include_stack_ptr = 0;
                   1113:     %}
                   1114: 
                   1115:     %%
                   1116:     include             BEGIN(incl);
                   1117: 
                   1118:     [a-z]+              ECHO;
                   1119:     [^a-z\\n]*\\n?        ECHO;
                   1120: 
                   1121:     <incl>[ \\t]*      /* eat the whitespace */
                   1122:     <incl>[^ \\t\\n]+   { /* got the include file name */
                   1123:             if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
                   1124:                 {
                   1125:                 fprintf( stderr, "Includes nested too deeply" );
                   1126:                 exit( 1 );
                   1127:                 }
                   1128: 
                   1129:             include_stack[include_stack_ptr++] =
                   1130:                 YY_CURRENT_BUFFER;
                   1131: 
                   1132:             yyin = fopen( yytext, "r" );
                   1133: 
                   1134:             if ( ! yyin )
                   1135:                 error( ... );
                   1136: 
                   1137:             yy_switch_to_buffer(
                   1138:                 yy_create_buffer( yyin, YY_BUF_SIZE ) );
                   1139: 
                   1140:             BEGIN(INITIAL);
                   1141:             }
                   1142: 
                   1143:     <<EOF>> {
                   1144:             if ( --include_stack_ptr < 0 )
                   1145:                 {
                   1146:                 yyterminate();
                   1147:                 }
                   1148: 
                   1149:             else
                   1150:                 yy_switch_to_buffer(
                   1151:                      include_stack[include_stack_ptr] );
                   1152:             }
                   1153: 
                   1154: .fi
                   1155: .SH END-OF-FILE RULES
                   1156: The special rule "<<EOF>>" indicates
                   1157: actions which are to be taken when an end-of-file is
                   1158: encountered and yywrap() returns non-zero (i.e., indicates
                   1159: no further files to process).  The action must finish
                   1160: by doing one of four things:
                   1161: .IP -
                   1162: the special
                   1163: .B YY_NEW_FILE
                   1164: action, if
                   1165: .I yyin
                   1166: has been pointed at a new file to process;
                   1167: .IP -
                   1168: a
                   1169: .I return
                   1170: statement;
                   1171: .IP -
                   1172: the special
                   1173: .B yyterminate()
                   1174: action;
                   1175: .IP -
                   1176: or, switching to a new buffer using
                   1177: .B yy_switch_to_buffer()
                   1178: as shown in the example above.
                   1179: .LP
                   1180: <<EOF>> rules may not be used with other
                   1181: patterns; they may only be qualified with a list of start
                   1182: conditions.  If an unqualified <<EOF>> rule is given, it
                   1183: applies to
                   1184: .I all
                   1185: start conditions which do not already have <<EOF>> actions.  To
                   1186: specify an <<EOF>> rule for only the initial start condition, use
                   1187: .nf
                   1188: 
                   1189:     <INITIAL><<EOF>>
                   1190: 
                   1191: .fi
                   1192: .LP
                   1193: These rules are useful for catching things like unclosed comments.
                   1194: An example:
                   1195: .nf
                   1196: 
                   1197:     %x quote
                   1198:     %%
                   1199: 
                   1200:     ...other rules for dealing with quotes...
                   1201: 
                   1202:     <quote><<EOF>>   {
                   1203:              error( "unterminated quote" );
                   1204:              yyterminate();
                   1205:              }
                   1206:     <<EOF>>  {
                   1207:              if ( *++filelist )
                   1208:                  {
                   1209:                  yyin = fopen( *filelist, "r" );
                   1210:                  YY_NEW_FILE;
                   1211:                  }
                   1212:              else
                   1213:                 yyterminate();
                   1214:              }
                   1215: 
                   1216: .fi
                   1217: .SH MISCELLANEOUS MACROS
                   1218: The macro
                   1219: .bd
                   1220: YY_USER_ACTION
                   1221: can be redefined to provide an action
                   1222: which is always executed prior to the matched rule's action.  For example,
                   1223: it could be #define'd to call a routine to convert yytext to lower-case.
                   1224: .LP
                   1225: The macro
                   1226: .B YY_USER_INIT
                   1227: may be redefined to provide an action which is always executed before
                   1228: the first scan (and before the scanner's internal initializations are done).
                   1229: For example, it could be used to call a routine to read
                   1230: in a data table or open a logging file.
                   1231: .LP
                   1232: In the generated scanner, the actions are all gathered in one large
                   1233: switch statement and separated using
                   1234: .B YY_BREAK,
                   1235: which may be redefined.  By default, it is simply a "break", to separate
                   1236: each rule's action from the following rule's.
                   1237: Redefining
                   1238: .B YY_BREAK
                   1239: allows, for example, C++ users to
                   1240: #define YY_BREAK to do nothing (while being very careful that every
                   1241: rule ends with a "break" or a "return"!) to avoid suffering from
                   1242: unreachable statement warnings where because a rule's action ends with
                   1243: "return", the
                   1244: .B YY_BREAK
                   1245: is inaccessible.
                   1246: .SH INTERFACING WITH YACC
                   1247: One of the main uses of
                   1248: .I flex
                   1249: is as a companion to the
                   1250: .I yacc
                   1251: parser-generator.
                   1252: .I yacc
                   1253: parsers expect to call a routine named
                   1254: .B yylex()
                   1255: to find the next input token.  The routine is supposed to
                   1256: return the type of the next token as well as putting any associated
                   1257: value in the global
                   1258: .B yylval.
                   1259: To use
                   1260: .I flex
                   1261: with
                   1262: .I yacc,
                   1263: one specifies the
                   1264: .B -d
                   1265: option to
                   1266: .I yacc
                   1267: to instruct it to generate the file
                   1268: .B y.tab.h
                   1269: containing definitions of all the
                   1270: .B %tokens
                   1271: appearing in the
                   1272: .I yacc
                   1273: input.  This file is then included in the
                   1274: .I flex
                   1275: scanner.  For example, if one of the tokens is "TOK_NUMBER",
                   1276: part of the scanner might look like:
                   1277: .nf
                   1278: 
                   1279:     %{
                   1280:     #include "y.tab.h"
                   1281:     %}
                   1282: 
                   1283:     %%
                   1284: 
                   1285:     [0-9]+        yylval = atoi( yytext ); return TOK_NUMBER;
                   1286: 
                   1287: .fi
                   1288: .SH TRANSLATION TABLE
                   1289: In the name of POSIX compliance,
                   1290: .I flex
                   1291: supports a
                   1292: .I translation table
                   1293: for mapping input characters into groups.
                   1294: The table is specified in the first section, and its format looks like:
                   1295: .nf
                   1296: 
                   1297:     %t
                   1298:     1        abcd
                   1299:     2        ABCDEFGHIJKLMNOPQRSTUVWXYZ
                   1300:     52       0123456789
                   1301:     6        \\t\\ \\n
                   1302:     %t
                   1303: 
                   1304: .fi
                   1305: This example specifies that the characters 'a', 'b', 'c', and 'd'
                   1306: are to all be lumped into group #1, upper-case letters
                   1307: in group #2, digits in group #52, tabs, blanks, and newlines into
                   1308: group #6, and
                   1309: .I
                   1310: no other characters will appear in the patterns.
                   1311: The group numbers are actually disregarded by
                   1312: .I flex;
                   1313: .B %t
                   1314: serves, though, to lump characters together.  Given the above
                   1315: table, for example, the pattern "a(AA)*5" is equivalent to "d(ZQ)*0".
                   1316: They both say, "match any character in group #1, followed by
                   1317: zero-or-more pairs of characters
                   1318: from group #2, followed by a character from group #52."  Thus
                   1319: .B %t
                   1320: provides a crude way for introducing equivalence classes into
                   1321: the scanner specification.
                   1322: .LP
                   1323: Note that the
                   1324: .B -i
                   1325: option (see below) coupled with the equivalence classes which
                   1326: .I flex
                   1327: automatically generates take care of virtually all the instances
                   1328: when one might consider using
                   1329: .B %t.
                   1330: But what the hell, it's there if you want it.
                   1331: .SH OPTIONS
                   1332: .I flex
                   1333: has the following options:
                   1334: .TP
                   1335: .B -b
                   1336: Generate backtracking information to
                   1337: .I lex.backtrack.
                   1338: This is a list of scanner states which require backtracking
                   1339: and the input characters on which they do so.  By adding rules one
                   1340: can remove backtracking states.  If all backtracking states
                   1341: are eliminated and
                   1342: .B -f
                   1343: or
                   1344: .B -F
                   1345: is used, the generated scanner will run faster (see the
                   1346: .B -p
                   1347: flag).  Only users who wish to squeeze every last cycle out of their
                   1348: scanners need worry about this option.  (See the section on PERFORMANCE
                   1349: CONSIDERATIONS below.)
                   1350: .TP
                   1351: .B -c
                   1352: is a do-nothing, deprecated option included for POSIX compliance.
                   1353: .IP
                   1354: .B NOTE:
                   1355: in previous releases of
                   1356: .I flex
                   1357: .B -c
                   1358: specified table-compression options.  This functionality is
                   1359: now given by the
                   1360: .B -C
                   1361: flag.  To ease the the impact of this change, when
                   1362: .I flex
                   1363: encounters
                   1364: .B -c,
                   1365: it currently issues a warning message and assumes that
                   1366: .B -C
                   1367: was desired instead.  In the future this "promotion" of
                   1368: .B -c
                   1369: to
                   1370: .B -C
                   1371: will go away in the name of full POSIX compliance (unless
                   1372: the POSIX meaning is removed first).
                   1373: .TP
                   1374: .B -d
                   1375: makes the generated scanner run in
                   1376: .I debug
                   1377: mode.  Whenever a pattern is recognized and the global
                   1378: .B yy_flex_debug
                   1379: is non-zero (which is the default),
                   1380: the scanner will write to
                   1381: .I stderr
                   1382: a line of the form:
                   1383: .nf
                   1384: 
                   1385:     --accepting rule at line 53 ("the matched text")
                   1386: 
                   1387: .fi
                   1388: The line number refers to the location of the rule in the file
                   1389: defining the scanner (i.e., the file that was fed to flex).  Messages
                   1390: are also generated when the scanner backtracks, accepts the
                   1391: default rule, reaches the end of its input buffer (or encounters
                   1392: a NUL; at this point, the two look the same as far as the scanner's concerned),
                   1393: or reaches an end-of-file.
                   1394: .TP
                   1395: .B -f
                   1396: specifies (take your pick)
                   1397: .I full table
                   1398: or
                   1399: .I fast scanner.
                   1400: No table compression is done.  The result is large but fast.
                   1401: This option is equivalent to
                   1402: .B -Cf
                   1403: (see below).
                   1404: .TP
                   1405: .B -i
                   1406: instructs
                   1407: .I flex
                   1408: to generate a
                   1409: .I case-insensitive
                   1410: scanner.  The case of letters given in the
                   1411: .I flex
                   1412: input patterns will
                   1413: be ignored, and tokens in the input will be matched regardless of case.  The
                   1414: matched text given in
                   1415: .I yytext
                   1416: will have the preserved case (i.e., it will not be folded).
                   1417: .TP
                   1418: .B -n
                   1419: is another do-nothing, deprecated option included only for
                   1420: POSIX compliance.
                   1421: .TP
                   1422: .B -p
                   1423: generates a performance report to stderr.  The report
                   1424: consists of comments regarding features of the
                   1425: .I flex
                   1426: input file which will cause a loss of performance in the resulting scanner.
                   1427: Note that the use of
                   1428: .I REJECT
                   1429: and variable trailing context (see the BUGS section in flex(1))
                   1430: entails a substantial performance penalty; use of
                   1431: .I yymore(),
                   1432: the
                   1433: .B ^
                   1434: operator,
                   1435: and the
                   1436: .B -I
                   1437: flag entail minor performance penalties.
                   1438: .TP
                   1439: .B -s
                   1440: causes the
                   1441: .I default rule
                   1442: (that unmatched scanner input is echoed to
                   1443: .I stdout)
                   1444: to be suppressed.  If the scanner encounters input that does not
                   1445: match any of its rules, it aborts with an error.  This option is
                   1446: useful for finding holes in a scanner's rule set.
                   1447: .TP
                   1448: .B -t
                   1449: instructs
                   1450: .I flex
                   1451: to write the scanner it generates to standard output instead
                   1452: of
                   1453: .B lex.yy.c.
                   1454: .TP
                   1455: .B -v
                   1456: specifies that
                   1457: .I flex
                   1458: should write to
                   1459: .I stderr
                   1460: a summary of statistics regarding the scanner it generates.
                   1461: Most of the statistics are meaningless to the casual
                   1462: .I flex
                   1463: user, but the
                   1464: first line identifies the version of
                   1465: .I flex,
                   1466: which is useful for figuring
                   1467: out where you stand with respect to patches and new releases,
                   1468: and the next two lines give the date when the scanner was created
                   1469: and a summary of the flags which were in effect.
                   1470: .TP
                   1471: .B -F
                   1472: specifies that the
                   1473: .ul
                   1474: fast
                   1475: scanner table representation should be used.  This representation is
                   1476: about as fast as the full table representation
                   1477: .ul
                   1478: (-f),
                   1479: and for some sets of patterns will be considerably smaller (and for
                   1480: others, larger).  In general, if the pattern set contains both "keywords"
                   1481: and a catch-all, "identifier" rule, such as in the set:
                   1482: .nf
                   1483: 
                   1484:     "case"    return TOK_CASE;
                   1485:     "switch"  return TOK_SWITCH;
                   1486:     ...
                   1487:     "default" return TOK_DEFAULT;
                   1488:     [a-z]+    return TOK_ID;
                   1489: 
                   1490: .fi
                   1491: then you're better off using the full table representation.  If only
                   1492: the "identifier" rule is present and you then use a hash table or some such
                   1493: to detect the keywords, you're better off using
                   1494: .ul
                   1495: -F.
                   1496: .IP
                   1497: This option is equivalent to
                   1498: .B -CF
                   1499: (see below).
                   1500: .TP
                   1501: .B -I
                   1502: instructs
                   1503: .I flex
                   1504: to generate an
                   1505: .I interactive
                   1506: scanner.  Normally, scanners generated by
                   1507: .I flex
                   1508: always look ahead one
                   1509: character before deciding that a rule has been matched.  At the cost of
                   1510: some scanning overhead,
                   1511: .I flex
                   1512: will generate a scanner which only looks ahead
                   1513: when needed.  Such scanners are called
                   1514: .I interactive
                   1515: because if you want to write a scanner for an interactive system such as a
                   1516: command shell, you will probably want the user's input to be terminated
                   1517: with a newline, and without
                   1518: .B -I
                   1519: the user will have to type a character in addition to the newline in order
                   1520: to have the newline recognized.  This leads to dreadful interactive
                   1521: performance.
                   1522: .IP
                   1523: If all this seems to confusing, here's the general rule: if a human will
                   1524: be typing in input to your scanner, use
                   1525: .B -I,
                   1526: otherwise don't; if you don't care about squeezing the utmost performance
                   1527: from your scanner and you
                   1528: don't want to make any assumptions about the input to your scanner,
                   1529: use
                   1530: .B -I.
                   1531: .IP
                   1532: Note,
                   1533: .B -I
                   1534: cannot be used in conjunction with
                   1535: .I full
                   1536: or
                   1537: .I fast tables,
                   1538: i.e., the
                   1539: .B -f, -F, -Cf,
                   1540: or
                   1541: .B -CF
                   1542: flags.
                   1543: .TP
                   1544: .B -L
                   1545: instructs
                   1546: .I flex
                   1547: not to generate
                   1548: .B #line
                   1549: directives.  Without this option,
                   1550: .I flex
                   1551: peppers the generated scanner
                   1552: with #line directives so error messages in the actions will be correctly
                   1553: located with respect to the original
                   1554: .I flex
                   1555: input file, and not to
                   1556: the fairly meaningless line numbers of
                   1557: .B lex.yy.c.
                   1558: (Unfortunately
                   1559: .I flex
                   1560: does not presently generate the necessary directives
                   1561: to "retarget" the line numbers for those parts of
                   1562: .B lex.yy.c
                   1563: which it generated.  So if there is an error in the generated code,
                   1564: a meaningless line number is reported.)
                   1565: .TP
                   1566: .B -T
                   1567: makes
                   1568: .I flex
                   1569: run in
                   1570: .I trace
                   1571: mode.  It will generate a lot of messages to
                   1572: .I stdout
                   1573: concerning
                   1574: the form of the input and the resultant non-deterministic and deterministic
                   1575: finite automata.  This option is mostly for use in maintaining
                   1576: .I flex.
                   1577: .TP
                   1578: .B -8
                   1579: instructs
                   1580: .I flex
                   1581: to generate an 8-bit scanner, i.e., one which can recognize 8-bit
                   1582: characters.  On some sites,
                   1583: .I flex
                   1584: is installed with this option as the default.  On others, the default
                   1585: is 7-bit characters.  To see which is the case, check the verbose
                   1586: .B (-v)
                   1587: output for "equivalence classes created".  If the denominator of
                   1588: the number shown is 128, then by default
                   1589: .I flex
                   1590: is generating 7-bit characters.  If it is 256, then the default is
                   1591: 8-bit characters and the
                   1592: .B -8
                   1593: flag is not required (but may be a good idea to keep the scanner
                   1594: specification portable).  Feeding a 7-bit scanner 8-bit characters
                   1595: will result in infinite loops, bus errors, or other such fireworks,
                   1596: so when in doubt, use the flag.  Note that if equivalence classes
                   1597: are used, 8-bit scanners take only slightly more table space than
                   1598: 7-bit scanners (128 bytes, to be exact); if equivalence classes are
                   1599: not used, however, then the tables may grow up to twice their
                   1600: 7-bit size.
                   1601: .TP 
                   1602: .B -C[efmF]
                   1603: controls the degree of table compression.
                   1604: .IP
                   1605: .B -Ce
                   1606: directs
                   1607: .I flex
                   1608: to construct
                   1609: .I equivalence classes,
                   1610: i.e., sets of characters
                   1611: which have identical lexical properties (for example, if the only
                   1612: appearance of digits in the
                   1613: .I flex
                   1614: input is in the character class
                   1615: "[0-9]" then the digits '0', '1', ..., '9' will all be put
                   1616: in the same equivalence class).  Equivalence classes usually give
                   1617: dramatic reductions in the final table/object file sizes (typically
                   1618: a factor of 2-5) and are pretty cheap performance-wise (one array
                   1619: look-up per character scanned).
                   1620: .IP
                   1621: .B -Cf
                   1622: specifies that the
                   1623: .I full
                   1624: scanner tables should be generated -
                   1625: .I flex
                   1626: should not compress the
                   1627: tables by taking advantages of similar transition functions for
                   1628: different states.
                   1629: .IP
                   1630: .B -CF
                   1631: specifies that the alternate fast scanner representation (described
                   1632: above under the
                   1633: .B -F
                   1634: flag)
                   1635: should be used.
                   1636: .IP
                   1637: .B -Cm
                   1638: directs
                   1639: .I flex
                   1640: to construct
                   1641: .I meta-equivalence classes,
                   1642: which are sets of equivalence classes (or characters, if equivalence
                   1643: classes are not being used) that are commonly used together.  Meta-equivalence
                   1644: classes are often a big win when using compressed tables, but they
                   1645: have a moderate performance impact (one or two "if" tests and one
                   1646: array look-up per character scanned).
                   1647: .IP
                   1648: A lone
                   1649: .B -C
                   1650: specifies that the scanner tables should be compressed but neither
                   1651: equivalence classes nor meta-equivalence classes should be used.
                   1652: .IP
                   1653: The options
                   1654: .B -Cf
                   1655: or
                   1656: .B -CF
                   1657: and
                   1658: .B -Cm
                   1659: do not make sense together - there is no opportunity for meta-equivalence
                   1660: classes if the table is not being compressed.  Otherwise the options
                   1661: may be freely mixed.
                   1662: .IP
                   1663: The default setting is
                   1664: .B -Cem,
                   1665: which specifies that
                   1666: .I flex
                   1667: should generate equivalence classes
                   1668: and meta-equivalence classes.  This setting provides the highest
                   1669: degree of table compression.  You can trade off
                   1670: faster-executing scanners at the cost of larger tables with
                   1671: the following generally being true:
                   1672: .nf
                   1673: 
                   1674:     slowest & smallest
                   1675:           -Cem
                   1676:           -Cm
                   1677:           -Ce
                   1678:           -C
                   1679:           -C{f,F}e
                   1680:           -C{f,F}
                   1681:     fastest & largest
                   1682: 
                   1683: .fi
                   1684: Note that scanners with the smallest tables are usually generated and
                   1685: compiled the quickest, so
                   1686: during development you will usually want to use the default, maximal
                   1687: compression.
                   1688: .IP
                   1689: .B -Cfe
                   1690: is often a good compromise between speed and size for production
                   1691: scanners.
                   1692: .IP
                   1693: .B -C
                   1694: options are not cumulative; whenever the flag is encountered, the
                   1695: previous -C settings are forgotten.
                   1696: .TP
                   1697: .B -Sskeleton_file
                   1698: overrides the default skeleton file from which
                   1699: .I flex
                   1700: constructs its scanners.  You'll never need this option unless you are doing
                   1701: .I flex
                   1702: maintenance or development.
                   1703: .SH PERFORMANCE CONSIDERATIONS
                   1704: The main design goal of
                   1705: .I flex
                   1706: is that it generate high-performance scanners.  It has been optimized
                   1707: for dealing well with large sets of rules.  Aside from the effects
                   1708: of table compression on scanner speed outlined above,
                   1709: there are a number of options/actions which degrade performance.  These
                   1710: are, from most expensive to least:
                   1711: .nf
                   1712: 
                   1713:     REJECT
                   1714: 
                   1715:     pattern sets that require backtracking
                   1716:     arbitrary trailing context
                   1717: 
                   1718:     '^' beginning-of-line operator
                   1719:     yymore()
                   1720: 
                   1721: .fi
                   1722: with the first three all being quite expensive and the last two
                   1723: being quite cheap.
                   1724: .LP
                   1725: .B REJECT
                   1726: should be avoided at all costs when performance is important.
                   1727: It is a particularly expensive option.
                   1728: .LP
                   1729: Getting rid of backtracking is messy and often may be an enormous
                   1730: amount of work for a complicated scanner.  In principal, one begins
                   1731: by using the
                   1732: .B -b 
                   1733: flag to generate a
                   1734: .I lex.backtrack
                   1735: file.  For example, on the input
                   1736: .nf
                   1737: 
                   1738:     %%
                   1739:     foo        return TOK_KEYWORD;
                   1740:     foobar     return TOK_KEYWORD;
                   1741: 
                   1742: .fi
                   1743: the file looks like:
                   1744: .nf
                   1745: 
                   1746:     State #6 is non-accepting -
                   1747:      associated rule line numbers:
                   1748:            2       3
                   1749:      out-transitions: [ o ]
                   1750:      jam-transitions: EOF [ \\001-n  p-\\177 ]
                   1751: 
                   1752:     State #8 is non-accepting -
                   1753:      associated rule line numbers:
                   1754:            3
                   1755:      out-transitions: [ a ]
                   1756:      jam-transitions: EOF [ \\001-`  b-\\177 ]
                   1757: 
                   1758:     State #9 is non-accepting -
                   1759:      associated rule line numbers:
                   1760:            3
                   1761:      out-transitions: [ r ]
                   1762:      jam-transitions: EOF [ \\001-q  s-\\177 ]
                   1763: 
                   1764:     Compressed tables always backtrack.
                   1765: 
                   1766: .fi
                   1767: The first few lines tell us that there's a scanner state in
                   1768: which it can make a transition on an 'o' but not on any other
                   1769: character, and that in that state the currently scanned text does not match
                   1770: any rule.  The state occurs when trying to match the rules found
                   1771: at lines 2 and 3 in the input file.
                   1772: If the scanner is in that state and then reads
                   1773: something other than an 'o', it will have to backtrack to find
                   1774: a rule which is matched.  With
                   1775: a bit of headscratching one can see that this must be the
                   1776: state it's in when it has seen "fo".  When this has happened,
                   1777: if anything other than another 'o' is seen, the scanner will
                   1778: have to back up to simply match the 'f' (by the default rule).
                   1779: .LP
                   1780: The comment regarding State #8 indicates there's a problem
                   1781: when "foob" has been scanned.  Indeed, on any character other
                   1782: than a 'b', the scanner will have to back up to accept "foo".
                   1783: Similarly, the comment for State #9 concerns when "fooba" has
                   1784: been scanned.
                   1785: .LP
                   1786: The final comment reminds us that there's no point going to
                   1787: all the trouble of removing backtracking from the rules unless
                   1788: we're using
                   1789: .B -f
                   1790: or
                   1791: .B -F,
                   1792: since there's no performance gain doing so with compressed scanners.
                   1793: .LP
                   1794: The way to remove the backtracking is to add "error" rules:
                   1795: .nf
                   1796: 
                   1797:     %%
                   1798:     foo         return TOK_KEYWORD;
                   1799:     foobar      return TOK_KEYWORD;
                   1800: 
                   1801:     fooba       |
                   1802:     foob        |
                   1803:     fo          {
                   1804:                 /* false alarm, not really a keyword */
                   1805:                 return TOK_ID;
                   1806:                 }
                   1807: 
                   1808: .fi
                   1809: .LP
                   1810: Eliminating backtracking among a list of keywords can also be
                   1811: done using a "catch-all" rule:
                   1812: .nf
                   1813: 
                   1814:     %%
                   1815:     foo         return TOK_KEYWORD;
                   1816:     foobar      return TOK_KEYWORD;
                   1817: 
                   1818:     [a-z]+      return TOK_ID;
                   1819: 
                   1820: .fi
                   1821: This is usually the best solution when appropriate.
                   1822: .LP
                   1823: Backtracking messages tend to cascade.
                   1824: With a complicated set of rules it's not uncommon to get hundreds
                   1825: of messages.  If one can decipher them, though, it often
                   1826: only takes a dozen or so rules to eliminate the backtracking (though
                   1827: it's easy to make a mistake and have an error rule accidentally match
                   1828: a valid token.  A possible future
                   1829: .I flex
                   1830: feature will be to automatically add rules to eliminate backtracking).
                   1831: .LP
                   1832: .I Variable
                   1833: trailing context (where both the leading and trailing parts do not have
                   1834: a fixed length) entails almost the same performance loss as
                   1835: .I REJECT
                   1836: (i.e., substantial).  So when possible a rule like:
                   1837: .nf
                   1838: 
                   1839:     %%
                   1840:     mouse|rat/(cat|dog)   run();
                   1841: 
                   1842: .fi
                   1843: is better written:
                   1844: .nf
                   1845: 
                   1846:     %%
                   1847:     mouse/cat|dog         run();
                   1848:     rat/cat|dog           run();
                   1849: 
                   1850: .fi
                   1851: or as
                   1852: .nf
                   1853: 
                   1854:     %%
                   1855:     mouse|rat/cat         run();
                   1856:     mouse|rat/dog         run();
                   1857: 
                   1858: .fi
                   1859: Note that here the special '|' action does
                   1860: .I not
                   1861: provide any savings, and can even make things worse (see
                   1862: .B BUGS
                   1863: in flex(1)).
                   1864: .LP
                   1865: Another area where the user can increase a scanner's performance
                   1866: (and one that's easier to implement) arises from the fact that
                   1867: the longer the tokens matched, the faster the scanner will run.
                   1868: This is because with long tokens the processing of most input
                   1869: characters takes place in the (short) inner scanning loop, and
                   1870: does not often have to go through the additional work of setting up
                   1871: the scanning environment (e.g.,
                   1872: .B yytext)
                   1873: for the action.  Recall the scanner for C comments:
                   1874: .nf
                   1875: 
                   1876:     %x comment
                   1877:     %%
                   1878:             int line_num = 1;
                   1879: 
                   1880:     "/*"         BEGIN(comment);
                   1881: 
                   1882:     <comment>[^*\\n]*
                   1883:     <comment>"*"+[^*/\\n]*
                   1884:     <comment>\\n             ++line_num;
                   1885:     <comment>"*"+"/"        BEGIN(INITIAL);
                   1886: 
                   1887: .fi
                   1888: This could be sped up by writing it as:
                   1889: .nf
                   1890: 
                   1891:     %x comment
                   1892:     %%
                   1893:             int line_num = 1;
                   1894: 
                   1895:     "/*"         BEGIN(comment);
                   1896: 
                   1897:     <comment>[^*\\n]*
                   1898:     <comment>[^*\\n]*\\n      ++line_num;
                   1899:     <comment>"*"+[^*/\\n]*
                   1900:     <comment>"*"+[^*/\\n]*\\n ++line_num;
                   1901:     <comment>"*"+"/"        BEGIN(INITIAL);
                   1902: 
                   1903: .fi
                   1904: Now instead of each newline requiring the processing of another
                   1905: action, recognizing the newlines is "distributed" over the other rules
                   1906: to keep the matched text as long as possible.  Note that
                   1907: .I adding
                   1908: rules does
                   1909: .I not
                   1910: slow down the scanner!  The speed of the scanner is independent
                   1911: of the number of rules or (modulo the considerations given at the
                   1912: beginning of this section) how complicated the rules are with
                   1913: regard to operators such as '*' and '|'.
                   1914: .LP
                   1915: A final example in speeding up a scanner: suppose you want to scan
                   1916: through a file containing identifiers and keywords, one per line
                   1917: and with no other extraneous characters, and recognize all the
                   1918: keywords.  A natural first approach is:
                   1919: .nf
                   1920: 
                   1921:     %%
                   1922:     asm      |
                   1923:     auto     |
                   1924:     break    |
                   1925:     ... etc ...
                   1926:     volatile |
                   1927:     while    /* it's a keyword */
                   1928: 
                   1929:     .|\\n     /* it's not a keyword */
                   1930: 
                   1931: .fi
                   1932: To eliminate the back-tracking, introduce a catch-all rule:
                   1933: .nf
                   1934: 
                   1935:     %%
                   1936:     asm      |
                   1937:     auto     |
                   1938:     break    |
                   1939:     ... etc ...
                   1940:     volatile |
                   1941:     while    /* it's a keyword */
                   1942: 
                   1943:     [a-z]+   |
                   1944:     .|\\n     /* it's not a keyword */
                   1945: 
                   1946: .fi
                   1947: Now, if it's guaranteed that there's exactly one word per line,
                   1948: then we can reduce the total number of matches by a half by
                   1949: merging in the recognition of newlines with that of the other
                   1950: tokens:
                   1951: .nf
                   1952: 
                   1953:     %%
                   1954:     asm\\n    |
                   1955:     auto\\n   |
                   1956:     break\\n  |
                   1957:     ... etc ...
                   1958:     volatile\\n |
                   1959:     while\\n  /* it's a keyword */
                   1960: 
                   1961:     [a-z]+\\n |
                   1962:     .|\\n     /* it's not a keyword */
                   1963: 
                   1964: .fi
                   1965: One has to be careful here, as we have now reintroduced backtracking
                   1966: into the scanner.  In particular, while
                   1967: .I we
                   1968: know that there will never be any characters in the input stream
                   1969: other than letters or newlines,
                   1970: .I flex
                   1971: can't figure this out, and it will plan for possibly needing backtracking
                   1972: when it has scanned a token like "auto" and then the next character
                   1973: is something other than a newline or a letter.  Previously it would
                   1974: then just match the "auto" rule and be done, but now it has no "auto"
                   1975: rule, only a "auto\\n" rule.  To eliminate the possibility of backtracking,
                   1976: we could either duplicate all rules but without final newlines, or,
                   1977: since we never expect to encounter such an input and therefore don't
                   1978: how it's classified, we can introduce one more catch-all rule, this
                   1979: one which doesn't include a newline:
                   1980: .nf
                   1981: 
                   1982:     %%
                   1983:     asm\\n    |
                   1984:     auto\\n   |
                   1985:     break\\n  |
                   1986:     ... etc ...
                   1987:     volatile\\n |
                   1988:     while\\n  /* it's a keyword */
                   1989: 
                   1990:     [a-z]+\\n |
                   1991:     [a-z]+   |
                   1992:     .|\\n     /* it's not a keyword */
                   1993: 
                   1994: .fi
                   1995: Compiled with
                   1996: .B -Cf,
                   1997: this is about as fast as one can get a
                   1998: .I flex 
                   1999: scanner to go for this particular problem.
                   2000: .LP
                   2001: A final note:
                   2002: .I flex
                   2003: is slow when matching NUL's, particularly when a token contains
                   2004: multiple NUL's.
                   2005: It's best to write rules which match
                   2006: .I short
                   2007: amounts of text if it's anticipated that the text will often include NUL's.
                   2008: .SH INCOMPATIBILITIES WITH LEX AND POSIX
                   2009: .I flex
                   2010: is a rewrite of the Unix
                   2011: .I lex
                   2012: tool (the two implementations do not share any code, though),
                   2013: with some extensions and incompatibilities, both of which
                   2014: are of concern to those who wish to write scanners acceptable
                   2015: to either implementation.  At present, the POSIX
                   2016: .I lex
                   2017: draft is
                   2018: very close to the original
                   2019: .I lex
                   2020: implementation, so some of these
                   2021: incompatibilities are also in conflict with the POSIX draft.  But
                   2022: the intent is that except as noted below,
                   2023: .I flex
                   2024: as it presently stands will
                   2025: ultimately be POSIX conformant (i.e., that those areas of conflict with
                   2026: the POSIX draft will be resolved in
                   2027: .I flex's
                   2028: favor).  Please bear in
                   2029: mind that all the comments which follow are with regard to the POSIX
                   2030: .I draft
                   2031: standard of Summer 1989, and not the final document (or subsequent
                   2032: drafts); they are included so
                   2033: .I flex
                   2034: users can be aware of the standardization issues and those areas where
                   2035: .I flex
                   2036: may in the near future undergo changes incompatible with
                   2037: its current definition.
                   2038: .LP
                   2039: .I flex
                   2040: is fully compatible with
                   2041: .I lex
                   2042: with the following exceptions:
                   2043: .IP -
                   2044: .I lex
                   2045: does not support exclusive start conditions (%x), though they
                   2046: are in the current POSIX draft.
                   2047: .IP -
                   2048: When definitions are expanded,
                   2049: .I flex
                   2050: encloses them in parentheses.
                   2051: With lex, the following:
                   2052: .nf
                   2053: 
                   2054:     NAME    [A-Z][A-Z0-9]*
                   2055:     %%
                   2056:     foo{NAME}?      printf( "Found it\\n" );
                   2057:     %%
                   2058: 
                   2059: .fi
                   2060: will not match the string "foo" because when the macro
                   2061: is expanded the rule is equivalent to "foo[A-Z][A-Z0-9]*?"
                   2062: and the precedence is such that the '?' is associated with
                   2063: "[A-Z0-9]*".  With
                   2064: .I flex,
                   2065: the rule will be expanded to
                   2066: "foo([A-Z][A-Z0-9]*)?" and so the string "foo" will match.
                   2067: Note that because of this, the
                   2068: .B ^, $, <s>, /,
                   2069: and
                   2070: .B <<EOF>>
                   2071: operators cannot be used in a
                   2072: .I flex
                   2073: definition.
                   2074: .IP
                   2075: The POSIX draft interpretation is the same as
                   2076: .I flex's.
                   2077: .IP -
                   2078: To specify a character class which matches anything but a left bracket (']'),
                   2079: in
                   2080: .I lex
                   2081: one can use "[^]]" but with
                   2082: .I flex
                   2083: one must use "[^\\]]".  The latter works with
                   2084: .I lex,
                   2085: too.
                   2086: .IP -
                   2087: The undocumented
                   2088: .I lex
                   2089: scanner internal variable
                   2090: .B yylineno
                   2091: is not supported.  (The variable is not part of the POSIX draft.)
                   2092: .IP -
                   2093: The
                   2094: .B input()
                   2095: routine is not redefinable, though it may be called to read characters
                   2096: following whatever has been matched by a rule.  If
                   2097: .B input()
                   2098: encounters an end-of-file the normal
                   2099: .B yywrap()
                   2100: processing is done.  A ``real'' end-of-file is returned by
                   2101: .B input()
                   2102: as
                   2103: .I EOF.
                   2104: .IP
                   2105: Input is instead controlled by redefining the
                   2106: .B YY_INPUT
                   2107: macro.
                   2108: .IP
                   2109: The
                   2110: .I flex
                   2111: restriction that
                   2112: .B input()
                   2113: cannot be redefined is in accordance with the POSIX draft, but
                   2114: .B YY_INPUT
                   2115: has not yet been accepted into the draft.
                   2116: .IP -
                   2117: .B output()
                   2118: is not supported.
                   2119: Output from the
                   2120: .B ECHO
                   2121: macro is done to the file-pointer
                   2122: .I yyout
                   2123: (default
                   2124: .I stdout).
                   2125: .IP
                   2126: The POSIX draft mentions that an
                   2127: .B output()
                   2128: routine exists but currently gives no details as to what it does.
                   2129: .IP -
                   2130: The
                   2131: .I lex
                   2132: .B %r
                   2133: (generate a Ratfor scanner) option is not supported.  It is not part
                   2134: of the POSIX draft.
                   2135: .IP -
                   2136: If you are providing your own yywrap() routine, you must include a
                   2137: "#undef yywrap" in the definitions section (section 1).  Note that
                   2138: the "#undef" will have to be enclosed in %{}'s.
                   2139: .IP
                   2140: The POSIX draft
                   2141: specifies that yywrap() is a function and this is unlikely to change; so
                   2142: .I flex users are warned
                   2143: that
                   2144: .B yywrap()
                   2145: is likely to be changed to a function in the near future.
                   2146: .IP -
                   2147: After a call to
                   2148: .B unput(),
                   2149: .I yytext
                   2150: and
                   2151: .I yyleng
                   2152: are undefined until the next token is matched.  This is not the case with
                   2153: .I lex
                   2154: or the present POSIX draft.
                   2155: .IP -
                   2156: The precedence of the
                   2157: .B {}
                   2158: (numeric range) operator is different.
                   2159: .I lex
                   2160: interprets "abc{1,3}" as "match one, two, or
                   2161: three occurrences of 'abc'", whereas
                   2162: .I flex
                   2163: interprets it as "match 'ab'
                   2164: followed by one, two, or three occurrences of 'c'".  The latter is
                   2165: in agreement with the current POSIX draft.
                   2166: .IP -
                   2167: The precedence of the
                   2168: .B ^
                   2169: operator is different.
                   2170: .I lex
                   2171: interprets "^foo|bar" as "match either 'foo' at the beginning of a line,
                   2172: or 'bar' anywhere", whereas
                   2173: .I flex
                   2174: interprets it as "match either 'foo' or 'bar' if they come at the beginning
                   2175: of a line".  The latter is in agreement with the current POSIX draft.
                   2176: .IP -
                   2177: To refer to yytext outside of the scanner source file,
                   2178: the correct definition with
                   2179: .I flex
                   2180: is "extern char *yytext" rather than "extern char yytext[]".
                   2181: This is contrary to the current POSIX draft but a point on which
                   2182: .I flex
                   2183: will not be changing, as the array representation entails a
                   2184: serious performance penalty.  It is hoped that the POSIX draft will
                   2185: be emended to support the
                   2186: .I flex
                   2187: variety of declaration (as this is a fairly painless change to
                   2188: require of
                   2189: .I lex
                   2190: users).
                   2191: .IP -
                   2192: .I yyin
                   2193: is
                   2194: .I initialized
                   2195: by
                   2196: .I lex
                   2197: to be
                   2198: .I stdin;
                   2199: .I flex,
                   2200: on the other hand,
                   2201: initializes
                   2202: .I yyin
                   2203: to NULL
                   2204: and then
                   2205: .I assigns
                   2206: it to
                   2207: .I stdin
                   2208: the first time the scanner is called, providing
                   2209: .I yyin
                   2210: has not already been assigned to a non-NULL value.  The difference is
                   2211: subtle, but the net effect is that with
                   2212: .I flex
                   2213: scanners,
                   2214: .I yyin
                   2215: does not have a valid value until the scanner has been called.
                   2216: .IP -
                   2217: The special table-size declarations such as
                   2218: .B %a
                   2219: supported by
                   2220: .I lex
                   2221: are not required by
                   2222: .I flex
                   2223: scanners;
                   2224: .I flex
                   2225: ignores them.
                   2226: .IP -
                   2227: The name
                   2228: .bd
                   2229: FLEX_SCANNER
                   2230: is #define'd so scanners may be written for use with either
                   2231: .I flex
                   2232: or
                   2233: .I lex.
                   2234: .LP
                   2235: The following
                   2236: .I flex
                   2237: features are not included in
                   2238: .I lex
                   2239: or the POSIX draft standard:
                   2240: .nf
                   2241: 
                   2242:     yyterminate()
                   2243:     <<EOF>>
                   2244:     YY_DECL
                   2245:     #line directives
                   2246:     %{}'s around actions
                   2247:     yyrestart()
                   2248:     comments beginning with '#' (deprecated)
                   2249:     multiple actions on a line
                   2250: 
                   2251: .fi
                   2252: This last feature refers to the fact that with
                   2253: .I flex
                   2254: you can put multiple actions on the same line, separated with
                   2255: semi-colons, while with
                   2256: .I lex,
                   2257: the following
                   2258: .nf
                   2259: 
                   2260:     foo    handle_foo(); ++num_foos_seen;
                   2261: 
                   2262: .fi
                   2263: is (rather surprisingly) truncated to
                   2264: .nf
                   2265: 
                   2266:     foo    handle_foo();
                   2267: 
                   2268: .fi
                   2269: .I flex
                   2270: does not truncate the action.  Actions that are not enclosed in
                   2271: braces are simply terminated at the end of the line.
                   2272: .SH DIAGNOSTICS
                   2273: .I reject_used_but_not_detected undefined
                   2274: or
                   2275: .I yymore_used_but_not_detected undefined -
                   2276: These errors can occur at compile time.  They indicate that the
                   2277: scanner uses
                   2278: .B REJECT
                   2279: or
                   2280: .B yymore()
                   2281: but that
                   2282: .I flex
                   2283: failed to notice the fact, meaning that
                   2284: .I flex
                   2285: scanned the first two sections looking for occurrences of these actions
                   2286: and failed to find any, but somehow you snuck some in (via a #include
                   2287: file, for example).  Make an explicit reference to the action in your
                   2288: .I flex
                   2289: input file.  (Note that previously
                   2290: .I flex
                   2291: supported a
                   2292: .B %used/%unused
                   2293: mechanism for dealing with this problem; this feature is still supported
                   2294: but now deprecated, and will go away soon unless the author hears from
                   2295: people who can argue compellingly that they need it.)
                   2296: .LP
                   2297: .I flex scanner jammed -
                   2298: a scanner compiled with
                   2299: .B -s
                   2300: has encountered an input string which wasn't matched by
                   2301: any of its rules.
                   2302: .LP
                   2303: .I flex input buffer overflowed -
                   2304: a scanner rule matched a string long enough to overflow the
                   2305: scanner's internal input buffer (16K bytes by default - controlled by
                   2306: .B YY_BUF_SIZE
                   2307: in "flex.skel".  Note that to redefine this macro, you must first
                   2308: .B #undefine
                   2309: it).
                   2310: .LP
                   2311: .I scanner requires -8 flag -
                   2312: Your scanner specification includes recognizing 8-bit characters and
                   2313: you did not specify the -8 flag (and your site has not installed flex
                   2314: with -8 as the default).
                   2315: .LP
                   2316: .I too many %t classes! -
                   2317: You managed to put every single character into its own %t class.
                   2318: .I flex
                   2319: requires that at least one of the classes share characters.
                   2320: .SH DEFICIENCIES / BUGS
                   2321: See flex(1).
                   2322: .SH "SEE ALSO"
                   2323: .LP
                   2324: flex(1), lex(1), yacc(1), sed(1), awk(1).
                   2325: .LP
                   2326: M. E. Lesk and E. Schmidt,
                   2327: .I LEX - Lexical Analyzer Generator
                   2328: .SH AUTHOR
                   2329: Vern Paxson, with the help of many ideas and much inspiration from
                   2330: Van Jacobson.  Original version by Jef Poskanzer.  The fast table
                   2331: representation is a partial implementation of a design done by Van
                   2332: Jacobson.  The implementation was done by Kevin Gong and Vern Paxson.
                   2333: .LP
                   2334: Thanks to the many
                   2335: .I flex
                   2336: beta-testers, feedbackers, and contributors, especially Casey
                   2337: Leedom, [email protected],
                   2338: Frederic Brehm, Nick Christopher, Jason Coughlin,
                   2339: Scott David Daniels, Leo Eskin,
                   2340: Chris Faylor, Eric Goldman, Eric
                   2341: Hughes, Jeffrey R. Jones, Kevin B. Kenny, Ronald Lamprecht,
                   2342: Greg Lee, Craig Leres, Mohamed el Lozy, Jim Meyering, Marc Nozell, Esmond Pitt,
                   2343: Jef Poskanzer, Jim Roskind,
                   2344: Dave Tallman, Frank Whaley, Ken Yap, and those whose names
                   2345: have slipped my marginal mail-archiving skills but whose contributions
                   2346: are appreciated all the same.
                   2347: .LP
                   2348: Thanks to Keith Bostic, John Gilmore, Craig Leres, Bob
                   2349: Mulcahy, Rich Salz, and Richard Stallman for help with various distribution
                   2350: headaches.
                   2351: .LP
                   2352: Thanks to Esmond Pitt and Earle Horton for 8-bit character support;
                   2353: to Benson Margulies and Fred
                   2354: Burke for C++ support; to Ove Ewerlid for the basics of support for
                   2355: NUL's; and to Eric Hughes for the basics of support for multiple buffers.
                   2356: .LP
                   2357: Work is being done on extending
                   2358: .I flex
                   2359: to generate scanners in which the
                   2360: state machine is directly represented in C code rather than tables.
                   2361: These scanners may well be substantially faster than those generated
                   2362: using -f or -F.  If you are working in this area and are interested
                   2363: in comparing notes and seeing whether redundant work can be avoided,
                   2364: contact Ove Ewerlid ([email protected]).
                   2365: .LP
                   2366: This work was primarily done when I was at the Real Time Systems Group
                   2367: at the Lawrence Berkeley Laboratory in Berkeley, CA.  Many thanks to all there
                   2368: for the support I received.
                   2369: .LP
                   2370: Send comments to:
                   2371: .nf
                   2372: 
                   2373:      Vern Paxson
                   2374:      Computer Science Department
                   2375:      4126 Upson Hall
                   2376:      Cornell University
                   2377:      Ithaca, NY 14853-7501
                   2378: 
                   2379:      [email protected]
                   2380:      decvax!cornell!vern
                   2381: 
                   2382: .fi

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.