Annotation of researchv10dc/vol2/yacc/oyacc.ms, revision 1.1.1.1

1.1       root        1: .so ../ADM/mac
                      2: .XX 22 359 "Yacc: A Parser Generator"
                      3: .\".nr PD 1u   \" bwk:  little bit of paddability
                      4: .\".nr PI 2n
                      5: .rn SH sH
                      6: .fp 9 CB CW
                      7: .de SH
                      8: .SP 1.5
                      9: .sH
                     10: \\$1.  \\$2
                     11: .PP
                     12: .nr H5 0
                     13: .nr H4 0
                     14: .nr H3 0
                     15: .nr H2 0
                     16: .nr H1 \\$1
                     17: ..
                     18: .de SS
                     19: .NH 2
                     20: \\$1
                     21: .PP
                     22: ..
                     23: .de CB
                     24: .nr Ft \\n(.f
                     25: \&\\$3\&\\f(CB\\$1\&\\f\\n(Ft\\$2
                     26: ..
                     27: .de Q{
                     28: .in +20p
                     29: .X{ \\$1
                     30: ..
                     31: .de P{
                     32: .Q{ \\$1
                     33: .tr _\(ru
                     34: .ft CB
                     35: .lg 0
                     36: ..
                     37: .de Q}
                     38: .X} \\$1
                     39: .in -20p
                     40: ..
                     41: .de P}
                     42: .lg
                     43: .Q} \\$1
                     44: ..
                     45: .de X{
                     46: .KS
                     47: .lg 0
                     48: .ie \\n(.$ .SP \\$1
                     49: .el .SP .5
                     50: .nf
                     51: .ft 1
                     52: .nr t 20p
                     53: .ta \\ntu +\\ntu +\\ntu +\\ntu +\\ntu +\\ntu +\\ntu +\\ntu +\\ntu +\\ntu +\\ntu +\\ntu +\\ntu +\\ntu +\\ntu
                     54: ..
                     55: .de X}
                     56: .ft 1
                     57: .fi
                     58: .lg
                     59: .ie \\n(.$ .SP \\$1
                     60: .el .SP .5
                     61: .KE
                     62: ..
                     63: .de FI
                     64: .LP
                     65: .DS B
                     66: .fi
                     67: .nr PS 9
                     68: .ps 9
                     69: \\f3Figure \\$1\\$2.\\f1
                     70: ..
                     71: .\"            EF - end figure
                     72: .de EF
                     73: .DE
                     74: .fi
                     75: .nr PS 10
                     76: .ps 10
                     77: .if \\n(.$ .SP \\$1
                     78: .if !\\n(.$ .SP
                     79: .LP
                     80: ..
                     81: .PS
                     82:        arrowht = .08; arrowwid = .04   # default values are .1 and .05
                     83:        vs = 1/6                        # 1/6 = 12p; for vertical distances
                     84:        pagewid = 6; fillval = .98
                     85: 
                     86:        # ln --         line to $1, $2 chop elliptically
                     87:        #               chopw and choph are the chop ellipse width and height
                     88:        define ln %
                     89:         {      [
                     90:                        x = $1*hu; y = $2*vu
                     91:                        xsq = x*x
                     92:                        rsq = xsq + y*y; r = sqrt(rsq);
                     93:                        asq = chopw*chopw/4;
                     94:                        bsq = choph*choph/4
                     95:                        esq = (asq - bsq)/asq
                     96:                        p = sqrt(bsq/(1-esq*(xsq/rsq)))/r;
                     97: 
                     98:                O:      ""
                     99:                B:      O + p*x, p*y
                    100:                E:      O + (1-p)*x, (1-p)*y
                    101:                P:      O + x,y
                    102:                line $3 from B to E
                    103:                ] with .O at Here
                    104:        }
                    105:        move to Here + $1*hu, $2*vu
                    106:        %
                    107:        # usage: adirection([e|n|w|s], [right|up|...], [1|0|1|0], Object)
                    108:        define adirection %
                    109:                axdir = $3
                    110:                move to $4
                    111:                $2
                    112:        %
                    113:        define aright % adirection(e, right, 1, $1) %
                    114:        define aleft  % adirection(w, left,  1, $1) %
                    115:        define anup   % adirection(n, up,    0, $1) %
                    116:        define adown  % adirection(s, down,  0, $1) %
                    117:        define anell %
                    118:                ax = $1.x - Here.x; ay = $1.y - Here.y
                    119:        Anell:  Here + ax,ay
                    120:                if axdir then|
                    121:                        line $3 from Here to Here + ax,0 chop 0 chop arcrad
                    122:                        if ax*ay > 0 then@ arc @else@ arc cw @
                    123:                        axdir = 0
                    124:                |else|
                    125:                        line $3 from Here to Here + 0,ay chop 0 chop arcrad
                    126:                        if ax*ay < 0 then@ arc @else@ arc cw @
                    127:                        axdir = 1
                    128:                |
                    129:                line $2 to Anell
                    130:        % axdir = 1
                    131: .PE
                    132: .fp 8 SS S
                    133: .EQ
                    134: define Small   % size 7 "$1" %
                    135: define f2      % "\&" font 2 "$1" %
                    136: define cdot    % "\s7\f8\N'183'\fP\s0" %
                    137: define =>      % "\v'-.15m'\f8\N'222'\fP\v'.15m'" %
                    138: define C++     % "\f1C\h'-.14m'+\h'-.18'+\fP" %
                    139: define <!      % "\f8\N'225'\fP" %
                    140: define >!      % "\f8\N'241'\fP" %
                    141: delim $$
                    142: .EN
                    143: .ND "July 1, 1989"
                    144: .TL
                    145: Yacc: A Parser Generator\(dg
                    146: .AU
                    147: Stephen C. Johnson
                    148: Ravi Sethi
                    149: .AI
                    150: .MH
                    151: .AB
                    152: Since the early 1970s, Yacc has been used to implement
                    153: hundreds of languages, big and small.
                    154: Its applications range from small desk calculators
                    155: to medium-sized preprocessors for typesetting
                    156: to large compiler front ends for complete programming languages.
                    157: .PP
                    158: A Yacc specification is based on a collection of grammar rules
                    159: describing the syntax of a language; Yacc turns the
                    160: specification into a syntax analyzer.
                    161: A pure syntax analyzer merely checks whether or not an input string
                    162: conforms to the syntax of the language.
                    163: .PP
                    164: We can go beyond pure syntax analysis by attaching code in C
                    165: or $C++$ to
                    166: a grammar rule; such code is called an action, and is executed
                    167: whenever the rule is applied during syntax analysis.
                    168: Thus, a desk calculator might use actions to evaluate an expression,
                    169: and a compiler front end might use actions to
                    170: emit intermediate code.
                    171: .PP
                    172: Yacc allows us to build parsers from LALR(1) grammars
                    173: without necessarily learning the underlying theory.
                    174: .AE
                    175: .@tag SH _SH1_
                    176: .FS
                    177: \(dg Prepared by R. Sethi from\&|reference(v7yacc)\&.
                    178: S. C. Johnson is presently with Ardent Computer,
                    179: 880 West Maude Ave.,
                    180: Sunnyvale, California 94086.
                    181: .FE
                    182: .SH _SH1_  "Introduction"
                    183: .LP
                    184: Yacc is a tool for building syntax analyzers, also known as
                    185: .I parsers .
                    186: This section introduces the basic features of Yacc.
                    187: We review grammars, build a pure parser
                    188: for real numbers, and then augment the parser to evaluate
                    189: numbers during parsing.
                    190: The language of real numbers is a toy;
                    191: realistic examples appear in Section _SH2_.
                    192: .PP
                    193: Uppercase letters are distinct from lowercase letters
                    194: in Yacc specifications.
                    195: Thus,
                    196: .CW digit
                    197: and
                    198: .CW DIGIT
                    199: are distinct names.
                    200: The font of a name is chosen purely for readability, so
                    201: .CW fraction ,
                    202: and $fraction$ (within diagrams)
                    203: refer to the same name.
                    204: .SS "Further Reading"
                    205: Yacc is designed to handle a single but significant part
                    206: of the total job of building a translator or interpreter
                    207: for a language.
                    208: The remaining parts of the job must be implemented
                    209: in a host programming language,
                    210: presumed to be C|reference(Kernighan Ritchie 1988) or
                    211: $C++$|reference(Stroustrup book 1986).
                    212: .PP
                    213: Another progam generator, designed to work in harmony with Yacc,
                    214: is Lex|reference(latest lex), a tool developed for
                    215: building lexical analyzers.
                    216: Lex can be easily used to produce quite complicated lexical analyzers,
                    217: but there remain some languages (such as Fortran) that do not
                    218: fit any theoretical framework, and whose lexical analyzers
                    219: must be crafted by hand.
                    220: .PP
                    221: Kernighan and Pike illustrate program development
                    222: using Yacc and Lex by gradually extending an expression evaluator
                    223: into an interpreter for a language comparable to Basic|reference(Kernighan Pike).
                    224: Schreiner and Friedman conduct a book-length case
                    225: study of how to create a compiler using Yacc and Lex|reference(Schreiner Friedman).
                    226: .PP
                    227: Textbooks on compilers often provide more information on the behavior and
                    228: construction of parsers than will be covered here; see for example
                    229: \&|reference(Aho Sethi Ullman 1986)\&.
                    230: The algorithms underlying Yacc are also discussed in the survey
                    231: of LR parsing by
                    232: \&|reference(Aho Johnson surveys)\&.
                    233: A feature that sets Yacc apart \(em its ability to build fast compact
                    234: LR parsers from ambiguous grammars \(em is based on the theory
                    235: developed by
                    236: \&|reference(Aho Johnson Ullman ambiguous)\&.
                    237: .PP
                    238: Among the earliest applications of Yacc are
                    239: EQN|reference(Kernighan Cherry 1975), a language for typesetting mathematics, and
                    240: PCC, the Portable C Compiler|reference(Johnson portable acm).
                    241: .SS "Grammars, Reviewed"
                    242: The
                    243: .I syntax
                    244: of a language imposes a hierarchical structure,
                    245: called a
                    246: .I "parse tree" ,
                    247: on strings in the language.
                    248: The following is a parse tree for the string
                    249: .CW 3.14
                    250: in a language of real numbers:
                    251: .KS
                    252: .ps 9
                    253: .ft CB
                    254: .PS
                    255: [
                    256:        hu = .5; vu = 1.5*vs; choph = vs; chopw = .7
                    257:        boxht = vs; boxwid = .8*vs
                    258: 
                    259:        "$realNumber$"
                    260:         {
                    261:                ln(-1,-1); "$integerPart$"
                    262:                ln( 0,-1); "$digit$"
                    263:                ln( 0,-2); "3"
                    264:        }{
                    265:                ln( 0,-4); "."
                    266:        }{
                    267:                ln( 1.5,-1); "$fraction$"
                    268:                 {
                    269:                        ln(-0.5,-1); "$digit$"
                    270:                        ln( 0,-2); "1"
                    271:                }{
                    272:                        ln( 0.5,-1); "$fraction$"
                    273:                        ln( 0,-1); "$digit$"
                    274:                        ln( 0,-1); "4"
                    275:                }
                    276:        }
                    277: ]
                    278: .PE
                    279: .KE
                    280: .PP
                    281: The leaves at the bottom of a parse tree are labeled with
                    282: .I terminals
                    283: or
                    284: .I tokens ;
                    285: tokens represent themselves.
                    286: By contrast, the other nodes of a parse tree are labeled with
                    287: .I nonterminals .
                    288: Each node in the parse tree is based on a rule
                    289: that defines a nonterminal in terms of a sequence of
                    290: terminals and nonterminals.
                    291: Such rules are called
                    292: .I productions .
                    293: The root of the preceding parse tree is based on the
                    294: following informally stated production:
                    295: .Q{
                    296: A real number consists of an integer part, a point, and a fraction.
                    297: .Q}
                    298: This production is written as follows in the notation accepted by Yacc:
                    299: .P{
                    300: realNumber :  integerPart '.' fraction
                    301:            ;
                    302: .P}
                    303: .PP
                    304: Together, the tokens, the nonterminals, the productions, and a
                    305: distinguished nonterminal, called the
                    306: .I "start symbol" ,
                    307: constitute a
                    308: .I grammar
                    309: for a language.
                    310: Both tokens and nonterminals can be referred to as
                    311: .I "grammar symbols" ,
                    312: or simply
                    313: .I symbols .
                    314: .SS "Grammars in Yacc Specifications"
                    315: A Yacc specification has three sections for
                    316: optional declarations, productions, and optional user-supplied programs.
                    317: The productions are the heart of a specification; they are
                    318: darker for emphasis in Figure _FI2_.
                    319: The sections are separated by
                    320: double percent
                    321: .CW %%
                    322: marks \(em the percent symbol
                    323: is generally used by Yacc as an escape character.
                    324: If the programs section is omitted, the second
                    325: .CW %%
                    326: mark can be omitted as well.
                    327: .KF bottom
                    328: .ps 9
                    329: .nf
                    330: \s5\l'\n(LLu\&\(ul'\s0
                    331: .fi
                    332: .PS
                    333: [
                    334:        define text % [
                    335:        B:      box ht vs wid pagewid invis
                    336:                $1 ljust at B.w + 20/72,0
                    337:        ] %
                    338:  down
                    339: .ft CW
                    340:  text("%start lines")
                    341:  text("%%")
                    342: .ft CB
                    343:  text("lines       : /* empty */")
                    344:  text("            | lines realNumber '\en'")
                    345:  text("            ;")
                    346:  text("realNumber  : integerPart '.' fraction")
                    347:  text("            ;")
                    348:  text("integerPart : digit")
                    349:  text("            | integerPart digit")
                    350:  text("            ;")
                    351:  text("fraction    : digit")
                    352:  text("            | digit fraction")
                    353:  text("            ;")
                    354:  text("digit       : '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'")
                    355:  text("            ;")
                    356: .ft CW
                    357:  text("%%")
                    358:  text("#include <stdio.h>")
                    359:  text("int  yylex() { return getchar(); }")
                    360:  text("int  main()  { return yyparse(); }")
                    361:  text("void yyerror(s) char *s; { fprintf(stderr, \"%s\en\", s); }")
                    362: ]
                    363: .PE
                    364: .@tag FI _FI2_
                    365: .FI _FI2_
                    366: A complete Yacc specification for sequences of real numbers, one per line.
                    367: .EF 0
                    368: .nf
                    369: \s5\l'\n(LLu\&\(ul'\s0
                    370: .fi
                    371: .SP
                    372: .KE
                    373: .PP
                    374: Blanks, tabs, and newlines are ignored.
                    375: Comments can appear wherever a name can; they are enclosed
                    376: between
                    377: .CW /*
                    378: and
                    379: .CW */ ,
                    380: as in C.
                    381: .PP
                    382: It is possible, and desirable, for the start symbol of a grammar
                    383: to be declared explicitly, using the
                    384: .CW %start
                    385: keyword, as in
                    386: .P{
                    387: %start lines
                    388: .P}
                    389: Otherwise, the start symbol is taken from the first production in the
                    390: specification.
                    391: .PP
                    392: A name in the production section is presumed to represent a nonterminal
                    393: unless it is explicitly declared to represent a token.
                    394: There are no token declarations in Figure _FI2_;
                    395: later in this section,
                    396: .CW DIGIT
                    397: will be declared to be a token by writing
                    398: .P{
                    399: %token DIGIT
                    400: .P}
                    401: .PP
                    402: Single-character tokens need not be declared; a
                    403: .I literal
                    404: is a character enclosed in single quotes.
                    405: As in C, the backslash
                    406: .CW \e
                    407: is an escape character within literals, and the following C escapes are
                    408: recognized:
                    409: .ft CB
                    410: .TS
                    411: lw4 0 l l.
                    412:        '\en'   \f1newline\fP
                    413:        '\er'   \f1return\fP
                    414:        '\e''   \f1single quote \fP'\f1\fP
                    415:        '\et'   \f1tab\fP
                    416:        '\eb'   \f1backspace\fP
                    417:        '\ef'   \f1form feed\fP
                    418:        '\exxx' \f1``\fPxxx\f1'' in octal
                    419: .TE
                    420: For technical reasons, the
                    421: .CW NUL
                    422: character,
                    423: .CW '\e0'
                    424: or
                    425: .CW 0 ,
                    426: should never be used in productions.
                    427: .PP
                    428: A production
                    429: .P{
                    430: realNumber :  integerPart '.' fraction
                    431:            ;
                    432: .P}
                    433: defines a nonterminal, called its
                    434: .I "left side" ,
                    435: in terms of a sequence of grammar symbols, called its
                    436: .I "right side" .
                    437: A colon separates the two sides, and a semicolon marks the end
                    438: of the production.
                    439: The left side of this production is
                    440: .CW realNumber .
                    441: Its right side consists of
                    442: .CW integerPart ,
                    443: the literal
                    444: .CW '.' ,
                    445: and
                    446: .CW fraction .
                    447: .PP
                    448: The right side of a production can be empty, as in the following
                    449: production with no symbols between the colon and the
                    450: terminating semicolon:
                    451: .P{
                    452: lines : ;
                    453: .P}
                    454: .PP
                    455: Productions with the same left side can be combined, and written with
                    456: a vertical bar separating the right sides.
                    457: The productions
                    458: .P{
                    459: integerPart :  digit
                    460:             ;
                    461: integerPart :  integerPart digit
                    462:             ;
                    463: .P}
                    464: can be rewritten equivalently as
                    465: .P{
                    466: integerPart :  digit
                    467:             |  integerPart digit
                    468:             ;
                    469: .P}
                    470: In words, an integer part is either a single digit or a
                    471: (smaller) integer part followed by a digit.
                    472: Thus,
                    473: an integer part consists of
                    474: a string of one or more digits.
                    475: .PP
                    476: A fraction also consists of a string of one or more digits;
                    477: however, the productions for
                    478: .CW fraction
                    479: impose a different hierarchical
                    480: structure on strings of digits.
                    481: The productions are
                    482: .P{
                    483: fraction :  digit
                    484:          |  digit fraction
                    485:          ;
                    486: .P}
                    487: Note how a tree for
                    488: .CW integerPart
                    489: grows down to the left, whereas a tree for
                    490: .CW fraction
                    491: grows down to the right:
                    492: .KS
                    493: .ps 9
                    494: .ft CB
                    495: .PS
                    496: [
                    497:        hu = .5; vu = 1.5*vs; choph = vs; chopw = .7
                    498:        boxht = vs
                    499: 
                    500: IntegerPart:\
                    501:        [
                    502:                "$integerPart$"
                    503:                {
                    504:                        ln( 1,-1); "$digit$"
                    505:                        ln( 0,-1); "3"
                    506:                }
                    507:                ln(-1,-1); "$integerPart$"
                    508:                {
                    509:                        ln( 1,-1); "$digit$"
                    510:                        ln( 0,-1); "2"
                    511:                }
                    512:                ln(-1,-1); "$integerPart$"
                    513:                {
                    514:                        ln( 0,-1); "$digit$"
                    515:                        ln( 0,-1); "1"
                    516:                }{
                    517:                        box invis wid .8 at Here
                    518:                }
                    519:        ]
                    520: Fraction:\
                    521:        [
                    522:                "$fraction$"
                    523:                {
                    524:                        ln(-1,-1); "$digit$"
                    525:                        ln( 0,-1); "7"
                    526:                }
                    527:                ln( 1,-1); "$fraction$"
                    528:                {
                    529:                        ln(-1,-1); "$digit$"
                    530:                        ln( 0,-1); "8"
                    531:                }
                    532:                ln( 1,-1); "$fraction$"
                    533:                {
                    534:                        ln( 0,-1); "$digit$"
                    535:                        ln( 0,-1); "9"
                    536:                }{
                    537:                        box invis wid .6 at Here
                    538:                }
                    539:        ] with .e at IntegerPart.w + pagewid-2*20/72,0
                    540: ]
                    541: .PE
                    542: .KE
                    543: .LP
                    544: The different hierarchical structures imposed by
                    545: .CW integerPart
                    546: and
                    547: .CW fraction
                    548: on strings of digits facilitate the evaluation of real numbers,
                    549: as we shall see later in this section.
                    550: .SS "Using Yacc"
                    551: Parsers generated by Yacc need to be supplemented
                    552: before a self-contained application is built.
                    553: Only four lines are devoted to such supplementary
                    554: code at the end of Figure _FI2_.
                    555: In other words,
                    556: Yacc confines itself to generating fast parsers, leaving
                    557: us with both the control and responsibility
                    558: for all other aspects of an application.
                    559: .PP
                    560: The use of Yacc is illustrated in Figure _FI3_.
                    561: The code of a Yacc-generated parser is a function,
                    562: .CW yyparse ,
                    563: which returns 0
                    564: if the entire input is parsed successfully;
                    565: otherwise, it returns 1.
                    566: The function
                    567: .CW yyparse
                    568: gets tokens by repeatedly calling
                    569: .CW yylex ,
                    570: a lexical analyzer.
                    571: .KF bottom
                    572: .nf
                    573: \s5\l'\n(LLu\&\(ul'\s0
                    574: .fi
                    575: .nr PS 9
                    576: .ps 9
                    577: .vs 11
                    578: .PS
                    579: [
                    580:        fillval = 1
                    581:        boxht = 2.5*vs; boxwid = .6
                    582:        lineht = vs; linewid = .25
                    583: 
                    584:        right
                    585:        box invis "character" "stream" wid .7
                    586:        line ->
                    587:        box "lexical" "analyzer" fill
                    588:        line ->
                    589:        box invis "token" "stream"
                    590:        line ->
                    591:        box "syntax" "analyzer" fill
                    592:        {
                    593:                move to last box.n
                    594:                up
                    595:                line <-
                    596:                box "C" "compiler"
                    597:                line <-
                    598:                box "Yacc" fill
                    599:                line <-
                    600:                box invis ht 1.5*vs "grammar"
                    601:        }
                    602:        line ->
                    603:        box invis "optional" "output"
                    604: ]
                    605: .PE
                    606: .@tag FI _FI3_
                    607: .FI _FI3_
                    608: Yacc handles the syntax analysis part of an application.
                    609: .EF 0
                    610: .nf
                    611: \s5\l'\n(LLu\&\(ul'\s0
                    612: .fi
                    613: .SP
                    614: .KE
                    615: .PP
                    616: A
                    617: .I "lexical analyzer"
                    618: reads input characters and returns tokens.
                    619: The simplest lexical analyzer returns each individual character
                    620: as a token; it is defined by
                    621: .P{
                    622: int yylex() { return getchar(); }
                    623: .P}
                    624: .PP
                    625: Execution of a C program begins in a function called
                    626: .CW main ,
                    627: so
                    628: .CW main
                    629: must call
                    630: .CW yyparse.
                    631: The code for
                    632: .CW main
                    633: in Figure _FI2_
                    634: .P{
                    635: int main() { return yyparse(); }
                    636: .P}
                    637: simply returns the result obtained from
                    638: .CW yyparse ;
                    639: more generally,
                    640: .CW main
                    641: might read command-line arguments and options
                    642: before calling
                    643: .CW yyparse .
                    644: .PP
                    645: If a syntax error occurs during parsing,
                    646: .CW yyparse
                    647: calls a user-supplied function
                    648: .CW yyerror
                    649: with a terse message, usually
                    650: .CW "syntax error" .'' ``
                    651: The following implementation of
                    652: .CW yyerror
                    653: prints the message :
                    654: .P{
                    655: void yyerror(s) char *s; { fprintf(stderr, "%s\en", s); }
                    656: .P}
                    657: Parsing terminates when an error is detected unless ``error productions''
                    658: are used as described in Section _SH5_.
                    659: .PP
                    660: We have now examined all the pieces of the specification in
                    661: Figure _FI2_ except
                    662: .P{
                    663: #include <stdio.h>
                    664: .P}
                    665: which provides access to input/output facilities from a
                    666: standard library. 
                    667: .PP
                    668: When Yacc is applied to a specification, the output
                    669: is a file of C programs, called
                    670: .CW y.tab.c
                    671: on most systems
                    672: (the name might differ due to local file-system conventions).
                    673: Suppose that the specification in Figure _FI2_ appears in a file
                    674: .CW real.y .
                    675: A program for reading a sequence of real numbers can then be
                    676: constructed by the following
                    677: .UX
                    678: system commands:
                    679: .ft CB
                    680: .TS
                    681: lw4 0 l8 l.
                    682:        yacc real.y     \f2generates C code into file \&\fPy.tab.c
                    683:        cc y.tab.c      \f2compiles executable program into file \&\fPa.out
                    684: .TE
                    685: .LP
                    686: The compiled program
                    687: .CW a.out
                    688: silently reads real numbers, one per line, until the end of the input
                    689: is reached, or until a syntax error occurs.
                    690: The specification will now be extended to evaluate real numbers
                    691: as they are read.
                    692: .EQ
                    693: delim off
                    694: .EN
                    695: .SS "Actions and Attributes"
                    696: An action attached to a production is
                    697: executed each time the production is applied during parsing.
                    698: An
                    699: .I action
                    700: consists of one or more C statements, enclosed in curly braces
                    701: .CW {
                    702: and
                    703: .CW } .
                    704: Within an action, pseudo-variables starting with
                    705: .CW $
                    706: signs refer to values associated with the symbols in the production.
                    707: The pseudo-variable for the left side is
                    708: .CW $$ ;
                    709: the pseudo-variable for a symbol on the right side
                    710: is formed by prefixing a
                    711: .CW $
                    712: sign to its name or to its position.
                    713: .PP
                    714: The action in
                    715: .P{
                    716: realNumber : integerPart fraction { $$ = $integerPart + $fraction; } ;
                    717: .P}
                    718: is the single statement
                    719: .P{
                    720: $$ = $integerPart + $fraction;
                    721: .P}
                    722: .EQ
                    723: delim @@
                    724: .EN
                    725: It defines the value associated with the left side to be the sum of the
                    726: values associated with the two symbols on the right side.@"" sup _FS#_@
                    727: .FS
                    728: .@tag FS _FS#_
                    729: @"" sup _FS#_@
                    730: When the same symbol @s@ appears several times on the right side,
                    731: its pseudo-variable can be written as
                    732: .CW $@s@#1 ,
                    733: .CW $@s@#2 ,
                    734: .CW $@s@#3 .
                    735: .FE
                    736: Using pseudo-variables formed from positions on the right side, instead of
                    737: names, the action can be rewritten equivalently as
                    738: .EQ
                    739: delim off
                    740: .EN
                    741: .P{
                    742: realNumber :  integerPart fraction  { $$ = $1 + $2; }  ;
                    743: .P}
                    744: This production and action are from the complete specification
                    745: in Figure _FI2A_.
                    746: .PP
                    747: Earlier versions of Yacc support only positional pseudo-variables
                    748: like
                    749: .CW $1
                    750: and
                    751: .CW $2 .
                    752: .PP
                    753: The type of the values associated with grammar symbols is given by
                    754: .CW YYSTYPE ,
                    755: defined to be
                    756: .CW double
                    757: in Figure _FI2A_.
                    758: The default type for
                    759: .CW YYSTYPE
                    760: is
                    761: .CW int .
                    762: Any C code in the declarations section must be enclosed between
                    763: .CW %{
                    764: and
                    765: .CW %} .
                    766: See Section _SH6_ for how to associate different types of values with
                    767: different grammar symbols.
                    768: .KF
                    769: .ps 9
                    770: .nf
                    771: \s5\l'\n(LLu\&\(ul'\s0
                    772: .fi
                    773: .PS
                    774: [
                    775:        define text % [
                    776:        B:      box ht vs wid pagewid invis
                    777:                $1 ljust at B.w + 20/72,0
                    778:        ] %
                    779:  down
                    780: .ft CW
                    781:   text("%token DIGIT")
                    782:   text("%start lines")
                    783:   text("%{")
                    784:   text("#def\&ine YYSTYPE double")
                    785:   text("%}")
                    786:   text("%%")
                    787: .ft CB
                    788:   text("lines       : lines realNumber '\en'")
                    789: .ft CW
                    790:   text("                { printf(\"%g\en\", $realNumber); }")
                    791: .ft CB
                    792:   text("            | /* empty */")
                    793:   text("            ;")
                    794:   text("realNumber  : integerPart '.' fraction")
                    795: .ft CW
                    796:   text("                { $$ = $integerPart + $fraction; }")
                    797: .ft CB
                    798:   text("            ;")
                    799:   text("integerPart : DIGIT")
                    800:   text("            | integerPart DIGIT")
                    801: .ft CW
                    802:   text("                { $$ = $integerPart*10 + $DIGIT; }")
                    803: .ft CB
                    804:   text("            ;")
                    805:   text("fraction    : DIGIT")
                    806: .ft CW
                    807:   text("                { $$ = $DIGIT*0.1; }")
                    808: .ft CB
                    809:   text("            | DIGIT fraction")
                    810: .ft CW
                    811:   text("                { $$ = ($DIGIT + $fraction)*0.1; }")
                    812: .ft CB
                    813:   text("            ;")
                    814: .ft CW
                    815:   text("%%")
                    816:   text("#include <stdio.h>")
                    817:   text("#include <ctype.h>")
                    818:   text("int  yylex()   {")
                    819:   text("    int c;")
                    820:   text("    c = getchar();")
                    821:   text("    if( ! isdigit(c) ) return c;")
                    822:   text("    yylval = c - '0';")
                    823:   text("    return DIGIT;")
                    824:   text("}")
                    825:   text("int  main() { return yyparse(); }")
                    826:   text("void yyerror(s) char *s; { fprintf(stderr, \"%s\en\", s); }")
                    827: ]
                    828: .PE
                    829: .@tag FI _FI2A_
                    830: .FI _FI2A_
                    831: The actions in this Yacc specification evaluate real numbers during parsing.
                    832: .EF 0
                    833: .nf
                    834: \s5\l'\n(LLu\&\(ul'\s0
                    835: .fi
                    836: .SP
                    837: .KE
                    838: .PP
                    839: The tree in Figure _FI2C_ illustrates the evaluation of the real number
                    840: .CW 321.789 .
                    841: (The tree is technically not a parse tree because its root is not
                    842: for the start symbol
                    843: .CW lines ,
                    844: and the nodes are labeled with values rather than grammar symbols.)
                    845: .KF
                    846: .EQ
                    847: delim $$
                    848: .EN
                    849: .nf
                    850: \s5\l'\n(LLu\&\(ul'\s0
                    851: .fi
                    852: .ps 9
                    853: .ft CB
                    854: .PS
                    855: [
                    856:        define intp % {
                    857:                "$f2($integerPart)^=^$1$"
                    858:        } %
                    859:        define frac % {
                    860:                "$f2($fraction)^=^$1$"
                    861:        } %
                    862:        define DIGIT % {
                    863:                "$Small($DIGIT)^=^$1$"
                    864:        } %
                    865: 
                    866:        hu = .6; vu = 2.5*vs; choph = vs; chopw = .7
                    867:        boxht = vs
                    868: 
                    869:        "$f2($realNumber)^=^321.789$"
                    870:        {
                    871:                ln(-2,-1); intp(321)
                    872:                {
                    873:                        ln( 1,-1); DIGIT(1)
                    874:                }
                    875:                ln(-1,-1); intp(32)
                    876:                {
                    877:                        ln( 1,-1); DIGIT(2)
                    878:                }
                    879:                ln(-1,-1); intp(3)
                    880:                {
                    881:                        ln( 0,-1); DIGIT(3)
                    882:                }{
                    883:                        box invis wid .85 at Here
                    884:                }
                    885:        }{
                    886:                ln( 2,-1); frac(0.789)
                    887:                {
                    888:                        ln(-1,-1); DIGIT(7)
                    889:                }
                    890:                ln( 1,-1); frac(0.89)
                    891:                {
                    892:                        ln(-1,-1); DIGIT(8)
                    893:                }
                    894:                ln( 1,-1); frac(0.9)
                    895:                {
                    896:                        ln( 0,-1); DIGIT(9)
                    897:                }{
                    898:                        box invis wid .8 at Here
                    899:                }
                    900:        }
                    901: ]
                    902: .PE
                    903: .@tag FI _FI2C_
                    904: .FI _FI2C_
                    905: Attribute values during the evaluation of
                    906: .CB 321.789 .
                    907: .EF 0
                    908: .nf
                    909: \s5\l'\n(LLu\&\(ul'\s0
                    910: .fi
                    911: .SP
                    912: .EQ
                    913: delim off
                    914: .EN
                    915: .KE
                    916: .PP
                    917: A value associated with a node in a parse tree is called an
                    918: .I attribute .
                    919: For the moment, the attribute at a node will be defined solely in
                    920: terms of the attributes at the children of the node.
                    921: .PP
                    922: Attributes for tokens are defined by the lexical analyzer.
                    923: Conceptually, a lexical analyzer returns a pair, consisting
                    924: of a token and an associated attribute value.
                    925: For example, in Figure _FI2A_,
                    926: .CW DIGIT
                    927: is a token.
                    928: When the lexical analyzer reads the character
                    929: .CW 1
                    930: it returns
                    931: .CW DIGIT
                    932: with attribute value 1, when it reads
                    933: .CW 2
                    934: it returns
                    935: .CW DIGIT
                    936: with attribute value 2, and so on.
                    937: .PP
                    938: Specifically, the parser
                    939: .CW yyparse
                    940: expects the lexical analyzer
                    941: .CW yylex
                    942: to leave the attribute value in a global variable
                    943: .CW yylval .
                    944: The function
                    945: .CW yylex
                    946: in Figure _FI2A_ assigns a value to
                    947: .CW yylval
                    948: just before it returns the token
                    949: .CW DIGIT .
                    950: .PP
                    951: Starting in the bottom-left corner of Figure _FI2C_,
                    952: the lexical analyzer sets the attribute value 3 at the
                    953: leftmost leaf for the token
                    954: .CW DIGIT .
                    955: The parent of this leaf is based on the production and action
                    956: .P{
                    957: integerPart :  DIGIT  { $$ = $1; }  ;
                    958: .P}
                    959: This action is omitted in Figure _FI2A_ because, by default,
                    960: the parser sets the attribute of the left side to that of the
                    961: first symbol on the right side.
                    962: .PP
                    963: Working up the tree, the next node is based on
                    964: .P{
                    965: integerPart :  integerPart DIGIT  { $$ = $integerPart + $DIGIT; }  ;
                    966: .P}
                    967: .PP
                    968: The effect of the actions is perhaps easier to see at the nodes
                    969: for
                    970: .CW fraction .
                    971: At the only node based on
                    972: .P{
                    973: fraction :  DIGIT  { $$ = $DIGIT*0.1; }  ;
                    974: .P}
                    975: the value of
                    976: .CW $DIGIT
                    977: is 9 and the value of
                    978: .CW $fraction
                    979: is 0.9.
                    980: .PP
                    981: Since Yacc generates bottom-up parsers, bottom-up evaluation of
                    982: attribute values fits naturally with parsing.
                    983: Actions attached to productions are examined further in Section _SH2_;
                    984: their execution order becomes significant when
                    985: they do input/output, assign values to variables, call functions
                    986: with side effects, or otherwise affect the state of a computation.
                    987: .SS "A Style for Specifications"
                    988: Choose a style that makes the productions
                    989: visible through the morass of action code.
                    990: .SP .5
                    991: .IP a. 4
                    992: Use all capital letters for token names, all lower case letters for
                    993: nonterminal names.
                    994: This hint comes under the heading of ``knowing who to blame when
                    995: things go wrong.''
                    996: .SP .25
                    997: .IP b.
                    998: Put productions and actions on separate lines.
                    999: Either can then be changed independently.
                   1000: .SP .25
                   1001: .IP c.
                   1002: Put all productions with the same left side together.
                   1003: Put the left side in only once, and let all
                   1004: following productions begin with a vertical bar.
                   1005: .SP .25
                   1006: .IP d.
                   1007: Put a semicolon only after the last production with a given left side,
                   1008: and put the semicolon on a separate line.
                   1009: New productions can then be easily added.
                   1010: .SP .25
                   1011: .IP e.
                   1012: Indent production bodies by one tab stop, and action bodies by two
                   1013: tab stops.
                   1014: .PP
                   1015: These style hints owe much to Brian Kernighan.
                   1016: The examples in this paper sometimes deviate from this style to conserve space.
                   1017: .EQ
                   1018: delim $$
                   1019: .EN
                   1020: .@tag SH _SH2_
                   1021: .SH _SH2_  "Evaluation And Translation Of Expressions"
                   1022: Both actions and productions must be considered
                   1023: when a Yacc specification is designed.
                   1024: Without actions, a parser would silently analyze input strings,
                   1025: complaining only if it detects an error.
                   1026: With suitable actions, a parser can become an evaluator or
                   1027: a translator.
                   1028: Typically, the desired actions
                   1029: influence the choice of productions.
                   1030: .PP
                   1031: For example, the actions for evaluating the integer and fractional
                   1032: parts of a real number motivate different productions for
                   1033: the sequences of digits
                   1034: represented by
                   1035: .CW integerPart
                   1036: and
                   1037: .CW fraction
                   1038: in Section _SH1_.
                   1039: In the integer part, the contribution of a digit depends on the
                   1040: number of digits to its right; the contribution of
                   1041: .CW 3
                   1042: in
                   1043: .CW 321.789
                   1044: is 300, where the number of zeros depends on the number of
                   1045: digits to its right.
                   1046: In the fractional part, however, the contribution of a digit
                   1047: depends on the number of digits to its left; the contribution
                   1048: of
                   1049: .CW 9
                   1050: in
                   1051: .CW 321.789
                   1052: is 0.009, where the number of zeros depends on the number of
                   1053: digits to its left.
                   1054: .PP
                   1055: Arithmetic expressions are a fertile source of examples for Yacc
                   1056: because the specifications of expression evaluators and translators are
                   1057: quite short and the ideas carry over to richer languages.
                   1058: This section begins with a specification for an
                   1059: expression evaluator.
                   1060: The evaluator benefits from Yacc's facilities for
                   1061: specifying the associativity and precedence of operators
                   1062: within expressions.
                   1063: The next example, a translator from infix into postfix notation,
                   1064: illustrates parsing order.
                   1065: .SS "Grammars for Expressions"
                   1066: Expressions are characterized by the operators within them;
                   1067: the choice of productions for expressions
                   1068: depends on the associativity and precedence of operators.
                   1069: .PP
                   1070: An operator
                   1071: .CW OP
                   1072: is
                   1073: .I "left associative"
                   1074: if an expression
                   1075: .P{
                   1076: expr$"" sub 1$ OP expr$"" sub 2$ OP expr$"" sub 3$
                   1077: .P}
                   1078: is evaluated as if it were parenthesized as
                   1079: .P{
                   1080: (expr$"" sub 1$ OP expr$"" sub 2$) OP expr$"" sub 3$
                   1081: .P}
                   1082: Similarly, the operator is
                   1083: .I "right associative"
                   1084: if the expression is evaluated as if it were parenthesized as
                   1085: .P{
                   1086: expr$"" sub 1$ OP (expr$"" sub 2$ OP expr$"" sub 3$)
                   1087: .P}
                   1088: .PP
                   1089: An operator
                   1090: .CW OPA
                   1091: has
                   1092: .I "lower precedence"
                   1093: than an operator
                   1094: .CW OPB
                   1095: if the following equivalences hold (that is, the expressions to the
                   1096: left and right of the $==$ signs have the same values):
                   1097: .ft CB
                   1098: .TS
                   1099: lw4 0 r2 c2 l.
                   1100:        expr$"" sub 1$ OPA expr$"" sub 2$ OPB expr$"" sub 3$    $==$    expr$"" sub 1$ OPA (expr$"" sub 2$ OPB expr$"" sub 3$)
                   1101:        expr$"" sub 1$ OPB expr$"" sub 2$ OPA expr$"" sub 3$    $==$    (expr$"" sub 1$ OPB expr$"" sub 2$) OPA expr$"" sub 3$
                   1102: .TE
                   1103: .PP
                   1104: The traditional grammar for arithmetic expressions uses three nonterminals
                   1105: .CW expr ,
                   1106: .CW term ,
                   1107: and
                   1108: .CW factor ,
                   1109: where
                   1110: .CW expr
                   1111: represents an expression and
                   1112: .CW term
                   1113: and
                   1114: .CW factor
                   1115: represent subexpressions:
                   1116: .P{
                   1117: %token NUMBER VAR
                   1118: %%
                   1119: expr   :  expr '+' term  |  expr '-' term  |  term
                   1120:        ;
                   1121: term   :  term '*' factor  |  term '/' factor  |  factor
                   1122:        ;
                   1123: factor :  NUMBER  |  VAR  |  '(' expr ')'
                   1124:        ;
                   1125: .P}
                   1126: In words, an expression is a sequence of terms separated
                   1127: by
                   1128: .CW +
                   1129: or
                   1130: .CW -
                   1131: signs.
                   1132: A term is a sequence of factors separated by
                   1133: .CW *
                   1134: or
                   1135: .CW /
                   1136: signs.
                   1137: Thus,
                   1138: .P{
                   1139: b*b - 4*a*c
                   1140: .P}
                   1141: is an expression containing two terms
                   1142: .CW b*b
                   1143: and
                   1144: .CW 4*a*c .
                   1145: The term
                   1146: .CW 4*a*c
                   1147: has three factors
                   1148: .CW 4 ,
                   1149: .CW a ,
                   1150: and
                   1151: .CW c .
                   1152: A factor is either a number, a variable, or a parenthesized expression.
                   1153: .PP
                   1154: Ths grammar for expressions
                   1155: dates back to 1960 when Backus\&|reference(Backus 1960 %no_cite)\&
                   1156: introduced BNF, a notation for writing grammars.
                   1157: .PP
                   1158: A desk calculator can be based on this grammar
                   1159: by adding actions, as in
                   1160: .EQ
                   1161: delim off
                   1162: .EN
                   1163: .P{
                   1164: expr :  expr '-' term  { $$ = $expr - $term; }
                   1165: .P}
                   1166: .EQ
                   1167: delim $$
                   1168: .EN
                   1169: This production and action respect the left associativity of
                   1170: the minus operator, and correctly evaluate
                   1171: .CW 7-1-2
                   1172: to 4 \(em check it by drawing a parse tree.
                   1173: .PP
                   1174: The traditional grammar generalizes to operators at $n^>=^1$ precedence levels;
                   1175: all operators at the same level have the same associativity and precedence.
                   1176: Set up a nonterminal
                   1177: .CW expr$"" sub i$
                   1178: for precedence level $i$, with level $1$ being the lowest.
                   1179: In the traditional grammar, the nonterminals
                   1180: .CW expr ,
                   1181: .CW term ,
                   1182: and
                   1183: .CW factor
                   1184: correspond to
                   1185: .CW expr$"" sub 1$ ,
                   1186: .CW expr$"" sub 2$ ,
                   1187: and
                   1188: .CW expr$"" sub 3$ ,
                   1189: respectively.
                   1190: If the operators at level $i^<^n$ are left associative,
                   1191: then the productions for
                   1192: .CW expr$"" sub i$
                   1193: have the form
                   1194: .P{
                   1195: expr$"" sub i$ :  expr$"" sub i$ OP expr$"" sub i+1$  ;
                   1196: .P}
                   1197: Here,
                   1198: .CW OP
                   1199: represents an operator at level $i$.
                   1200: Otherwise, if the operators at level $i$ are right associative,
                   1201: then the productions have the form
                   1202: .P{
                   1203: expr$"" sub i$ :  expr$"" sub i+1$ OP expr$"" sub i$  ;
                   1204: .P}
                   1205: .PP
                   1206: At each precedence level $i^<^n$, there is an additional production of the
                   1207: form
                   1208: .P{
                   1209: expr$"" sub i$ :  expr$"" sub i+1$  ;
                   1210: .P}
                   1211: .SS "Associativity and Precedence Declarations"
                   1212: Yacc has special facilities for declaring the associativity and
                   1213: precedence of operators.
                   1214: They will be introduced by considering the
                   1215: specification in Figure _PREC_.
                   1216: .KF
                   1217: .EQ
                   1218: delim off
                   1219: .EN
                   1220: .nf
                   1221: \s5\l'\n(LLu\&\(ul'\s0
                   1222: .fi
                   1223: .ps 9
                   1224: .ft CB
                   1225: .PS
                   1226: [
                   1227:        define text @ [
                   1228:        B:      box ht vs wid pagewid invis
                   1229:                $1 ljust at B.w + 20/72,0
                   1230:        ] @
                   1231:  down
                   1232:  text("%{")
                   1233:  text("#def\&ine YYSTYPE double")
                   1234:  text("%}")
                   1235:  text("%token NUMBER")
                   1236:  text("%left '+' '-'")
                   1237:  text("%left '*' '/'")
                   1238:  text("%right '^'")
                   1239:  text("%left '~' UMINUS")
                   1240:  text("%%")
                   1241:  text("lines :  lines expr '\en'        { printf(\"%g\en\", $expr); }")
                   1242:  text("      |  lines '\en'")
                   1243:  text("      |  /* empty */")
                   1244:  text("      ;")
                   1245:  text("expr  :  expr '+' expr          { $$ = $1 + $3; }")
                   1246:  text("      |  expr '-' expr          { $$ = $1 - $3; }")
                   1247:  text("      |  expr '*' expr          { $$ = $1 * $3; }")
                   1248:  text("      |  expr '/' expr          { $$ = $1 / $3; }")
                   1249:  text("      |  '-' expr %prec UMINUS  { $$ = - $expr; }")
                   1250:  text("      |  '~' expr               { $$ = - $expr; }")
                   1251:  text("      |  expr '^' expr          { $$ = pow($1, $3); }")
                   1252:  text("      |  '(' expr ')'           { $$ = $expr; }")
                   1253:  text("      |  NUMBER")
                   1254:  text("      ;")
                   1255: ]
                   1256: .PE
                   1257: .@tag FI _PREC_
                   1258: .FI _PREC_
                   1259: An expression evaluator based on precedence declarations for tokens.
                   1260: .EF 0
                   1261: .nf
                   1262: \s5\l'\n(LLu\&\(ul'\s0
                   1263: .fi
                   1264: .SP
                   1265: .EQ
                   1266: delim $$
                   1267: .EN
                   1268: .KE
                   1269: .PP
                   1270: The tokens of the evaluator in Figure _PREC_ are
                   1271: parentheses,
                   1272: .CW NUMBER ,
                   1273: and the operators
                   1274: .P{
                   1275: \&'+' '-' '*' '/' '^' '~' UMINUS
                   1276: .P}
                   1277: (Ignore
                   1278: .CW ~
                   1279: and
                   1280: .CW UMINUS
                   1281: for the moment.)
                   1282: .PP
                   1283: The associativity and precedence of tokens are declared on
                   1284: lines beginning with one of the keywords
                   1285: .CW %left ,
                   1286: .CW %right ,
                   1287: or
                   1288: .CW %nonassoc .
                   1289: All of the tokens on a line have the same associativity and
                   1290: precedence; they have lower precedence than operators on successive lines.
                   1291: These declarations will be referred to as
                   1292: .I precedence
                   1293: declarations.
                   1294: .PP
                   1295: (The keyword
                   1296: .CW %nonassoc
                   1297: is used to describe operators that must not associate with themselves;
                   1298: for example,
                   1299: .P{
                   1300: A .LT. B .LT. C
                   1301: .P}
                   1302: is illegal in Fortran because
                   1303: .CW .LT.
                   1304: is nonassociative.)
                   1305: .PP
                   1306: The precedence declarations
                   1307: .P{
                   1308: %left  '+' '-'
                   1309: %left  '*' '/'
                   1310: %right '^'
                   1311: .P}
                   1312: specify that
                   1313: .CW +
                   1314: and
                   1315: .CW -
                   1316: are left associative and have lower
                   1317: precedence than the left-associative operators
                   1318: .CW *
                   1319: and
                   1320: .CW / ,
                   1321: which in turn have lower precedence than the right-associative operator
                   1322: .CW ^ .
                   1323: .PP
                   1324: The operator
                   1325: .CW ^
                   1326: in the grammar
                   1327: represents exponentiation, as in
                   1328: .CW 2^3 ,
                   1329: which evaluates to 8.
                   1330: This operator is right associative;
                   1331: thus,
                   1332: .CW 2^2^3
                   1333: is equivalent to
                   1334: .CW 2^(2^3) .
                   1335: .PP
                   1336: The nonterminals of the grammar are
                   1337: .CW lines
                   1338: and
                   1339: .CW expr .
                   1340: The grammar expects a sequence of expressions, on separate lines.
                   1341: A typical production for
                   1342: .CW expr
                   1343: has the form
                   1344: .EQ
                   1345: delim off
                   1346: .EN
                   1347: .P{
                   1348: expr :  expr '+' expr   { $$ = $1 + $3; }
                   1349: .P}
                   1350: Alternatively, we can write the action as
                   1351: .P{
                   1352: expr :  expr '+' expr   { $$ = $expr#1 + $expr#2; }
                   1353: .P}
                   1354: .EQ
                   1355: delim $$
                   1356: .EN
                   1357: .PP
                   1358: With these precedence declarations, the expression
                   1359: .P{
                   1360: 2 ^ 2 ^ 3 * 4 - 5 * 6 - 7 * 8
                   1361: .P}
                   1362: is evaluated as if it were parenthesized as
                   1363: .P{
                   1364: ( (2^(2^3))*4  -  5*6 )  -  7*8
                   1365: .P}
                   1366: .PP
                   1367: The programs section for the evaluator is in Figure _PRECB_.
                   1368: The lexical analyzer
                   1369: .CW yylex
                   1370: returns a token each time it is called.
                   1371: It skips blanks.
                   1372: If it sees a digit or a decimal point, it
                   1373: returns the token
                   1374: .CW NUMBER
                   1375: after using the
                   1376: C library function
                   1377: .CW scanf
                   1378: to read a number into the global variable
                   1379: .CW yylval
                   1380: (as mentioned in Section 1, the attribute value, if any,
                   1381: associated with a token
                   1382: must be left in
                   1383: .CW yylval ).
                   1384: Otherwise, the lexical analyzer returns a character as a token.
                   1385: .KF
                   1386: .EQ
                   1387: delim off
                   1388: .EN
                   1389: .nf
                   1390: \s5\l'\n(LLu\&\(ul'\s0
                   1391: .fi
                   1392: .ps 9
                   1393: .ft CB
                   1394: .PS
                   1395: [
                   1396:        define text @ [
                   1397:        B:      box ht vs wid pagewid invis
                   1398:                $1 ljust at B.w + 20/72,0
                   1399:        ] @
                   1400:  down
                   1401:  text("%%")
                   1402:  text("#include <stdio.h>")
                   1403:  text("#include <ctype.h>")
                   1404:  text("#include <math.h>")
                   1405:  text("int yylex() {")
                   1406:  text("        int c;")
                   1407:  text("        while ( ( c = getchar() ) == ' ' );")
                   1408:  text("        if ( (c == '.') || (isdigit(c)) ) {")
                   1409:  text("                ungetc(c, stdin);")
                   1410:  text("                scanf(\"%le\", &yylval);")
                   1411:  text("                return NUMBER;")
                   1412:  text("        }")
                   1413:  text("        return c;")
                   1414:  text("}")
                   1415:  text("int main() { return yyparse(); }")
                   1416:  text("void yyerror(s) char * s; { fprintf(stderr, \"%s\en\", s); }")
                   1417: ]
                   1418: .PE
                   1419: .@tag FI _PRECB_
                   1420: .FI _PRECB_
                   1421: Programs section for the evaluator in Figure _PREC_.
                   1422: .EF 0
                   1423: .nf
                   1424: \s5\l'\n(LLu\&\(ul'\s0
                   1425: .fi
                   1426: .SP
                   1427: .EQ
                   1428: delim $$
                   1429: .EN
                   1430: .KE
                   1431: .PP
                   1432: The parser uses precedence declarations to decide when to apply a production.
                   1433: Suppose that the input has the form
                   1434: .P{
                   1435: expr * expr \&\f1$...$\fP
                   1436: .P}
                   1437: and the parser has to decide whether or not to apply the
                   1438: multiplication production
                   1439: .P{
                   1440: expr :  expr '*' expr
                   1441: .P}
                   1442: If the next symbol in the input is
                   1443: .CW + ,
                   1444: as in
                   1445: .P{
                   1446: expr * expr  + \&\f1$...$\fP
                   1447: .P}
                   1448: the parser applies the multiplication production because the
                   1449: token
                   1450: .CW +
                   1451: has lower precedence than
                   1452: .CW * .
                   1453: However, if the next symbol in the input is
                   1454: .CW ^ ,
                   1455: the parser defers the multiplication production because
                   1456: .CW ^
                   1457: has higher precedence than
                   1458: .CW * .
                   1459: .PP
                   1460: The treatment of the unary minus operator deserves special mention.
                   1461: The evaluator in Figure _PREC_ accepts the expression
                   1462: .CW 10^-1
                   1463: in lieu of $10 sup -1~==~0.1$.
                   1464: In other words,
                   1465: .CW 10^-1
                   1466: is treated like
                   1467: .CW 10^(-1) ,
                   1468: with unary minus having higher precedence than
                   1469: .CW ^ .
                   1470: To help distinguish between the two uses of the minus operator,
                   1471: the evaluator recognizes
                   1472: .CW ~
                   1473: as a synonym for unary minus.
                   1474: Unary
                   1475: .CW ~
                   1476: has the highest precedence and binary
                   1477: .CW -
                   1478: has the lowest precedence in Figure _PREC_.
                   1479: The expression
                   1480: .CW 3-10^~1
                   1481: is therefore equivalent to
                   1482: .CW 3-(10^(~1)) .
                   1483: .PP
                   1484: The keyword
                   1485: .CW %prec
                   1486: in the production
                   1487: .P{
                   1488: expr :  '-' expr  %prec UMINUS
                   1489: .P}
                   1490: specifies that the precedence of the unary minus operator is
                   1491: taken from that of the token
                   1492: .CW UMINUS .
                   1493: Since
                   1494: .CW ~
                   1495: has this same precedence,
                   1496: .CW 3-10^-1
                   1497: is equivalent to
                   1498: .CW 3-(10^(-1)) .
                   1499: .PP
                   1500: The
                   1501: .CW %prec
                   1502: keyword is used to override the precedence of the tokens
                   1503: on the right side of a production.
                   1504: Without
                   1505: .CW %prec
                   1506: the parser uses the precedence of the last token on the right
                   1507: side to decide whether to apply a production.
                   1508: Thus, the
                   1509: .CW %prec
                   1510: in
                   1511: .P{
                   1512: expr :  '(' TYPENAME ')' expr   %prec TYPENAME
                   1513: .P}
                   1514: is necessary for the production to take the precedence of
                   1515: token
                   1516: .CW TYPENAME ;
                   1517: otherwise the production takes its precedence from the
                   1518: closing parenthesis.
                   1519: .PP
                   1520: It is recommended that precedence declarations
                   1521: be used in a ``cookbook'' fashion, until some experience is gained.
                   1522: How Yacc uses precedence declarations is examined further in
                   1523: Section _SH4_.
                   1524: .SS "Execution Order for Actions"
                   1525: The execution order of actions is significant because actions can
                   1526: have side effects.
                   1527: One way to visualize the order is to imagine a traversal of
                   1528: a parse tree in which the children of each node
                   1529: are visited depth-first from left to right, starting at the root.
                   1530: Suppose a node has two children $c$ and $d$, with $c$ to the left of $d$.
                   1531: .I Depth-first
                   1532: implies that all the nodes in the subtree for $c$
                   1533: are visited before any nodes are visited in the subtree for $d$.
                   1534: The tree in Figure _FI.ACTIONS_ includes actions as pseudo-symbols,
                   1535: attached by dashed lines.
                   1536: Actions are executed in the order they would be visited
                   1537: in a depth-first left-to-right traversal.
                   1538: .KF
                   1539: .EQ
                   1540: define Small % size 7 "$1" %
                   1541: .EN
                   1542: .nf
                   1543: \s5\l'\n(LLu\&\(ul'\s0
                   1544: .fi
                   1545: .nr PS 9
                   1546: .ps 9
                   1547: .PS
                   1548: [
                   1549:        define NUM % {
                   1550:                "$Small(NUM)$"
                   1551:                "$Small($NUM)^=^$1$" at Here + 0,-vs
                   1552:        } %
                   1553: 
                   1554:        hu = .3; vu = vs; choph = vs; chopw = .7
                   1555:        boxht = vs
                   1556: 
                   1557:        "$expr$"
                   1558:         {
                   1559:                ln(-5,-3); "$expr$"
                   1560: G1:""
                   1561:                 {      ln(-2,-2); NUM(2)
                   1562: G2:""
                   1563:                }{      ln( 1,-2, dashed .04); "{print $Small($NUM)$}"
                   1564: G3:""
                   1565:                }
                   1566:        }{
                   1567:                ln(-1,-3); "+"
                   1568:        }{
                   1569:                ln( 2,-3); "$expr$"
                   1570:                 {
                   1571:                        ln(-3,-4); "$expr$"
                   1572:                         {      ln(-2,-2); NUM(3)
                   1573:                        }{      ln( 1,-2, dashed .04); "{print $Small($NUM)$}"
                   1574:                        }
                   1575:                }{
                   1576:                        ln(-.5,-4); "\(**"
                   1577:                }{
                   1578:                        ln( 2.5,-4); "$expr$"
                   1579:                         {      ln(-2,-4); NUM(5)
                   1580:                        }{      ln( 1,-4, dashed .04); "{print $Small($NUM)$}"
                   1581:                        }
                   1582:                }{
                   1583:                        ln( 5,-4, dashed .04);  "{print \(**}"
                   1584:                        box invis wid .6 ht vs at Here
                   1585:                }
                   1586:        }{
                   1587:                ln( 6,-3, dashed .04);  "{print +}"
                   1588:        }
                   1589: 
                   1590: H1:    G1 + -3*hu,0
                   1591: H2:    G2 + -5*hu,-3*vu
                   1592: H3:    G2.x, H2.y
                   1593: .ps 36
                   1594:        spline -> from H1 to H2 to H3
                   1595: .ps\n(PS
                   1596: ]
                   1597: .PE
                   1598: .@tag FI _FI.ACTIONS_
                   1599: .FI _FI.ACTIONS_
                   1600: Actions are executed in a depth-first left-to-right order.
                   1601: .EF 0
                   1602: .nf
                   1603: \s5\l'\n(LLu\&\(ul'\s0
                   1604: .fi
                   1605: .SP
                   1606: .KE
                   1607: .PP
                   1608: The parse tree in Figure _FI.ACTIONS_
                   1609: is based on the following specification of an
                   1610: infix-to-postfix translator:
                   1611: .EQ
                   1612: delim off
                   1613: .EN
                   1614: .P{
                   1615: %token NUM
                   1616: %left  '+'
                   1617: %left  '*'
                   1618: %%
                   1619: expr : expr '+' expr    { printf(" +"); }
                   1620:      | expr '*' expr    { printf(" *"); }
                   1621:      | '(' expr ')'
                   1622:      | NUM              { printf(" %d", $NUM); }
                   1623:      ;
                   1624: .P}
                   1625: .EQ
                   1626: delim $$
                   1627: .EN
                   1628: The translation is emitted incrementally during parsing, so
                   1629: the execution order of the print statements is critical.
                   1630: The translation of
                   1631: .CW 2+3*5
                   1632: is
                   1633: .P{
                   1634:  2 3 5 * +
                   1635: .P}
                   1636: .SS "Actions Embedded Within Rules"
                   1637: Yacc permits an action to be written in the middle of a production
                   1638: as well as at the end; such actions are called
                   1639: .I embedded
                   1640: actions.
                   1641: .PP
                   1642: Embedded actions are useful for keeping track of context information.
                   1643: In the EQN grammar, the context includes the current point size.
                   1644: The EQN input
                   1645: .P{
                   1646: E sub 1
                   1647: .P}
                   1648: is typeset as $E sub 1$.
                   1649: Note that the subscript $1$ has a smaller point size than $E$.
                   1650: Nonterminal
                   1651: .CW box
                   1652: in the following production represents an EQN construct.
                   1653: The current point size is maintained in variable
                   1654: .CW ps .
                   1655: The embedded action
                   1656: .CW ps$^$-=$^$del
                   1657: reduces the point size before the subscript box
                   1658: is processed; the other action
                   1659: .CW ps$^$+=$^$del
                   1660: restores the point size.
                   1661: Token
                   1662: .CW SUB
                   1663: represents the input characters
                   1664: .CW sub .
                   1665: .P{
                   1666: box :  box  { ps -= del; }  SUB  box  { ps += del; }
                   1667: .P}
                   1668: .PP
                   1669: Embedded actions are implemented by manufacturing a fresh
                   1670: nonterminal with one production deriving the empty string.
                   1671: Yacc actually treats this EQN example as if it had been
                   1672: written:
                   1673: .EQ
                   1674: delim off
                   1675: .EN
                   1676: .P{
                   1677: box  :  box  $ACT  SUB  box
                   1678:             { ps +=del; }
                   1679:      ;
                   1680: $ACT :  /* empty */
                   1681:             { ps -= del; }
                   1682: .P}
                   1683: Here
                   1684: .CW $ACT
                   1685: is a fresh nonterminal.
                   1686: .PP
                   1687: Section _SH6_ considers the use of embedded actions
                   1688: to pass left-to-right context in a Yacc specification.
                   1689: .PP
                   1690: Embedded actions can have associated attribute values;
                   1691: within an embedded action,
                   1692: .CW $$
                   1693: refers to its attribute value, not to the attribute of the
                   1694: left side of the production.
                   1695: Thus, 1 is the attribute value for the embedded action in
                   1696: .P{
                   1697: a : b  { $$ = 1; }  c  { x = $2; y = $c; }
                   1698: .P}
                   1699: The embedded action is at the second position in the right
                   1700: side, so its value is referred to as
                   1701: .CW $2
                   1702: in the assignment
                   1703: .CW x=$2 .
                   1704: Note that
                   1705: .CW c
                   1706: is at position 3, so the above production can be
                   1707: rewritten using
                   1708: .CW $3
                   1709: instead of
                   1710: .CW $c :
                   1711: .P{
                   1712: a : b  { $$ = 1; }  c  { x = $2; y = $3; }
                   1713: .P}
                   1714: .EQ
                   1715: delim $$
                   1716: .EN
                   1717: .@tag SH _SH3_
                   1718: .SH _SH3_  "How The Parser Works"
                   1719: Some familiarity with parsing is helpful
                   1720: in deciphering messages from Yacc
                   1721: about ``shift/reduce'' and ``reduce/reduce'' conflicts.
                   1722: Such messages merit investigation; they are a warning that
                   1723: the generated parser will make choices that may or may not be
                   1724: consistent with the grammar designer's intent.
                   1725: .PP
                   1726: When invoked with the
                   1727: .CW -v
                   1728: (for verbose) option,
                   1729: Yacc places a human-readable description of the generated parser
                   1730: into the file
                   1731: .CW y.output .
                   1732: This section deals with the parsing background behind
                   1733: .CW y.output
                   1734: files; parsing conflicts themselves are considered in Section _SH4_.
                   1735: .PP
                   1736: The running example in this section is the following grammar for
                   1737: real numbers:
                   1738: .P{
                   1739: %token D P
                   1740: %%
                   1741: real :  intp P frac    ;
                   1742: intp :  D  |  intp D   ;
                   1743: frac :  D  |  D frac   ;
                   1744: .P}
                   1745: The abbreviated names
                   1746: .CW intp
                   1747: for integer part,
                   1748: .CW frac
                   1749: for fraction,
                   1750: and
                   1751: .CW D
                   1752: for digit, conserve space in diagrams.
                   1753: The use of token
                   1754: .CW P
                   1755: for a decimal point
                   1756: .CW '.'
                   1757: avoids confusion with other uses of dots within
                   1758: .CW y.output
                   1759: files.
                   1760: .SS "Shift-Reduce Parsing"
                   1761: A
                   1762: .I "bottom-up"
                   1763: parser works from the leaves (bottom) of a parse tree towards the
                   1764: root.
                   1765: The following sequence of tree snapshots illustrates a bottom-up
                   1766: parse of the token stream
                   1767: .CW DDPDD ,
                   1768: corresponding to the real number
                   1769: .CW 21.89 .
                   1770: For the moment, the digit represented by a token
                   1771: .CW D
                   1772: appears below the token.
                   1773: The trees are
                   1774: .KS
                   1775: .ps 9
                   1776: .ft CB
                   1777: .PS
                   1778: [
                   1779:        define D % {
                   1780:                "\f2\s8D\s0\fP"
                   1781:                "\s6$1\s0" at Here + 0,-.5*vs
                   1782:        } %
                   1783:        define Pt % {
                   1784:                "\f2\s8P\s0\fP"
                   1785:                "." at Here + 0,-.5*vs
                   1786:        } %
                   1787: 
                   1788:        hu = .125; vu = 1.5*vs; choph = vs; chopw = .4
                   1789:        boxht = vs; boxwid = .8*vs; movewid = .5
                   1790: 
                   1791: S1:    [
                   1792:                # "$real$"
                   1793:                 {
                   1794:                        ln(-1,-1, invis); # "$intp$"
                   1795:                         {
                   1796:                                ln(-1,-1, invis); # "$intp$"
                   1797:                                ln( 0,-1, invis); D(2)
                   1798:                        }{
                   1799:                                ln( 0,-2, invis); D(1)
                   1800:                        }
                   1801:                }{
                   1802:                        ln( 0,-3, invis); Pt
                   1803:                }{
                   1804:                        ln( 1,-1, invis); # "$frac$"
                   1805:                         {
                   1806:                                ln( 0,-2, invis); D(8)
                   1807:                        }{
                   1808:                                ln( 1,-1, invis); # "$frac$"
                   1809:                                ln( 0,-1, invis); D(9)
                   1810:                        }
                   1811:                }
                   1812:        ]
                   1813:        move
                   1814: S2:    [
                   1815:                # "$real$"
                   1816:                 {
                   1817:                        ln(-1,-1, invis); # "$intp$"
                   1818:                         {
                   1819:                                ln(-1,-1, invis); "$intp$"
                   1820:                                ln( 0,-1); D(2)
                   1821:                        }{
                   1822:                                ln( 0,-2, invis); D(1)
                   1823:                        }
                   1824:                }{
                   1825:                        ln( 0,-3, invis); Pt
                   1826:                }{
                   1827:                        ln( 1,-1, invis); # "$~~frac$"
                   1828:                         {
                   1829:                                ln( 0,-2, invis); D(8)
                   1830:                        }{
                   1831:                                ln( 1,-1, invis); # "$frac$"
                   1832:                                ln( 0,-1, invis); D(9)
                   1833:                        }
                   1834:                }
                   1835:        ]
                   1836:        move
                   1837: S3:    [
                   1838:                # "$real$"
                   1839:                 {
                   1840:                        ln(-1,-1, invis); "$intp~$"
                   1841:                         {
                   1842:                                ln(-1,-1); "$intp$"
                   1843:                                ln( 0,-1); D(2)
                   1844:                        }{
                   1845:                                ln( 0,-2); D(1)
                   1846:                        }
                   1847:                }{
                   1848:                        ln( 0,-3, invis); Pt
                   1849:                }{
                   1850:                        ln( 1,-1, invis); # "$~~frac$"
                   1851:                         {
                   1852:                                ln( 0,-2, invis); D(8)
                   1853:                        }{
                   1854:                                ln( 1,-1, invis); # "$frac$"
                   1855:                                ln( 0,-1, invis); D(9)
                   1856:                        }
                   1857:                }
                   1858:        ]
                   1859:        move
                   1860: S4:    [
                   1861:                # "$real$"
                   1862:                 {
                   1863:                        ln(-1,-1, invis); "$intp~$"
                   1864:                         {
                   1865:                                ln(-1,-1); "$intp$"
                   1866:                                ln( 0,-1); D(2)
                   1867:                        }{
                   1868:                                ln( 0,-2); D(1)
                   1869:                        }
                   1870:                }{
                   1871:                        ln( 0,-3, invis); Pt
                   1872:                }{
                   1873:                        ln( 1,-1, invis); # "$frac$"
                   1874:                         {
                   1875:                                ln( 0,-2, invis); D(8)
                   1876:                        }{
                   1877:                                ln( 1,-1, invis); "$frac$"
                   1878:                                ln( 0,-1); D(9)
                   1879:                        }
                   1880:                }
                   1881:        ]
                   1882:        move
                   1883: S5:    [
                   1884:                 # "$real$"
                   1885:                 {
                   1886:                        ln(-1,-1, invis); "$intp~~$"
                   1887:                         {
                   1888:                                ln(-1,-1); "$intp$"
                   1889:                                ln( 0,-1); D(2)
                   1890:                        }{
                   1891:                                ln( 0,-2); D(1)
                   1892:                        }
                   1893:                }{
                   1894:                        ln( 0,-3, invis); Pt
                   1895:                }{
                   1896:                        ln( 1,-1, invis); "$~~frac$"
                   1897:                         {
                   1898:                                ln( 0,-2); D(8)
                   1899:                        }{
                   1900:                                ln( 1,-1); "$frac$"
                   1901:                                ln( 0,-1); D(9)
                   1902:                        }
                   1903:                }
                   1904:        ]
                   1905:        move
                   1906: S6:    [
                   1907:                "$real$"
                   1908:                 {
                   1909:                        ln(-1,-1); "$intp~~$"
                   1910:                         {
                   1911:                                ln(-1,-1); "$intp$"
                   1912:                                ln( 0,-1); D(2)
                   1913:                        }{
                   1914:                                ln( 0,-2); D(1)
                   1915:                        }
                   1916:                }{
                   1917:                        ln( 0,-3); Pt
                   1918:                }{
                   1919:                        ln( 1,-1); "$~~frac$"
                   1920:                         {
                   1921:                                ln( 0,-2); D(8)
                   1922:                        }{
                   1923:                                ln( 1,-1); "$frac$"
                   1924:                                ln( 0,-1); D(9)
                   1925:                        }
                   1926:                }
                   1927:        ]
                   1928: 
                   1929:        "$=>$" at .5<S1.e, S2.w>
                   1930:        "$=>$" at .5<S2.e, S3.w>
                   1931:        "$=>$" at .5<S3.e, S4.w>
                   1932:        "$=>$" at .5<S4.e, S5.w>
                   1933:        "$=>$" at .5<S5.e, S6.w>
                   1934: ]
                   1935: .PE
                   1936: .KE
                   1937: .LP
                   1938: Let us redraw these trees to line up their uncovered portions;
                   1939: that is, the roots of the completed subtrees.
                   1940: The redrawn trees are
                   1941: .KS
                   1942: .ps 9
                   1943: .PS
                   1944: [
                   1945:        define D % {
                   1946:                "\f2\s8D\s0\fP"
                   1947:        } %
                   1948:        define Pt % {
                   1949:                "\f2\s8P\s0\fP"
                   1950:        #       "." at Here + 0,-.5*vs
                   1951:        } %
                   1952: 
                   1953:        hu = .125; vu = 1.5*vs; choph = vs; chopw = .4
                   1954:        boxht = vs; boxwid = .8*vs; movewid = hu; sep = .5
                   1955: 
                   1956: 
                   1957: S1:    [ 
                   1958:                D(1); move; D(2); move; Pt; move; D(8); move; D(9)
                   1959:        ]
                   1960: 
                   1961: S2:    [
                   1962:                {
                   1963:                        "$intp~~$"; ln( 0,-1); D(1)
                   1964:                }
                   1965:                move
                   1966:                D(2); move; Pt; move; D(8); move; D(9)
                   1967:        ] with .nw at S1.ne + sep,0
                   1968: 
                   1969: S3:    [
                   1970:                {
                   1971:                        "$intp~~$"
                   1972:                         {
                   1973:                                ln(-1,-1); "$intp$"
                   1974:                                ln( 0,-1); D(1)
                   1975:                        }{
                   1976:                                ln( 0,-2); D(2)
                   1977:                        }
                   1978:                }
                   1979:                move
                   1980:                Pt; move; D(8); move; D(9)
                   1981:        ] with .nw at S2.ne + sep,0
                   1982: 
                   1983: S4:    [
                   1984:                {
                   1985:                        "$intp~~$"
                   1986:                         {
                   1987:                                ln(-1,-1); "$intp$"
                   1988:                                ln( 0,-1); D(1)
                   1989:                        }{
                   1990:                                ln( 0,-2); D(2)
                   1991:                        }
                   1992:                }
                   1993:                move
                   1994:                Pt; move; D(8)
                   1995:                move
                   1996:                {
                   1997:                        "$~~frac$"; ln( 0,-1); D(9)
                   1998:                }
                   1999:        ] with .nw at S3.ne + sep,0
                   2000: 
                   2001: S5:    [
                   2002:                {
                   2003:                        "$intp~~$"
                   2004:                         {
                   2005:                                ln(-1,-1); "$intp$"
                   2006:                                ln( 0,-1); D(1)
                   2007:                        }{
                   2008:                                ln( 0,-2); D(2)
                   2009:                        }
                   2010:                }
                   2011:                move
                   2012:                Pt
                   2013:                move
                   2014:                {
                   2015:                        "$~~frac$"
                   2016:                         {
                   2017:                                ln( 0,-2); D(8)
                   2018:                        }{
                   2019:                                ln( 1,-1); "$frac$"
                   2020:                                ln( 0,-1); D(9)
                   2021:                        }
                   2022:                }
                   2023:        ] with .nw at S4.ne + sep,0
                   2024: 
                   2025: S6:    [
                   2026:                "$real$"
                   2027:                 {
                   2028:                        ln(-1,-1); "$intp~~$"
                   2029:                         {
                   2030:                                ln(-1,-1); "$intp$"
                   2031:                                ln( 0,-1); D(1)
                   2032:                        }{
                   2033:                                ln( 0,-2); D(2)
                   2034:                        }
                   2035:                }{
                   2036:                        ln( 0,-3); Pt
                   2037:                }{
                   2038:                        ln( 1,-1); "$~~frac$"
                   2039:                         {
                   2040:                                ln( 0,-2); D(8)
                   2041:                        }{
                   2042:                                ln( 1,-1); "$frac$"
                   2043:                                ln( 0,-1); D(9)
                   2044:                        }
                   2045:                }
                   2046:        ] with .nw at S5.ne + sep,0
                   2047: 
                   2048:        "$=>~$" at .5<S1.ne, S2.nw>
                   2049:        "$=>$" at .5<S2.ne, S3.nw>
                   2050:        "$=>$" at .5<S3.ne, S4.nw>
                   2051:        "$~~=>$" at .5<S4.ne, S5.nw>
                   2052:        "$=>$" at .5<S5.ne, S6.nw>
                   2053: ]
                   2054: .PE
                   2055: .KE
                   2056: .PP
                   2057: Shift-reduce parsers store only the uncovered portions of a
                   2058: parse tree, as in
                   2059: the following
                   2060: snapshots, obtained from the
                   2061: preceding sequence of trees:
                   2062: .KS
                   2063: .ps 9
                   2064: .PS
                   2065: [
                   2066:        define N % box invis $1 wid .25 %
                   2067:        define D % box invis "\f2\s8D\s0\fP" wid .125 %
                   2068:        define P % box invis "\f2\s8P\s0\fP" wid .125 %
                   2069:        define derives % box invis wid .4 "$=>$" %
                   2070: 
                   2071:        boxht = vs; boxwid = .8*vs
                   2072: 
                   2073: 
                   2074:                [ D; D; P; D; D ]
                   2075:        derives
                   2076:                [ N("$intp$"); D; P; D; D ]
                   2077:        derives
                   2078:                [ N("$intp$"); P; D; D ]
                   2079:        derives
                   2080:                [ N("$intp$"); P; D; N("$frac$") ]
                   2081:        derives
                   2082:                [ N("$intp$"); P; N("$frac$") ]
                   2083:        derives
                   2084:                [ N("$real$") ]
                   2085: ]
                   2086: .PE
                   2087: .KE
                   2088: .PP
                   2089: Such derivations can be broken down
                   2090: into sequences of shift and
                   2091: reduce actions.
                   2092: A
                   2093: .I shift
                   2094: action advances the parser to the next unexamined input token;
                   2095: such tokens are called
                   2096: .I lookahead
                   2097: symbols.
                   2098: A
                   2099: .I reduce
                   2100: action replaces the right side of a production by its left side.
                   2101: The key problem of shift-reduce parsing is that of deciding
                   2102: when to shift and when to reduce; Yacc generates tables for
                   2103: this purpose that are explained later in this section.
                   2104: .EQ
                   2105: delim off
                   2106: .EN
                   2107: .PP
                   2108: A shift-reduce parse of the input token stream
                   2109: .CW DDPDD
                   2110: appears in Figure _FI.SHIFTREDUCE_.
                   2111: A special token
                   2112: .CW $end
                   2113: marks the end of the input.
                   2114: Within each snapshot, a pointer appears before the
                   2115: current lookahead symbol.
                   2116: The first action, a shift, advances the pointer past the
                   2117: leftmost
                   2118: .CW D :
                   2119: .EQ
                   2120: delim $$
                   2121: .EN
                   2122: .KF
                   2123: .nf
                   2124: \s5\l'\n(LLu\&\(ul'\s0
                   2125: .fi
                   2126: .ps 9
                   2127: .PS
                   2128: [
                   2129:        define N % box invis $1 wid .25 %
                   2130:        define D % box invis "\f2\s8D\s0\fP" wid .125 %
                   2131:        define P % box invis "\f2\s8P\s0\fP" wid .125 %
                   2132:        define E % box invis "$f2($end)$" wid .3 %
                   2133:        define action % Act: [
                   2134:                right
                   2135:        B:      box invis wid actionwid
                   2136:        PTR:    box invis wid .1
                   2137:                $1 ljust at B.w
                   2138:        ] with .PTR.n at S.PTR.s %
                   2139:        define shift % action("shift") %
                   2140:        define reduce % action("reduce") %
                   2141:        define ptr %
                   2142:                PTR: box invis wid .1; { move left .025; up; line <- }
                   2143:        %
                   2144:        define handle % { line from last box.sw to last box.se } %
                   2145: 
                   2146:        boxht = vs
                   2147:        arrowht = .05; arrowwid = .025; lineht = .75*vs; dy = vs
                   2148: 
                   2149:        down
                   2150: 
                   2151:        actionwid = .9
                   2152: T1:    S:[ right
                   2153:                ptr; D; D; P; D; D; E
                   2154:        ]
                   2155:  shift
                   2156:        S:[ right
                   2157:                D; handle; ptr; D; P; D; D; E
                   2158:        ] with .PTR.n at Act.PTR.s
                   2159:  reduce
                   2160:        S:[ right
                   2161:                N("$intp$"); ptr; D; P; D; D; E
                   2162:        ] with .PTR.n at Act.PTR.s
                   2163:  shift
                   2164:        S:[ right
                   2165:                N("$intp$"); handle; D; handle; ptr; P; D; D; E
                   2166:        ] with .PTR.n at Act.PTR.s
                   2167:  reduce
                   2168:        S:[ right
                   2169:                N("$intp$"); ptr; P; D; D; E
                   2170:        ] with .PTR.n at Act.PTR.s
                   2171:  shift
                   2172: B1:    S:[ right
                   2173:                N("$intp$"); P; ptr; D; D; E
                   2174:        ] with .PTR.n at Act.PTR.s
                   2175: 
                   2176: 
                   2177: 
                   2178:        actionwid = 1.2
                   2179: T2:    S:[ right
                   2180:                box invis wid actionwid
                   2181:          PTR:  box invis wid .05
                   2182:        ] with .sw at T1.se + 1.2,0
                   2183:  shift
                   2184:        S:[ right
                   2185:                N("$intp$"); P; D; ptr; D; E
                   2186:        ] with .PTR.n at Act.PTR.s
                   2187:  shift
                   2188:        S:[ right
                   2189:                N("$intp$"); P; D; D; handle; ptr; E
                   2190:        ] with .PTR.n at Act.PTR.s
                   2191:  reduce
                   2192:        S:[ right
                   2193:                N("$intp$"); P; D; handle; N("$frac$"); handle; ptr; E
                   2194:        ] with .PTR.n at Act.PTR.s
                   2195:  reduce
                   2196:        S:[ right
                   2197:                N("$intp$"); handle; P; handle; N("$frac$"); handle; ptr; E
                   2198:        ] with .PTR.n at Act.PTR.s
                   2199:  reduce
                   2200: B2:    S:[ right
                   2201:                N("$real$"); ptr; E
                   2202:        ] with .PTR.n at Act.PTR.s
                   2203: 
                   2204: G:     .5<T1.se, T2.sw> + 0,vs
                   2205:        line from G to G.x, B2.s.y
                   2206: ]
                   2207: .PE
                   2208: .@tag FI _FI.SHIFTREDUCE_
                   2209: .FI _FI.SHIFTREDUCE_
                   2210: Shift-reduce parsing of
                   2211: .CB DDPDD .
                   2212: .EF
                   2213: .nf
                   2214: \s5\l'\n(LLu\&\(ul'\s0
                   2215: .EF 0
                   2216: .fi
                   2217: .SP
                   2218: .ps 9
                   2219: .PS
                   2220: 
                   2221:  define N % box invis $1 wid .25 %
                   2222:  define D % box invis "\f2\s8D\s0\fP" wid .125 %
                   2223:  define P % box invis "\f2\s8P\s0\fP" wid .125 %
                   2224:  define E % box invis wid .05; box invis "$f2($end)$" wid .25 %
                   2225:  define shift  % box invis wid .8 "shift" %
                   2226:  define reduce % box invis wid .8 "reduce" %
                   2227:  define lookahead % box invis wid .1; { move left .05; up; line <- } %
                   2228:  define handle % { line from last box.sw to last box.se } %
                   2229: 
                   2230: [
                   2231:        boxht = vs
                   2232:        arrowht = .05; arrowwid = .025; lineht = .75*vs
                   2233: 
                   2234:        lookahead; D; D; P; D; D; E
                   2235:  shift
                   2236:        D; lookahead; D; P; D; D; E
                   2237: ]
                   2238: .PE
                   2239: .LP
                   2240: The second action reduces the token
                   2241: .CW D
                   2242: immediately to the left of the pointer
                   2243: (right sides to be reduced are underlined for clarity).
                   2244: The reduction replaces the right side
                   2245: .CW D
                   2246: by the left side
                   2247: .CW intp :
                   2248: .ps 9
                   2249: .PS
                   2250: [
                   2251:        boxht = vs
                   2252:        arrowht = .05; arrowwid = .025; lineht = .75*vs
                   2253: 
                   2254:        D; handle; lookahead; D; P; D; D; E
                   2255:  reduce
                   2256:        N("$intp$"); lookahead; D; P; D; D; E
                   2257: ]
                   2258: .PE
                   2259: .LP
                   2260: After the next
                   2261: .CW D
                   2262: is shifted, the right side
                   2263: .CW intp$~$D
                   2264: is reduced to the left side
                   2265: .CW intp :
                   2266: .ps 9
                   2267: .PS
                   2268: [
                   2269:        boxht = vs
                   2270:        arrowht = .05; arrowwid = .025; lineht = .75*vs
                   2271: 
                   2272:        N("$intp$"); handle; D; handle; lookahead; P; D; D; E
                   2273:  reduce
                   2274:        N("$intp$"); lookahead; P; D; D; E
                   2275: ]
                   2276: .PE
                   2277: .LP
                   2278: Successive shift actions now advance the lookahead pointer all the way
                   2279: to the endmarker.
                   2280: Finally, a sequence of reduce actions completes the parse.
                   2281: .PP
                   2282: It is no accident that a right side to be reduced always appears
                   2283: immediately to the left of the pointer in Figure _FI.SHIFTREDUCE_.
                   2284: This observation is the basis for a stack-implementation of shift-reduce
                   2285: parsing.
                   2286: Informally, the symbols to the left of the pointer
                   2287: are held on a stack, so a right side to
                   2288: be reduced appears at the top of the stack.
                   2289: .PP
                   2290: Parsers generated by Yacc use a stack; however, instead of symbols
                   2291: the stack holds states.
                   2292: It is these states that are displayed in a
                   2293: .CW y.output
                   2294: file.
                   2295: .SS "Parser States"
                   2296: How does a parser know that a digit to the left of a decimal point
                   2297: reduces to
                   2298: .CW intp ,
                   2299: but that a digit to the right reduces to
                   2300: .CW frac ?
                   2301: The parser uses states to summarize prior parsing actions.
                   2302: Some of
                   2303: the states of the real-number parser are (informally)
                   2304: .SP .5
                   2305: .IP 0. 4
                   2306: .I "The starting state" .
                   2307: The very first token must be a
                   2308: .CW D ;
                   2309: it reduces to
                   2310: .CW intp .
                   2311: .SP .5
                   2312: .IP 2.
                   2313: .I "Within the integer part" .
                   2314: An
                   2315: .CW intp
                   2316: has been seen.
                   2317: The lookahead token must either be a
                   2318: .CW D
                   2319: (another digit in the integer part)
                   2320: or a
                   2321: .CW P
                   2322: (the decimal point).
                   2323: .SP .5
                   2324: .IP 7.
                   2325: .I "Within the fraction part" .
                   2326: Shift as long as the lookahead token is a
                   2327: .CW D .
                   2328: Otherwise, reduce the last
                   2329: .CW D
                   2330: to
                   2331: .CW frac .
                   2332: .SP .5
                   2333: .PP
                   2334: State 2 is displayed as follows in the
                   2335: .CW y.output
                   2336: file for the real-number grammar:
                   2337: .P{
                   2338: state 2
                   2339:        real :  intp.P frac 
                   2340:        intp :  intp.D 
                   2341: .sp .5
                   2342: .ft CW
                   2343:        D  shift 5
                   2344:        P  shift 4
                   2345:        .  error
                   2346: .P}
                   2347: .LP
                   2348: A
                   2349: .I state
                   2350: consists of a collection of items, where an
                   2351: .I item
                   2352: is a production with a dot inserted in the right side\(emsome
                   2353: versions of Yacc use an underscore to mark the position of the dot.
                   2354: The items of state 2 are
                   2355: .P{
                   2356: real :  intp.P frac 
                   2357: intp :  intp.D 
                   2358: .P}
                   2359: In this state, the parser shifts on lookahead
                   2360: .CW P .
                   2361: The shift is recorded by (conceptually) moving the dot past
                   2362: .CW P
                   2363: to obtain the item
                   2364: .P{
                   2365: real :  intp P.frac 
                   2366: .P}
                   2367: This item is the sole item in state 4.
                   2368: In words, state 4 records that a
                   2369: .CW P
                   2370: has been seen and that the incoming tokens are now
                   2371: expected to match
                   2372: .CW frac .
                   2373: .PP
                   2374: The states and their transitions constitute an automaton.
                   2375: The automaton for the real-number grammar appears in
                   2376: Figure _FI.GOTO_.
                   2377: The solid arrows are for shift transitions, due to tokens.
                   2378: The dashed arrows, for transitions due to nonterminals, are used
                   2379: during reductions.
                   2380: .KF
                   2381: .nf
                   2382: \s5\l'\n(LLu\&\(ul'\s0
                   2383: .fi
                   2384: .nr PS 9
                   2385: .ps 9
                   2386: .PS
                   2387: [
                   2388:        define state %
                   2389:                if "$4"!="" then 'nitems=$4' else 'nitems=1'
                   2390:        S$1:    box fill at O + $2*hu, $3*vu ht nitems*vs
                   2391:                "$1" at S$1.n + 0,vs/2
                   2392:        %
                   2393: 
                   2394:        arcrad = vs/3; boxht = vs; boxwid = 1.2; fillval = 1
                   2395:        dashwid = .03
                   2396:        hu = .7; vu = 4*vs
                   2397: 
                   2398: O: ""
                   2399:        state(0, 0, 0)
                   2400:        box invis "$f2($accept)^:~cdot~real~f2($end)$" at S0
                   2401: 
                   2402:        state(1, 3, 0)
                   2403:        box invis "$f2($accept)^:~real~cdot~f2($end)$" at S1
                   2404: 
                   2405:        state(2, 1,-1, 2)
                   2406:        [ down
                   2407:        B1:     box invis
                   2408:        B2:     box invis
                   2409:                "$real^:~intp~cdot~P~frac$" ljust at B1.w + .075,0
                   2410:                "$intp^:~intp~cdot~D$" ljust at B2.w + .075,0
                   2411:        ] at S2
                   2412: 
                   2413:        state(5, 4,-1)
                   2414:        box invis "$intp^:~intp~D~cdot$" at S5
                   2415: 
                   2416:        state(4, 2,-2)
                   2417:        box invis "$real^:~intp~P~cdot~frac$" at S4
                   2418: 
                   2419:        state(6, 5,-2)
                   2420:        box invis "$real^:~intp~P~frac~cdot$" at S6
                   2421: 
                   2422:        state(7, 3,-3, 2)
                   2423:        [ down
                   2424:        B1:     box invis
                   2425:        B2:     box invis
                   2426:                box invis "$frac^:~D~cdot$" ljust at B1.w + .1,0
                   2427:                box invis "$frac^:~D~cdot~frac$" ljust at B2.w + .1,0
                   2428:        ] at S7
                   2429: 
                   2430:        state(8, 6,-3)
                   2431:        box invis "$frac^:~D~frac~cdot$" at S8
                   2432: 
                   2433:        state(3, 0,-3)
                   2434:        box invis "$intp^:~D~cdot$" at S3
                   2435: 
                   2436: S9:    box invis at O + 6*hu, 0
                   2437:        "\0\0\f3accept\fP" ljust at S9.w
                   2438: 
                   2439: G02:   .66<S0.sw,S0.s>
                   2440: G03:   .33<S0.sw,S0.s>
                   2441: G2:    .5<S2.sw,S2.s>
                   2442: G4:    .5<S4.sw,S4.s>
                   2443: G7a:   .5<S7.sw,S7.s>
                   2444: G7b:   .5<S7.s,S7.se>
                   2445: G7c:   S7.s + 0,-1.5*vs
                   2446: 
                   2447:        line -> from S0.e to S1.w dashed
                   2448:        line -> from S2.e to S5.w
                   2449:        line -> from S4.e to S6.w dashed
                   2450:        line -> from S7.e to S8.w dashed
                   2451:        line -> from S1.e to S9.w
                   2452:        line -> from G03.s to G03.x, S3.n.y
                   2453: 
                   2454:        adown(G02); anell(S2.w, -> dashed, dashed)
                   2455:        adown(G2); anell(S4.w, ->)
                   2456:        adown(G4); anell(S7.w, ->)
                   2457:        adown(G7a); anell(G7c); anell(G7b, ->)
                   2458: 
                   2459:        "$real$"        at .5<S0.e, S1.w> + 0, vs/2
                   2460:        "$intp$"        at (G02.x+S2.w.x)/2, S2.y + vs/2
                   2461:        "$~D$" ljust    at G03.x,S4.y
                   2462:        "$f2($end)$"    at .5<S1.e, S9.w> + 0, vs/2
                   2463:        "$D$"           at .5<S2.e, S5.w> + 0, vs/2
                   2464:        "$P$"           at (G2.x+S4.w.x)/2, S4.y + vs/2
                   2465:        "$frac$"        at .5<S4.e, S6.w> + 0, vs/2
                   2466:        "$D$"           at (G4.x+S7.w.x)/2, S7.y + vs/2
                   2467:        "$frac$"        at .5<S7.e, S8.w> + 0, vs/2
                   2468:        "$D$"           at G7c + 0, vs/2
                   2469: ]
                   2470: .PE
                   2471: .@tag FI _FI.GOTO_
                   2472: .FI _FI.GOTO_
                   2473: States and transitions for the real-number grammar.
                   2474: .EF 0
                   2475: .nf
                   2476: \s5\l'\n(LLu\&\(ul'\s0
                   2477: .fi
                   2478: .SP
                   2479: .KE
                   2480: .PP
                   2481: The parser holds states on a stack, with the current state on
                   2482: top.
                   2483: The starting state of the automaton in Figure _FI.GOTO_ is state 0.
                   2484: With lookahead
                   2485: .CW D ,
                   2486: the automaton shifts to state 3 (in the bottom-left corner of
                   2487: the figure)
                   2488: by pushing 3 onto the stack and removing the lookahead
                   2489: .CW D
                   2490: from the input.
                   2491: For ease of comparison with Figure _FI.SHIFTREDUCE_, the symbol
                   2492: .CW D
                   2493: appears below the state in the following diagram:
                   2494: .KS
                   2495: .ps 9
                   2496: .PS
                   2497: [
                   2498:        define Disp %
                   2499:                box invis $2
                   2500:                { move to last box + 0,-del; $1 }
                   2501:        %
                   2502:        define N % Disp($1, wid .25) %
                   2503:        define D % Disp("\f2\s8D\s0\fP", wid .1) %
                   2504:        define P % Disp("\f2\s8P\s0\fP", wid .1) %
                   2505:        define E % Disp("$f2($end)$", wid .3) %
                   2506:        define action % Act: [
                   2507:                right
                   2508:        B:      box invis wid 1
                   2509:        PTR:    box invis wid .1
                   2510:                $1 ljust at B.w
                   2511:        ] with .PTR.n at S.PTR.s %
                   2512:        define shift % action("shift") %
                   2513:        define reduce % action("$1") %
                   2514:        define ptr %
                   2515:        PTR:    box invis wid .05
                   2516:                        { move left .025; move up boxht/2; line <- }
                   2517:                box invis wid .3
                   2518:                        { move left .15; $1 }
                   2519:                box invis wid .05
                   2520:                        { move left .025; move up boxht/2; line <- }
                   2521:        %
                   2522:        define handle % { line from last box.sw to last box.se } %
                   2523:        define state % [
                   2524:                down
                   2525:        ELEM:   box "$1"
                   2526:                $2
                   2527:                $3
                   2528:        ] with .ELEM.w at Here; move to last [].ELEM.e; right %
                   2529: 
                   2530:        boxht = vs; boxwid = .2
                   2531:        arrowht = .05; arrowwid = .025; lineht = .5*vs; dy = vs
                   2532:        movewid = .1; del = .015
                   2533: 
                   2534: L1:    S:[ right
                   2535:                state(0)
                   2536:                ptr()
                   2537:                D; D; P; D; D; E
                   2538:        ]
                   2539:  shift
                   2540: L2:    S:[ right
                   2541:                state(0); state(3, D)
                   2542:                ptr()
                   2543:                D; P; D; D; E
                   2544:        ] with .PTR.n at Act.PTR.s + 0,-boxht/2
                   2545: 
                   2546: ]
                   2547: .PE
                   2548: .KE
                   2549: .LP
                   2550: The top of the state stack has its own pointer, separate from the
                   2551: lookahead pointer to the next input symbol.
                   2552: .PP
                   2553: The only item in state 3 is
                   2554: .P{
                   2555: intp :  D.
                   2556: .P}
                   2557: Whenever the dot in an item is at the end of the production, one of the
                   2558: possible actions is a reduction by that production.
                   2559: Since the state has no other actions, the parser chooses to reduce.
                   2560: .PP
                   2561: A reduce action has two phases:
                   2562: (a) pop the states corresponding to the right side,
                   2563: and (b) push a state corresponding to the left side.
                   2564: The following diagram illustrates the reduction of the
                   2565: leading
                   2566: .CW D
                   2567: in
                   2568: .CW DDPDD
                   2569: to
                   2570: .CW intp :
                   2571: .KS
                   2572: .ps 9
                   2573: .PS
                   2574: [
                   2575:        define Disp %
                   2576:                box invis $2
                   2577:                { move to last box + 0,-del; $1 }
                   2578:        %
                   2579:        define N % Disp($1, wid .25) %
                   2580:        define D % Disp("\f2\s8D\s0\fP", wid .1) %
                   2581:        define P % Disp("\f2\s8P\s0\fP", wid .1) %
                   2582:        define E % Disp("$f2($end)$", wid .3) %
                   2583:        define action % Act: [
                   2584:                right
                   2585:        B:      box invis wid 1
                   2586:        PTR:    box invis wid .1
                   2587:                $1 ljust at B.w
                   2588:        ] with .PTR.n at S.PTR.s  + 0,-boxht %
                   2589:        define shift % action("shift") %
                   2590:        define reduce % action("$1") %
                   2591:        define ptr %
                   2592:        PTR:    box invis wid .05
                   2593:                        { move left .025; move up boxht/2; line <- }
                   2594:                box invis wid .3
                   2595:                        { move left .15; $1 }
                   2596:                box invis wid .05
                   2597:                        { move left .025; move up boxht/2; line <- }
                   2598:        %
                   2599:        define handle % { line from last box.sw to last box.se } %
                   2600:        define state % [
                   2601:                down
                   2602:        ELEM:   box "$1"
                   2603:                $2
                   2604:                $3
                   2605:        ] with .ELEM.w at Here; move to last [].ELEM.e; right %
                   2606: 
                   2607:        boxht = vs; boxwid = .2
                   2608:        arrowht = .05; arrowwid = .025; lineht = .5*vs; dy = vs
                   2609:        movewid = .1; del = .015
                   2610: 
                   2611: L1:    S:[ right
                   2612:                state(0); state(3, D, handle)
                   2613:                ptr()
                   2614:                D; P; D; D; E
                   2615:        ]
                   2616:  reduce(pop)
                   2617: L2:    S:[ right
                   2618:                state(0)
                   2619:                ptr("$intp$")
                   2620:                D; P; D; D; E
                   2621:        ] with .PTR.n at Act.PTR.s + 0,-boxht
                   2622:  reduce(goto)
                   2623: L3:    S:[ right
                   2624:                state(0); state(2, N("$intp$"))
                   2625:                ptr()
                   2626:                D; P; D; D; E
                   2627:        ] with .PTR.n at Act.PTR.s + 0,-boxht
                   2628: 
                   2629:        dx = .75; dy = -lineht-vs/2-del
                   2630:        "Pop the states corresponding to the right side \f2\s8D\s0\fP."\
                   2631:                ljust at L1.ne + dx,dy
                   2632:        "Prepare to push a state for the left side $intp$."\
                   2633:                ljust at L2.ne + dx,dy
                   2634:        "State 0 goes to 2 under $intp$."\
                   2635:                ljust at L3.ne + dx,dy
                   2636: 
                   2637:        box invis wid 2.75 with .nw at L1.ne + dx,dy
                   2638: ]
                   2639: .PE
                   2640: .KE
                   2641: .SS "Parsing Actions"
                   2642: The parser has only four actions available to it, called
                   2643: shift, reduce, accept, and error.
                   2644: A move of the parser is as follows:
                   2645: .SP .5
                   2646: .IP 1. 4
                   2647: Based on its current state, the parser decides whether it needs a lookahead
                   2648: token to choose the next action.
                   2649: If it needs one, and does not already have one, it calls
                   2650: .CW yylex
                   2651: to obtain the next token.
                   2652: .SP .5
                   2653: .IP 2.
                   2654: Using the current state $p$, and the lookahead token $t$
                   2655: if needed, the parser chooses an action.
                   2656: .RS
                   2657: .SP .25
                   2658: .IP a) 4
                   2659: A
                   2660: .I shift
                   2661: action to state $q$ is done by pushing state $q$ onto the
                   2662: state stack and clearing the lookahead token.
                   2663: .SP .25
                   2664: .IP b)
                   2665: A
                   2666: .I reduce
                   2667: action by a production is done in two phases.
                   2668: In the first phase, the parser pops from the stack a number of states
                   2669: equal to the number of symbols on the right side.
                   2670: Let $q$ be the
                   2671: state uncovered after the states are popped,
                   2672: and let the nonterminal on the left side of the production take $q$ to $r$.
                   2673: In the second phase, the parser pushes state $r$
                   2674: onto the stack.
                   2675: .SP .25
                   2676: .EQ
                   2677: delim off
                   2678: .EN
                   2679: .IP c)
                   2680: The
                   2681: .I accept
                   2682: action occurs after the entire input has been seen and matched.
                   2683: This action occurs only when the lookahead token is the endmarker
                   2684: .CW $end .
                   2685: .EQ
                   2686: delim $$
                   2687: .EN
                   2688: .SP .25
                   2689: .IP d)
                   2690: An
                   2691: .I error
                   2692: action occurs when the parser can no longer continue parsing
                   2693: according to the productions.
                   2694: That is, the input tokens seen so far and the current lookahead
                   2695: cannot possibly be followed by anything that would result
                   2696: in a legal input.
                   2697: Error recovery is covered in Section _SH5_.
                   2698: .RE
                   2699: .@tag SH _SH4_
                   2700: .SH _SH4_  "Ambiguity and Conflicts"
                   2701: A
                   2702: .I "shift/reduce conflict"
                   2703: occurs if the parser cannot decide between
                   2704: a shift action and a reduce action.
                   2705: Similarly, a
                   2706: .I "reduce/reduce conflict"
                   2707: occurs if the parser cannot decide between
                   2708: two legal reductions.
                   2709: .PP
                   2710: Conflicts definitely occur when a grammar is
                   2711: .I ambiguous ;
                   2712: that is, if some input string has more than one parse tree.
                   2713: Conflicts can also occur when a grammar, although consistent,
                   2714: requires a more complex parser than Yacc is capable of
                   2715: constructing.
                   2716: Finally, conflicts are sometimes introduced when an action is embedded
                   2717: into the middle of a production.
                   2718: .PP
                   2719: Yacc produces a parser even when conflicts occur.
                   2720: Rules used to choose between two competing actions is
                   2721: called
                   2722: .I "disambiguating rules" .
                   2723: The default disambiguating rules are:
                   2724: .SP .5
                   2725: .IP 1. 4
                   2726: In a shift/reduce conflict, the default is to shift.
                   2727: .SP .25
                   2728: .IP 2.
                   2729: In a reduce/reduce conflict, the default is to reduce by
                   2730: the earlier production in the specification.
                   2731: .SP .5
                   2732: .PP
                   2733: Although the effect of disambiguating rules can often be achieved
                   2734: by rewriting the grammar to avoid conflicts,
                   2735: experience suggests that this rewriting is somewhat unnatural
                   2736: and produces slower parsers.
                   2737: .PP
                   2738: The rest of this section considers two situations;
                   2739: one in which the default disambiguating rules do not
                   2740: have the intended effect, and one in which they do.
                   2741: It is recommended that shift/reduce conflicts be
                   2742: investigated using the
                   2743: .CW y.output
                   2744: file created by running Yacc with the
                   2745: .CW -v
                   2746: option.
                   2747: .SS "To Shift or To Reduce"
                   2748: Yacc reports 2 shift/reduce conflicts when it is applied to
                   2749: .EQ
                   2750: delim off
                   2751: .EN
                   2752: .P{
                   2753: %token NUM
                   2754: %%
                   2755: expr  :  expr '\en'       { printf("\en"); return(0); }
                   2756:       |  expr '-' expr   { printf(" -"); }
                   2757:       |  NUM             { printf(" %g", $NUM); }
                   2758:       ;
                   2759: .P}
                   2760: .EQ
                   2761: delim $$
                   2762: .EN
                   2763: This specification marks the end of an expression
                   2764: by a newline character;
                   2765: the
                   2766: .CW return
                   2767: in the associated action terminates parsing immediately after
                   2768: echoing the newline.
                   2769: .PP
                   2770: The hope here is to translate an infix expression into postfix
                   2771: notation.
                   2772: Thus we want
                   2773: .P{
                   2774: 2 - 1 - 1
                   2775: .P}
                   2776: to be translated into
                   2777: .P{
                   2778: 2 1 - 1 -
                   2779: .P}
                   2780: The answer would be 0 if the expression were evaluated by
                   2781: subtracting 1 from 2, and then subtracting 1 from the result.
                   2782: Unfortunately, the output of the parser (with a suitable program
                   2783: section) is
                   2784: .P{
                   2785:  2 1 1
                   2786: .P}
                   2787: Whatever happened to the minus operators?
                   2788: The problem can be traced to the preference for shift in a shift/reduce
                   2789: conflict, which makes
                   2790: .CW -
                   2791: right associative, and gives
                   2792: .CW \en
                   2793: higher precedence than
                   2794: .CW - .
                   2795: .KF
                   2796: .EQ
                   2797: delim off
                   2798: .EN
                   2799: .nf
                   2800: \s5\l'\n(LLu\&\(ul'\s0
                   2801: .fi
                   2802: .ps 9
                   2803: .ft CW
                   2804: .PS
                   2805: [
                   2806:        define text % [
                   2807:                boxht = vs
                   2808:        B:      box $2 invis
                   2809:                $1 ljust at B.w
                   2810:        ] %
                   2811: 
                   2812:        boxht = vs
                   2813: 
                   2814: C1:    [
                   2815:                boxwid = 2; down
                   2816: 
                   2817:                text("state 0")
                   2818:                text("    $accept : .expr $end ")
                   2819:                text("", ht vs/3)
                   2820:                text("    NUM  shift 2")
                   2821:                text("    .  error")
                   2822:                text("    expr  goto 1")
                   2823:                text("", ht vs/2)
                   2824:                text("state 1")
                   2825:                text("", ht vs/3)
                   2826:                text("    $accept :  expr.$end ")
                   2827:                text("    expr :  expr.\en ")
                   2828:                text("    expr :  expr.- expr ")
                   2829:                text("    $end  accept")
                   2830:                text("    \en  shift 3")
                   2831:                text("    -  shift 4")
                   2832:                text("    .  error")
                   2833:                text("", ht vs/2)
                   2834:                text("state 2")
                   2835:                text("", ht vs/3)
                   2836:                text("    expr :  NUM.    (3)")
                   2837:                text("    .  reduce 3")
                   2838:        ]
                   2839: 
                   2840: C2:    [
                   2841:                boxwid = 2.5; down
                   2842: 
                   2843:                text("state 3")
                   2844:                text("    expr :  expr \en.    (1)")
                   2845:                text("", ht vs/3)
                   2846:                text("    .  reduce 1")
                   2847:                text("", ht vs/2)
                   2848:                text("state 4")
                   2849:                text("    expr :  expr -.expr ")
                   2850:                text("", ht vs/3)
                   2851:                text("    NUM  shift 2")
                   2852:                text("    .  error")
                   2853:                text("    expr  goto 5")
                   2854:                text("", ht vs/2)
                   2855: .ft CB
                   2856:                text("5: conflict (shift \en, reduce 2)")
                   2857:                text("5: conflict (shift -, reduce 2)")
                   2858:                text("state 5")
                   2859:                text("    expr :  expr.\en ")
                   2860:                text("    expr :  expr.- expr ")
                   2861:                text("    expr :  expr - expr.    (2)")
                   2862:                text("", ht vs/3)
                   2863:                text("    \en  shift 3")
                   2864:                text("    -  shift 4")
                   2865:                text("    .  reduce 2")
                   2866: .ft CW
                   2867:        ] with .ne at C1.nw + pagewid-.75,0
                   2868: ]
                   2869: .PE
                   2870: .EQ
                   2871: delim $$
                   2872: .EN
                   2873: .@tag FI _FI.Y.OUTPUT_
                   2874: .FI _FI.Y.OUTPUT_
                   2875: A slightly edited
                   2876: .CW y.output
                   2877: file.
                   2878: .EF 0
                   2879: .nf
                   2880: \s5\l'\n(LLu\&\(ul'\s0
                   2881: .fi
                   2882: .SP
                   2883: .KE
                   2884: .PP
                   2885: A slightly edited version of the
                   2886: .CW y.output
                   2887: file for this grammar appears in Figure _FI.Y.OUTPUT_.
                   2888: The 2 shift/reduce conflicts are in state 5.
                   2889: In this state,
                   2890: by default, the parser shifts the lookahead symbols
                   2891: .CW \en
                   2892: and
                   2893: .CW -
                   2894: instead of using the item
                   2895: .P{
                   2896: expr :  expr - expr.    (2)
                   2897: .P}
                   2898: to reduce by production (2).
                   2899: A reduction occurs only when a right side is at the top of the
                   2900: parser stack, so the stack must contain states corresponding to
                   2901: .P{
                   2902: \f1$...$\fP expr$"" sub a$ - expr$"" sub b$
                   2903: .P}
                   2904: (The subscripts merely distinguish between the
                   2905: two occurrences of
                   2906: .CW expr .)
                   2907: .PP
                   2908: The other items in state 5 tell us more about the choices
                   2909: faced by the parser.
                   2910: With lookahead
                   2911: .CW \en
                   2912: the parser shifts, by default.
                   2913: Thus, it treats
                   2914: .CW expr$"" sub b$
                   2915: on top of the stack as if it were in the item
                   2916: .P{
                   2917: expr :  expr$"" sub b$.\en
                   2918: .P}
                   2919: instead of the item
                   2920: .P{
                   2921: expr :  expr$"" sub a$ - expr$"" sub b$.    (2)
                   2922: .P}
                   2923: Similarly, with lookahead
                   2924: .CW - ,
                   2925: the parser treats
                   2926: .CW expr$"" sub b$
                   2927: as if it were the first subexpression in
                   2928: .P{
                   2929: expr :  expr$"" sub b$.- expr
                   2930: .P}
                   2931: .PP
                   2932: Putting these observations together, the input
                   2933: .CW 2-1-1\en
                   2934: will result in the stack eventually containing
                   2935: .P{
                   2936: expr - expr - expr \en
                   2937: .P}
                   2938: .PP
                   2939: Now, when the right side
                   2940: .CW expr$^$\en
                   2941: is reduced, its action will print a newline and return,
                   2942: abandoning the parse in midstream.
                   2943: .PP
                   2944: The addition of the precedence declarations
                   2945: .P{
                   2946: %nonassoc '\en'
                   2947: %left     '-'
                   2948: .P}
                   2949: eliminates the conflicts in state 5, resulting in the
                   2950: new state
                   2951: .P{
                   2952: state 5
                   2953:     expr :  expr.\en 
                   2954:     expr :  expr.- expr 
                   2955:     expr :  expr - expr.    (2)
                   2956: .sp .5
                   2957:     .  reduce 2
                   2958: .P}
                   2959: Here, the reduction takes precedence over the potential shifts,
                   2960: thereby implementing the left associativity of
                   2961: .CW -
                   2962: and its higher precedence over
                   2963: .CW \en .
                   2964: .SS "Precedence Declarations"
                   2965: Precedence declarations give rise to disambiguating
                   2966: rules for resolving parsing conflicts.
                   2967: As mentioned in Section _SH2_, a precedence declaration
                   2968: starts with
                   2969: .CW %left ,
                   2970: .CW %right ,
                   2971: or
                   2972: .CW %nonassoc .
                   2973: These keywords specify the associativity of the tokens in a declaration.
                   2974: All the tokens in a declaration have the same precedence; tokens
                   2975: in successive declarations have higher precedence.
                   2976: A token in a precedence declaration need not be, but can be,
                   2977: declared by
                   2978: .CW %token
                   2979: as well.
                   2980: .PP
                   2981: The disambiguating rules are as follows.
                   2982: .SP .5
                   2983: .IP 1. 4
                   2984: Although declared only for tokens and literals, precedence
                   2985: information is attached to each production as well.
                   2986: The precedence and associativity of a production
                   2987: is that of the last token or literal
                   2988: on its right side.
                   2989: The
                   2990: .CW %prec
                   2991: construction overrides this default.
                   2992: .SP .5
                   2993: .IP 2.
                   2994: If there is a shift/reduce conflict, and both
                   2995: the lookahead symbol (to be shifted)
                   2996: and the production (to be reduced)
                   2997: have precedence declarations, then
                   2998: the conflict is resolved in favor of the action (shift or reduce)
                   2999: with the higher precedence.
                   3000: If the precedences are the same, then the associativity is used;
                   3001: left associative implies reduce, right associative
                   3002: implies shift, and nonassociative implies error.
                   3003: .SP .5
                   3004: .IP 3.
                   3005: In the absence of precedence information, the default
                   3006: disambiguating rules given earlier in this section are used.
                   3007: More precisely, suppose that there is no
                   3008: precedence information for either the lookahead symbol or
                   3009: a production to be reduced by.
                   3010: A shift/reduce conflict is resolved by shifting.
                   3011: A reduce/reduce conflict is resolved by reducing by the
                   3012: production that appears earlier in the specification.
                   3013: Conflicts resolved by these default rules are reported.
                   3014: .SP .5
                   3015: .LP
                   3016: Conflicts resolved by precedence are not counted in the shift/reduce
                   3017: and reduce/reduce conflicts reported by Yacc.
                   3018: Thus, mistakes in precedence declarations can mask errors in
                   3019: the design of the productions.
                   3020: .SS "Shift a Dangling Else"
                   3021: As an example of the power of the default disambiguating rules
                   3022: consider a fragment from a programming language involving an
                   3023: if-then-else construction:
                   3024: .P{
                   3025: stmt :  IF '(' expr ')' stmt
                   3026:      |  IF '(' expr ')' stmt ELSE stmt
                   3027:      ;
                   3028: .P}
                   3029: Here,
                   3030: .CW IF
                   3031: and
                   3032: .CW ELSE
                   3033: are tokens,
                   3034: .CW stmt
                   3035: is a nonterminal for statements, and
                   3036: .CW expr
                   3037: is a nonterminal for expressions.
                   3038: Call the first production the
                   3039: .I "simple-if"
                   3040: production and the second the
                   3041: .I "else-if"
                   3042: production.
                   3043: .PP
                   3044: These two productions are ambiguous, since
                   3045: .P{
                   3046: IF ( expr$"" sub 1$ ) IF ( expr$"" sub 2$ ) stmt$"" sub a$ ELSE stmt$"" sub b$
                   3047: .P}
                   3048: can be structured in two ways
                   3049: .ft CW
                   3050: .TS
                   3051: lw4 0 l7 | l.
                   3052:        IF ( expr$"" sub 1$ ) { IF ( expr$"" sub 1$ ) {
                   3053: .ft CB
                   3054:            IF ( expr$"" sub 2$ ) stmt$"" sub a$            IF ( expr$"" sub 2$ ) stmt$"" sub a$
                   3055:        \f(CW}\fP           ELSE stmt$"" sub b$
                   3056: .ft CW
                   3057:        ELSE stmt$"" sub b$     }
                   3058: .TE
                   3059: .LP
                   3060: The second interpretation, with an
                   3061: .CW ELSE
                   3062: matching the nearest preceding unmatched
                   3063: .CW IF ,
                   3064: is the one taken by most programming languages.
                   3065: It is the interpretation obtained when shift/reduce conflicts are
                   3066: resolved in favor of shift actions.
                   3067: .PP
                   3068: The
                   3069: .CW y.output
                   3070: file for a grammar containing the simple-if and if-else productions
                   3071: contains a shift/reduce conflict, illustrated by
                   3072: .P{
                   3073: .ft CW
                   3074: 8: shift/reduce conflict (shift 9, red'n 1) on ELSE
                   3075: .ft CB
                   3076: state 8
                   3077:     stmt :  IF ( expr ) stmt.    (1)
                   3078:     stmt :  IF ( expr ) stmt.ELSE stmt 
                   3079: .ft CW
                   3080: .sp .5
                   3081:     ELSE  shift 9
                   3082:     .  reduce 1
                   3083: .P}
                   3084: This conflict occurs when the lookahead symbol is
                   3085: .CW ELSE
                   3086: and the parser stack contains the right side of the simple-if production
                   3087: .P{
                   3088: \f1$...$\fP IF ( expr ) stmt
                   3089: .P}
                   3090: The parser chooses to shift the
                   3091: .CW ELSE
                   3092: rather than reduce by the simple-if production.
                   3093: This choice allows
                   3094: .P{
                   3095: \f1$...$\fP IF ( expr ) stmt ELSE stmt
                   3096: .P}
                   3097: to be successfully reduced by the if-else production.
                   3098: Note that a premature application of the simple-if rule
                   3099: (with lookahead
                   3100: .CW ELSE )
                   3101: would lead to the stack contents
                   3102: .P{
                   3103: \f1$...$\fP stmt ELSE stmt
                   3104: .P}
                   3105: which cannot be parsed further.
                   3106: .PP
                   3107: A shift on lookahead
                   3108: .CW ELSE
                   3109: also matches an
                   3110: .CW ELSE
                   3111: with the nearest preceding unmatched
                   3112: .CW IF .
                   3113: With stack contents
                   3114: .P{
                   3115: \f1$...$\fP \f(CWIF ( expr )\fP IF ( expr ) stmt
                   3116: .P}
                   3117: and lookahead
                   3118: .CW ELSE ,
                   3119: the parser shifts, so the stack eventually holds
                   3120: .P{
                   3121: \f1$...$\fP \f(CWIF ( expr )\fP IF ( expr ) stmt ELSE stmt
                   3122: .P}
                   3123: A reduction by the if-else production now yields
                   3124: .P{
                   3125: \f1$...$\fP \f(CWIF ( expr )\fP stmt
                   3126: .P}
                   3127: which can be reduced by the simple-if production.
                   3128: .@tag SH _SH5_
                   3129: .SH _SH5_  "Error Handling"
                   3130: Error handling is an extremely difficult area, and many of the problems are
                   3131: semantic ones.
                   3132: When an error is found, it may be necessary to undo the effect of
                   3133: actions\(emfor example, to reclaim parse-tree storage, to delete or alter
                   3134: symbol-table entries\(emand, typically, set flags to avoid generation of
                   3135: further output.
                   3136: .PP
                   3137: It is seldom acceptable to stop all processing when an error is found;
                   3138: further syntax errors might be found if parsing continues.
                   3139: But, how do we get the parser ``restarted'' after an error is detected.
                   3140: One approach is to discard tokens from the input until parsing can be
                   3141: continued.
                   3142: .PP
                   3143: Yacc provides a simple, but reasonably general, feature for discarding
                   3144: tokens.
                   3145: The token name
                   3146: .CW error
                   3147: is reserved for error handling.
                   3148: On the right side of a production,
                   3149: .CW error
                   3150: suggests a place where error recovery is planned.
                   3151: When an error occurs, the parser pops its stack until it enters a
                   3152: state where the token
                   3153: .CW error
                   3154: is legal.
                   3155: It then behaves as if
                   3156: .CW error
                   3157: were the current lookahead, and performs the action encountered.
                   3158: The lookahead is then reset to the token that caused the error.
                   3159: If no error productions are specified, parsing halts when an
                   3160: error is detected.
                   3161: .PP
                   3162: In order to prevent a cascade of error messages, the parser, after
                   3163: detecting an error, remains in the error state until
                   3164: three tokens have been successfully
                   3165: read and shifted.
                   3166: If an error is detected when the parser is already in error state,
                   3167: no message is given, and the input token is quietly deleted.
                   3168: .PP
                   3169: For example, a production
                   3170: .P{
                   3171: stmt :  error
                   3172: .P}
                   3173: would, in effect, mean that on a syntax error
                   3174: the parser would attempt to skip over the statement
                   3175: in which the error was seen.
                   3176: More precisely, the parser will
                   3177: scan ahead, looking for three tokens that might legally follow
                   3178: a statement, and start processing at the first of these; if
                   3179: the beginnings of statements are not sufficiently distinctive, it may make a
                   3180: false start in the middle of a statement, and end up reporting a
                   3181: second error where there is in fact no error.
                   3182: .PP
                   3183: Actions can be used with these special error rules.
                   3184: These actions might attempt to reinitialize tables, reclaim symbol table space, etc.
                   3185: .PP
                   3186: Productions with just
                   3187: .CW error
                   3188: on the right side are very general, but difficult to control.
                   3189: Somewhat easier are productions such as
                   3190: .P{
                   3191: stmt :  error  ';'
                   3192: .P}
                   3193: Here, upon error, the parser attempts to skip over the statement, but
                   3194: will do so by skipping to the next semicolon
                   3195: All tokens after the error and before the next semicolon
                   3196: cannot be shifted, and are discarded.
                   3197: When the semicolon is seen, this right side will be reduced,
                   3198: and any ``cleanup''
                   3199: action associated with it performed.
                   3200: .PP
                   3201: Another form of error production arises in interactive applications, where
                   3202: it may be desirable to permit a line to be reentered after an error.
                   3203: A possible error production might be
                   3204: .EQ
                   3205: delim off
                   3206: .EN
                   3207: .P{
                   3208: input :  error '\en'
                   3209:              {  printf("Reenter last line: ");  }
                   3210:          input
                   3211:              { $$ = $input;  }
                   3212:       ;
                   3213: .P}
                   3214: One potential difficulty with this approach is that
                   3215: the parser must correctly process three input tokens before it
                   3216: admits that it has correctly resynchronized after the error.
                   3217: If the reentered line contains an error
                   3218: in the first two tokens, the parser deletes the offending tokens,
                   3219: and gives no message; this is clearly unacceptable.
                   3220: For this reason, there is a mechanism that
                   3221: can be used to force the parser
                   3222: to believe that an error has been fully recovered from.
                   3223: The statement
                   3224: .P{
                   3225: yyerrok;
                   3226: .P}
                   3227: in an action
                   3228: resets the parser to its normal mode.
                   3229: The last example is better written
                   3230: .P{
                   3231: input :  error '\en'
                   3232:              { yyerrok; printf("Reenter last line: "); }
                   3233:          input
                   3234:              { $$ = $input; }
                   3235:       ;
                   3236: .P}
                   3237: .EQ
                   3238: delim $$
                   3239: .EN
                   3240: .PP
                   3241: As mentioned above, the token seen immediately
                   3242: after the
                   3243: .CW error
                   3244: symbol is the input token at which the
                   3245: error was discovered.
                   3246: Sometimes, this is inappropriate; for example, an
                   3247: error recovery action might
                   3248: take upon itself the job of finding the correct place to resume input.
                   3249: In this case,
                   3250: the previous lookahead token must be cleared.
                   3251: The statement
                   3252: .P{
                   3253: yyclearin;
                   3254: .P}
                   3255: in an action has this effect.
                   3256: For example, suppose the action after error
                   3257: is to call some sophisticated resynchronization routine,
                   3258: supplied by the user, that attempts to advance the input to the
                   3259: beginning of the next valid statement.
                   3260: After this routine is called, the next token returned by
                   3261: .CW yylex
                   3262: is presumably the first token in a legal statement;
                   3263: the old, illegal token must be discarded, and the error state reset.
                   3264: This can be done by a rule like
                   3265: .P{
                   3266: stmt :  error 
                   3267:             { resynch(); yyerrok; yyclearin; }
                   3268:      ;
                   3269: .P}
                   3270: .PP
                   3271: These mechanisms are admittedly crude, but do allow for a simple,
                   3272: fairly effective recovery of the parser
                   3273: from many errors;
                   3274: moreover, the user can get control to deal with
                   3275: the error actions required by other portions of the program.
                   3276: .@tag SH _SH6_
                   3277: .SH _SH6_  "The Yacc Environment"
                   3278: From a specification, Yacc creates a file of C programs, called
                   3279: .CW y.tab.c
                   3280: on most systems.
                   3281: .SS "Program Organization"
                   3282: User-code in a specification file
                   3283: .P{
                   3284: %{
                   3285:   $<!$\f2user supplied code within declarations\fP$>!$
                   3286: #define YYSTYPE $<!$\f1desired type\fP$>!$
                   3287: %}
                   3288:   $<!$\f2declarations section\fP$>!$
                   3289: %%
                   3290:   $<!$\f2productions\fP$>!$
                   3291: %%
                   3292:   $<!$  \f1program section\fP$>!$
                   3293: .P}
                   3294: leads to a
                   3295: .CW y.tab.c
                   3296: file organized as follows:
                   3297: .P{
                   3298:   $<!$\&\f2user supplied code within declarations\fP$>!$
                   3299: #define YYSTYPE $<!$\f1desired type\fP$>!$
                   3300:   $<!$\f2token and other declarations\fP$>!$
                   3301:   $<!$\f2program section\fP$>!$
                   3302:   $<!$\f2parser tables\fP$>!$
                   3303: yyparse() {  \&\f1$...$\fP }
                   3304: .P}
                   3305: Actions are incorporated into
                   3306: .CW yyparse .
                   3307: .PP
                   3308: As mentioned in Section _SH1_,
                   3309: .CW yyparse ,
                   3310: the code for the parser, expects the following functions
                   3311: to be supplied:
                   3312: .P{
                   3313: int yylex() {
                   3314:        \f2a lexical analyzer; returns a token\fP
                   3315: }
                   3316: int main(\f1$...$\fP) {
                   3317:        \f1$...$\fP yyparse(); \f1$...$\fP
                   3318: }
                   3319: void yyerror(s) char *s; {
                   3320:        \f2print an error message pointed to by\fP s
                   3321: }
                   3322: .P}
                   3323: .PP
                   3324: The function
                   3325: .CW main
                   3326: decides when it wants to call
                   3327: .CW yyparse ,
                   3328: which returns 0 if the parser accepts, and 1 if an error is detected
                   3329: and no error recovery is possible.
                   3330: .PP
                   3331: A user-supplied function
                   3332: .CW yyerror
                   3333: is called with a string containing an error message.
                   3334: The average application will want to do more than simply print the
                   3335: message; for example, the message might be
                   3336: accompanied by the input line number on which the error was detected.
                   3337: The external integer variable
                   3338: .CW yychar
                   3339: contains the lookahead token number at the time an error is
                   3340: detected; this may be of some interest in giving better
                   3341: diagnostics.
                   3342: .PP
                   3343: The external variable
                   3344: .CW yydebug
                   3345: is normally set to 0.
                   3346: It it is set to a nonzero value, the parser will output a
                   3347: verbose description of its actions, including the tokens
                   3348: read and the parser actions.
                   3349: Depending on the operating environment, it may be possible
                   3350: to set this variable by using a debugging system.
                   3351: .SS "Lexical Tie-Ins"
                   3352: The lexical analyzer
                   3353: .CW yylex
                   3354: must return an integer, the token number, representing
                   3355: the lookahead token.
                   3356: An attribute value associated with the token must be
                   3357: placed in the global variable
                   3358: .CW yylval .
                   3359: .PP
                   3360: The parser and the lexical analyzer must agree on the
                   3361: token numbers in order for communication between them to
                   3362: take place.
                   3363: Token numbers may be chosen by Yacc, or chosen by the user.
                   3364: In either case, the
                   3365: .CW #def\&ine
                   3366: mechanism of C is used to allow the lexical analyzer
                   3367: to refer to these numbers symbolically.
                   3368: For example, the declarations section
                   3369: .P{
                   3370: %token IF ELSE
                   3371: .P}
                   3372: leads to the following definitions in the file
                   3373: .CW y.tab.c :
                   3374: .P{
                   3375: # define IF 257
                   3376: # define ELSE 258
                   3377: .P}
                   3378: .PP
                   3379: If
                   3380: .CW yylex
                   3381: is included in the programs section, it is within the scope
                   3382: of these definitions, so
                   3383: .CW IF
                   3384: and
                   3385: .CW ELSE
                   3386: can be used as the names of token numbers in
                   3387: .CW yylex .
                   3388: .PP
                   3389: A file
                   3390: .CW y.tab.h
                   3391: containing the definition of token numbers can be
                   3392: created by running Yacc with the
                   3393: .CW -d
                   3394: option.
                   3395: .PP
                   3396: The approach of treating token names as defined constants
                   3397: leads to clear, easily modified lexical analyzers; the only
                   3398: pitfall is the need to avoid using any token names that are
                   3399: reserved or significant in C or the parser.
                   3400: For example, the use of the token names
                   3401: .CW if
                   3402: and
                   3403: .CW while
                   3404: will almost certainly cause severe difficulties when
                   3405: the lexical analyzer is compiled.
                   3406: The token name
                   3407: .CW error
                   3408: is reserved for error handling; see Section _SH5_.
                   3409: .PP
                   3410: Yacc chooses token numbers if the user does not.
                   3411: The default token number for a literal character
                   3412: is the numerical value of the character in the
                   3413: local character set.
                   3414: Other names are assigned token numbers starting at
                   3415: 257.
                   3416: .PP
                   3417: To assign a number to a token (including a literal), the first
                   3418: appearance of the token name or literal in the declarations section
                   3419: can be immediately followed by a nonnegative integer.
                   3420: This integer is taken to be the token number of the name or literal.
                   3421: Names and literals not defined by this mechanism retain their default
                   3422: definition.
                   3423: It is important that all token numbers be distinct.
                   3424: .PP
                   3425: For historical reasons, the endmarker must have token number
                   3426: 0 or negative.
                   3427: This token number cannot be redefined by the user;
                   3428: thus, all lexical analyzers must be prepared to return
                   3429: 0 or negative as a token number upon reaching the end of
                   3430: their input.
                   3431: .SS "Communicating Context to the Lexical Analyzer"
                   3432: Some lexical decisions depend on context.
                   3433: For example, the lexical analyzer might want to
                   3434: delete blanks normally, but not within quoted strings.
                   3435: Or names might be entered into a symbol table in declarations,
                   3436: but not in expressions.
                   3437: .PP
                   3438: One way of handling this situation is
                   3439: to create a global flag that is
                   3440: examined by the lexical analyzer, and set by actions.
                   3441: For example, suppose a program
                   3442: consists of zero or more declarations,
                   3443: followed by zero or more statements.
                   3444: Consider:
                   3445: .P{
                   3446: %{
                   3447:     int dflag;
                   3448: %}
                   3449: \&\f2$...$  other declarations $...$\f(CB
                   3450: %%
                   3451: prog  :  decls stmts
                   3452:       ;
                   3453: decls :  /* empty */          { dflag = 1; }
                   3454:       |  decls  declaration
                   3455:       ;
                   3456: stmts :  /* empty */          { dflag = 0; }
                   3457:       |  stmts  statement
                   3458:       ;
                   3459: \&\f2$...$  other productions $...$\f(CB
                   3460: .P}
                   3461: .PP
                   3462: The flag
                   3463: .CW dflag
                   3464: is now 1 when reading declarations and 0 when reading statements,
                   3465: .ul
                   3466: except for the first token in the first statement.
                   3467: This token must be seen by the parser before it can tell that
                   3468: the declarations have ended and the productions have
                   3469: begun.
                   3470: In many cases, this single token exception does not
                   3471: affect the lexical scan.
                   3472: .PP
                   3473: This kind of ``backdoor'' approach can be elaborated
                   3474: to a noxious degree.
                   3475: Nevertheless, it represents a way of doing some things
                   3476: that are difficult, if not impossible, to
                   3477: do otherwise.
                   3478: .PP
                   3479: Some programming languages
                   3480: permit the user to
                   3481: use words like
                   3482: .CW if ,
                   3483: which are normally reserved,
                   3484: as label or variable names, provided that such use does not
                   3485: conflict with the legal use of these names in the programming language.
                   3486: This is extremely hard to do in the framework of Yacc;
                   3487: it is difficult to pass information to the lexical analyzer
                   3488: telling it ``this instance of 
                   3489: .CW if
                   3490: is a keyword, and that instance is a variable''.
                   3491: The user can make a stab at it, using flags like
                   3492: .CW dflag ,
                   3493: above, but it is difficult.
                   3494: It is better that the keywords be
                   3495: .I reserved ;
                   3496: that is, be forbidden for use as variable names.
                   3497: There are powerful stylistic reasons for preferring this, anyway.
                   3498: .SS "Support for Arbitrary Attribute Types"
                   3499: By default, the values returned by actions and
                   3500: the lexical analyzer are integers.
                   3501: Other types can be supported by defining
                   3502: .CW YYSTYPE
                   3503: in the declarations section, as in
                   3504: .P{
                   3505: %{
                   3506: #define YYSTYPE double
                   3507: %}
                   3508: .P}
                   3509: .CW YYSTYPE
                   3510: is not a normal variable, because the parser contains the following
                   3511: lines to define it to be
                   3512: .CW int
                   3513: if it has not already been defined by the user:
                   3514: .P{
                   3515: #ifndef YYSTYPE
                   3516: #define YYSTYPE int
                   3517: #endif
                   3518: .P}
                   3519: .PP
                   3520: Clearly,
                   3521: .CW YYSTYPE
                   3522: can be defined to be any type, including a union type.
                   3523: .PP
                   3524: The
                   3525: .CW %union
                   3526: mechanism of Yacc attempts to make the underlying union
                   3527: transparent, in all but a few places where Yacc needs
                   3528: help in determining which field of the union is intended.
                   3529: .PP
                   3530: Unions are declared in the declarations section, an example being
                   3531: .P{
                   3532: %union {
                   3533:     int    ival;
                   3534:     double dval;
                   3535:     char * sval;
                   3536: }
                   3537: .P}
                   3538: A union type with these members is created for the Yacc value stack,
                   3539: and for the global variables
                   3540: .CW yylval
                   3541: and
                   3542: .CW yyval .
                   3543: With the
                   3544: .CW -d
                   3545: option, Yacc copies the union type into the
                   3546: .CW y.tab.h
                   3547: file.
                   3548: The type of the union can be referred to as
                   3549: .CW YYSTYPE .
                   3550: .PP
                   3551: The type of each attribute must now correspond to one of
                   3552: the union members.
                   3553: The construction
                   3554: .P{
                   3555: <name>
                   3556: .P}
                   3557: indicates a union member name.
                   3558: If the construction follows
                   3559: .CW %token ,
                   3560: .CW %left ,
                   3561: .CW %right ,
                   3562: or
                   3563: .CW %nonassoc ,
                   3564: then the union member name is associated with the tokens in
                   3565: that declaration.
                   3566: Another keyword
                   3567: .CW %type
                   3568: is used similarly to associate union member names with nonterminals.
                   3569: Thus, we might use
                   3570: .P{
                   3571: %type <dval> expr term
                   3572: .P}
                   3573: .EQ
                   3574: delim off
                   3575: .EN
                   3576: .PP
                   3577: There remain a couple of cases where these mechanisms are insufficient.
                   3578: If there is an action within a rule, the value returned
                   3579: by this action has no a priori type.
                   3580: Similarly, reference to left context values
                   3581: leaves Yacc with no easy way of knowing the type.
                   3582: In this case, a type can be imposed on the reference by inserting
                   3583: a union member name, between
                   3584: .CW <
                   3585: and
                   3586: .CW > , immediately after
                   3587: the first
                   3588: .CW $ .
                   3589: An example of this usage is
                   3590: .P{
                   3591: rule :  aaa  {  $<intval>$  =  3;  }
                   3592:         bbb  {  fun( $<intval>2, $<other>0 );  }
                   3593:      ;
                   3594: .P}
                   3595: This syntax has little to recommend it, but the situation arises rarely.
                   3596: .PP
                   3597: The facilities in this subsection are not triggered until they are used:
                   3598: in particular, the use of
                   3599: .CW %type
                   3600: will turn on these mechanisms.
                   3601: When they are used, there is a fairly strict level of checking.
                   3602: For example, use of
                   3603: .CW $\f2n\fP
                   3604: or
                   3605: .CW $$
                   3606: to refer to something with no defined type
                   3607: is diagnosed.
                   3608: If these facilities are not triggered, the Yacc value stack is used to
                   3609: hold
                   3610: .CW int s,
                   3611: as was true historically.
                   3612: .EQ
                   3613: delim $$
                   3614: .EN
                   3615: .NH 1
                   3616: References
                   3617: .LP
                   3618: |reference_placement

unix.superglobalmegacorp.com

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