Annotation of researchv10dc/cmd/flex/flex.1, revision 1.1.1.1

1.1       root        1: .TH FLEX 1 "20 June 1989" "Version 2.1"
                      2: .SH NAME
                      3: flex - fast lexical analyzer generator
                      4: .SH SYNOPSIS
                      5: .B flex
                      6: [
                      7: .B -bdfipstvFILT -c[efmF] -Sskeleton_file
                      8: ] [ 
                      9: .I filename
                     10: ]
                     11: .SH DESCRIPTION
                     12: .I flex
                     13: is a rewrite of
                     14: .I lex
                     15: intended to right some of that tool's deficiencies: in particular,
                     16: .I flex
                     17: generates lexical analyzers much faster, and the analyzers use
                     18: smaller tables and run faster.
                     19: .SH OPTIONS
                     20: In addition to lex's
                     21: .B -t
                     22: flag, flex has the following options:
                     23: .TP
                     24: .B -b
                     25: Generate backtracking information to
                     26: .I lex.backtrack.
                     27: This is a list of scanner states which require backtracking
                     28: and the input characters on which they do so.  By adding rules one
                     29: can remove backtracking states.  If all backtracking states
                     30: are eliminated and
                     31: .B -f
                     32: or
                     33: .B -F
                     34: is used, the generated scanner will run faster (see the
                     35: .B -p
                     36: flag).  Only users who wish to squeeze every last cycle out of their
                     37: scanners need worry about this option.
                     38: .TP
                     39: .B -d
                     40: makes the generated scanner run in
                     41: .I debug
                     42: mode.  Whenever a pattern is recognized the scanner will
                     43: write to
                     44: .I stderr
                     45: a line of the form:
                     46: .nf
                     47: 
                     48:     --accepting rule #n
                     49: 
                     50: .fi
                     51: Rules are numbered sequentially with the first one being 1.  Rule #0
                     52: is executed when the scanner backtracks; Rule #(n+1) (where
                     53: .I n
                     54: is the number of rules) indicates the default action; Rule #(n+2) indicates
                     55: that the input buffer is empty and needs to be refilled and then the scan
                     56: restarted.  Rules beyond (n+2) are end-of-file actions.
                     57: .TP
                     58: .B -f
                     59: has the same effect as lex's -f flag (do not compress the scanner
                     60: tables); the mnemonic changes from
                     61: .I fast compilation
                     62: to (take your pick)
                     63: .I full table
                     64: or
                     65: .I fast scanner.
                     66: The actual compilation takes
                     67: .I longer,
                     68: since flex is I/O bound writing out the big table.
                     69: .IP
                     70: This option is equivalent to
                     71: .B -cf
                     72: (see below).
                     73: .TP
                     74: .B -i
                     75: instructs flex to generate a
                     76: .I case-insensitive
                     77: scanner.  The case of letters given in the flex input patterns will
                     78: be ignored, and the rules will be matched regardless of case.  The
                     79: matched text given in
                     80: .I yytext
                     81: will have the preserved case (i.e., it will not be folded).
                     82: .TP
                     83: .B -p
                     84: generates a performance report to stderr.  The report
                     85: consists of comments regarding features of the flex input file
                     86: which will cause a loss of performance in the resulting scanner.
                     87: Note that the use of
                     88: .I REJECT
                     89: and variable trailing context (see
                     90: .B BUGS)
                     91: entails a substantial performance penalty; use of
                     92: .I yymore(),
                     93: the
                     94: .B ^
                     95: operator,
                     96: and the
                     97: .B -I
                     98: flag entail minor performance penalties.
                     99: .TP
                    100: .B -s
                    101: causes the
                    102: .I default rule
                    103: (that unmatched scanner input is echoed to
                    104: .I stdout)
                    105: to be suppressed.  If the scanner encounters input that does not
                    106: match any of its rules, it aborts with an error.  This option is
                    107: useful for finding holes in a scanner's rule set.
                    108: .TP
                    109: .B -v
                    110: has the same meaning as for lex (print to
                    111: .I stderr
                    112: a summary of statistics of the generated scanner).  Many more statistics
                    113: are printed, though, and the summary spans several lines.  Most
                    114: of the statistics are meaningless to the casual flex user, but the
                    115: first line identifies the version of flex, which is useful for figuring
                    116: out where you stand with respect to patches and new releases.
                    117: .TP
                    118: .B -F
                    119: specifies that the
                    120: .ul
                    121: fast
                    122: scanner table representation should be used.  This representation is
                    123: about as fast as the full table representation
                    124: .ul
                    125: (-f),
                    126: and for some sets of patterns will be considerably smaller (and for
                    127: others, larger).  In general, if the pattern set contains both "keywords"
                    128: and a catch-all, "identifier" rule, such as in the set:
                    129: .nf
                    130: 
                    131:        "case"    return ( TOK_CASE );
                    132:        "switch"  return ( TOK_SWITCH );
                    133:        ...
                    134:        "default" return ( TOK_DEFAULT );
                    135:        [a-z]+    return ( TOK_ID );
                    136: 
                    137: .fi
                    138: then you're better off using the full table representation.  If only
                    139: the "identifier" rule is present and you then use a hash table or some such
                    140: to detect the keywords, you're better off using
                    141: .ul
                    142: -F.
                    143: .IP
                    144: This option is equivalent to
                    145: .B -cF
                    146: (see below).
                    147: .TP
                    148: .B -I
                    149: instructs flex to generate an
                    150: .I interactive
                    151: scanner.  Normally, scanners generated by flex always look ahead one
                    152: character before deciding that a rule has been matched.  At the cost of
                    153: some scanning overhead, flex will generate a scanner which only looks ahead
                    154: when needed.  Such scanners are called
                    155: .I interactive
                    156: because if you want to write a scanner for an interactive system such as a
                    157: command shell, you will probably want the user's input to be terminated
                    158: with a newline, and without
                    159: .B -I
                    160: the user will have to type a character in addition to the newline in order
                    161: to have the newline recognized.  This leads to dreadful interactive
                    162: performance.
                    163: .IP
                    164: If all this seems to confusing, here's the general rule: if a human will
                    165: be typing in input to your scanner, use
                    166: .B -I,
                    167: otherwise don't; if you don't care about how fast your scanners run and
                    168: don't want to make any assumptions about the input to your scanner,
                    169: always use
                    170: .B -I.
                    171: .IP
                    172: Note,
                    173: .B -I
                    174: cannot be used in conjunction with
                    175: .I full
                    176: or
                    177: .I fast tables,
                    178: i.e., the
                    179: .B -f, -F, -cf,
                    180: or
                    181: .B -cF
                    182: flags.
                    183: .TP
                    184: .B -L
                    185: instructs flex to not generate
                    186: .B #line
                    187: directives (see below).
                    188: .TP
                    189: .B -T
                    190: makes flex run in
                    191: .I trace
                    192: mode.  It will generate a lot of messages to stdout concerning
                    193: the form of the input and the resultant non-deterministic and deterministic
                    194: finite automatons.  This option is mostly for use in maintaining flex.
                    195: .TP 
                    196: .B -c[efmF]
                    197: controls the degree of table compression.
                    198: .B -ce
                    199: directs flex to construct
                    200: .I equivalence classes,
                    201: i.e., sets of characters
                    202: which have identical lexical properties (for example, if the only
                    203: appearance of digits in the flex input is in the character class
                    204: "[0-9]" then the digits '0', '1', ..., '9' will all be put
                    205: in the same equivalence class).
                    206: .B -cf
                    207: specifies that the
                    208: .I full
                    209: scanner tables should be generated - flex should not compress the
                    210: tables by taking advantages of similar transition functions for
                    211: different states.
                    212: .B -cF
                    213: specifies that the alternate fast scanner representation (described
                    214: above under the
                    215: .B -F
                    216: flag)
                    217: should be used.
                    218: .B -cm
                    219: directs flex to construct
                    220: .I meta-equivalence classes,
                    221: which are sets of equivalence classes (or characters, if equivalence
                    222: classes are not being used) that are commonly used together.
                    223: A lone
                    224: .B -c
                    225: specifies that the scanner tables should be compressed but neither
                    226: equivalence classes nor meta-equivalence classes should be used.
                    227: .IP
                    228: The options
                    229: .B -cf
                    230: or
                    231: .B -cF
                    232: and
                    233: .B -cm
                    234: do not make sense together - there is no opportunity for meta-equivalence
                    235: classes if the table is not being compressed.  Otherwise the options
                    236: may be freely mixed.
                    237: .IP
                    238: The default setting is
                    239: .B -cem
                    240: which specifies that flex should generate equivalence classes
                    241: and meta-equivalence classes.  This setting provides the highest
                    242: degree of table compression.  You can trade off
                    243: faster-executing scanners at the cost of larger tables with
                    244: the following generally being true:
                    245: .nf
                    246: 
                    247:     slowest            smallest
                    248:                -cem
                    249:                -ce
                    250:                -cm
                    251:                -c
                    252:                -c{f,F}e
                    253:                -c{f,F}
                    254:     fastest            largest
                    255: 
                    256: .fi
                    257: Note that scanners with the smallest tables compile the quickest, so
                    258: during development you will usually want to use the default, maximal
                    259: compression.
                    260: .TP
                    261: .B -Sskeleton_file
                    262: overrides the default skeleton file from which flex constructs
                    263: its scanners.  You'll never need this option unless you are doing
                    264: flex maintenance or development.
                    265: .SH INCOMPATIBILITIES WITH LEX
                    266: .I flex
                    267: is fully compatible with
                    268: .I lex
                    269: with the following exceptions:
                    270: .IP -
                    271: There is no run-time library to link with.  You needn't
                    272: specify
                    273: .I -ll
                    274: when linking, and you must supply a main program.  (Hacker's note: since
                    275: the lex library contains a main() which simply calls yylex(), you actually
                    276: .I can
                    277: be lazy and not supply your own main program and link with
                    278: .I -ll.)
                    279: .IP -
                    280: lex's
                    281: .B %r
                    282: (Ratfor scanners) and
                    283: .B %t
                    284: (translation table) options
                    285: are not supported.
                    286: .IP -
                    287: The do-nothing
                    288: .ul
                    289: -n
                    290: flag is not supported.
                    291: .IP -
                    292: When definitions are expanded, flex encloses them in parentheses.
                    293: With lex, the following
                    294: .nf
                    295: 
                    296:     NAME    [A-Z][A-Z0-9]*
                    297:     %%
                    298:     foo{NAME}?      printf( "Found it\\n" );
                    299:     %%
                    300: 
                    301: .fi
                    302: will not match the string "foo" because when the macro
                    303: is expanded the rule is equivalent to "foo[A-Z][A-Z0-9]*?"
                    304: and the precedence is such that the '?' is associated with
                    305: "[A-Z0-9]*".  With flex, the rule will be expanded to
                    306: "foo([A-z][A-Z0-9]*)?" and so the string "foo" will match.
                    307: Note that because of this, the
                    308: .B ^, $, <s>,
                    309: and
                    310: .B /
                    311: operators cannot be used in a definition.
                    312: .IP -
                    313: The undocumented lex-scanner internal variable
                    314: .B yylineno
                    315: is not supported.
                    316: .IP -
                    317: The
                    318: .B input()
                    319: routine is not redefinable, though may be called to read characters
                    320: following whatever has been matched by a rule.  If
                    321: .B input()
                    322: encounters an end-of-file the normal
                    323: .B yywrap()
                    324: processing is done.  A ``real'' end-of-file is returned as
                    325: .I EOF.
                    326: .IP
                    327: Input can be controlled by redefining the
                    328: .B YY_INPUT
                    329: macro.
                    330: YY_INPUT's calling sequence is "YY_INPUT(buf,result,max_size)".  Its
                    331: action is to place up to max_size characters in the character buffer "buf"
                    332: and return in the integer variable "result" either the
                    333: number of characters read or the constant YY_NULL (0 on Unix systems)
                    334: systems) to indicate EOF.  The default YY_INPUT reads from the
                    335: file-pointer "yyin" (which is by default
                    336: .I stdin),
                    337: so if you
                    338: just want to change the input file, you needn't redefine
                    339: YY_INPUT - just point yyin at the input file.
                    340: .IP
                    341: A sample redefinition of YY_INPUT (in the first section of the input
                    342: file):
                    343: .nf
                    344: 
                    345:     %{
                    346:     #undef YY_INPUT
                    347:     #define YY_INPUT(buf,result,max_size) \\
                    348:         result = (buf[0] = getchar()) == EOF ? YY_NULL : 1;
                    349:     %}
                    350: 
                    351: .fi
                    352: You also can add in things like counting keeping track of the
                    353: input line number this way; but don't expect your scanner to
                    354: go very fast.
                    355: .IP -
                    356: .B output()
                    357: is not supported.
                    358: Output from the ECHO macro is done to the file-pointer
                    359: "yyout" (default
                    360: .I stdout).
                    361: .IP -
                    362: If you are providing your own yywrap() routine, you must "#undef yywrap"
                    363: first.
                    364: .IP -
                    365: To refer to yytext outside of your scanner source file, use
                    366: "extern char *yytext;" rather than "extern char yytext[];".
                    367: .IP -
                    368: .B yyleng
                    369: is a macro and not a variable, and hence cannot be accessed outside
                    370: of the scanner source file.
                    371: .IP -
                    372: flex reads only one input file, while lex's input is made
                    373: up of the concatenation of its input files.
                    374: .IP -
                    375: The name
                    376: .bd
                    377: FLEX_SCANNER
                    378: is #define'd so scanners may be written for use with either
                    379: flex or lex.
                    380: .IP -
                    381: The macro
                    382: .bd
                    383: YY_USER_ACTION
                    384: can be redefined to provide an action
                    385: which is always executed prior to the matched rule's action.  For example,
                    386: it could be #define'd to call a routine to convert yytext to lower-case,
                    387: or to copy yyleng to a global variable to make it accessible outside of
                    388: the scanner source file.
                    389: .IP -
                    390: In the generated scanner, rules are separated using
                    391: .bd
                    392: YY_BREAK
                    393: instead of simple "break"'s.  This allows, for example, C++ users to
                    394: #define YY_BREAK to do nothing (while being very careful that every
                    395: rule ends with a "break" or a "return"!) to avoid suffering from
                    396: unreachable statement warnings where a rule's action ends with "return".
                    397: .SH ENHANCEMENTS
                    398: .IP -
                    399: .I Exclusive start-conditions
                    400: can be declared by using
                    401: .B %x
                    402: instead of
                    403: .B %s.
                    404: These start-conditions have the property that when they are active,
                    405: .I no other rules are active.
                    406: Thus a set of rules governed by the same exclusive start condition
                    407: describe a scanner which is independent of any of the other rules in
                    408: the flex input.  This feature makes it easy to specify "mini-scanners"
                    409: which scan portions of the input that are syntactically different
                    410: from the rest (e.g., comments).
                    411: .IP -
                    412: .I yyterminate()
                    413: can be used in lieu of a return statement in an action.  It terminates
                    414: the scanner and returns a 0 to the scanner's caller, indicating "all done".
                    415: .IP -
                    416: .I End-of-file rules.
                    417: The special rule "<<EOF>>" indicates
                    418: actions which are to be taken when an end-of-file is
                    419: encountered and yywrap() returns non-zero (i.e., indicates
                    420: no further files to process).  The action can either
                    421: point yyin at a new file to process, in which case the
                    422: action should finish with
                    423: .I YY_NEW_FILE
                    424: (this is a branch, so subsequent code in the action won't
                    425: be executed), or it should finish with a
                    426: .I return
                    427: statement.  <<EOF>> rules may not be used with other
                    428: patterns; they may only be qualified with a list of start
                    429: conditions.  If an unqualified <<EOF>> rule is given, it
                    430: applies only to the INITIAL start condition, and
                    431: .I not
                    432: to
                    433: .B %s
                    434: start conditions.
                    435: These rules are useful for catching things like unclosed comments.
                    436: An example:
                    437: .nf
                    438: 
                    439:     %x quote
                    440:     %%
                    441:     ...
                    442:     <quote><<EOF>>   {
                    443:             error( "unterminated quote" );
                    444:             yyterminate();
                    445:             }
                    446:     <<EOF>>          {
                    447:             yyin = fopen( next_file, "r" );
                    448:             YY_NEW_FILE;
                    449:             }
                    450: 
                    451: .fi
                    452: .IP -
                    453: flex dynamically resizes its internal tables, so directives like "%a 3000"
                    454: are not needed when specifying large scanners.
                    455: .IP -
                    456: The scanning routine generated by flex is declared using the macro
                    457: .B YY_DECL.
                    458: By redefining this macro you can change the routine's name and
                    459: its calling sequence.  For example, you could use:
                    460: .nf
                    461: 
                    462:     #undef YY_DECL
                    463:     #define YY_DECL float lexscan( a, b ) float a, b;
                    464: 
                    465: .fi
                    466: to give it the name
                    467: .I lexscan,
                    468: returning a float, and taking two floats as arguments.  Note that
                    469: if you give arguments to the scanning routine, you must terminate
                    470: the definition with a semi-colon (;).
                    471: .IP -
                    472: flex generates
                    473: .B #line
                    474: directives mapping lines in the output to
                    475: their origin in the input file.
                    476: .IP -
                    477: You can put multiple actions on the same line, separated with
                    478: semi-colons.  With lex, the following
                    479: .nf
                    480: 
                    481:     foo    handle_foo(); return 1;
                    482: 
                    483: .fi
                    484: is truncated to
                    485: .nf
                    486: 
                    487:     foo    handle_foo();
                    488: 
                    489: .fi
                    490: flex does not truncate the action.  Actions that are not enclosed in
                    491: braces are terminated at the end of the line.
                    492: .IP -
                    493: Actions can be begun with
                    494: .B %{
                    495: and terminated with
                    496: .B %}.
                    497: In this case, flex does not count braces to figure out where the
                    498: action ends - actions are terminated by the closing
                    499: .B %}.
                    500: This feature is useful when the enclosed action has extraneous
                    501: braces in it (usually in comments or inside inactive #ifdef's)
                    502: that throw off the brace-count.
                    503: .IP -
                    504: All of the scanner actions (e.g.,
                    505: .B ECHO, yywrap ...)
                    506: except the
                    507: .B unput()
                    508: and
                    509: .B input()
                    510: routines,
                    511: are written as macros, so they can be redefined if necessary
                    512: without requiring a separate library to link to.
                    513: .IP -
                    514: When
                    515: .B yywrap()
                    516: indicates that the scanner is done processing (it does this by returning
                    517: non-zero), on subsequent calls the scanner will always immediately return
                    518: a value of 0.  To restart it on a new input file, the action
                    519: .B yyrestart()
                    520: is used.  It takes one argument, the new input file.  It closes the
                    521: previous yyin (unless stdin) and sets up the scanners internal variables
                    522: so that the next call to yylex() will start scanning the new file.  This
                    523: functionality is useful for, e.g., programs which will process a file, do some
                    524: work, and then get a message to parse another file.
                    525: .IP -
                    526: Flex scans the code in section 1 (inside %{}'s) and the actions for
                    527: occurrences of
                    528: .I REJECT
                    529: and
                    530: .I yymore().
                    531: If it doesn't see any, it assumes the features are not used and generates
                    532: higher-performance scanners.  Flex tries to be correct in identifying
                    533: uses but can be fooled (for example, if a reference is made in a macro from
                    534: a #include file).  If this happens (a feature is used and flex didn't
                    535: realize it) you will get a compile-time error of the form
                    536: .nf
                    537: 
                    538:     reject_used_but_not_detected undefined
                    539: 
                    540: .fi
                    541: You can tell flex that a feature is used even if it doesn't think so
                    542: with
                    543: .B %used
                    544: followed by the name of the feature (for example, "%used REJECT");
                    545: similarly, you can specify that a feature is
                    546: .I not
                    547: used even though it thinks it is with
                    548: .B %unused.
                    549: .IP -
                    550: Comments may be put in the first section of the input by preceding
                    551: them with '#'.
                    552: .SH FILES
                    553: .TP
                    554: .I flex.skel
                    555: skeleton scanner
                    556: .TP
                    557: .I lex.yy.c
                    558: generated scanner (called
                    559: .I lexyy.c
                    560: on some systems).
                    561: .TP
                    562: .I lex.backtrack
                    563: backtracking information for
                    564: .B -b
                    565: flag (called
                    566: .I lex.bck
                    567: on some systems).
                    568: .SH "SEE ALSO"
                    569: .LP
                    570: lex(1)
                    571: .LP
                    572: M. E. Lesk and E. Schmidt,
                    573: .I LEX - Lexical Analyzer Generator
                    574: .SH AUTHOR
                    575: Vern Paxson, with the help of many ideas and much inspiration from
                    576: Van Jacobson.  Original version by Jef Poskanzer.  Fast table
                    577: representation is a partial implementation of a design done by Van
                    578: Jacobson.  The implementation was done by Kevin Gong and Vern Paxson.
                    579: .LP
                    580: Thanks to the many flex beta-testers and feedbackers, especially Casey
                    581: Leedom, Frederic Brehm, Nick Christopher, Chris Faylor, Eric Goldman, Eric
                    582: Hughes, Greg Lee, Craig Leres, Mohamed el Lozy, Jim Meyering, Esmond Pitt,
                    583: Jef Poskanzer, and Dave Tallman.  Thanks to Keith Bostic, John Gilmore, Bob
                    584: Mulcahy, Rich Salz, and Richard Stallman for help with various distribution
                    585: headaches.
                    586: .LP
                    587: Send comments to:
                    588: .nf
                    589: 
                    590:      Vern Paxson
                    591:      Real Time Systems
                    592:      Bldg. 46A
                    593:      Lawrence Berkeley Laboratory
                    594:      1 Cyclotron Rd.
                    595:      Berkeley, CA 94720
                    596: 
                    597:      (415) 486-6411
                    598: 
                    599:      [email protected]
                    600:      [email protected]
                    601:      ucbvax!csam.lbl.gov!vern
                    602: 
                    603: .fi
                    604: I will be gone from mid-July '89 through mid-August '89.  From August on,
                    605: the addresses are:
                    606: .nf
                    607: 
                    608:      [email protected]
                    609: 
                    610:      Vern Paxson
                    611:      CS Department
                    612:      Grad Office
                    613:      4126 Upson
                    614:      Cornell University
                    615:      Ithaca, NY 14853-7501
                    616: 
                    617:      <no phone number yet>
                    618: 
                    619: .fi
                    620: Email sent to the former addresses should continue to be forwarded for
                    621: quite a while.  Also, it looks like my username will be "paxson" and
                    622: not "vern".  I'm planning on having a mail alias set up so "vern" will
                    623: still work, but if you encounter problems try "paxson".
                    624: .SH DIAGNOSTICS
                    625: .LP
                    626: .I flex scanner jammed -
                    627: a scanner compiled with
                    628: .B -s
                    629: has encountered an input string which wasn't matched by
                    630: any of its rules.
                    631: .LP
                    632: .I flex input buffer overflowed -
                    633: a scanner rule matched a string long enough to overflow the
                    634: scanner's internal input buffer (16K bytes - controlled by
                    635: .B YY_BUF_MAX
                    636: in "flex.skel").
                    637: .LP
                    638: .I old-style lex command ignored -
                    639: the flex input contains a lex command (e.g., "%n 1000") which
                    640: is being ignored.
                    641: .SH BUGS
                    642: .LP
                    643: Some trailing context
                    644: patterns cannot be properly matched and generate
                    645: warning messages ("Dangerous trailing context").  These are
                    646: patterns where the ending of the
                    647: first part of the rule matches the beginning of the second
                    648: part, such as "zx*/xy*", where the 'x*' matches the 'x' at
                    649: the beginning of the trailing context.  (Lex doesn't get these
                    650: patterns right either.)
                    651: If desperate, you can use
                    652: .B yyless()
                    653: to effect arbitrary trailing context.
                    654: .LP
                    655: .I variable
                    656: trailing context (where both the leading and trailing parts do not have
                    657: a fixed length) entails the same performance loss as
                    658: .I REJECT
                    659: (i.e., substantial).
                    660: .LP
                    661: For some trailing context rules, parts which are actually fixed-length are
                    662: not recognized as such, leading to the abovementioned performance loss.
                    663: In particular, parts using '|' or {n} are always considered variable-length.
                    664: .LP
                    665: Use of unput() or input() trashes the current yytext and yyleng.
                    666: .LP
                    667: Use of unput() to push back more text than was matched can
                    668: result in the pushed-back text matching a beginning-of-line ('^')
                    669: rule even though it didn't come at the beginning of the line.
                    670: .LP
                    671: yytext and yyleng cannot be modified within a flex action.
                    672: .LP
                    673: Nulls are not allowed in flex inputs or in the inputs to
                    674: scanners generated by flex.  Their presence generates fatal
                    675: errors.
                    676: .LP
                    677: Flex does not generate correct #line directives for code internal
                    678: to the scanner; thus, bugs in
                    679: .I
                    680: flex.skel
                    681: yield bogus line numbers.
                    682: .LP
                    683: Pushing back definitions enclosed in ()'s can result in nasty,
                    684: difficult-to-understand problems like:
                    685: .nf
                    686: 
                    687:        {DIG}  [0-9] /* a digit */
                    688: 
                    689: .fi
                    690: In which the pushed-back text is "([0-9] /* a digit */)".
                    691: .LP
                    692: Due to both buffering of input and read-ahead, you cannot intermix
                    693: calls to stdio routines, such as, for example,
                    694: .B getchar()
                    695: with flex rules and expect it to work.  Call
                    696: .B input()
                    697: instead.
                    698: .LP
                    699: The total table entries listed by the
                    700: .B -v
                    701: flag excludes the number of table entries needed to determine
                    702: what rule has been matched.  The number of entries is equal
                    703: to the number of DFA states if the scanner does not use REJECT,
                    704: and somewhat greater than the number of states if it does.
                    705: .LP
                    706: To be consistent with ANSI C, the escape sequence \\xhh should
                    707: be recognized for hexadecimal escape sequences, such as '\\x41' for 'A'.
                    708: .LP
                    709: It would be useful if flex wrote to lex.yy.c a summary of the flags used in
                    710: its generation (such as which table compression options).
                    711: .LP
                    712: The scanner run-time speeds still have not been optimized as much
                    713: as they deserve.  Van Jacobson's work shows that the can go
                    714: faster still.
                    715: .LP
                    716: The utility needs more complete documentation.

unix.superglobalmegacorp.com

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