Annotation of researchv10dc/vol2/lex/lex.ms, revision 1.1

1.1     ! root        1: .so ../ADM/mac
        !             2: .XX lex 375 "Lex \(em A Lexical Analyzer Generator"
        !             3: .hc ~
        !             4: ...ND July 21, 1975
        !             5: ...TR 39
        !             6: ...RP
        !             7: ...TM 75-1274-15 39199 39199-11
        !             8: .ds L \f2Lex\fP
        !             9: .ds l \f2lex\fP
        !            10: .nr dP 2
        !            11: .nr dV 3p
        !            12: .TL
        !            13: Lex \(em A Lexical Analyzer Generator
        !            14: .AU ``MH 2C-569'' 6377
        !            15: M. E. Lesk
        !            16: E. Schmidt
        !            17: .AI
        !            18: .MH
        !            19: .AB
        !            20: .PP
        !            21: \*L helps write programs whose control flow
        !            22: is directed by instances of regular
        !            23: expressions in the input stream.
        !            24: It is well suited for editor-script type transformations and
        !            25: for segmenting input in preparation for
        !            26: a parsing routine.
        !            27: .PP
        !            28: \*L source is a table of regular expressions and corresponding program fragments.
        !            29: The table is translated to a program
        !            30: which reads an input stream, copying it to an output stream
        !            31: and partitioning the input
        !            32: into strings which match the given expressions.
        !            33: As each such string is recognized the corresponding
        !            34: program fragment is executed.
        !            35: The recognition of the expressions
        !            36: is performed by a deterministic finite automaton
        !            37: generated by \*l.
        !            38: The program fragments written by the user are executed in the order in which the
        !            39: corresponding regular expressions occur in the input stream.
        !            40: .PP
        !            41: The lexical analysis
        !            42: programs written with \*l accept ambiguous specifications
        !            43: and choose the longest
        !            44: match possible at each input point.
        !            45: If necessary, substantial look~ahead
        !            46: is performed on the input, but the
        !            47: input stream will be backed up to the
        !            48: end of the current partition, so that the user
        !            49: has general freedom to manipulate it.
        !            50: .PP
        !            51: \*L can generate analyzers in either C or Ratfor, a language
        !            52: which can be translated automatically to portable Fortran.
        !            53: This manual, however, will only discuss generating analyzers
        !            54: in C.
        !            55: \*L is designed to simplify
        !            56: interfacing with \fIyacc\fP, for those
        !            57: with access to this compiler-compiler system.
        !            58: .AE
        !            59: .2C
        !            60: .NH
        !            61: Introduction.
        !            62: .PP
        !            63: \*L is a program generator designed for
        !            64: lexical processing of character input streams.
        !            65: It accepts a high-level, problem oriented specification
        !            66: for character string matching,
        !            67: and
        !            68: produces a program in a general purpose language which recognizes
        !            69: regular expressions.
        !            70: The regular expressions are specified by the user in the
        !            71: source specifications given to \*l.
        !            72: The \*l written code recognizes these expressions
        !            73: in an input stream and partitions the input stream into
        !            74: strings matching the expressions.  At the bound~aries
        !            75: between strings
        !            76: program sections
        !            77: provided by the user are executed.
        !            78: The \*l source file associates the regular expressions and the
        !            79: program fragments.
        !            80: As each expression appears in the input to the program written by \*l,
        !            81: the corresponding fragment is executed.
        !            82: .PP
        !            83: The user supplies the additional code
        !            84: beyond expression matching
        !            85: needed to complete his tasks, possibly
        !            86: including code written by other generators.
        !            87: The program that recognizes the expressions is generated in the
        !            88: general purpose programming language employed for the
        !            89: user's program fragments.
        !            90: Thus, a high level expression
        !            91: language is provided to write the string expressions to be
        !            92: matched while the user's freedom to write actions
        !            93: is unimpaired.
        !            94: This avoids forcing the user who wishes to use a string manipulation
        !            95: language for input analysis to write processing programs in the same
        !            96: and often inappropriate string handling language.
        !            97: .PP
        !            98: \*L is not a complete language, but rather a generator representing
        !            99: a new language feature which can be added to
        !           100: different programming languages, called ``host languages.'' 
        !           101: Just as general purpose languages
        !           102: can produce code to run on different computer hardware,
        !           103: \*l can write code in different host languages.
        !           104: The host language is used for the output code generated by \*l
        !           105: and also for the program fragments added by the user.
        !           106: Compatible run-time libraries for the different host languages
        !           107: are also provided.
        !           108: This makes \*l adaptable to different environments and
        !           109: different users.
        !           110: Each application
        !           111: may be directed to the combination of hardware and host language appropriate
        !           112: to the task, the user's background, and the properties of local
        !           113: implementations.
        !           114: At present, the only supported host language is C|reference(cbook),
        !           115: although Fortran (in the form of Ratfor|reference(ratfor spe) has been available
        !           116: in the past.
        !           117: .PP
        !           118: \*L turns the user's expressions and actions
        !           119: (called
        !           120: .I source
        !           121: in this memo) into the host general-purpose language;
        !           122: the generated program is named
        !           123: .I yylex .
        !           124: The
        !           125: .I yylex
        !           126: program
        !           127: will recognize expressions
        !           128: in a stream
        !           129: (called
        !           130: .I input
        !           131: in this memo)
        !           132: and perform the specified actions for each expression as it is detected.
        !           133: See Figure 1.
        !           134: .KF
        !           135: .TS
        !           136: center;
        !           137: l _ r
        !           138: l|c|r
        !           139: l _ r
        !           140: l _ r
        !           141: l|c|r
        !           142: l _ r
        !           143: c s s
        !           144: c s s.
        !           145: 
        !           146: Source \(->    \*l     \(-> yylex
        !           147: 
        !           148: .sp
        !           149: 
        !           150: Input \(->     yylex   \(-> Output
        !           151: 
        !           152: .sp
        !           153: \fBFigure 1.\fP  An overview of \*l
        !           154: .TE
        !           155: .KE
        !           156: .PP
        !           157: For a trivial example, consider a program to delete
        !           158: from the input
        !           159: all blanks or tabs at the ends of lines.
        !           160: .P1 0
        !           161: %%
        !           162: [ \et]+$       ;
        !           163: .P2
        !           164: is all that is required.
        !           165: The program
        !           166: contains a
        !           167: .CW %%
        !           168: delimiter to mark the beginning of the rules, and
        !           169: one rule.
        !           170: This rule contains a regular expression
        !           171: which matches one or more
        !           172: instances of the characters blank or tab
        !           173: (written
        !           174: .CW \et
        !           175: for visibility, in accordance with the C language convention)
        !           176: just prior to the end of a line.
        !           177: The brackets indicate the character
        !           178: class made of blank and tab; the
        !           179: .CW +
        !           180: indicates ``one or more ...'';
        !           181: and the
        !           182: .CW $
        !           183: indicates ``end of line,'' as in QED.
        !           184: No action is specified,
        !           185: so the program generated by \*l (yylex) will ignore these characters.
        !           186: Everything else will be copied.
        !           187: To change any remaining
        !           188: string of blanks or tabs to a single blank,
        !           189: add another rule:
        !           190: .P1 0
        !           191: %%
        !           192: [ \et]+$       ;
        !           193: [ \et]+        printf(" ");
        !           194: .P2
        !           195: The finite automaton generated for this
        !           196: source will scan for both rules at once,
        !           197: observing at
        !           198: the termination of the string of blanks or tabs
        !           199: whether or not there is a newline character, and executing
        !           200: the desired rule action.
        !           201: The first rule matches all strings of blanks or tabs
        !           202: at the end of lines, and the second
        !           203: rule all remaining strings of blanks or tabs.
        !           204: .PP
        !           205: \*L can be used alone for simple transformations, or
        !           206: for analysis and statistics gathering on a lexical level.
        !           207: \*L can also be used with a parser generator
        !           208: to perform the lexical analysis phase; it is particularly
        !           209: easy to interface \*l and \fIyacc\fP|reference(latest yacc).
        !           210: \*L programs recognize only regular expressions;
        !           211: \fIyacc\fP writes parsers that accept a large class of context free grammars,
        !           212: but require a lower level analyzer to recognize input tokens.
        !           213: Thus, a combination of \*l and \fIyacc\fP is often appropriate.
        !           214: When used as a preprocessor for a later parser generator,
        !           215: \*l is used to partition the input stream,
        !           216: and the parser generator assigns structure to
        !           217: the resulting pieces.
        !           218: The flow of control
        !           219: in such a case (which might be the first half of a compiler,
        !           220: for example) is shown in Figure 2.
        !           221: Additional programs,
        !           222: written by other generators
        !           223: or by hand, can
        !           224: be added easily to programs written by \*l.
        !           225: .KF
        !           226: .TS
        !           227: center;
        !           228: l c c c l
        !           229: l c c c l
        !           230: l c c c l
        !           231: l _ c _ l
        !           232: l|c|c|c|l
        !           233: l _ c _ l
        !           234: l c c c l
        !           235: l _ c _ l
        !           236: l|c|c|c|l
        !           237: l _ c _ l
        !           238: l c s s l.
        !           239:        lexical         grammar
        !           240:        rules           rules
        !           241:        \(da            \(da
        !           242: 
        !           243:        \*l             \fIyacc\fP
        !           244: 
        !           245:        \(da            \(da
        !           246: 
        !           247: Input \(->     yylex   \(->    yyparse \(-> Parsed input
        !           248: 
        !           249: .sp
        !           250:        \fBFigure 2.\fP \*L with \fIyacc\fP
        !           251: .TE
        !           252: .KE
        !           253: \fIYacc\fP users
        !           254: will realize that the name
        !           255: .I yylex
        !           256: is what \fIyacc\fP expects its lexical analyzer to be named,
        !           257: so that the use of this name by \*l simplifies
        !           258: interfacing.
        !           259: .PP
        !           260: \*L generates a deterministic finite automaton from the regular expressions
        !           261: in the source|reference(aho corasick).
        !           262: The automaton is interpreted, rather than compiled, in order
        !           263: to save space.
        !           264: The result is still a fast analyzer.
        !           265: In particular, the time taken by a \*l program
        !           266: to recognize and partition an input stream is
        !           267: proportional to the length of the input.
        !           268: The number of \*l rules or
        !           269: the complexity of the rules is
        !           270: not important in determining speed,
        !           271: unless rules which include
        !           272: forward context require a significant amount of re~scanning.
        !           273: What does increase with the number and complexity of rules
        !           274: is the size of the finite
        !           275: automaton, and therefore the size of the program
        !           276: generated by \*l.
        !           277: .PP
        !           278: In the program written by \*l, the user's fragments
        !           279: (representing the
        !           280: .I actions
        !           281: to be performed as each regular expression
        !           282: is found)
        !           283: are gathered
        !           284: as cases of a switch.
        !           285: The automaton interpreter directs the control flow.
        !           286: Opportunity is provided for the user to insert either
        !           287: declarations or additional statements in the routine containing
        !           288: the actions, or to
        !           289: add subroutines outside this action routine.
        !           290: .PP
        !           291: \*L is not limited to source which can
        !           292: be interpreted on the basis of one character
        !           293: look~ahead.
        !           294: For example,
        !           295: if there are two rules, one looking for
        !           296: .CW ab
        !           297: and another for
        !           298: .CW abcdefg ,
        !           299: and the input stream is
        !           300: .CW abcdefh ,
        !           301: \*L will recognize
        !           302: .CW ab
        !           303: and leave
        !           304: the input pointer just before
        !           305: .CW cdefh .
        !           306: Such backup is more costly
        !           307: than the processing of simpler languages.
        !           308: .NH
        !           309: \*L Source.
        !           310: .PP
        !           311: The general format of \*l source is:
        !           312: .P1 0
        !           313: {definitions}
        !           314: %%
        !           315: {rules}
        !           316: %%
        !           317: {user subroutines}
        !           318: .P2
        !           319: where the definitions and the user subroutines
        !           320: are often omitted.
        !           321: The second
        !           322: .CW %%
        !           323: is optional, but the first is required
        !           324: to mark the beginning of the rules.
        !           325: The absolute minimum \*l program is thus
        !           326: .P1 0
        !           327: %%
        !           328: .P2
        !           329: (no definitions, no rules) which translates into a program
        !           330: which copies the input to the output unchanged.
        !           331: .PP
        !           332: In the outline of \*l programs shown above, the
        !           333: .I rules
        !           334: represent the user's control
        !           335: decisions; they are a table, in which the left column
        !           336: contains
        !           337: .I
        !           338: regular expressions
        !           339: .R
        !           340: (see section 3)
        !           341: and the right column contains
        !           342: .I actions ,
        !           343: program fragments to be executed when the expressions
        !           344: are recognized.
        !           345: Thus an individual rule might appear
        !           346: .P1 0
        !           347: integer        printf("found keyword INT");
        !           348: .P2
        !           349: to look for the string
        !           350: .CW integer
        !           351: in the input stream and
        !           352: print the message ``found keyword INT'' whenever it appears.
        !           353: In this example the host procedural language is C and
        !           354: the C library function
        !           355: .I printf
        !           356: is used to print the string.
        !           357: The end
        !           358: of the expression is indicated by the first blank or tab character.
        !           359: If the action is merely a single C expression,
        !           360: it can just be given on the right side of the line; if it is
        !           361: compound, or takes more than a line, it should be enclosed in
        !           362: braces.
        !           363: As a slightly more useful example, suppose it is desired to
        !           364: change a number of words from British to American spelling.
        !           365: \*L rules such as
        !           366: .P1 0
        !           367: colour         printf("color");
        !           368: mechanise      printf("mechanize");
        !           369: petrol         printf("gas");
        !           370: .P2
        !           371: would be a start.  These rules are not quite enough,
        !           372: since
        !           373: the word
        !           374: .CW petroleum
        !           375: would become
        !           376: .CW gaseum ;
        !           377: a way of dealing
        !           378: with this will be described later.
        !           379: .NH
        !           380: \*L Regular Expressions.
        !           381: .PP
        !           382: The definitions of regular expressions are very similar to those
        !           383: in QED|reference(qed cstr).
        !           384: A regular
        !           385: expression specifies a set of strings to be matched.
        !           386: It contains text characters (which match the corresponding
        !           387: characters in the strings being compared)
        !           388: and operator characters (which specify
        !           389: repetitions, choices, and other features).
        !           390: The letters of the alphabet and the digits are
        !           391: always text characters; thus the regular expression
        !           392: .P1 0
        !           393: integer
        !           394: .P2
        !           395: matches the string
        !           396: .CW integer
        !           397: wherever it appears
        !           398: and the expression
        !           399: .P1 0
        !           400: a57D
        !           401: .P2
        !           402: looks for the string
        !           403: .CW a57D .
        !           404: .PP
        !           405: .I Operators .
        !           406: The operator characters are
        !           407: .P1 0
        !           408: " \e [ ] ^ - ? . \(** + | ( ) $ / { } % < >
        !           409: .P2
        !           410: and if they are to be used as text characters, an escape
        !           411: should be used.
        !           412: The quotation mark operator (")
        !           413: indicates that whatever is contained between a pair of quotes
        !           414: is to be taken as text characters.
        !           415: Thus
        !           416: .P1 0
        !           417: xyz"++"
        !           418: .P2
        !           419: matches the string
        !           420: .CW xyz++
        !           421: when it appears.  Note that a part of a string may be quoted.
        !           422: It is harmless but unnecessary to quote an ordinary
        !           423: text character; the expression
        !           424: .P1 0
        !           425: "xyz++"
        !           426: .P2
        !           427: is the same as the one above.
        !           428: Thus by quoting every non-alphanumeric character
        !           429: being used as a text character, the user can avoid remembering
        !           430: the list above of current
        !           431: operator characters, and is safe should further extensions to \*l
        !           432: lengthen the list.
        !           433: .PP
        !           434: An operator character may also be turned into a text character
        !           435: by preceding it with \e as in
        !           436: .P1 0
        !           437: xyz\e+\e+
        !           438: .P2
        !           439: which
        !           440: is another, less readable, equivalent of the above expressions.
        !           441: Another use of the quoting mechanism is to get a blank into
        !           442: an expression; normally, as explained above, blanks or tabs end
        !           443: a rule.
        !           444: Any blank character not contained within
        !           445: .CW []
        !           446: (see below) must
        !           447: be quoted.
        !           448: Several normal C escapes with
        !           449: .CW \e
        !           450: are recognized:
        !           451: .CW \en
        !           452: is newline,
        !           453: .CW \et
        !           454: is tab, and
        !           455: .CW \eb
        !           456: is backspace.
        !           457: To enter
        !           458: .CW \e
        !           459: itself, use
        !           460: .CW \e\e .
        !           461: Since newline is illegal in an expression,
        !           462: .CW \en
        !           463: must be used;
        !           464: it is not
        !           465: required to escape tab and backspace.
        !           466: Every character but blank, tab, newline and the list above is always
        !           467: a text character.
        !           468: .PP
        !           469: .I "Character classes" .
        !           470: Classes of characters can be specified using the operator pair
        !           471: .CW [] .
        !           472: The construction
        !           473: .CW [abc]
        !           474: matches a
        !           475: single character, which may be
        !           476: .CW a ,
        !           477: .CW b ,
        !           478: or
        !           479: .CW c .
        !           480: Within square brackets,
        !           481: most operator meanings are ignored.
        !           482: Only three characters are special:
        !           483: these are
        !           484: .CW \e ,
        !           485: .CW -
        !           486: and
        !           487: .CW  ^ .
        !           488: The
        !           489: .CW -
        !           490: character
        !           491: indicates ranges.  For example,
        !           492: .P1 0
        !           493: [a-z0-9<>_]
        !           494: .P2
        !           495: indicates the character class containing all the lower case letters,
        !           496: the digits,
        !           497: the angle brackets, and underline.
        !           498: Ranges may be given in either order.
        !           499: Using
        !           500: .CW -
        !           501: between any pair of characters which are
        !           502: not both upper case letters, both lower case letters, or both digits
        !           503: is implementation dependent and will get a warning message.
        !           504: (E.g.,
        !           505: .CW [0\e-z]
        !           506: in ASCII is many more characters
        !           507: than it is in EBCDIC).
        !           508: If it is desired to include the
        !           509: character - in a character class, it should be first or
        !           510: last; thus
        !           511: .P1 0
        !           512: [-+0-9]
        !           513: .P2
        !           514: matches all the digits and the two signs.
        !           515: .PP
        !           516: In character classes,
        !           517: the
        !           518: .CW ^
        !           519: operator must appear as the first character
        !           520: after the left bracket; it indicates that the resulting string
        !           521: is to be complemented with respect to the computer character set.
        !           522: Thus
        !           523: .P1 0
        !           524: [^abc]
        !           525: .P2
        !           526: matches all characters except
        !           527: .CW a ,
        !           528: .CW b , or
        !           529: .CW c ,
        !           530: including
        !           531: all special or control characters; or
        !           532: .P1 0
        !           533: [^a-zA-Z]
        !           534: .P2
        !           535: is any character which is not a letter.
        !           536: The
        !           537: .CW \e
        !           538: character provides the usual escapes within
        !           539: character class brackets.
        !           540: .PP
        !           541: .I "Arbitrary character" .
        !           542: To match almost any character, the operator character
        !           543: .CW .
        !           544: is the class of all characters except newline.
        !           545: Escaping into octal is possible although non-portable:
        !           546: .P1 0
        !           547: [\e40-\e176]
        !           548: .P2
        !           549: matches all printable characters in the ASCII character set, from octal
        !           550: 40 (blank) to octal 176 (tilde).
        !           551: .PP
        !           552: .I "Optional expressions" .
        !           553: The operator
        !           554: .CW ?
        !           555: indicates
        !           556: an optional element of an expression.
        !           557: Thus
        !           558: .P1 0
        !           559: ab?c
        !           560: .P2
        !           561: matches either
        !           562: .CW ac
        !           563: or
        !           564: .CW abc .
        !           565: .PP
        !           566: .I "Repeated expressions" .
        !           567: Repetitions of classes are indicated by the operators
        !           568: .CW *
        !           569: and
        !           570: .CW + .
        !           571: .P1 0
        !           572: a*
        !           573: .P2
        !           574: is any number of consecutive
        !           575: .CW a
        !           576: characters, including zero; while
        !           577: .P1 0
        !           578: a+
        !           579: .P2
        !           580: is one or more instances of
        !           581: .CW a .
        !           582: For example,
        !           583: .P1 0
        !           584: [a-z]+
        !           585: .P2
        !           586: is all strings of lower case letters.
        !           587: And
        !           588: .P1 0
        !           589: [A-Za-z][A-Za-z0-9]*
        !           590: .P2
        !           591: indicates all alphanumeric strings with a leading
        !           592: alphabetic character.
        !           593: This is a typical expression for recognizing identifiers in
        !           594: computer languages.
        !           595: .PP
        !           596: .I "Alternation and Grouping" .
        !           597: The operator
        !           598: .CW |
        !           599: indicates alternation:
        !           600: .P1 0
        !           601: (ab|cd)
        !           602: .P2
        !           603: matches either
        !           604: .CW ab
        !           605: or
        !           606: .CW cd .
        !           607: Note that parentheses are used for grouping, although
        !           608: they are
        !           609: not necessary on the outside level;
        !           610: .P1 0
        !           611: ab|cd
        !           612: .P2
        !           613: would have sufficed.
        !           614: Parentheses
        !           615: can be used for more complex expressions:
        !           616: .P1 0
        !           617: (ab|cd+)?(ef)*
        !           618: .P2
        !           619: matches such strings as
        !           620: .CW abefef ,
        !           621: .CW efefef ,
        !           622: .CW cdef ,
        !           623: or
        !           624: .CW cddd ;
        !           625: but not
        !           626: .CW abc ,
        !           627: .CW abcd ,
        !           628: or
        !           629: .CW abcdef .
        !           630: .PP
        !           631: .I "Context sensitivity" .
        !           632: \*L will recognize a small amount of surrounding
        !           633: context.  The two simplest operators for this are
        !           634: .CW ^
        !           635: and
        !           636: .CW $ .
        !           637: If the first character of an expression is
        !           638: .CW ^ ,
        !           639: the expression will only be matched at the beginning
        !           640: of a line (after a newline character, or at the beginning of
        !           641: the input stream).
        !           642: This can never conflict with the other meaning of
        !           643: .CW ^ ,
        !           644: complementation
        !           645: of character classes, since that only applies within
        !           646: the
        !           647: .CW []
        !           648: operators.
        !           649: If the very last character is
        !           650: .CW $ ,
        !           651: the expression will only be matched at the end of a line (when
        !           652: immediately followed by newline).
        !           653: The latter operator is a special case of the
        !           654: .CW /
        !           655: operator character,
        !           656: which indicates trailing context.
        !           657: The expression
        !           658: .P1 0
        !           659: ab/cd
        !           660: .P2
        !           661: matches the string
        !           662: .CW ab ,
        !           663: but only if followed by
        !           664: .CW cd .
        !           665: Thus
        !           666: .P1 0
        !           667: ab$
        !           668: .P2
        !           669: is the same as
        !           670: .P1 0
        !           671: ab/\en
        !           672: .P2
        !           673: Left context is handled in \*l by
        !           674: .I "start conditions"
        !           675: as explained in section 10.  If a rule is only to be executed
        !           676: when the \*l automaton interpreter is in start condition
        !           677: .I x ,
        !           678: the rule should be prefixed by
        !           679: .P1 0
        !           680: <x>
        !           681: .P2
        !           682: using the angle bracket operator characters.
        !           683: If we considered ``being at the beginning of a line'' to be
        !           684: start condition
        !           685: .I ONE ,
        !           686: then the
        !           687: .CW ^
        !           688: operator
        !           689: would be equivalent to
        !           690: .P1 0
        !           691: <ONE>
        !           692: .P2
        !           693: Start conditions are explained more fully later.
        !           694: .PP
        !           695: .I "Repetitions and Definitions" .
        !           696: The operators
        !           697: .CW {}
        !           698: specify
        !           699: either repetitions (if they enclose numbers)
        !           700: or
        !           701: definition expansion (if they enclose a name).  For example
        !           702: .P1 0
        !           703: {digit}
        !           704: .P2
        !           705: looks for a predefined string named
        !           706: .I digit
        !           707: and inserts it
        !           708: at that point in the expression.
        !           709: The definitions are given in the first part of the \*l
        !           710: input, before the rules.
        !           711: In contrast,
        !           712: .P1 0
        !           713: a{1,5}
        !           714: .P2
        !           715: looks for 1 to 5 occurrences of
        !           716: .CW a .
        !           717: .PP
        !           718: Finally, initial
        !           719: .CW %
        !           720: is special, being the separator
        !           721: for \*l source segments.
        !           722: .NH
        !           723: \*L Actions.
        !           724: .PP
        !           725: When an expression written as above is matched, \*l
        !           726: executes the corresponding action.  This section describes
        !           727: some features of \*l which aid in writing actions.  Note
        !           728: that there is a default action, which
        !           729: consists of copying the input to the output.  This
        !           730: is performed on all strings not otherwise matched.  Thus
        !           731: the \*l user who wishes to absorb the entire input, without
        !           732: producing any output, must provide rules to match everything.
        !           733: When \*l is being used with \fIyacc\fP, this is the normal
        !           734: situation.
        !           735: One may consider that actions are what is done instead of
        !           736: copying the input to the output; thus, in general,
        !           737: a rule which merely copies can be omitted.
        !           738: Also, a character combination
        !           739: which is omitted from the rules
        !           740: and which appears as input
        !           741: is likely to be printed on the output, thus calling
        !           742: attention to the gap in the rules.
        !           743: .PP
        !           744: One of the simplest things that can be done is to ignore
        !           745: the input.   Specifying a C null statement,
        !           746: .CW ;
        !           747: as an action
        !           748: causes this result.  A frequent rule is
        !           749: .P1 0
        !           750: [ \et\en]      ;
        !           751: .P2
        !           752: which causes the three spacing characters (blank, tab, and newline)
        !           753: to be ignored.
        !           754: .PP
        !           755: Another easy way to avoid writing actions is the action character
        !           756: .CW | ,
        !           757: which indicates that the action for this rule is the action
        !           758: for the next rule.
        !           759: The previous example could also have been written
        !           760: .P1 0
        !           761: " "            |
        !           762: "\et"          |
        !           763: "\en"          ;
        !           764: .P2
        !           765: with the same result, although in different style.
        !           766: The quotes around
        !           767: .CW \en
        !           768: and
        !           769: .CW \et
        !           770: are not required.
        !           771: .PP
        !           772: In more complex actions, the user
        !           773: will
        !           774: often want to know the actual text that matched some expression
        !           775: like
        !           776: .CW [a-z]+ .
        !           777: \*L leaves this text in an external character
        !           778: array named
        !           779: .I yytext .
        !           780: Thus, to print the name found,
        !           781: a rule like
        !           782: .P1 0
        !           783: [a-z]+ printf("%s", yytext);
        !           784: .P2
        !           785: will print
        !           786: the string in
        !           787: .I yytext .
        !           788: The C function
        !           789: .I printf
        !           790: accepts a format argument and data to be printed;
        !           791: in this case, the format is ``print string'' (\f(CW%\fP indicating
        !           792: data conversion, and
        !           793: .CW s
        !           794: indicating string type),
        !           795: and the data are the characters
        !           796: in
        !           797: .I yytext .
        !           798: So this just places
        !           799: the matched string
        !           800: on the output.
        !           801: This action
        !           802: is so common that
        !           803: it may be written as
        !           804: .CW ECHO :
        !           805: .P1 0
        !           806: [a-z]+ ECHO;
        !           807: .P2
        !           808: is the same as the above.
        !           809: Since the default action is just to
        !           810: print the characters found, one might ask why
        !           811: give a rule, like this one, which merely specifies
        !           812: the default action?
        !           813: Such rules are often required
        !           814: to avoid matching some other rule
        !           815: which is not desired.  For example, if there is a rule
        !           816: which matches
        !           817: .I read
        !           818: it will normally match the instances of
        !           819: .I read
        !           820: contained in
        !           821: .I bread
        !           822: or
        !           823: .I readjust ;
        !           824: to avoid
        !           825: this,
        !           826: a rule
        !           827: of the form
        !           828: .CW [a-z]+
        !           829: is needed.
        !           830: This is explained further below.
        !           831: .PP
        !           832: Sometimes it is more convenient to know the end of what
        !           833: has been found; hence \*l also provides a count
        !           834: .I yyleng
        !           835: of the number of characters matched.
        !           836: To count both the number
        !           837: of words and the number of characters in words in the input, the user might write
        !           838: .P1 0
        !           839: [a-zA-Z]+      {words++; chars += yyleng;}
        !           840: .P2
        !           841: which accumulates in
        !           842: .I chars
        !           843: the number
        !           844: of characters in the words recognized.
        !           845: The last character in the string matched can
        !           846: be accessed by
        !           847: .P1 0
        !           848: yytext[yyleng-1]
        !           849: .P2
        !           850: .PP
        !           851: Occasionally, a \*l
        !           852: action may decide that a rule has not recognized the correct
        !           853: span of characters.
        !           854: Two routines are provided to aid with this situation.
        !           855: First,
        !           856: .I yymore()
        !           857: can be called to indicate that the next input expression recognized is to be
        !           858: tacked on to the end of this input.  Normally,
        !           859: the next input string would overwrite the current
        !           860: entry in
        !           861: .I yytext .
        !           862: Second,
        !           863: .I yyless(n)
        !           864: may be called to indicate that not all the characters matched
        !           865: by the currently successful expression are wanted right now.
        !           866: The argument
        !           867: .I n
        !           868: indicates the number of characters in
        !           869: .I yytext
        !           870: to be retained.
        !           871: Further characters previously matched
        !           872: are
        !           873: returned to the input.  This provides the same sort of
        !           874: look~ahead offered by the
        !           875: .CW /
        !           876: operator,
        !           877: but in a different form.
        !           878: .PP
        !           879: .I "Example" :
        !           880: Consider a language which defines
        !           881: a string as a set of characters between quotation
        !           882: .CW \"
        !           883: marks, and provides that
        !           884: to include a
        !           885: .CW \"
        !           886: in a string it must be preceded by a
        !           887: .CW  \e .
        !           888: The regular expression which matches that is somewhat confusing,
        !           889: so that it might be preferable to write
        !           890: .P1 0
        !           891: \e"[^"]*       {
        !           892:        if (yytext[yyleng-1] == '\e\e'
        !           893:             yymore();
        !           894:        else
        !           895:             ... normal user processing
        !           896:        }
        !           897: .P2
        !           898: which will, when faced with a string such as
        !           899: .CW \"abc\e"def" ,
        !           900: first match
        !           901: the five characters
        !           902: .CW \"abc\e ;
        !           903: then
        !           904: the call to
        !           905: .I yymore()
        !           906: will
        !           907: cause the next part of the string,
        !           908: .CW \"def ,
        !           909: to be tacked on the end.
        !           910: Note that the final quote terminating the string should be picked
        !           911: up in the code labeled ``normal processing''.
        !           912: .PP
        !           913: The function
        !           914: .I yyless
        !           915: might be used to reprocess
        !           916: text in various circumstances.  Consider the C problem of distinguishing
        !           917: the ambiguity of
        !           918: .CW =-a .
        !           919: Suppose it is desired to treat this as
        !           920: .CW "=- a"
        !           921: but print a message.  A rule might be
        !           922: .P1 0
        !           923: =-[a-zA-Z]     {
        !           924:        printf("Operator (=-) ambiguous\en");
        !           925:        yyless(yyleng-1);
        !           926:        ... action for =- ...
        !           927:        }
        !           928: .P2
        !           929: which prints a message, returns the letter after the
        !           930: operator to the input stream, and treats the operator as
        !           931: .CW =- .
        !           932: Alternatively it might be desired to treat this as
        !           933: .CW "=  -a" .
        !           934: To do this, just return the minus
        !           935: sign as well as the letter to the input:
        !           936: .P1 0
        !           937: =-[a-zA-Z]     {
        !           938:        printf("Operator (=-) ambiguous\en");
        !           939:        yyless(yyleng-2);
        !           940:        ... action for = ...
        !           941:        }
        !           942: .P2
        !           943: will perform the other interpretation.
        !           944: Note that the expressions for the two cases might more easily
        !           945: be written
        !           946: .P1 0
        !           947: =-/[A-Za-z]
        !           948: .P2
        !           949: in the first case and
        !           950: .P1 0
        !           951: =/-[A-Za-z]
        !           952: .P2
        !           953: in the second;
        !           954: no backup would be required in the rule action.
        !           955: It is not necessary to recognize the whole identifier
        !           956: to observe the ambiguity.
        !           957: The
        !           958: possibility of
        !           959: .CW =-3 ,
        !           960: however, makes
        !           961: .P1 0
        !           962: =-/[^ \et\en]
        !           963: .P2
        !           964: a still better rule.
        !           965: .PP
        !           966: In addition to these routines, \*l also permits
        !           967: access to the I/O routines
        !           968: it uses.
        !           969: They are:
        !           970: .IP 1)
        !           971: .I
        !           972: input()
        !           973: .R
        !           974: which returns the next input character;
        !           975: .IP 2)
        !           976: .I
        !           977: output(c)
        !           978: .R
        !           979: which writes the character
        !           980: .I c
        !           981: on the output; and
        !           982: .IP 3)
        !           983: .I
        !           984: unput(c)
        !           985: .R
        !           986: pushes the character
        !           987: .I c
        !           988: back onto the input stream to be read later by
        !           989: .I input() .
        !           990: .LP
        !           991: By default these routines are provided as macro definitions,
        !           992: but the user can override them and supply private versions.
        !           993: These routines
        !           994: define the relationship between external files and
        !           995: internal characters, and must all be retained
        !           996: or modified consistently.
        !           997: They may be redefined, to
        !           998: cause input or output to be transmitted to or from strange
        !           999: places, including other programs or internal memory;
        !          1000: but the character set used must be consistent in all routines;
        !          1001: a value of zero returned by
        !          1002: .I input
        !          1003: must mean end of file; and
        !          1004: the relationship between
        !          1005: .I unput
        !          1006: and
        !          1007: .I input
        !          1008: must be retained
        !          1009: or the \*l look~ahead will not work.
        !          1010: \*L does not look ahead at all if it does not have to,
        !          1011: but every rule ending in
        !          1012: .CW +
        !          1013: .CW *
        !          1014: .CW ?
        !          1015: .CW $
        !          1016: or containing
        !          1017: .CW /
        !          1018: implies look~ahead.
        !          1019: Look~ahead is also necessary to match an expression that is a prefix
        !          1020: of another expression.
        !          1021: See below for a discussion of the character set used by \*l.
        !          1022: The standard \*l library imposes
        !          1023: a 100 character limit on backup.
        !          1024: .PP
        !          1025: Another \*l library routine that the user will sometimes want
        !          1026: to redefine is
        !          1027: .I yywrap()
        !          1028: which is called whenever \*l reaches an end-of-file.
        !          1029: If
        !          1030: .I yywrap
        !          1031: returns a 1, \*l continues with the normal wrapup on end of input.
        !          1032: Sometimes, however, it is convenient to arrange for more
        !          1033: input to arrive
        !          1034: from a new source.
        !          1035: In this case, the user should provide
        !          1036: a
        !          1037: .I yywrap
        !          1038: which
        !          1039: arranges for new input and
        !          1040: returns 0.  This instructs \*l to continue processing.
        !          1041: The default
        !          1042: .I yywrap
        !          1043: always returns 1.
        !          1044: .PP
        !          1045: This routine is also a convenient place
        !          1046: to print tables, summaries, etc. at the end
        !          1047: of a program.  Note that it is not
        !          1048: possible to write a normal rule which recognizes
        !          1049: end-of-file; the only access to this condition is
        !          1050: through
        !          1051: .I yywrap .
        !          1052: In fact, unless a private version of
        !          1053: .I input()
        !          1054: is supplied
        !          1055: a file containing nulls
        !          1056: cannot be handled,
        !          1057: since a value of 0 returned by
        !          1058: .I input
        !          1059: is taken to be end-of-file.
        !          1060: ........
        !          1061: .NH
        !          1062: Ambiguous Source Rules.
        !          1063: .PP
        !          1064: \*L can handle ambiguous specifications.
        !          1065: When more than one expression can match the
        !          1066: current input, \*l chooses as follows:
        !          1067: .IP 1)
        !          1068: The longest match is preferred.
        !          1069: .IP 2)
        !          1070: Among rules which matched the same number of characters,
        !          1071: the rule given first is preferred.
        !          1072: .LP
        !          1073: Thus, suppose the rules
        !          1074: .P1 0
        !          1075: integer        keyword action ...;
        !          1076: [a-z]+ identifier action ...;
        !          1077: .P2
        !          1078: to be given in that order.  If the input is
        !          1079: .I integers ,
        !          1080: it is taken as an identifier, because
        !          1081: .CW [a-z]+
        !          1082: matches 8 characters while
        !          1083: .CW integer
        !          1084: matches only 7.
        !          1085: If the input is
        !          1086: .I integer ,
        !          1087: both rules match 7 characters, and
        !          1088: the keyword rule is selected because it was given first.
        !          1089: Anything shorter (e.g. \fIint\fR\|) will
        !          1090: not match the expression
        !          1091: .I integer
        !          1092: and so the identifier interpretation is used.
        !          1093: .PP
        !          1094: The principle of preferring the longest
        !          1095: match makes rules containing
        !          1096: expressions like
        !          1097: .CW .*
        !          1098: dangerous.
        !          1099: For example,
        !          1100: .P1 0
        !          1101: \&'.*'
        !          1102: .P2
        !          1103: might seem a good way of recognizing
        !          1104: a string in single quotes.
        !          1105: But it is an invitation for the program to read far
        !          1106: ahead, looking for a distant
        !          1107: single quote.
        !          1108: Presented with the input
        !          1109: .P1 0
        !          1110: \&'first' quoted string here, 'second' here
        !          1111: .P2
        !          1112: the above expression will match
        !          1113: .P1 0
        !          1114: \&'first' quoted string here, 'second'
        !          1115: .P2
        !          1116: which is probably not what was wanted.
        !          1117: A better rule is of the form
        !          1118: .P1 0
        !          1119: \&'[^'\en]*'
        !          1120: .P2
        !          1121: which, on the above input, will stop
        !          1122: after
        !          1123: .I 'first' .
        !          1124: The consequences
        !          1125: of errors like this are mitigated by the fact
        !          1126: that the
        !          1127: .CW .
        !          1128: operator will not match newline.
        !          1129: Thus expressions like
        !          1130: .CW .*
        !          1131: stop on the
        !          1132: current line.
        !          1133: Don't try to defeat this with expressions like
        !          1134: .CW [.\en]+
        !          1135: or
        !          1136: equivalents;
        !          1137: the \*l generated program will try to read
        !          1138: the entire input file, causing
        !          1139: internal buffer overflows.
        !          1140: .PP
        !          1141: Note that \*l is normally partitioning
        !          1142: the input stream, not searching for all possible matches
        !          1143: of each expression.
        !          1144: This means that each character is accounted for
        !          1145: once and only once.
        !          1146: For example, suppose it is desired to
        !          1147: count occurrences of both
        !          1148: .CW she
        !          1149: and
        !          1150: .CW he
        !          1151: in an input text.
        !          1152: Some \*l rules to do this might be
        !          1153: .P1 0
        !          1154: she    s++;
        !          1155: he     h++;
        !          1156: \en    |
        !          1157: \&.    ;
        !          1158: .P2
        !          1159: where the last two rules ignore everything besides
        !          1160: .CW he
        !          1161: and
        !          1162: .CW she .
        !          1163: Remember that
        !          1164: .CW .
        !          1165: does not include newline.
        !          1166: Since
        !          1167: .CW she
        !          1168: includes
        !          1169: .CW he ,
        !          1170: \*l will normally
        !          1171: .I not
        !          1172: recognize
        !          1173: the instances of
        !          1174: .CW he
        !          1175: included in
        !          1176: .CW she ,
        !          1177: since once it has passed a
        !          1178: .CW she
        !          1179: those characters are gone.
        !          1180: .PP
        !          1181: Sometimes the user would like to override this choice.  The action
        !          1182: .I REJECT
        !          1183: means ``go do the next alternative.''
        !          1184: It causes whatever rule was second choice after the current
        !          1185: rule to be executed.
        !          1186: The position of the input pointer is adjusted accordingly.
        !          1187: Suppose the user really wants to count the included instances of
        !          1188: .CW he :
        !          1189: .P1 0
        !          1190: she    {s++; REJECT;}
        !          1191: he     {h++; REJECT;}
        !          1192: \en    |
        !          1193: \&.    ;
        !          1194: .P2
        !          1195: these rules are one way of changing the previous example
        !          1196: to do just that.
        !          1197: After counting each expression, it is rejected; whenever appropriate,
        !          1198: the other expression will then be counted.  In this example, of course,
        !          1199: the user could note that
        !          1200: .CW she
        !          1201: includes
        !          1202: .CW he
        !          1203: but not
        !          1204: vice versa, and omit the
        !          1205: .I REJECT
        !          1206: action on
        !          1207: .CW he ;
        !          1208: in other cases, however, it
        !          1209: would not be possible a priori to tell
        !          1210: which input characters
        !          1211: were in both classes.
        !          1212: .PP
        !          1213: Consider the two rules
        !          1214: .P1 0
        !          1215: a[bc]+ { ... ; REJECT;}
        !          1216: a[cd]+ { ... ; REJECT;}
        !          1217: .P2
        !          1218: If the input is
        !          1219: .CW ab ,
        !          1220: only the first rule matches,
        !          1221: and on
        !          1222: .CW ad
        !          1223: only the second matches.
        !          1224: The input string
        !          1225: .CW accb
        !          1226: matches the first rule for four characters
        !          1227: and then the second rule for three characters.
        !          1228: In contrast, the input
        !          1229: .CW accd
        !          1230: agrees with
        !          1231: the second rule for four characters and then the first
        !          1232: rule for three.
        !          1233: .PP
        !          1234: In general, REJECT is useful whenever
        !          1235: the purpose of \*l is not to partition the input
        !          1236: stream but to detect all examples of some items
        !          1237: in the input, and the instances of these items
        !          1238: may overlap or include each other.
        !          1239: Suppose a digram table of the input is desired;
        !          1240: normally the digrams overlap, that is the word
        !          1241: .CW the
        !          1242: is considered to contain
        !          1243: both
        !          1244: .CW th
        !          1245: and
        !          1246: .CW he .
        !          1247: Assuming a two-dimensional array named
        !          1248: .I digram
        !          1249: to be incremented, the appropriate
        !          1250: source is
        !          1251: .P1 0
        !          1252: %%
        !          1253: [a-z][a-z]     {digram[yytext[0]][yytext[1]]++;
        !          1254:                REJECT;};
        !          1255: \en    ;
        !          1256: .P2
        !          1257: where the REJECT is necessary to pick up
        !          1258: a letter pair beginning at every character, rather than at every
        !          1259: other character.
        !          1260: .NH
        !          1261: \*L Source Definitions.
        !          1262: .PP
        !          1263: Remember the format of the \*l
        !          1264: source:
        !          1265: .P1 0
        !          1266: {definitions}
        !          1267: %%
        !          1268: {rules}
        !          1269: %%
        !          1270: {user routines}
        !          1271: .P2
        !          1272: So far only the rules have been described.  The user needs
        !          1273: additional options,
        !          1274: though, to define variables for use in his program and for use
        !          1275: by \*l.
        !          1276: These can go either in the definitions section
        !          1277: or in the rules section.
        !          1278: .PP
        !          1279: Remember that \*l is turning the rules into a program.
        !          1280: Any source not intercepted by \*l is copied
        !          1281: into the generated program.  There are three classes
        !          1282: of such things.
        !          1283: .IP 1)
        !          1284: Any line which is not part of a \*l rule or action
        !          1285: which begins with a blank or tab is copied into
        !          1286: the \*l generated program.
        !          1287: Such source input prior to the first
        !          1288: .CW %%
        !          1289: delimiter will be external
        !          1290: to any function in the code; if it appears immediately after the first
        !          1291: .CW %% ,
        !          1292: it appears in an appropriate place for declarations
        !          1293: in the function written by \*l which contains the actions.
        !          1294: This material must look like program fragments,
        !          1295: and should precede the first \*l rule.
        !          1296: .IP
        !          1297: As a side effect of the above, lines which begin with a blank
        !          1298: or tab, and which contain a comment,
        !          1299: are passed through to the generated program.
        !          1300: This can be used to include comments in either the \*l source or
        !          1301: the generated code.  The comments should follow the host
        !          1302: language convention.
        !          1303: .IP 2)
        !          1304: Anything included between lines containing
        !          1305: only
        !          1306: .CW %{
        !          1307: and
        !          1308: .CW %}
        !          1309: is
        !          1310: copied out as above.  The delimiters are discarded.
        !          1311: This format permits entering text like preprocessor statements that
        !          1312: must begin in column 1,
        !          1313: or copying lines that do not look like programs.
        !          1314: .IP 3)
        !          1315: Anything after the third
        !          1316: .CW %%
        !          1317: delimiter, regardless of formats, etc.,
        !          1318: is copied out after the \*l output.
        !          1319: .PP
        !          1320: Definitions intended for \*l are given
        !          1321: before the first
        !          1322: .CW %%
        !          1323: delimiter.  Any line in this section
        !          1324: not contained between
        !          1325: .CW %{
        !          1326: and
        !          1327: .CW %} ,
        !          1328: and beginning
        !          1329: in column 1, is assumed to define \*l substitution strings.
        !          1330: The format of such lines is
        !          1331: .P1 0
        !          1332: name translation
        !          1333: .P2
        !          1334: and it
        !          1335: causes the string given as a translation to
        !          1336: be associated with the name.
        !          1337: The name and translation
        !          1338: must be separated by at least one blank or tab, and the name must begin with a letter.
        !          1339: The translation can then be called out
        !          1340: by the {name} syntax in a rule.
        !          1341: Using {D} for the digits and {E} for an exponent field,
        !          1342: for example, might abbreviate rules to recognize numbers:
        !          1343: .P1 0
        !          1344: D      [0-9]
        !          1345: E      [DEde][-+]?{D}+
        !          1346: %%
        !          1347: {D}+   printf("integer");
        !          1348: {D}+"."{D}\(**({E})?   |
        !          1349: {D}\(**"."{D}+({E})?   |
        !          1350: {D}+{E}                printf("real");
        !          1351: .P2
        !          1352: Note the first two rules for real numbers;
        !          1353: both require a decimal point and contain
        !          1354: an optional exponent field,
        !          1355: but the first requires at least one digit before the
        !          1356: decimal point and the second requires at least one
        !          1357: digit after the decimal point.
        !          1358: To correctly handle the problem
        !          1359: posed by a Fortran expression such as
        !          1360: .CW 35.EQ.I ,
        !          1361: which does not contain a real number, a context-sensitive
        !          1362: rule such as
        !          1363: .P1 0
        !          1364: [0-9]+/"."EQ   printf("integer");
        !          1365: .P2
        !          1366: could be used in addition to the normal rule for integers.
        !          1367: .PP
        !          1368: The definitions
        !          1369: section may also contain other commands, including the
        !          1370: selection of a host language, a character set table,
        !          1371: a list of start conditions, or adjustments to the default
        !          1372: size of arrays within \*l itself for larger source programs.
        !          1373: These possibilities
        !          1374: are discussed below under ``Summary of Source Format,''
        !          1375: section 12.
        !          1376: .NH
        !          1377: Usage.
        !          1378: .PP
        !          1379: There are two steps in
        !          1380: compiling a \*l source program.
        !          1381: First, the \*l source must be turned into a generated program
        !          1382: in the host general purpose language.
        !          1383: Then this program must be compiled and loaded, usually with
        !          1384: a library of \*l subroutines.
        !          1385: The generated program
        !          1386: is on a file named
        !          1387: .CW lex.yy.c .
        !          1388: The I/O library is defined in terms of the C standard
        !          1389: library|reference(stdio).
        !          1390: .PP
        !          1391: The library is accessed by the loader flag
        !          1392: .CW -ll .
        !          1393: So an appropriate
        !          1394: set of commands is
        !          1395: .P1 0
        !          1396: lex source
        !          1397: cc lex.yy.c -ll
        !          1398: .P2
        !          1399: The resulting program is placed on the usual file
        !          1400: .CW a.out
        !          1401: for later execution.
        !          1402: To use \*l with \fIyacc\fP see below.
        !          1403: Although the default \*l I/O routines use the C standard library,
        !          1404: the \*l automata themselves do not do so;
        !          1405: if private versions of
        !          1406: .I input ,
        !          1407: .I output
        !          1408: and
        !          1409: .I unput
        !          1410: are given, the library can be avoided.
        !          1411: .NH
        !          1412: \*L and \fIyacc\fP.
        !          1413: .PP
        !          1414: If you want to use \*l with \fIyacc\fP, note that what \*l writes is a function
        !          1415: named
        !          1416: .I yylex ,
        !          1417: the name required by \fIyacc\fP for its analyzer.
        !          1418: Normally, the default main program on the \*l library
        !          1419: calls this routine, but if \fIyacc\fP is loaded, and its main
        !          1420: program is used, \fIyacc\fP will call
        !          1421: .I yylex .
        !          1422: In this case each \*l rule should end with
        !          1423: .P1 0
        !          1424: return(token);
        !          1425: .P2
        !          1426: where the appropriate token value is returned.
        !          1427: An easy way to get access
        !          1428: to \fIyacc\fP's names for tokens is to
        !          1429: compile the \*l output file as part of
        !          1430: the \fIyacc\fP output file by placing the line
        !          1431: .P1 0
        !          1432: #include "lex.yy.c"
        !          1433: .P2
        !          1434: in the last section of \fIyacc\fP input.
        !          1435: Supposing the grammar to be
        !          1436: named ``good'' and the lexical rules to be named ``better''
        !          1437: the
        !          1438: .UX
        !          1439: command sequence can just be:
        !          1440: .P1 0
        !          1441: yacc good
        !          1442: lex better
        !          1443: cc y.tab.c -ly -ll
        !          1444: .P2
        !          1445: The \fIyacc\fP library
        !          1446: .CW -ly ) (
        !          1447: should be loaded before the \*l library,
        !          1448: to obtain a main program which invokes the \fIyacc\fP parser.
        !          1449: The generations of \*l and \fIyacc\fP programs can be done in
        !          1450: either order.
        !          1451: .NH
        !          1452: Examples.
        !          1453: .PP
        !          1454: As a trivial problem, consider copying an input file while
        !          1455: adding 3 to every positive number divisible by 7.
        !          1456: Here is a suitable \*l source program
        !          1457: .P1 0
        !          1458: %%
        !          1459:        int k;
        !          1460: [0-9]+ {
        !          1461:        k = atoi(yytext);
        !          1462:        if (k%7 == 0)
        !          1463:             printf("%d", k+3);
        !          1464:        else
        !          1465:             printf("%d",k);
        !          1466:        }
        !          1467: .P2
        !          1468: to do just that.
        !          1469: The rule
        !          1470: .CW [0-9]+
        !          1471: recognizes strings of digits;
        !          1472: .I atoi
        !          1473: converts the digits to binary
        !          1474: and stores the result in
        !          1475: .I k .
        !          1476: The operator
        !          1477: .CW %
        !          1478: (remainder) is used to check whether
        !          1479: .I k
        !          1480: is divisible by 7; if it is,
        !          1481: it is incremented by 3 as it is written out.
        !          1482: It may be objected that this program will alter such
        !          1483: input items as
        !          1484: .I 49.63
        !          1485: or
        !          1486: .I X7 .
        !          1487: Furthermore, it increments the absolute value
        !          1488: of all negative numbers divisible by 7.
        !          1489: To avoid this, just add a few more rules after the active one,
        !          1490: as here:
        !          1491: .P1 0
        !          1492: %%
        !          1493:        int k;
        !          1494: -?[0-9]+       {
        !          1495:        k = atoi(yytext);
        !          1496:        printf("%d", k%7 == 0 ? k+3 : k);
        !          1497:        }
        !          1498: -?[0-9.]+      ECHO;
        !          1499: [A-Za-z][A-Za-z0-9]+   ECHO;
        !          1500: .P2
        !          1501: Numerical strings containing a
        !          1502: .CW .
        !          1503: or preceded by a letter will be picked up by
        !          1504: one of the last two rules, and not changed.
        !          1505: The
        !          1506: .I if-else
        !          1507: has been replaced by
        !          1508: a C conditional expression to save space;
        !          1509: the form
        !          1510: .CW a?b:c
        !          1511: means ``if
        !          1512: .CW a
        !          1513: then
        !          1514: .CW b
        !          1515: else
        !          1516: .CW c .
        !          1517: .PP
        !          1518: For an example of statistics gathering, here
        !          1519: is a program which histograms the lengths
        !          1520: of words, where a word is defined as a string of letters.
        !          1521: .P1 0
        !          1522:        int lengs[100];
        !          1523: %%
        !          1524: [a-z]+ lengs[yyleng]++;
        !          1525: \&.    |
        !          1526: \en    ;
        !          1527: %%
        !          1528: .P3
        !          1529: yywrap()
        !          1530: {
        !          1531: int i;
        !          1532: printf("Length  No. words\en");
        !          1533: for(i=0; i<100; i++)
        !          1534:      if (lengs[i] > 0)
        !          1535:           printf("%5d%10d\en",i,lengs[i]);
        !          1536: return(1);
        !          1537: }
        !          1538: .P2
        !          1539: This program
        !          1540: accumulates the histogram, while producing no output.  At the end
        !          1541: of the input it prints the table.
        !          1542: The final statement
        !          1543: .CW return(1)
        !          1544: indicates that \*l is to perform wrapup.  If
        !          1545: .I yywrap
        !          1546: returns zero (false)
        !          1547: it implies that further input is available
        !          1548: and the program is
        !          1549: to continue reading and processing.
        !          1550: To provide a
        !          1551: .I yywrap
        !          1552: that never
        !          1553: returns true causes an infinite loop.
        !          1554: .PP
        !          1555: As a larger example,
        !          1556: here are some parts of a program written by N. L. Schryer
        !          1557: to convert double precision Fortran to single precision Fortran.
        !          1558: Because Fortran does not distinguish upper and lower case letters,
        !          1559: this routine begins by defining a set of classes including
        !          1560: both cases of each letter:
        !          1561: .P1 0
        !          1562: a      [aA]
        !          1563: b      [bB]
        !          1564: c      [cC]
        !          1565: \&...
        !          1566: z      [zZ]
        !          1567: .P2
        !          1568: An additional class recognizes white space:
        !          1569: .P1 0
        !          1570: W      [ \et]*
        !          1571: .P2
        !          1572: The first rule changes
        !          1573: ``double precision'' to ``real'', or ``DOUBLE PRECISION'' to ``REAL''.
        !          1574: .P1 0
        !          1575: {d}{o}{u}{b}{l}{e}{W}\e
        !          1576: {p}{r}{e}{c}{i}{s}{i}{o}{n} {
        !          1577:      printf(yytext[0]=='d'? "real" : "REAL");
        !          1578:      }
        !          1579: .P2
        !          1580: Care is taken throughout this program to preserve the case
        !          1581: (upper or lower)
        !          1582: of the original program.
        !          1583: The conditional operator is used to
        !          1584: select the proper form of the keyword.
        !          1585: The next rule copies continuation card indications to
        !          1586: avoid confusing them with constants:
        !          1587: .P1 0
        !          1588: ^"     "[^ 0]  ECHO;
        !          1589: .P2
        !          1590: In the regular expression, the quotes surround the
        !          1591: blanks.
        !          1592: It is interpreted as
        !          1593: ``beginning of line, then five blanks, then
        !          1594: anything but blank or zero.'' 
        !          1595: Note the two different meanings of
        !          1596: .CW ^ .
        !          1597: There follow some rules to change double precision
        !          1598: constants to ordinary floating constants.
        !          1599: .P1 0
        !          1600: [0-9]+{W}{d}{W}[+-]?{W}[0-9]+     |
        !          1601: [0-9]+{W}"."{W}{d}{W}[+-]?{W}[0-9]+     |
        !          1602: "."{W}[0-9]+{W}{d}{W}[+-]?{W}[0-9]+     {
        !          1603:      /* convert constants */
        !          1604:      for(p=yytext; *p != 0; p++)
        !          1605:           {
        !          1606:           if (*p == 'd' || *p == 'D')
        !          1607:                *p =+ 'e'- 'd';
        !          1608:           ECHO;
        !          1609:           }
        !          1610: .P2
        !          1611: After the floating point constant is recognized, it is
        !          1612: scanned by the
        !          1613: .I for
        !          1614: loop
        !          1615: to find the letter
        !          1616: .CW d
        !          1617: or
        !          1618: .CW D .
        !          1619: The program then adds
        !          1620: .CW 'e'-'d' ,
        !          1621: which converts
        !          1622: it to the next letter of the alphabet.
        !          1623: The modified constant, now single-precision,
        !          1624: is written out again.
        !          1625: There follow a series of names which must be respelled to remove
        !          1626: their initial \fId\fR.
        !          1627: By using the
        !          1628: array
        !          1629: .I yytext
        !          1630: the same action suffices for all the names (only a sample of
        !          1631: a rather long list is given here).
        !          1632: .P1 0
        !          1633: {d}{s}{i}{n}   |
        !          1634: {d}{c}{o}{s}   |
        !          1635: {d}{s}{q}{r}{t}        |
        !          1636: {d}{a}{t}{a}{n}        |
        !          1637: \&...
        !          1638: {d}{f}{l}{o}{a}{t}  printf("%s",yytext+1);
        !          1639: .P2
        !          1640: Another list of names must have initial \fId\fR changed to initial \fIa\fR:
        !          1641: .P1 0
        !          1642: {d}{l}{o}{g}   |
        !          1643: {d}{l}{o}{g}10 |
        !          1644: {d}{m}{i}{n}1  |
        !          1645: {d}{m}{a}{x}1  {
        !          1646:        yytext[0] =+ 'a' - 'd';
        !          1647:        ECHO;
        !          1648:        }
        !          1649: .P2
        !          1650: And one routine
        !          1651: must have initial \fId\fR changed to initial \fIr\fR:
        !          1652: .P1 0
        !          1653: {d}1{m}{a}{c}{h}       {
        !          1654:                yytext[0] =+ 'r'  - 'd';
        !          1655:                ECHO;
        !          1656:                }
        !          1657: .P2
        !          1658: To avoid such names as \fIdsinx\fR being detected as instances
        !          1659: of \fIdsin\fR, some final rules pick up longer words as identifiers
        !          1660: and copy some surviving characters:
        !          1661: .P1 0
        !          1662: [A-Za-z][A-Za-z0-9]*   |
        !          1663: [0-9]+ |
        !          1664: \en    |
        !          1665: \&.    ECHO;
        !          1666: .P2
        !          1667: Note that this program is not complete; it
        !          1668: does not deal with the spacing problems in Fortran or
        !          1669: with the use of keywords as identifiers.
        !          1670: .NH
        !          1671: Left Context Sensitivity.
        !          1672: .PP
        !          1673: Sometimes
        !          1674: it is desirable to have several sets of lexical rules
        !          1675: to be applied at different times in the input.
        !          1676: For example, a compiler preprocessor might distinguish
        !          1677: preprocessor statements and analyze them differently
        !          1678: from ordinary statements.
        !          1679: This requires
        !          1680: sensitivity
        !          1681: to prior context, and there are several ways of handling
        !          1682: such problems.
        !          1683: The
        !          1684: .CW ^
        !          1685: operator, for example, is a prior context operator,
        !          1686: recognizing immediately preceding left context just as
        !          1687: .CW $
        !          1688: recognizes
        !          1689: immediately following right context.
        !          1690: Adjacent left context could be extended, to produce a facility similar to
        !          1691: that for adjacent right context, but it is unlikely
        !          1692: to be as useful, since often the relevant left context
        !          1693: appeared some time earlier, such as at the beginning of a line.
        !          1694: .PP
        !          1695: This section describes three means of dealing
        !          1696: with different environments: a simple use of flags,
        !          1697: when only a few rules change from one environment to another,
        !          1698: the use of
        !          1699: .I
        !          1700: start conditions
        !          1701: .R
        !          1702: on rules,
        !          1703: and the possibility of making multiple lexical analyzers all run
        !          1704: together.
        !          1705: In each case, there are rules which recognize the need to change the
        !          1706: environment in which the
        !          1707: following input text is analyzed, and set some parameter
        !          1708: to reflect the change.  This may be a flag explicitly tested by
        !          1709: the user's action code; such a flag is the simplest way of dealing
        !          1710: with the problem, since \*l is not involved at all.
        !          1711: It may be more convenient,
        !          1712: however,
        !          1713: to have \*l remember the flags as initial conditions on the rules.
        !          1714: Any rule may be associated with a start condition.  It will only
        !          1715: be recognized when \*l is in
        !          1716: that start condition.
        !          1717: The current start condition may be changed at any time.
        !          1718: Finally, if the sets of rules for the different environments
        !          1719: are very dissimilar,
        !          1720: clarity may be best achieved by writing several distinct lexical
        !          1721: analyzers, and switching from one to another as desired.
        !          1722: .PP
        !          1723: Consider the following problem: copy the input to the output,
        !          1724: changing the word \fImagic\fR to \fIfirst\fR on every line which began
        !          1725: with the letter \fIa\fR, changing \fImagic\fR to \fIsecond\fR on every line
        !          1726: which began with the letter \fIb\fR, and changing
        !          1727: \fImagic\fR to \fIthird\fR on every line which began
        !          1728: with the letter \fIc\fR.  All other words and all other lines
        !          1729: are left unchanged.
        !          1730: .PP
        !          1731: These rules are so simple that the easiest way
        !          1732: to do this job is with a flag:
        !          1733: .P1 0
        !          1734:        int flag;
        !          1735: %%
        !          1736: ^a     {flag = 'a'; ECHO;}
        !          1737: ^b     {flag = 'b'; ECHO;}
        !          1738: ^c     {flag = 'c'; ECHO;}
        !          1739: \en    {flag =  0 ; ECHO;}
        !          1740: magic  {
        !          1741:        switch (flag)
        !          1742:        {
        !          1743:        case 'a': printf("first"); break;
        !          1744:        case 'b': printf("second"); break;
        !          1745:        case 'c': printf("third"); break;
        !          1746:        default: ECHO; break;
        !          1747:        }
        !          1748:        }
        !          1749: .P2
        !          1750: should be adequate.
        !          1751: .PP
        !          1752: To handle the same problem with start conditions, each
        !          1753: start condition must be introduced to \*l in the definitions section
        !          1754: with a line reading
        !          1755: .P1 0
        !          1756: %Start name1 name2 ...
        !          1757: .P2
        !          1758: where the conditions may be named in any order.
        !          1759: The word \fIStart\fR may be abbreviated to \fIs\fR or \fIS\fR.
        !          1760: The conditions may be referenced at the
        !          1761: head of a rule with the
        !          1762: .CW <>
        !          1763: brackets:
        !          1764: .P1 0
        !          1765: <name1>expression
        !          1766: .P2
        !          1767: is a rule which is only recognized when \*l is in the
        !          1768: start condition \fIname1\fR.
        !          1769: To enter a start condition,
        !          1770: execute the action statement
        !          1771: .P1 0
        !          1772: BEGIN name1;
        !          1773: .P2
        !          1774: which changes the start condition to \fIname1\fR.
        !          1775: To resume the normal state,
        !          1776: .P1 0
        !          1777: BEGIN 0;
        !          1778: .P2
        !          1779: resets the initial condition
        !          1780: of the \*l automaton interpreter.
        !          1781: A rule may be active in several
        !          1782: start conditions:
        !          1783: .P1 0
        !          1784: <name1,name2,name3>
        !          1785: .P2
        !          1786: is a legal prefix.  Any rule not beginning with the
        !          1787: .CW <>
        !          1788: prefix operator is always active.
        !          1789: .PP
        !          1790: The same example as before can be written:
        !          1791: .P1 0
        !          1792: %START AA BB CC
        !          1793: %%
        !          1794: ^a     {ECHO; BEGIN AA;}
        !          1795: ^b     {ECHO; BEGIN BB;}
        !          1796: ^c     {ECHO; BEGIN CC;}
        !          1797: \en    {ECHO; BEGIN 0;}
        !          1798: <AA>magic      printf("first");
        !          1799: <BB>magic      printf("second");
        !          1800: <CC>magic      printf("third");
        !          1801: .P2
        !          1802: where the logic is exactly the same as in the previous
        !          1803: method of handling the problem, but \*l does the work
        !          1804: rather than the user's code.
        !          1805: .NH
        !          1806: Character Set.
        !          1807: .PP
        !          1808: The programs generated by \*l handle
        !          1809: character I/O only through the routines
        !          1810: .I input ,
        !          1811: .I output ,
        !          1812: and
        !          1813: .I unput .
        !          1814: Thus the character representation
        !          1815: provided in these routines
        !          1816: is accepted by \*l and employed to return
        !          1817: values in
        !          1818: .I yytext .
        !          1819: For internal use
        !          1820: a character is represented as a small integer
        !          1821: which, if the standard library is used,
        !          1822: has a value equal to the integer value of the bit
        !          1823: pattern representing the character on the host computer.
        !          1824: Normally, the letter
        !          1825: .CW a
        !          1826: is represented as the same form as the character constant
        !          1827: .CW 'a' .
        !          1828: If this interpretation is changed, by providing I/O
        !          1829: routines which translate the characters,
        !          1830: \*l must be told about
        !          1831: it, by giving a translation table.
        !          1832: This table must be in the definitions section,
        !          1833: and must be bracketed by lines containing  only
        !          1834: .CW %T .
        !          1835: The table contains lines of the form
        !          1836: .P1 0
        !          1837: {integer} {character string}
        !          1838: .P2
        !          1839: which indicate the value associated with each character.
        !          1840: .KF
        !          1841: .P1 0
        !          1842: %T
        !          1843:  1     Aa
        !          1844:  2     Bb
        !          1845: \&...
        !          1846: 26     Zz
        !          1847: 27     \en
        !          1848: 28     +
        !          1849: 29     -
        !          1850: 30     0
        !          1851: 31     1
        !          1852: \&...
        !          1853: 39     9
        !          1854: %T
        !          1855: .P2
        !          1856: .sp
        !          1857: .ce 1
        !          1858: Sample character table.
        !          1859: .KE
        !          1860: Thus the next example
        !          1861: maps the lower and upper case letters together into the integers 1 through 26,
        !          1862: newline into 27, + and - into 28 and 29, and the
        !          1863: digits into 30 through 39.
        !          1864: Note the escape for newline.
        !          1865: If a table is supplied, every character that is to appear either
        !          1866: in the rules or in any valid input must be included
        !          1867: in the table.
        !          1868: No character
        !          1869: may be assigned the number 0, and no character may be
        !          1870: assigned a bigger number than the size of the hardware character set.
        !          1871: .NH
        !          1872: Summary of Source Format.
        !          1873: .PP
        !          1874: The general form of a \*l source file is:
        !          1875: .P1
        !          1876: {definitions}
        !          1877: %%
        !          1878: {rules}
        !          1879: %%
        !          1880: {user subroutines}
        !          1881: .P2
        !          1882: The definitions section contains
        !          1883: a combination of
        !          1884: .IP 1)
        !          1885: Definitions, in the form ``name space translation''.
        !          1886: .IP 2)
        !          1887: Included code, in the form ``space code''.
        !          1888: .IP 3)
        !          1889: Included code, in the form
        !          1890: .P1
        !          1891: %{
        !          1892: code
        !          1893: %}
        !          1894: .P2
        !          1895: .ns
        !          1896: .IP 4)
        !          1897: Start conditions, given in the form
        !          1898: .P1
        !          1899: %S name1 name2 ...
        !          1900: .P2
        !          1901: .ns
        !          1902: .IP 5)
        !          1903: Character set tables, in the form
        !          1904: .P1
        !          1905: %T
        !          1906: number space character-string
        !          1907: \&...
        !          1908: %T
        !          1909: .P2
        !          1910: .ns
        !          1911: .IP 6)
        !          1912: Changes to internal array sizes, in the form
        !          1913: .SP .5
        !          1914: %\fIx\fP \fInnn
        !          1915: .SP .5
        !          1916: where \fInnn\fR is a decimal integer representing an array size
        !          1917: and \fIx\fR selects the parameter as follows:
        !          1918: .TS
        !          1919: center;
        !          1920: c c
        !          1921: cFCW l.
        !          1922: Letter Parameter
        !          1923: p      positions
        !          1924: n      states
        !          1925: e      tree nodes
        !          1926: a      transitions
        !          1927: k      packed character classes
        !          1928: o      output array size
        !          1929: .TE
        !          1930: .LP
        !          1931: Lines in the rules section have the form ``expression  action''
        !          1932: where the action may be continued on succeeding
        !          1933: lines by using braces to delimit it.
        !          1934: .PP
        !          1935: Regular expressions in \*l use the following
        !          1936: operators:
        !          1937: .TS
        !          1938: center;
        !          1939: lFCW l.
        !          1940: x      the character "x"
        !          1941: "x"    an "x", even if x is an operator.
        !          1942: \ex    an "x", even if x is an operator.
        !          1943: [xy]   the character x or y.
        !          1944: [x-z]  the characters x, y or z.
        !          1945: [^x]   any character but x.
        !          1946: \&.    any character but newline.
        !          1947: ^x     an x at the beginning of a line.
        !          1948: <y>x   an x when \*l is in start condition y.
        !          1949: x$     an x at the end of a line.
        !          1950: x?     an optional x.
        !          1951: x*     0,1,2, ... instances of x.
        !          1952: x+     1,2,3, ... instances of x.
        !          1953: x|y    an x or a y.
        !          1954: (x)    an x.
        !          1955: x/y    an x but only if followed by y.
        !          1956: {xx}   the translation of xx from the
        !          1957:            definitions section.
        !          1958: x{m,n} \fIm\fR through \fIn\fR occurrences of x
        !          1959: .TE
        !          1960: .NH
        !          1961: Caveats and Bugs.
        !          1962: .PP
        !          1963: There are pathological expressions which
        !          1964: produce exponential growth of the tables when
        !          1965: converted to deterministic machines;
        !          1966: fortunately, they are rare.
        !          1967: .PP
        !          1968: REJECT does not rescan the input; instead it remembers the results of the previous
        !          1969: scan.  This means that if a rule with trailing context is found, and
        !          1970: REJECT executed, the user
        !          1971: must not have used
        !          1972: .I unput
        !          1973: to change the characters forthcoming
        !          1974: from the input stream.
        !          1975: This is the only restriction on the user's ability to manipulate
        !          1976: the not-yet-processed input.
        !          1977: .NH
        !          1978: Acknowledgments.
        !          1979: .PP
        !          1980: As should
        !          1981: be obvious from the above, the outside of \*l
        !          1982: is patterned
        !          1983: on \fIyacc\fP and the inside on Aho's string matching routines.
        !          1984: Therefore, both S. C. Johnson and A. V. Aho
        !          1985: are really originators
        !          1986: of much of \*l,
        !          1987: as well as debuggers of it.
        !          1988: Many thanks are due to both.
        !          1989: .PP
        !          1990: The code of the current version of \*l was designed, written,
        !          1991: and debugged by Eric Schmidt.
        !          1992: .NH
        !          1993: References.
        !          1994: .LP
        !          1995: |reference_placement

unix.superglobalmegacorp.com

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