home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_200 / 290_01 / flex.man < prev    next >
Text File  |  1990-05-14  |  20KB  |  595 lines

  1.  
  2.  
  3.  
  4. FLEX(1)             UNIX Programmer's Manual              FLEX(1)
  5.  
  6.  
  7.  
  8. NAME
  9.      flex - fast lexical analyzer generator
  10.  
  11. SYNOPSIS
  12.      flex [ -dfirstvFILT -c[efmF] -Sskeleton_file ] [ filename ]
  13.  
  14. DESCRIPTION
  15.      flex is a rewrite of lex intended to right some of that
  16.      tool's deficiencies: in particular, flex generates lexical
  17.      analyzers much faster, and the analyzers use smaller tables
  18.      and run faster.
  19.  
  20. OPTIONS
  21.      In addition to lex's -t flag, flex has the following
  22.      options:
  23.  
  24.      -d   makes the generated scanner run in debug mode.  When-
  25.           ever a pattern is recognized the scanner will write to
  26.           stderr a line of the form:
  27.  
  28.               --accepting rule #n
  29.  
  30.           Rules are numbered sequentially with the first one
  31.           being 1.
  32.  
  33.      -f   has the same effect as lex's -f flag (do not compress
  34.           the scanner tables); the mnemonic changes from fast
  35.           compilation to (take your pick) full table or fast
  36.           scanner. The actual compilation takes longer, since
  37.           flex is I/O bound writing out the big table.
  38.  
  39.           This option is equivalent to -cf (see below).
  40.  
  41.      -i   instructs flex to generate a case-insensitive scanner.
  42.           The case of letters given in the flex input patterns
  43.           will be ignored, and the rules will be matched regard-
  44.           less of case.  The matched text given in yytext will
  45.           have the preserved case (i.e., it will not be folded).
  46.  
  47.      -r   specifies that the scanner uses the REJECT action.
  48.  
  49.      -s   causes the default rule (that unmatched scanner input
  50.           is echoed to stdout) to be suppressed.  If the scanner
  51.           encounters input that does not match any of its rules,
  52.           it aborts with an error.  This option is useful for
  53.           finding holes in a scanner's rule set.
  54.  
  55.      -v   has the same meaning as for lex (print to stderr a sum-
  56.           mary of statistics of the generated scanner).  Many
  57.           more statistics are printed, though, and the summary
  58.           spans several lines.  Most of the statistics are mean-
  59.           ingless to the casual flex user.
  60.  
  61.  
  62.  
  63. Printed 12/28/88           13 May 1987                          1
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70. FLEX(1)             UNIX Programmer's Manual              FLEX(1)
  71.  
  72.  
  73.  
  74.      -F   specifies that the fast scanner table representation
  75.           should be used.  This representation is about as fast
  76.           as the full table representation (-f), and for some
  77.           sets of patterns will be considerably smaller (and for
  78.           others, larger).  In general, if the pattern set con-
  79.           tains both "keywords" and a catch-all, "identifier"
  80.           rule, such as in the set:
  81.  
  82.                "case"    return ( TOK_CASE );
  83.                "switch"  return ( TOK_SWITCH );
  84.                ...
  85.                "default" return ( TOK_DEFAULT );
  86.                [a-z]+    return ( TOK_ID );
  87.  
  88.           then you're better off using the full table representa-
  89.           tion.  If only the "identifier" rule is present and you
  90.           then use a hash table or some such to detect the key-
  91.           words, you're better off using -F.
  92.  
  93.           This option is equivalent to -cF (see below).
  94.  
  95.      -I   instructs flex to generate an interactive scanner.
  96.           Normally, scanners generated by flex always look ahead
  97.           one character before deciding that a rule has been
  98.           matched.  At the possible cost of some scanning over-
  99.           head (it's not clear that more overhead is involved),
  100.           flex will generate a scanner which only looks ahead
  101.           when needed.  Such scanners are called interactive
  102.           because if you want to write a scanner for an interac-
  103.           tive system such as a command shell, you will probably
  104.           want the user's input to be terminated with a newline,
  105.           and without -I the user will have to type a character
  106.           in addition to the newline in order to have the newline
  107.           recognized.  This leads to dreadful interactive perfor-
  108.           mance.
  109.  
  110.           If all this seems to confusing, here's the general
  111.           rule: if a human will be typing in input to your
  112.           scanner, use -I, otherwise don't; if you don't care
  113.           about how fast your scanners run and don't want to make
  114.           any assumptions about the input to your scanner, always
  115.           use -I.
  116.  
  117.           Note, -I cannot be used in conjunction with full or
  118.           fast tables, i.e., the -f, -F, -cf, or -cF flags.
  119.  
  120.      -L   instructs flex to not generate #line directives (see
  121.           below).
  122.  
  123.      -T   makes flex run in trace mode.  It will generate a lot
  124.           of messages to standard out concerning the form of the
  125.           input and the resultant non-deterministic and
  126.  
  127.  
  128.  
  129. Printed 12/28/88           13 May 1987                          2
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136. FLEX(1)             UNIX Programmer's Manual              FLEX(1)
  137.  
  138.  
  139.  
  140.           deterministic finite automatons.  This option is mostly
  141.           for use in maintaining flex.
  142.  
  143.      -c[efmF]
  144.           controls the degree of table compression.  -ce directs
  145.           flex to construct equivalence classes, i.e., sets of
  146.           characters which have identical lexical properties (for
  147.           example, if the only appearance of digits in the flex
  148.           input is in the character class "[0-9]" then the digits
  149.           '0', '1', ..., '9' will all be put in the same
  150.           equivalence class).  -cf specifies that the full
  151.           scanner tables should be generated - flex should not
  152.           compress the tables by taking advantages of similar
  153.           transition functions for different states.  -cF speci-
  154.           fies that the alternate fast scanner representation
  155.           (described above under the -F flag) should be used.  -
  156.           cm directs flex to construct meta-equivalence classes,
  157.           which are sets of equivalence classes (or characters,
  158.           if equivalence classes are not being used) that are
  159.           commonly used together.  A lone -c specifies that the
  160.           scanner tables should be compressed but neither
  161.           equivalence classes nor meta-equivalence classes should
  162.           be used.
  163.  
  164.           The options -cf or -cF and -cm do not make sense
  165.           together - there is no opportunity for meta-equivalence
  166.           classes if the table is not being compressed.  Other-
  167.           wise the options may be freely mixed.
  168.  
  169.           The default setting is -cem which specifies that flex
  170.           should generate equivalence classes and meta-
  171.           equivalence classes.  This setting provides the highest
  172.           degree of table compression.  You can trade off
  173.           faster-executing scanners at the cost of larger tables
  174.           with the following generally being true:
  175.  
  176.               slowest            smallest
  177.                          -cem
  178.                          -ce
  179.                          -cm
  180.                          -c
  181.                          -c{f,F}e
  182.                          -c{f,F}
  183.               fastest            largest
  184.  
  185.  
  186.      -Sskeleton_file
  187.           overrides the default skeleton file from which flex
  188.           constructs its scanners.  You'll never need this option
  189.           unless you are doing flex maintenance or development.
  190.  
  191. INCOMPATIBILITIES WITH LEX
  192.  
  193.  
  194.  
  195. Printed 12/28/88           13 May 1987                          3
  196.  
  197.  
  198.  
  199.  
  200.  
  201.  
  202. FLEX(1)             UNIX Programmer's Manual              FLEX(1)
  203.  
  204.  
  205.  
  206.      flex is fully compatible with lex with the following excep-
  207.      tions:
  208.  
  209.      -    There is no run-time library to link with.  You needn't
  210.           specify -ll when linking, and you must supply a main
  211.           program.  (Hacker's note: since the lex library con-
  212.           tains a main() which simply calls yylex(), you actually
  213.           can be lazy and not supply your own main program and
  214.           link with -ll.)
  215.  
  216.      -    lex's %r (Ratfor scanners) and %t (translation table)
  217.           options are not supported.
  218.  
  219.      -    The do-nothing -n flag is not supported.
  220.  
  221.      -    When definitions are expanded, flex encloses them in
  222.           parentheses.  With lex, the following
  223.  
  224.               NAME    [A-Z][A-Z0-9]*
  225.               %%
  226.               foo{NAME}?      printf( "Found it\n" );
  227.               %%
  228.  
  229.           will not match the string "foo" because when the macro
  230.           is expanded the rule is equivalent to "foo[A-Z][A-Z0-
  231.           9]*?" and the precedence is such that the '?' is asso-
  232.           ciated with "[A-Z0-9]*".  With flex, the rule will be
  233.           expanded to "foo([A-z][A-Z0-9]*)?" and so the string
  234.           "foo" will match.
  235.  
  236.      -    yymore() is not supported.
  237.  
  238.      -    The undocumented lex-scanner internal variable yylineno
  239.           is not supported.
  240.  
  241.      -    If your input uses REJECT, you must run flex with the
  242.           -r flag.  If you leave out the flag, the scanner will
  243.           abort at run-time with a message that the scanner was
  244.           compiled without the flag being specified.
  245.  
  246.      -    The input() routine is not redefinable, though may be
  247.           called to read characters following whatever has been
  248.           matched by a rule.  If input() encounters and end-of-
  249.           file the normal yywrap() processing is done.  A
  250.           ``real'' end-of-file is returned as EOF.
  251.  
  252.           Input can be controlled by redefining the YY_INPUT
  253.           macro.  YY_INPUT's calling sequence is
  254.           "YY_INPUT(buf,result,max_size)".  Its action is to
  255.           place up to max_size characters in the character buffer
  256.           "buf" and return in the integer variable "result"
  257.           either the number of characters read or the constant
  258.  
  259.  
  260.  
  261. Printed 12/28/88           13 May 1987                          4
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268. FLEX(1)             UNIX Programmer's Manual              FLEX(1)
  269.  
  270.  
  271.  
  272.           YY_NULL (0 on Unix systems) systems) to indicate EOF.
  273.           The default YY_INPUT reads from the file-pointer "yyin"
  274.           (which is by default stdin), so if you just want to
  275.           change the input file, you needn't redefine YY_INPUT -
  276.           just point yyin at the input file.
  277.  
  278.           A sample redefinition of YY_INPUT (in the first section
  279.           of the input file):
  280.  
  281.               %{
  282.               #undef YY_INPUT
  283.               #define YY_INPUT(buf,result,max_size) \
  284.                   result = (buf[0] = getchar()) == EOF ? YY_NULL : 1;
  285.               %}
  286.  
  287.           You also can add in things like counting keeping track
  288.           of the input line number this way; but don't expect
  289.           your scanner to go very fast.
  290.  
  291.      -    output() is not supported.  Output from the ECHO macro
  292.           is done to the file-pointer "yyout" (default stdout).
  293.  
  294.      -    Trailing context is restricted to patterns which have
  295.           either a fixed-sized leading part or a fixed-sized
  296.           trailing part.  For example, "a*/b" and "a/b*" are
  297.           okay, but not "a*/b*".  This restriction is due to a
  298.           bug in the trailing context algorithm given in Princi-
  299.           ples of Compiler Design (and Compilers - Principles,
  300.           Techniques, and Tools) which can result in mismatches.
  301.           Try the following lex program
  302.  
  303.               %%
  304.               x+/xy           printf( "I found \"%s\"\n", yytext );
  305.  
  306.           on the input "xxy".  (If anyone knows of a fast algo-
  307.           rithm for finding the beginning of trailing context for
  308.           an arbitrary pair of regular expressions, please let me
  309.           know!) If you must have arbitrary trailing context, you
  310.           can use yyless() to effect it.
  311.  
  312.      -    flex reads only one input file, while lex's input is
  313.           made up of the concatenation of its input files.
  314.  
  315. ENHANCEMENTS
  316.      -    Exclusive start-conditions can be declared by using %x
  317.           instead of %s. These start-conditions have the property
  318.           that when they are active, no other rules are active.
  319.           Thus a set of rules governed by the same exclusive
  320.           start condition describe a scanner which is independent
  321.           of any of the other rules in the flex input.  This
  322.           feature makes it easy to specify "mini-scanners" which
  323.           scan portions of the input that are syntactically
  324.  
  325.  
  326.  
  327. Printed 12/28/88           13 May 1987                          5
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334. FLEX(1)             UNIX Programmer's Manual              FLEX(1)
  335.  
  336.  
  337.  
  338.           different from the rest (e.g., comments).
  339.  
  340.      -    flex dynamically resizes its internal tables, so direc-
  341.           tives like "%a 3000" are not needed when specifying
  342.           large scanners.
  343.  
  344.      -    The scanning routine generated by flex is declared
  345.           using the macro YY_DECL. By redefining this macro you
  346.           can change the routine's name and its calling sequence.
  347.           For example, you could use:
  348.  
  349.               #undef YY_DECL
  350.               #define YY_DECL float lexscan( a, b ) float a, b;
  351.  
  352.           to give it the name lexscan, returning a float, and
  353.           taking two floats as arguments.
  354.  
  355.      -    flex generates #line directives mapping lines in the
  356.           output to their origin in the input file.
  357.  
  358.      -    You can put multiple actions on the same line,
  359.           separated with semi-colons.  With lex, the following
  360.  
  361.               foo    handle_foo(); return 1;
  362.  
  363.           is truncated to
  364.  
  365.               foo    handle_foo();
  366.  
  367.           flex does not truncate the action.  Actions that are
  368.           not enclosed in braces are terminated at the end of the
  369.           line.
  370.  
  371.      -    Actions can be begun with %{ and terminated with %}. In
  372.           this case, flex does not count braces to figure out
  373.           where the action ends - actions are terminated by the
  374.           closing %}. This feature is useful when the enclosed
  375.           action has extraneous braces in it (usually in comments
  376.           or inside inactive #ifdef's) that throw off the brace-
  377.           count.
  378.  
  379.      -    All of the scanner actions (e.g., ECHO, yywrap ...)
  380.           except the unput() and input() routines, are written as
  381.           macros, so they can be redefined if necessary without
  382.           requiring a separate library to link to.
  383.  
  384. FILES
  385.      flex.skel
  386.           skeleton scanner
  387.  
  388.      flex.fastskel
  389.           skeleton scanner for -f and -F
  390.  
  391.  
  392.  
  393. Printed 12/28/88           13 May 1987                          6
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400. FLEX(1)             UNIX Programmer's Manual              FLEX(1)
  401.  
  402.  
  403.  
  404.      flexskelcom.h
  405.           common definitions for skeleton files
  406.  
  407.      flexskeldef.h
  408.           definitions for compressed skeleton file
  409.  
  410.      fastskeldef.h
  411.           definitions for -f, -F skeleton file
  412.  
  413. SEE ALSO
  414.      lex(1)
  415.  
  416.      M. E. Lesk and E. Schmidt, LEX - Lexical Analyzer Generator
  417.  
  418. AUTHOR
  419.      Vern Paxson, with the help of many ideas and much inspira-
  420.      tion from Van Jacobson.  Original version by Jef Poskanzer.
  421.      Fast table representation is a partial implementation of a
  422.      design done by Van Jacobson.  The implementation was done by
  423.      Kevin Gong and Vern Paxson.
  424.  
  425.      Thanks to the many flex beta-testers, especially Casey Lee-
  426.      dom, Nick Christopher, Chris Faylor, Eric Goldman, Craig
  427.      Leres, Mohamed el Lozy, Esmond Pitt, Jef Poskanzer, and Dave
  428.      Tallman.  Thanks to John Gilmore, Bob Mulcahy, Rich Salz,
  429.      and Richard Stallman for help with various distribution
  430.      headaches.
  431.  
  432.      Send comments to:
  433.  
  434.           Vern Paxson
  435.           Real Time Systems
  436.           Bldg. 46A
  437.           Lawrence Berkeley Laboratory
  438.           1 Cyclotron Rd.
  439.           Berkeley, CA 94720
  440.  
  441.           (415) 486-6411
  442.  
  443.           vern@lbl-{csam,rtsg}.arpa
  444.           ucbvax!lbl-csam.arpa!vern
  445.  
  446.  
  447. DIAGNOSTICS
  448.      flex scanner jammed - a scanner compiled with -s has encoun-
  449.      tered an input string which wasn't matched by any of its
  450.      rules.
  451.  
  452.      flex input buffer overflowed - a scanner rule matched a
  453.      string long enough to overflow the scanner's internal input
  454.      buffer (as large as BUFSIZ in "/usr/include/stdio.h").  You
  455.      can edit flexskelcom.h and increase YY_BUF_SIZE and
  456.  
  457.  
  458.  
  459. Printed 12/28/88           13 May 1987                          7
  460.  
  461.  
  462.  
  463.  
  464.  
  465.  
  466. FLEX(1)             UNIX Programmer's Manual              FLEX(1)
  467.  
  468.  
  469.  
  470.      YY_MAX_LINE to increase this limit.
  471.  
  472.      REJECT used and scanner was not generated using -r - jus
  473.      like it sounds.  Your scanner uses REJECT. You must run flex
  474.      on the scanner description using the -r flag.
  475.  
  476.      old-style lex command ignored - the flex input contains a
  477.      lex command (e.g., "%n 1000") which is being ignored.
  478.  
  479. BUGS
  480.      Use of unput() or input() trashes the current yytext and
  481.      yyleng.
  482.  
  483.      Use of unput() to push back more text than was matched can
  484.      result in the pushed-back text matching a beginning-of-line
  485.      ('^') rule even though it didn't come at the beginning of
  486.      the line.
  487.  
  488.      Nulls are not allowed in flex inputs or in the inputs to
  489.      scanners generated by flex.  Their presence generates fatal
  490.      errors.
  491.  
  492.      Do not mix trailing context with the '|' operator used to
  493.      specify that multiple rules use the same action.  That is,
  494.      avoid constructs like:
  495.  
  496.              foo/bar      |
  497.              bletch       |
  498.              bugprone     { ... }
  499.  
  500.      They can result in subtle mismatches.  This is actually not
  501.      a problem if there is only one rule using trailing context
  502.      and it is the first in the list (so the above example will
  503.      actually work okay).  The problem is due to fall-through in
  504.      the action switch statement, causing non-trailing-context
  505.      rules to execute the trailing-context code of their fellow
  506.      rules.  This should be fixed, as it's a nasty bug and not
  507.      obvious.  The proper fix is for flex to spit out a
  508.      FLEX_TRAILING_CONTEXT_USED #define and then have the backup
  509.      logic in a separate table which is consulted for each rule-
  510.      match, rather than as part of the rule action.  The place to
  511.      do the tweaking is in add_accept() - any kind soul want to
  512.      be a hero?
  513.  
  514.      The pattern:
  515.  
  516.           x{3}
  517.  
  518.      is considered to be variable-length for the purposes of
  519.      trailing context, even though it has a clear fixed length.
  520.  
  521.      Due to both buffering of input and read-ahead, you cannot
  522.  
  523.  
  524.  
  525. Printed 12/28/88           13 May 1987                          8
  526.  
  527.  
  528.  
  529.  
  530.  
  531.  
  532. FLEX(1)             UNIX Programmer's Manual              FLEX(1)
  533.  
  534.  
  535.  
  536.      intermix calls to, for example, getchar() with flex rules
  537.      and expect it to work.  Call input() instead.
  538.  
  539.      The total table entries listed by the -v flag excludes the
  540.      number of table entries needed to determine what rule has
  541.      been matched.  The number of entries is equal to the number
  542.      of DFA states if the scanner was not compiled with -r, and
  543.      greater than the number of states if it was.
  544.  
  545.      The scanner run-time speeds have not been optimized as much
  546.      as they deserve.  Van Jacobson's work shows that the can go
  547.      quite a bit faster still.
  548.  
  549.  
  550.  
  551.  
  552.  
  553.  
  554.  
  555.  
  556.  
  557.  
  558.  
  559.  
  560.  
  561.  
  562.  
  563.  
  564.  
  565.  
  566.  
  567.  
  568.  
  569.  
  570.  
  571.  
  572.  
  573.  
  574.  
  575.  
  576.  
  577.  
  578.  
  579.  
  580.  
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.  
  591. Printed 12/28/88           13 May 1987                          9
  592.  
  593.  
  594.  
  595.