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