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