1791Speter /* Copyright (c) 1979 Regents of the University of California */ 2791Speter 3*3086Smckusic static char sccsid[] = "@(#)yyparse.c 1.2 03/08/81"; 4791Speter 5791Speter #include "whoami.h" 6791Speter #include "0.h" 7791Speter #include "yy.h" 8791Speter 9791Speter /* 10791Speter * Parser for 'yacc' output. 11791Speter * Specifially Modified for Berkeley Pascal 12791Speter */ 13791Speter 14791Speter int yystate; /* Current parser state */ 15791Speter int *yypv; 16*3086Smckusic unsigned yytshifts = 1; /* Number of "true" shifts */ 17791Speter 18791Speter /* 19791Speter * Parse Tables 20791Speter */ 21791Speter int yygo[]; 22791Speter int yypgo[]; 23791Speter int yyr1[]; 24791Speter int yyr2[]; 25791Speter int yyact[]; 26791Speter int yypact[]; 27791Speter 28791Speter /* 29791Speter * Parse and parallel semantic stack 30791Speter */ 31791Speter int yyv[MAXDEPTH]; 32791Speter int yys[MAXDEPTH]; 33791Speter 34791Speter /* 35791Speter * This routine parses the input stream, and 36791Speter * returns if it accepts, or if an unrecoverable syntax 37791Speter * error is encountered. 38791Speter */ 39791Speter yyparse() 40791Speter { 41791Speter register int *ps, n, *p; 42791Speter int paniced, *panicps, idfail; 43791Speter 44791Speter yystate = 0; 45791Speter yychar = yylex(); 46791Speter OY.Yychar = -1; 47791Speter yyshifts = 3; 48791Speter paniced = 0; 49791Speter ps = &yys[0]-1; 50791Speter yypv = &yyv[0]-1; 51791Speter #ifdef PXP 52791Speter yypw = &yyw[0]-1; 53791Speter #endif 54791Speter 55791Speter stack: 56791Speter /* 57791Speter * Push new state and value. 58791Speter */ 59791Speter if (yypv >= &yyv[MAXDEPTH-1]) { 60791Speter yerror("Parse stack overflow"); 61791Speter pexit(DIED); 62791Speter } 63791Speter *++ps = yystate; 64791Speter *++yypv = yyval; 65791Speter #ifdef PXP 66791Speter yypw++; 67791Speter #endif 68791Speter newstate: 69791Speter /* 70791Speter * Locate parsing actions for the 71791Speter * new parser state. 72791Speter */ 73791Speter p = &yyact[ yypact[yystate+1] ]; 74791Speter actn: 75791Speter /* 76791Speter * Search the parse actions table 77791Speter * for something useful to do. 78791Speter * While n is non-positive, it is the negation 79791Speter * of the token we are testing for. 80791Speter */ 81791Speter #ifdef PI 82791Speter if ((n = *p++) <= 0) { 83791Speter if (yychar < 0) 84791Speter yychar = yylex(); 85791Speter do 86*3086Smckusic if ((n += yychar) != 0) 87791Speter p++; 88791Speter while ((n = *p++) <= 0); 89791Speter } 90791Speter #else 91791Speter while ((n = *p++) <= 0) 92*3086Smckusic if ((n += yychar) != 0) 93791Speter p++; 94791Speter #endif 95791Speter switch (n >> 12) { 96791Speter 97791Speter /* 98791Speter * Shift. 99791Speter */ 100791Speter case 2: 101791Speter #ifdef PXP 102791Speter yypw[1].Wseqid = yyseqid; 103791Speter yypw[1].Wcol = yycol; 104791Speter #endif 105791Speter OYcopy(); 106791Speter yystate = n & 07777; 107791Speter yyval = yylval; 108791Speter #ifdef PI 109791Speter yychar = -1; 110791Speter #else 111791Speter yychar = yylex(); 112791Speter #endif 113791Speter yyshifts++; 114791Speter yytshifts++; 115791Speter goto stack; 116791Speter 117791Speter /* 118791Speter * Reduce. 119791Speter */ 120791Speter case 3: 121*3086Smckusic n &= 07777; 122791Speter N = yyr2[n]; 123791Speter if (N == 1 && OY.Yychar == YID && !yyEactr(n, yypv[0])) { 124791Speter idfail = 1; 125791Speter goto errin; 126791Speter } 127791Speter OY.Yychar = -1; 128*3086Smckusic ps -= N; 129*3086Smckusic yypv -= N; 130791Speter #ifdef PXP 131*3086Smckusic yypw -= N; 132791Speter #endif 133791Speter yyval = yypv[1]; 134791Speter yyactr(n); 135791Speter /* 136791Speter * Use goto table to find next state. 137791Speter */ 138791Speter p = &yygo[yypgo[yyr1[n]]]; 139791Speter while (*p != *ps && *p >= 0) 140*3086Smckusic p += 2; 141791Speter yystate = p[1]; 142791Speter goto stack; 143791Speter 144791Speter /* 145791Speter * Accept. 146791Speter */ 147791Speter case 4: 148791Speter return; 149791Speter 150791Speter /* 151791Speter * Error. 152791Speter */ 153791Speter case 1: 154791Speter idfail = 0; 155791Speter errin: 156791Speter if ((paniced || yyshifts != 0) && yyrecover(ps, idfail)) { 157791Speter paniced = 0; 158791Speter ps = Ps; 159791Speter yystate = *ps; 160791Speter goto newstate; 161791Speter } 162791Speter /* 163791Speter * Find a state where 'error' is a 164791Speter * legal shift action. 165791Speter */ 166791Speter if (paniced && yyshifts <= 0 && ps >= panicps) { 167*3086Smckusic yypv -= (ps - panicps) + 1; 168791Speter #ifdef PXP 169*3086Smckusic yypw -= (ps - panicps) + 1; 170791Speter #endif 171791Speter ps = panicps - 1; 172791Speter } 173791Speter while (ps >= yys) { 174*3086Smckusic for (p = &yyact[ yypact[*ps+1] ] ; *p <= 0; p += 2) 175791Speter if (*p == -256) { 176791Speter panicps = ps; 177791Speter yystate= p[1] & 07777; 178791Speter yyOshifts = yyshifts; 179791Speter yyshifts = 0; 180791Speter paniced = 1; 181791Speter goto stack; 182791Speter } 183791Speter --ps; 184791Speter --yypv; 185791Speter #ifdef PXP 186791Speter --yypw; 187791Speter #endif 188791Speter #ifdef PI 189791Speter if (OY.Yychar != YID) 190*3086Smckusic syneflg = TRUE; 191791Speter #endif 192791Speter OY.Yychar = -1; 193791Speter } 194791Speter if (yychar == YEOF) 195791Speter yyunexeof(); 196791Speter if (yystate == 1) 197791Speter yyexeof(); 198791Speter yerror("Unrecoverable syntax error - QUIT"); 199791Speter return; 200791Speter } 201791Speter panic("yyparse"); 202791Speter } 203