Annotation of researchv10dc/vol2/lex/lex.ms, revision 1.1.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.