Annotation of 43BSDReno/pgrm/lex/lex.1, revision 1.1

1.1     ! root        1: .\" Copyright (c) 1990 The Regents of the University of California.
        !             2: .\" All rights reserved.
        !             3: .\"
        !             4: .\" Redistribution and use in source and binary forms are permitted provided
        !             5: .\" that: (1) source distributions retain this entire copyright notice and
        !             6: .\" comment, and (2) distributions including binaries display the following
        !             7: .\" acknowledgement:  ``This product includes software developed by the
        !             8: .\" University of California, Berkeley and its contributors'' in the
        !             9: .\" documentation or other materials provided with the distribution and in
        !            10: .\" all advertising materials mentioning features or use of this software.
        !            11: .\" Neither the name of the University nor the names of its contributors may
        !            12: .\" be used to endorse or promote products derived from this software without
        !            13: .\" specific prior written permission.
        !            14: .\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
        !            15: .\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
        !            16: .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            17: .\"
        !            18: .\"     @(#)lex.1      5.10 (Berkeley) 7/24/90
        !            19: .\"
        !            20: .Dd July 24, 1990
        !            21: .Dt LEX 1
        !            22: .Sh NAME
        !            23: .Nm lex
        !            24: .Nd fast lexical analyzer generator
        !            25: .Sh SYNOPSIS
        !            26: .Nm lex
        !            27: .Ob
        !            28: .Op Fl bcdfinpstvFILT8
        !            29: .Cx Fl C
        !            30: .Op efmF
        !            31: .Cx
        !            32: .Cx Fl S
        !            33: .Ar skeleton
        !            34: .Cx
        !            35: .Oe
        !            36: .Nm lex
        !            37: .Ar
        !            38: .Sh DESCRIPTION
        !            39: .Nm Lex
        !            40: is a tool for generating
        !            41: .Ar scanners :
        !            42: programs which recognized lexical patterns in text.
        !            43: .Nm Lex
        !            44: reads
        !            45: the given input files, or its standard input if no file names are given,
        !            46: for a description of a scanner to generate.  The description is in
        !            47: the form of pairs
        !            48: of regular expressions and C code, called
        !            49: .Em rules .
        !            50: .Nm Lex
        !            51: generates as output a C source file,
        !            52: .Pa lex.yy.c ,
        !            53: which defines a routine
        !            54: .Fn yylex .
        !            55: This file is compiled and linked with the
        !            56: .Fl lfl
        !            57: library to produce an executable.  When the executable is run,
        !            58: it analyzes its input for occurrences
        !            59: of the regular expressions.  Whenever it finds one, it executes
        !            60: the corresponding C code.
        !            61: .Pp
        !            62: For full documentation, see
        !            63: .Em Lexdoc .
        !            64: This manual entry is intended for use as a quick reference.
        !            65: .Sh OPTIONS
        !            66: .Nm Lex
        !            67: has the following options:
        !            68: .Tw Ds
        !            69: .Tp Fl b
        !            70: Generate backtracking information to
        !            71: .Va lex.backtrack .
        !            72: This is a list of scanner states which require backtracking
        !            73: and the input characters on which they do so.  By adding rules one
        !            74: can remove backtracking states.  If all backtracking states
        !            75: are eliminated and
        !            76: .Fl f
        !            77: or
        !            78: .Fl F
        !            79: is used, the generated scanner will run faster.
        !            80: .Tp Fl c
        !            81: is a do-nothing, deprecated option included for POSIX compliance.
        !            82: .Pp
        !            83: .Ar NOTE :
        !            84: in previous releases of
        !            85: .Nm Lex
        !            86: .Op Fl c
        !            87: specified table-compression options.  This functionality is
        !            88: now given by the
        !            89: .Fl C
        !            90: flag.  To ease the the impact of this change, when
        !            91: .Nm lex
        !            92: encounters
        !            93: .Fl c,
        !            94: it currently issues a warning message and assumes that
        !            95: .Fl C
        !            96: was desired instead.  In the future this "promotion" of
        !            97: .Fl c
        !            98: to
        !            99: .Fl C
        !           100: will go away in the name of full POSIX compliance (unless
        !           101: the POSIX meaning is removed first).
        !           102: .Tp Fl d
        !           103: makes the generated scanner run in
        !           104: .Ar debug
        !           105: mode.  Whenever a pattern is recognized and the global
        !           106: .Va yy_Lex_debug
        !           107: is non-zero (which is the default), the scanner will
        !           108: write to
        !           109: .Li stderr
        !           110: a line of the form:
        !           111: .Pp
        !           112: .Dl --accepting rule at line 53 ("the matched text")
        !           113: .Pp
        !           114: The line number refers to the location of the rule in the file
        !           115: defining the scanner (i.e., the file that was fed to lex).  Messages
        !           116: are also generated when the scanner backtracks, accepts the
        !           117: default rule, reaches the end of its input buffer (or encounters
        !           118: a NUL; the two look the same as far as the scanner's concerned),
        !           119: or reaches an end-of-file.
        !           120: .Tp Fl f
        !           121: specifies (take your pick)
        !           122: .Em full table
        !           123: or
        !           124: .Em fast scanner .
        !           125: No table compression is done.  The result is large but fast.
        !           126: This option is equivalent to
        !           127: .Fl Cf
        !           128: (see below).
        !           129: .Tp Fl i
        !           130: instructs
        !           131: .Nm lex
        !           132: to generate a
        !           133: .Em case-insensitive
        !           134: scanner.  The case of letters given in the
        !           135: .Nm lex
        !           136: input patterns will
        !           137: be ignored, and tokens in the input will be matched regardless of case.  The
        !           138: matched text given in
        !           139: .Va yytext
        !           140: will have the preserved case (i.e., it will not be folded).
        !           141: .Tp Fl n
        !           142: is another do-nothing, deprecated option included only for
        !           143: POSIX compliance.
        !           144: .Tp Fl p
        !           145: generates a performance report to stderr.  The report
        !           146: consists of comments regarding features of the
        !           147: .Nm lex
        !           148: input file which will cause a loss of performance in the resulting scanner.
        !           149: .Tp Fl s
        !           150: causes the
        !           151: .Ar default rule
        !           152: (that unmatched scanner input is echoed to
        !           153: .Ar stdout )
        !           154: to be suppressed.  If the scanner encounters input that does not
        !           155: match any of its rules, it aborts with an error.
        !           156: .Tp Fl t
        !           157: instructs
        !           158: .Nm lex
        !           159: to write the scanner it generates to standard output instead
        !           160: of
        !           161: .Pa lex.yy.c .
        !           162: .Tp Fl v
        !           163: specifies that
        !           164: .Nm lex
        !           165: should write to
        !           166: .Li stderr
        !           167: a summary of statistics regarding the scanner it generates.
        !           168: .Tp Fl F
        !           169: specifies that the
        !           170: .Em fast
        !           171: scanner table representation should be used.  This representation is
        !           172: about as fast as the full table representation
        !           173: .Pq Fl f ,
        !           174: and for some sets of patterns will be considerably smaller (and for
        !           175: others, larger).  See
        !           176: .Em Lexdoc
        !           177: for details.
        !           178: .Pp
        !           179: This option is equivalent to
        !           180: .Fl CF
        !           181: (see below).
        !           182: .Tp Fl I
        !           183: instructs
        !           184: .Nm lex
        !           185: to generate an
        !           186: .Em interactive
        !           187: scanner, that is, a scanner which stops immediately rather than
        !           188: looking ahead if it knows
        !           189: that the currently scanned text cannot be part of a longer rule's match.
        !           190: Again, see
        !           191: .Em Lexdoc
        !           192: for details.
        !           193: .Pp
        !           194: Note,
        !           195: .Fl I
        !           196: cannot be used in conjunction with
        !           197: .Em full
        !           198: or
        !           199: .Em fast tables ,
        !           200: i.e., the
        !           201: .Fl f , F , Cf ,
        !           202: or
        !           203: .Fl CF
        !           204: flags.
        !           205: .Tp Fl L
        !           206: instructs
        !           207: .Nm lex
        !           208: not to generate
        !           209: .Li #line
        !           210: directives in
        !           211: .Pa lex.yy.c .
        !           212: The default is to generate such directives so error
        !           213: messages in the actions will be correctly
        !           214: located with respect to the original
        !           215: .Nm lex
        !           216: input file, and not to
        !           217: the fairly meaningless line numbers of
        !           218: .Pa lex.yy.c .
        !           219: .Tp Fl T
        !           220: makes
        !           221: .Nm lex
        !           222: run in
        !           223: .Em trace
        !           224: mode.  It will generate a lot of messages to
        !           225: .Li stdout
        !           226: concerning
        !           227: the form of the input and the resultant non-deterministic and deterministic
        !           228: finite automata.  This option is mostly for use in maintaining
        !           229: .Nm lex .
        !           230: .Tp Fl 8
        !           231: instructs
        !           232: .Nm lex
        !           233: to generate an 8-bit scanner.
        !           234: On some sites, this is the default.  On others, the default
        !           235: is 7-bit characters.  To see which is the case, check the verbose
        !           236: .Pq Fl v
        !           237: output for "equivalence classes created".  If the denominator of
        !           238: the number shown is 128, then by default
        !           239: .Nm lex
        !           240: is generating 7-bit characters.  If it is 256, then the default is
        !           241: 8-bit characters.
        !           242: .Tc Fl C
        !           243: .Op Cm efmF
        !           244: .Cx
        !           245: controls the degree of table compression. The default setting is
        !           246: .Fl Cem .
        !           247: .Pp
        !           248: .Tw Ds
        !           249: .Tp Fl C
        !           250: A lone
        !           251: .Fl C
        !           252: specifies that the scanner tables should be compressed but neither
        !           253: equivalence classes nor meta-equivalence classes should be used.
        !           254: .Tp Fl \&Ce
        !           255: directs
        !           256: .Nm lex
        !           257: to construct
        !           258: .Em equivalence classes ,
        !           259: i.e., sets of characters
        !           260: which have identical lexical properties.
        !           261: Equivalence classes usually give
        !           262: dramatic reductions in the final table/object file sizes (typically
        !           263: a factor of 2-5) and are pretty cheap performance-wise (one array
        !           264: look-up per character scanned).
        !           265: .Tp Fl \&Cf
        !           266: specifies that the
        !           267: .Em full
        !           268: scanner tables should be generated -
        !           269: .Nm lex
        !           270: should not compress the
        !           271: tables by taking advantages of similar transition functions for
        !           272: different states.
        !           273: .Tp Fl \&CF
        !           274: specifies that the alternate fast scanner representation (described in
        !           275: .Em Lexdoc )
        !           276: should be used.
        !           277: .Tp Fl \&Cm
        !           278: directs
        !           279: .Nm lex
        !           280: to construct
        !           281: .Em meta-equivalence classes ,
        !           282: which are sets of equivalence classes (or characters, if equivalence
        !           283: classes are not being used) that are commonly used together.  Meta-equivalence
        !           284: classes are often a big win when using compressed tables, but they
        !           285: have a moderate performance impact (one or two "if" tests and one
        !           286: array look-up per character scanned).
        !           287: .Tp Fl Cem
        !           288: (default)
        !           289: Generate both equivalence classes
        !           290: and meta-equivalence classes.  This setting provides the highest
        !           291: degree of table compression.
        !           292: .Tp
        !           293: .Pp
        !           294: Faster-executing scanners can be traded off at the cost of larger tables with
        !           295: the following generally being true:
        !           296: .Pp
        !           297: .Ds C
        !           298: slowest & smallest
        !           299:       -Cem
        !           300:       -Cm
        !           301:       -Ce
        !           302:       -C
        !           303:       -C{f,F}e
        !           304:       -C{f,F}
        !           305: fastest & largest
        !           306: .De
        !           307: .Pp
        !           308: .Fl C
        !           309: options are not cumulative; whenever the flag is encountered, the
        !           310: previous -C settings are forgotten.
        !           311: .Pp
        !           312: The options
        !           313: .Fl \&Cf
        !           314: or
        !           315: .Fl \&CF
        !           316: and
        !           317: .Fl \&Cm
        !           318: do not make sense together - there is no opportunity for meta-equivalence
        !           319: classes if the table is not being compressed.  Otherwise the options
        !           320: may be freely mixed.
        !           321: .Tc Fl S
        !           322: .Ar skeleton_file
        !           323: .Cx
        !           324: overrides the default skeleton file from which
        !           325: .Nm lex
        !           326: constructs its scanners.  Useful for
        !           327: .Nm lex
        !           328: maintenance or development.
        !           329: .Sh SUMMARY OF Lex REGULAR EXPRESSIONS
        !           330: The patterns in the input are written using an extended set of regular
        !           331: expressions.  These are:
        !           332: .Pp
        !           333: .Dw 8n
        !           334: .Di L
        !           335: .Dp Li x
        !           336: match the character 'x'
        !           337: .Dp Li \&.
        !           338: any character except newline
        !           339: .Dp Op Li xyz
        !           340: a "character class"; in this case, the pattern
        !           341: matches either an 'x', a 'y', or a 'z'
        !           342: .Dp Op Li abj-oZ
        !           343: a "character class" with a range in it; matches
        !           344: an 'a', a 'b', any letter from 'j' through 'o',
        !           345: or a 'Z'
        !           346: .Dp Op \&Li ^A-Z
        !           347: a "negated character class", i.e., any character
        !           348: but those in the class.  In this case, any
        !           349: character EXCEPT an uppercase letter.
        !           350: .Dp Op \&Li ^A-Z\en
        !           351: any character EXCEPT an uppercase letter or
        !           352: a newline
        !           353: .Dp Li r*
        !           354: zero or more r's, where r is any regular expression
        !           355: .Dp Li r+
        !           356: one or more r's
        !           357: .Dp Li r?
        !           358: zero or one r's (that is, "an optional r")
        !           359: .Dp Li r{2,5}
        !           360: anywhere from two to five r's
        !           361: .Dp Li r{2,}
        !           362: two or more r's
        !           363: .Dp Li r{4}
        !           364: exactly 4 r's
        !           365: .Dp Li {name}
        !           366: the expansion of the "name" definition
        !           367: (see above)
        !           368: .Dc Op Li xyz
        !           369: .Li \&\e"foo"
        !           370: .Cx
        !           371: the literal string:
        !           372: [xyz]"foo
        !           373: .Dp Li \&\eX
        !           374: if X is an 'a', 'b', 'f', 'n', 'r', 't', or 'v',
        !           375: then the ANSI-C interpretation of \ex.
        !           376: Otherwise, a literal 'X' (used to escape
        !           377: operators such as '*')
        !           378: .Dp Li \&\e123
        !           379: the character with octal value 123
        !           380: .Dp Li \&\ex2a
        !           381: the character with hexadecimal value 2a
        !           382: .Dp Li (r)
        !           383: match an r; parentheses are used to override
        !           384: precedence (see below)
        !           385: .Dp Li rs
        !           386: the regular expression r followed by the
        !           387: regular expression s; called "concatenation"
        !           388: .Dp Li rs
        !           389: either an r or an s
        !           390: .Dp Li r/s
        !           391: an r but only if it is followed by an s.  The
        !           392: s is not part of the matched text.  This type
        !           393: of pattern is called as "trailing context".
        !           394: .Dp Li \&^r
        !           395: an r, but only at the beginning of a line
        !           396: .Dp Li r$
        !           397: an r, but only at the end of a line.  Equivalent
        !           398: to "r/\en".
        !           399: .Dp Li <s>r
        !           400: an r, but only in start condition s (see
        !           401: below for discussion of start conditions)
        !           402: .Dp Li <s1,s2,s3>r
        !           403: same, but in any of start conditions s1,
        !           404: s2, or s3
        !           405: .Dp Li <<EOF>>
        !           406: an end-of-file
        !           407: .Dp Li <s1,s2><<EOF>>
        !           408: an end-of-file when in start condition s1 or s2
        !           409: .Dp
        !           410: The regular expressions listed above are grouped according to
        !           411: precedence, from highest precedence at the top to lowest at the bottom.
        !           412: Those grouped together have equal precedence.
        !           413: .Pp
        !           414: Some notes on patterns:
        !           415: .Pp
        !           416: Negated character classes
        !           417: .Ar match newlines
        !           418: unless "\en" (or an equivalent escape sequence) is one of the
        !           419: characters explicitly present in the negated character class
        !           420: (e.g., " [^A-Z\en] ").
        !           421: .Pp
        !           422: A rule can have at most one instance of trailing context (the '/' operator
        !           423: or the '$' operator).  The start condition, '^', and "<<EOF>>" patterns
        !           424: can only occur at the beginning of a pattern, and, as well as with '/' and '$',
        !           425: cannot be grouped inside parentheses.  The following are all illegal:
        !           426: .Pp
        !           427: .Ds C
        !           428: foo/bar$
        !           429: foo(bar$)
        !           430: foo^bar
        !           431: <sc1>foo<sc2>bar
        !           432: .De
        !           433: .Sh SUMMARY OF SPECIAL ACTIONS
        !           434: In addition to arbitrary C code, the following can appear in actions:
        !           435: .Tw Fl
        !           436: .Tp Ic ECHO
        !           437: Copies
        !           438: .Va yytext
        !           439: to the scanner's output.
        !           440: .Tp Ic BEGIN
        !           441: Followed by the name of a start condition places the scanner in the
        !           442: corresponding start condition.
        !           443: .Tp Ic REJECT
        !           444: Directs the scanner to proceed on to the "second best" rule which matched the
        !           445: input (or a prefix of the input).
        !           446: .Va yytext
        !           447: and
        !           448: .Va yyleng
        !           449: are set up appropriately.  Note that
        !           450: .Ic REJECT
        !           451: is a particularly expensive feature in terms scanner performance;
        !           452: if it is used in
        !           453: .Em any
        !           454: of the scanner's actions it will slow down
        !           455: .Em all
        !           456: of the scanner's matching.  Furthermore,
        !           457: .Ic REJECT
        !           458: cannot be used with the
        !           459: .Fl f
        !           460: or
        !           461: .Fl F
        !           462: options.
        !           463: .Pp
        !           464: Note also that unlike the other special actions,
        !           465: .Ic REJECT
        !           466: is a
        !           467: .Em branch ;
        !           468: code immediately following it in the action will
        !           469: .Em not
        !           470: be executed.
        !           471: .Tp Fn yymore
        !           472: tells the scanner that the next time it matches a rule, the corresponding
        !           473: token should be
        !           474: .Em appended
        !           475: onto the current value of
        !           476: .Va yytext
        !           477: rather than replacing it.
        !           478: .Tp Fn yyless \&n
        !           479: returns all but the first
        !           480: .Ar n
        !           481: characters of the current token back to the input stream, where they
        !           482: will be rescanned when the scanner looks for the next match.
        !           483: .Va yytext
        !           484: and
        !           485: .Va yyleng
        !           486: are adjusted appropriately (e.g.,
        !           487: .Va yyleng
        !           488: will now be equal to
        !           489: .Ar n ) .
        !           490: .Tp Fn unput c
        !           491: puts the character
        !           492: .Ar c
        !           493: back onto the input stream.  It will be the next character scanned.
        !           494: .Tp Fn input
        !           495: reads the next character from the input stream (this routine is called
        !           496: .Fn yyinput
        !           497: if the scanner is compiled using
        !           498: .Em C \&+\&+ ) .
        !           499: .Tp Fn yyterminate
        !           500: can be used in lieu of a return statement in an action.  It terminates
        !           501: the scanner and returns a 0 to the scanner's caller, indicating "all done".
        !           502: .Pp
        !           503: By default,
        !           504: .Fn yyterminate
        !           505: is also called when an end-of-file is encountered.  It is a macro and
        !           506: may be redefined.
        !           507: .Tp Ic YY_NEW_FILE
        !           508: is an action available only in <<EOF>> rules.  It means "Okay, I've
        !           509: set up a new input file, continue scanning".
        !           510: .Tp Fn yy_create_buffer file size
        !           511: takes a
        !           512: .Ic FILE
        !           513: pointer and an integer
        !           514: .Ar size .
        !           515: It returns a YY_BUFFER_STATE
        !           516: handle to a new input buffer large enough to accomodate
        !           517: .Ar size
        !           518: characters and associated with the given file.  When in doubt, use
        !           519: .Ar YY_BUF_SIZE
        !           520: for the size.
        !           521: .Tp Fn yy_switch_to_buffer new_buffer
        !           522: switches the scanner's processing to scan for tokens from
        !           523: the given buffer, which must be a YY_BUFFER_STATE.
        !           524: .Tp Fn yy_delete_buffer buffer
        !           525: deletes the given buffer.
        !           526: .Tp
        !           527: .Sh \&VALUES\ AVAILABLE\ TO THE USER
        !           528: .Tw Fl
        !           529: .Tp Va \&char \&*yytext
        !           530: holds the text of the current token.  It may not be modified.
        !           531: .Tp Va \&int yyleng
        !           532: holds the length of the current token.  It may not be modified.
        !           533: .Tp Va FILE  \&*yyin
        !           534: is the file which by default
        !           535: .Nm lex
        !           536: reads from.  It may be redefined but doing so only makes sense before
        !           537: scanning begins.  Changing it in the middle of scanning will have
        !           538: unexpected results since
        !           539: .Nm lex
        !           540: buffers its input.  Once scanning terminates because an end-of-file
        !           541: has been seen,
        !           542: .Fn void\ yyrestart FILE\ *new_file
        !           543: may be called to point
        !           544: .Va yyin
        !           545: at the new input file.
        !           546: .Tp Va FILE  \&*yyout
        !           547: is the file to which
        !           548: .Ar ECHO
        !           549: actions are done.  It can be reassigned by the user.
        !           550: .Tp Va YY_CURRENT_BUFFER
        !           551: returns a
        !           552: YY_BUFFER_STATE
        !           553: handle to the current buffer.
        !           554: .Tp
        !           555: .Sh MACROS THE USER CAN REDEFINE
        !           556: .Tw Fl
        !           557: .Tp Va YY_DECL
        !           558: controls how the scanning routine is declared.
        !           559: By default, it is "int yylex()", or, if prototypes are being
        !           560: used, "int yylex(void)".  This definition may be changed by redefining
        !           561: the "YY_DECL" macro.  Note that
        !           562: if you give arguments to the scanning routine using a
        !           563: K&R-style/non-prototyped function declaration, you must terminate
        !           564: the definition with a semi-colon (;).
        !           565: .Tp Va YY_INPUT
        !           566: The nature of how the scanner
        !           567: gets its input can be controlled by redefining the
        !           568: YY_INPUT
        !           569: macro.
        !           570: YY_INPUT's calling sequence is "YY_INPUT(buf,result,max_size)".  Its
        !           571: action is to place up to
        !           572: .Ar max _size
        !           573: characters in the character array
        !           574: .Ar buf
        !           575: and return in the integer variable
        !           576: .Ar result
        !           577: either the
        !           578: number of characters read or the constant YY_NULL (0 on Unix systems)
        !           579: to indicate EOF.  The default YY_INPUT reads from the
        !           580: global file-pointer "yyin".
        !           581: A sample redefinition of YY_INPUT (in the definitions
        !           582: section of the input file):
        !           583: .Pp
        !           584: .Ds I
        !           585: %{
        !           586: #undef YY_INPUT
        !           587: #define YY_INPUT(buf,result,max_size) \\
        !           588:     result = ((buf[0] = getchar()) == EOF) ? YY_NULL : 1;
        !           589: %}
        !           590: .De
        !           591: .Tp Va YY_INPUT
        !           592: When the scanner receives an end-of-file indication from YY_INPUT,
        !           593: it then checks the
        !           594: .Fn yywrap
        !           595: function.  If
        !           596: .Fn yywrap
        !           597: returns false (zero), then it is assumed that the
        !           598: function has gone ahead and set up
        !           599: .Va yyin
        !           600: to point to another input file, and scanning continues.  If it returns
        !           601: true (non-zero), then the scanner terminates, returning 0 to its
        !           602: caller.
        !           603: .Tp Va yywrap
        !           604: The default
        !           605: .Fn yywrap
        !           606: always returns 1.  Presently, to redefine it you must first
        !           607: "#undef yywrap", as it is currently implemented as a macro.  It is
        !           608: likely that
        !           609: .Fn yywrap
        !           610: will soon be defined to be a function rather than a macro.
        !           611: .Tp Va YY_USER_ACTION
        !           612: can be redefined to provide an action
        !           613: which is always executed prior to the matched rule's action.
        !           614: .Tp Va YY_USER_INIT
        !           615: The macro
        !           616: .Va YY _USER_INIT
        !           617: may be redefined to provide an action which is always executed before
        !           618: the first scan.
        !           619: .Tp Va YY_BREAK
        !           620: In the generated scanner, the actions are all gathered in one large
        !           621: switch statement and separated using
        !           622: .Va YY _BREAK ,
        !           623: which may be redefined.  By default, it is simply a "break", to separate
        !           624: each rule's action from the following rule's.
        !           625: .Tp
        !           626: .Sh FILES
        !           627: .Dw lex.backtrack
        !           628: .Di L
        !           629: .Dp Pa lex.skel
        !           630: skeleton scanner.
        !           631: .Dp Pa lex.yy.c
        !           632: generated scanner
        !           633: (called
        !           634: .Pa lexyy.c
        !           635: on some systems).
        !           636: .Dp Pa lex.backtrack
        !           637: backtracking information for
        !           638: .Fl b
        !           639: .Dp Pa flag
        !           640: (called
        !           641: .Pa lex.bck
        !           642: on some systems).
        !           643: .Dp
        !           644: .Sh SEE ALSO
        !           645: .Xr lex 1 ,
        !           646: .Xr yacc 1 ,
        !           647: .Xr sed 1 ,
        !           648: .Xr awk 1 .
        !           649: .br
        !           650: .Em lexdoc
        !           651: .br
        !           652: M.
        !           653: E.
        !           654: Lesk and E.
        !           655: Schmidt,
        !           656: .Em LEX \- Lexical Analyzer Generator
        !           657: .Sh DIAGNOSTICS
        !           658: .Tw Fl
        !           659: .Tp Li reject_used_but_not_detected undefined
        !           660: or
        !           661: .Tp Li yymore_used_but_not_detected undefined
        !           662: These errors can occur at compile time.
        !           663: They indicate that the
        !           664: scanner uses
        !           665: .Ic REJECT
        !           666: or
        !           667: .Fn yymore
        !           668: but that
        !           669: .Nm lex
        !           670: failed to notice the fact,
        !           671: meaning that
        !           672: .Nm lex
        !           673: scanned the first two sections looking for occurrences of these actions
        !           674: and failed to find any,
        !           675: but somehow you snuck some in  via a #include
        !           676: file,
        !           677: for example .
        !           678: Make an explicit reference to the action in your
        !           679: .Nm lex
        !           680: input file.
        !           681: Note that previously
        !           682: .Nm lex
        !           683: supported a
        !           684: .Li %used/%unused
        !           685: mechanism for dealing with this problem;
        !           686: this feature is still supported
        !           687: but now deprecated,
        !           688: and will go away soon unless the author hears from
        !           689: people who can argue compellingly that they need it.
        !           690: .Tp Li lex scanner jammed
        !           691: a scanner compiled with
        !           692: .Fl s
        !           693: has encountered an input string which wasn't matched by
        !           694: any of its rules.
        !           695: .Tp Li lex input buffer overflowed
        !           696: a scanner rule matched a string long enough to overflow the
        !           697: scanner's internal input buffer  16K bytes - controlled by
        !           698: .Va YY_BUF_MAX
        !           699: in
        !           700: .Pa lex.skel .
        !           701: .Tp Li scanner requires  \&\-8 flag
        !           702: Your scanner specification includes recognizing 8-bit characters and
        !           703: you did not specify the -8 flag  and your site has not installed lex
        !           704: with -8 as the default .
        !           705: .Tp Li too many  \&%t classes!
        !           706: You managed to put every single character into its own %t class.
        !           707: .Nm Lex
        !           708: requires that at least one of the classes share characters.
        !           709: .Tp
        !           710: .Sh HISTORY
        !           711: A
        !           712: .Nm lex
        !           713: appeared in Version 6 AT&T Unix.
        !           714: The version this man page describes is
        !           715: derived from code contributed by Vern Paxson.
        !           716: .Sh AUTHOR
        !           717: Vern Paxson, with the help of many ideas and much inspiration from
        !           718: Van Jacobson.  Original version by Jef Poskanzer.
        !           719: .Pp
        !           720: See
        !           721: .Em Lexdoc
        !           722: for additional credits and the address to send comments to.
        !           723: .Sh BUGS
        !           724: .Pp
        !           725: Some trailing context
        !           726: patterns cannot be properly matched and generate
        !           727: warning messages ("Dangerous trailing context").  These are
        !           728: patterns where the ending of the
        !           729: first part of the rule matches the beginning of the second
        !           730: part, such as "zx*/xy*", where the 'x*' matches the 'x' at
        !           731: the beginning of the trailing context.  (Note that the POSIX draft
        !           732: states that the text matched by such patterns is undefined.)
        !           733: .Pp
        !           734: For some trailing context rules, parts which are actually fixed-length are
        !           735: not recognized as such, leading to the abovementioned performance loss.
        !           736: In particular, parts using '\&|' or {n} (such as "foo{3}") are always
        !           737: considered variable-length.
        !           738: .Pp
        !           739: Combining trailing context with the special '\&|' action can result in
        !           740: .Em fixed
        !           741: trailing context being turned into the more expensive
        !           742: .Em variable
        !           743: trailing context.  This happens in the following example:
        !           744: .Pp
        !           745: .Ds C
        !           746: %%
        !           747: abc  \&|
        !           748: xyz/def
        !           749: .De
        !           750: .Pp
        !           751: Use of
        !           752: .Fn unput
        !           753: invalidates yytext and yyleng.
        !           754: .Pp
        !           755: Use of
        !           756: .Fn unput
        !           757: to push back more text than was matched can
        !           758: result in the pushed-back text matching a beginning-of-line ('^')
        !           759: rule even though it didn't come at the beginning of the line
        !           760: (though this is rare!).
        !           761: .Pp
        !           762: Pattern-matching of NUL's is substantially slower than matching other
        !           763: characters.
        !           764: .Pp
        !           765: .Nm Lex
        !           766: does not generate correct #line directives for code internal
        !           767: to the scanner; thus, bugs in
        !           768: .Pa lex.skel
        !           769: yield bogus line numbers.
        !           770: .Pp
        !           771: Due to both buffering of input and read-ahead, you cannot intermix
        !           772: calls to <stdio.h> routines, such as, for example,
        !           773: .Fn getchar ,
        !           774: with
        !           775: .Nm lex
        !           776: rules and expect it to work.  Call
        !           777: .Fn input
        !           778: instead.
        !           779: .Pp
        !           780: The total table entries listed by the
        !           781: .Fl v
        !           782: flag excludes the number of table entries needed to determine
        !           783: what rule has been matched.  The number of entries is equal
        !           784: to the number of DFA states if the scanner does not use
        !           785: .Ic REJECT ,
        !           786: and somewhat greater than the number of states if it does.
        !           787: .Pp
        !           788: .Ic REJECT
        !           789: cannot be used with the
        !           790: .Fl f
        !           791: or
        !           792: .Fl F
        !           793: options.
        !           794: .Pp
        !           795: Some of the macros, such as
        !           796: .Fn yywrap ,
        !           797: may in the future become functions which live in the
        !           798: .Fl lfl
        !           799: library.  This will doubtless break a lot of code, but may be
        !           800: required for POSIX-compliance.
        !           801: .Pp
        !           802: The
        !           803: .Nm lex
        !           804: internal algorithms need documentation.

unix.superglobalmegacorp.com

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