|
|
1.1 ! root 1: /* Copyright (c) 1979 Regents of the University of California */ ! 2: # ! 3: /* ! 4: * pi - Pascal interpreter code translator ! 5: * ! 6: * Charles Haley, Bill Joy UCB ! 7: * Version 1.2 January 1979 ! 8: * ! 9: * ! 10: * pxp - Pascal execution profiler ! 11: * ! 12: * Bill Joy UCB ! 13: * Version 1.2 January 1979 ! 14: */ ! 15: ! 16: #include "0.h" ! 17: #include "yy.h" ! 18: ! 19: /* ! 20: * Parser for 'yacc' output. ! 21: * Specifially Modified for Berkeley Pascal ! 22: */ ! 23: ! 24: int yystate; /* Current parser state */ ! 25: int *yypv; ! 26: unsigned yytshifts 1; /* Number of "true" shifts */ ! 27: ! 28: /* ! 29: * Parse Tables ! 30: */ ! 31: int yygo[]; ! 32: int yypgo[]; ! 33: int yyr1[]; ! 34: int yyr2[]; ! 35: int yyact[]; ! 36: int yypact[]; ! 37: ! 38: /* ! 39: * Parse and parallel semantic stack ! 40: */ ! 41: int yyv[MAXDEPTH]; ! 42: int yys[MAXDEPTH]; ! 43: ! 44: /* ! 45: * This routine parses the input stream, and ! 46: * returns if it accepts, or if an unrecoverable syntax ! 47: * error is encountered. ! 48: */ ! 49: yyparse() ! 50: { ! 51: register int *ps, n, *p; ! 52: int paniced, *panicps, idfail; ! 53: ! 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: actn: ! 85: /* ! 86: * Search the parse actions table ! 87: * for something useful to do. ! 88: * While n is non-positive, it is the negation ! 89: * of the token we are testing for. ! 90: */ ! 91: #ifdef PI ! 92: if ((n = *p++) <= 0) { ! 93: if (yychar < 0) ! 94: yychar = yylex(); ! 95: do ! 96: if ((n =+ yychar) != 0) ! 97: p++; ! 98: while ((n = *p++) <= 0); ! 99: } ! 100: #else ! 101: while ((n = *p++) <= 0) ! 102: if ((n =+ yychar) != 0) ! 103: p++; ! 104: #endif ! 105: switch (n >> 12) { ! 106: ! 107: /* ! 108: * Shift. ! 109: */ ! 110: case 2: ! 111: #ifdef PXP ! 112: yypw[1].Wseqid = yyseqid; ! 113: yypw[1].Wcol = yycol; ! 114: #endif ! 115: OYcopy(); ! 116: yystate = n & 07777; ! 117: yyval = yylval; ! 118: #ifdef PI ! 119: yychar = -1; ! 120: #else ! 121: yychar = yylex(); ! 122: #endif ! 123: yyshifts++; ! 124: yytshifts++; ! 125: goto stack; ! 126: ! 127: /* ! 128: * Reduce. ! 129: */ ! 130: case 3: ! 131: n =& 07777; ! 132: N = yyr2[n]; ! 133: if (N == 1 && OY.Yychar == YID && !yyEactr(n, yypv[0])) { ! 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++; ! 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.