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