Annotation of 43BSD/ingres/source/equel/parser.c, revision 1.1

1.1     ! root        1: # include      <sccs.h>
        !             2: 
        !             3: SCCSID(@(#)parser.c    8.1     12/31/84)
        !             4: 
        !             5: 
        !             6: # define       MAXDEPTH        150
        !             7: 
        !             8: /*
        !             9: **  PARSER FOR YACC OUTPUT
        !            10: **
        !            11: **  This is the same as the yacc parser found in the UNIX system
        !            12: **  library "/lib/liby.a".  There have been two kinds of
        !            13: **  modifications. 1) The coding style has been altered to conform
        !            14: **  to the INGRES standard.  2) The changes marked by comments.
        !            15: */
        !            16: 
        !            17: extern int     yyval;          /* defined in the table file */
        !            18: extern int     yylval;         /* defined in the table file */
        !            19: extern int     *yypv;          /* defined in the table file */
        !            20: 
        !            21: 
        !            22: /* -------- the next line is an INGRES customization -------- */
        !            23: int    yypflag         1;      /* zero for no actions performed */
        !            24: int    yydebug         0;      /* 1 for debugging */
        !            25: int    yyv[MAXDEPTH];          /* where the values are stored */
        !            26: int    yystate         0;      /* current parser state */
        !            27: int    yychar          -1;     /* current input token number */
        !            28: int    yynerrs         0;      /* number of errors */
        !            29: int    yyerrflag       0;      /* error recovery flag */
        !            30: 
        !            31: 
        !            32: yyparse()
        !            33: {
        !            34:        extern int      yygo[], yypgo[], yyr1[], yyr2[], yyact[], yypact[];
        !            35:        /* INGRES customization to make 'ps', 'p', and 'n' register variables */
        !            36:        int             s[MAXDEPTH];
        !            37:        register int    *ps, *p;
        !            38:        register int    n;
        !            39:        int             ac;
        !            40: 
        !            41:        yystate = 0;
        !            42:        yychar = -1;
        !            43:        yynerrs = 0;
        !            44:        yyerrflag = 0;
        !            45:        ps = &s[0] - 1;
        !            46:        yypv = &yyv[0] - 1;
        !            47: 
        !            48: stack:         /* put a state and value onto the stack */
        !            49:        if (yydebug)
        !            50:                printf("state %d value %d char %d\n", yystate, yyval, yychar);
        !            51:        *++ps = yystate;
        !            52:        *++yypv = yyval;
        !            53: 
        !            54: newstate:      /* set ap to point to the parsing actions for the new state */
        !            55: 
        !            56:        p = &yyact[yypact[yystate + 1]];
        !            57: 
        !            58: actn:          /* get the next action, and perform it */
        !            59:        n = (ac = *p++) & 07777;        /* n is the "address" of the action */
        !            60: 
        !            61:        switch (ac >> 12)       /* switch on operation */
        !            62:        {
        !            63: 
        !            64:          case 1:       /* skip on test */
        !            65:                if (yychar < 0)
        !            66:                {
        !            67:                        yychar = yylex();
        !            68:                        if (yydebug)
        !            69:                                printf( "character %d read\n", yychar );
        !            70:                }
        !            71:                /* ---------- the next two lines are an INGRES customization ---------- */
        !            72:                if (yychar < 0)
        !            73:                        return(1);
        !            74:                if (n != yychar)
        !            75:                        p++;
        !            76:                goto actn;      /* get next action */
        !            77: 
        !            78:          case 2:               /* shift */
        !            79:                yystate = n;
        !            80:                yyval = yylval;
        !            81:                yychar = -1;
        !            82:                if (yyerrflag)
        !            83:                        yyerrflag--;
        !            84:                goto stack;     /* stack new state */
        !            85: 
        !            86:          case 3:               /* reduce */
        !            87:                if (yydebug)
        !            88:                        printf("reduce %d\n", n);
        !            89:                ps =- yyr2[n];
        !            90:                yypv =- yyr2[n];
        !            91:                yyval = yypv[1];
        !            92:                /* --------  the next 2 lines are an INGRES customization -------- */
        !            93:                if (yypflag && yyactr(n))
        !            94:                         goto abort;
        !            95:                /* consult goto table to find next state */
        !            96:                for (p = &yygo[yypgo[yyr1[n]]]; *p != *ps && *p >= 0; p =+ 2) ;
        !            97:                yystate = p[1];
        !            98:                goto stack;  /* stack new state and value */
        !            99: 
        !           100:          case 4:               /* accept */
        !           101:                return(0);
        !           102: 
        !           103:          case 0:               /* error ... attempt to resume parsing */
        !           104:                switch (yyerrflag)
        !           105:                {
        !           106: 
        !           107:                  case 0:               /* brand new error */
        !           108:                /* ----------the next 2 lines are an INGRES customization ---------- */
        !           109:                        /* syntax error */
        !           110:                        yyerror("syntax error");
        !           111:                        yynerrs++;
        !           112: 
        !           113:                  case 1:
        !           114:                  case 2: /* incompletely recovered error ... try again */
        !           115:                        yyerrflag = 3;
        !           116: 
        !           117:                        /* find a state where "error" is a legal shift action */
        !           118:                        while (ps >= s)
        !           119:                        {
        !           120:                                /* search ps actions */
        !           121:                                for (p = &yyact[yypact[*ps + 1]]; (*p >> 12) == 1; p =+ 2)
        !           122:                                if (*p == 4352)
        !           123:                                        goto found;
        !           124: 
        !           125:                                /* the current ps has no shift onn "error", pop stack */
        !           126: 
        !           127:                                if (yydebug)
        !           128:                                        printf("err recov pops state %d, uncovers %d\n", ps[0], ps[-1]);
        !           129:                                ps--;
        !           130:                                yypv--;
        !           131:                        }
        !           132: 
        !           133:                        /* there is no state on the stack with an error shift ... abort */
        !           134: 
        !           135:                abort:
        !           136:                        return(1);
        !           137: 
        !           138:                found:   /* we have a state with a shift on "error", resume parsing */
        !           139:                        yystate = p[1] & 07777;
        !           140:                        goto stack;
        !           141: 
        !           142:                  case 3:  /* no shift yet; clobber input char */
        !           143:                        if (yydebug)
        !           144:                                printf("err recov discards char %d\n", yychar);
        !           145: 
        !           146:                        /* don't discard EOF; quit */
        !           147:                        if (yychar == 0)
        !           148:                                goto abort;
        !           149:                        yychar = -1;
        !           150:                        goto newstate;   /* try again in the same state */
        !           151: 
        !           152:                }
        !           153:        }
        !           154: }

unix.superglobalmegacorp.com

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