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

Defined functions

yyparse defined in line 46; used 1 times

Defined variables

sccsid defined in line 8; never used
yyact defined in line 32; used 2 times
yygo defined in line 28; used 2 times
yypact defined in line 33; used 2 times
yypgo defined in line 29; used 2 times
yypv defined in line 22; used 9 times
yyr1 defined in line 30; used 2 times
yyr2 defined in line 31; used 2 times
yys defined in line 39; used 2 times
yystate defined in line 21; used 8 times
yytshifts defined in line 23; used 1 times
yyv defined in line 38; used 2 times
Last modified: 1985-06-06
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1117
Valid CSS Valid XHTML 1.0 Strict