FLEXDOC.1
上传用户:jnzhq888
上传日期:2007-01-18
资源大小:51694k
文件大小:64k
源码类别:

操作系统开发

开发平台:

WINDOWS

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