Annotation of 41BSD/cmd/pi/yyparse.c, revision 1.1

1.1     ! root        1: /* Copyright (c) 1979 Regents of the University of California */
        !             2: 
        !             3: static char sccsid[] = "@(#)yyparse.c 1.1 8/27/80";
        !             4: 
        !             5: #include "whoami.h"
        !             6: #include "0.h"
        !             7: #include "yy.h"
        !             8: 
        !             9: /*
        !            10:  * Parser for 'yacc' output.
        !            11:  * Specifially Modified for Berkeley Pascal
        !            12:  */
        !            13: 
        !            14: int    yystate;        /* Current parser state */
        !            15: int    *yypv;
        !            16: unsigned yytshifts 1;  /* Number of "true" shifts */
        !            17: 
        !            18: /*
        !            19:  * Parse Tables
        !            20:  */
        !            21: int    yygo[];
        !            22: int    yypgo[];
        !            23: int    yyr1[];
        !            24: int    yyr2[];
        !            25: int    yyact[];
        !            26: int    yypact[];
        !            27: 
        !            28: /*
        !            29:  * Parse and parallel semantic stack
        !            30:  */
        !            31: int    yyv[MAXDEPTH];
        !            32: int    yys[MAXDEPTH];
        !            33: 
        !            34: /*
        !            35:  * This routine parses the input stream, and
        !            36:  * returns if it accepts, or if an unrecoverable syntax
        !            37:  * error is encountered.
        !            38:  */
        !            39: yyparse()
        !            40: {
        !            41:        register int *ps, n, *p;
        !            42:        int paniced, *panicps, idfail;
        !            43: 
        !            44:        yystate = 0;
        !            45:        yychar = yylex();
        !            46:        OY.Yychar = -1;
        !            47:        yyshifts = 3;
        !            48:        paniced = 0;
        !            49:        ps = &yys[0]-1;
        !            50:        yypv = &yyv[0]-1;
        !            51: #ifdef PXP
        !            52:        yypw = &yyw[0]-1;
        !            53: #endif
        !            54: 
        !            55: stack:
        !            56:        /*
        !            57:         * Push new state and value.
        !            58:         */
        !            59:        if (yypv >= &yyv[MAXDEPTH-1]) {
        !            60:                yerror("Parse stack overflow");
        !            61:                pexit(DIED);
        !            62:        }
        !            63:        *++ps = yystate;
        !            64:        *++yypv = yyval;
        !            65: #ifdef PXP
        !            66:        yypw++;
        !            67: #endif
        !            68: newstate:
        !            69:        /*
        !            70:         * Locate parsing actions for the
        !            71:         * new parser state.
        !            72:         */
        !            73:        p = &yyact[ yypact[yystate+1] ]; 
        !            74: actn:
        !            75:        /*
        !            76:         * Search the parse actions table
        !            77:         * for something useful to do.
        !            78:         * While n is non-positive, it is the negation
        !            79:         * of the token we are testing for.
        !            80:         */
        !            81: #ifdef PI
        !            82:        if ((n = *p++) <= 0) {
        !            83:                if (yychar < 0)
        !            84:                        yychar = yylex();
        !            85:                do
        !            86:                        if ((n =+ yychar) != 0)
        !            87:                                p++;
        !            88:                while ((n = *p++) <= 0);
        !            89:        }
        !            90: #else
        !            91:        while ((n = *p++) <= 0)
        !            92:                if ((n =+ yychar) != 0)
        !            93:                        p++;
        !            94: #endif
        !            95:        switch (n >> 12) {
        !            96: 
        !            97:                /*
        !            98:                 * Shift.
        !            99:                 */
        !           100:                case 2:
        !           101: #ifdef PXP
        !           102:                        yypw[1].Wseqid = yyseqid;
        !           103:                        yypw[1].Wcol = yycol;
        !           104: #endif
        !           105:                        OYcopy();
        !           106:                        yystate = n & 07777;
        !           107:                        yyval = yylval;
        !           108: #ifdef PI
        !           109:                        yychar = -1;
        !           110: #else
        !           111:                        yychar = yylex();
        !           112: #endif
        !           113:                        yyshifts++;
        !           114:                        yytshifts++;
        !           115:                        goto stack;
        !           116: 
        !           117:                /*
        !           118:                 * Reduce.
        !           119:                 */
        !           120:                case 3:
        !           121:                        n =& 07777;
        !           122:                        N = yyr2[n];
        !           123:                        if (N == 1 && OY.Yychar == YID && !yyEactr(n, yypv[0])) {
        !           124:                                idfail = 1;
        !           125:                                goto errin;
        !           126:                        }
        !           127:                        OY.Yychar = -1;
        !           128:                        ps =- N;
        !           129:                        yypv =- N;
        !           130: #ifdef PXP
        !           131:                        yypw =- N;
        !           132: #endif
        !           133:                        yyval = yypv[1];
        !           134:                        yyactr(n);
        !           135:                        /*
        !           136:                         * Use goto table to find next state.
        !           137:                         */
        !           138:                        p = &yygo[yypgo[yyr1[n]]];
        !           139:                        while (*p != *ps && *p >= 0)
        !           140:                                p =+ 2;
        !           141:                        yystate = p[1];
        !           142:                        goto stack;
        !           143: 
        !           144:                /*
        !           145:                 * Accept.
        !           146:                 */
        !           147:                case 4:
        !           148:                        return;
        !           149: 
        !           150:                /*
        !           151:                 * Error.
        !           152:                 */
        !           153:                case 1:
        !           154:                        idfail = 0;
        !           155: errin:
        !           156:                        if ((paniced || yyshifts != 0) && yyrecover(ps, idfail)) {
        !           157:                                paniced = 0;
        !           158:                                ps = Ps;
        !           159:                                yystate = *ps;
        !           160:                                goto newstate;
        !           161:                        }
        !           162:                        /*
        !           163:                         * Find a state where 'error' is a
        !           164:                         * legal shift action.
        !           165:                         */
        !           166:                        if (paniced && yyshifts <= 0 && ps >= panicps) {
        !           167:                                yypv =- (ps - panicps) + 1;
        !           168: #ifdef PXP
        !           169:                                yypw =- (ps - panicps) + 1;
        !           170: #endif
        !           171:                                ps = panicps - 1;
        !           172:                        }
        !           173:                        while (ps >= yys) {
        !           174:                                for (p = &yyact[ yypact[*ps+1] ] ; *p <= 0; p=+ 2)
        !           175:                                        if (*p == -256) {
        !           176:                                                panicps = ps;
        !           177:                                                yystate= p[1] & 07777;
        !           178:                                                yyOshifts = yyshifts;
        !           179:                                                yyshifts = 0;
        !           180:                                                paniced = 1;
        !           181:                                                goto stack;
        !           182:                                        }
        !           183:                                --ps;
        !           184:                                --yypv;
        !           185: #ifdef PXP
        !           186:                                --yypw;
        !           187: #endif
        !           188: #ifdef PI
        !           189:                                if (OY.Yychar != YID)
        !           190:                                        syneflg++;
        !           191: #endif
        !           192:                                OY.Yychar = -1;
        !           193:                        }
        !           194:                        if (yychar == YEOF)
        !           195:                                yyunexeof();
        !           196:                        if (yystate == 1)
        !           197:                                yyexeof();
        !           198:                        yerror("Unrecoverable syntax error - QUIT");
        !           199:                        return;
        !           200:        }
        !           201:        panic("yyparse");
        !           202: }

unix.superglobalmegacorp.com

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