1*48116Sbostic /*- 2*48116Sbostic * Copyright (c) 1980 The Regents of the University of California. 3*48116Sbostic * All rights reserved. 4*48116Sbostic * 5*48116Sbostic * %sccs.include.redist.c% 622211Sdist */ 7791Speter 814748Sthien #ifndef lint 9*48116Sbostic static char sccsid[] = "@(#)yyparse.c 5.2 (Berkeley) 04/16/91"; 10*48116Sbostic #endif /* not lint */ 11791Speter 12791Speter #include "whoami.h" 13791Speter #include "0.h" 1414748Sthien #include "tree_ty.h" /* must be included for yy.h */ 15791Speter #include "yy.h" 16791Speter 17791Speter /* 18791Speter * Parser for 'yacc' output. 19791Speter * Specifially Modified for Berkeley Pascal 20791Speter */ 21791Speter 22791Speter int yystate; /* Current parser state */ 2314748Sthien union semstack *yypv; 243086Smckusic unsigned yytshifts = 1; /* Number of "true" shifts */ 25791Speter 26791Speter /* 27791Speter * Parse Tables 28791Speter */ 29791Speter int yygo[]; 30791Speter int yypgo[]; 31791Speter int yyr1[]; 32791Speter int yyr2[]; 33791Speter int yyact[]; 34791Speter int yypact[]; 35791Speter 36791Speter /* 37791Speter * Parse and parallel semantic stack 38791Speter */ 3914748Sthien union semstack yyv[MAXDEPTH]; 40791Speter int yys[MAXDEPTH]; 41791Speter 42791Speter /* 43791Speter * This routine parses the input stream, and 44791Speter * returns if it accepts, or if an unrecoverable syntax 45791Speter * error is encountered. 46791Speter */ 47791Speter yyparse() 48791Speter { 49791Speter register int *ps, n, *p; 50791Speter int paniced, *panicps, idfail; 51791Speter 5214748Sthien #ifdef lint 5314748Sthien panicps = (int *) 0; 5414748Sthien #endif 55791Speter yystate = 0; 56791Speter yychar = yylex(); 57791Speter OY.Yychar = -1; 58791Speter yyshifts = 3; 59791Speter paniced = 0; 60791Speter ps = &yys[0]-1; 61791Speter yypv = &yyv[0]-1; 62791Speter #ifdef PXP 63791Speter yypw = &yyw[0]-1; 64791Speter #endif 65791Speter 66791Speter stack: 67791Speter /* 68791Speter * Push new state and value. 69791Speter */ 70791Speter if (yypv >= &yyv[MAXDEPTH-1]) { 71791Speter yerror("Parse stack overflow"); 72791Speter pexit(DIED); 73791Speter } 74791Speter *++ps = yystate; 75791Speter *++yypv = yyval; 76791Speter #ifdef PXP 77791Speter yypw++; 78791Speter #endif 79791Speter newstate: 80791Speter /* 81791Speter * Locate parsing actions for the 82791Speter * new parser state. 83791Speter */ 84791Speter p = &yyact[ yypact[yystate+1] ]; 85791Speter /* 86791Speter * Search the parse actions table 87791Speter * for something useful to do. 88791Speter * While n is non-positive, it is the negation 89791Speter * of the token we are testing for. 90791Speter */ 91791Speter #ifdef PI 92791Speter if ((n = *p++) <= 0) { 93791Speter if (yychar < 0) 94791Speter yychar = yylex(); 95791Speter do 963086Smckusic if ((n += yychar) != 0) 97791Speter p++; 98791Speter while ((n = *p++) <= 0); 99791Speter } 100791Speter #else 101791Speter while ((n = *p++) <= 0) 1023086Smckusic if ((n += yychar) != 0) 103791Speter p++; 104791Speter #endif 105791Speter switch (n >> 12) { 106791Speter 107791Speter /* 108791Speter * Shift. 109791Speter */ 110791Speter case 2: 111791Speter #ifdef PXP 112791Speter yypw[1].Wseqid = yyseqid; 113791Speter yypw[1].Wcol = yycol; 114791Speter #endif 115791Speter OYcopy(); 116791Speter yystate = n & 07777; 11714748Sthien yyval.i_entry = yylval; 118791Speter #ifdef PI 119791Speter yychar = -1; 120791Speter #else 121791Speter yychar = yylex(); 122791Speter #endif 123791Speter yyshifts++; 124791Speter yytshifts++; 125791Speter goto stack; 126791Speter 127791Speter /* 128791Speter * Reduce. 129791Speter */ 130791Speter case 3: 1313086Smckusic n &= 07777; 132791Speter N = yyr2[n]; 13314748Sthien if (N == 1 && OY.Yychar == YID && !yyEactr(n, 13414748Sthien yypv[0].cptr)) { 135791Speter idfail = 1; 136791Speter goto errin; 137791Speter } 138791Speter OY.Yychar = -1; 1393086Smckusic ps -= N; 1403086Smckusic yypv -= N; 141791Speter #ifdef PXP 1423086Smckusic yypw -= N; 143791Speter #endif 144791Speter yyval = yypv[1]; 145791Speter yyactr(n); 146791Speter /* 147791Speter * Use goto table to find next state. 148791Speter */ 149791Speter p = &yygo[yypgo[yyr1[n]]]; 150791Speter while (*p != *ps && *p >= 0) 1513086Smckusic p += 2; 152791Speter yystate = p[1]; 153791Speter goto stack; 154791Speter 155791Speter /* 156791Speter * Accept. 157791Speter */ 158791Speter case 4: 159791Speter return; 160791Speter 161791Speter /* 162791Speter * Error. 163791Speter */ 164791Speter case 1: 165791Speter idfail = 0; 166791Speter errin: 167791Speter if ((paniced || yyshifts != 0) && yyrecover(ps, idfail)) { 168791Speter paniced = 0; 169791Speter ps = Ps; 170791Speter yystate = *ps; 171791Speter goto newstate; 172791Speter } 173791Speter /* 174791Speter * Find a state where 'error' is a 175791Speter * legal shift action. 176791Speter */ 177791Speter if (paniced && yyshifts <= 0 && ps >= panicps) { 1783086Smckusic yypv -= (ps - panicps) + 1; 179791Speter #ifdef PXP 1803086Smckusic yypw -= (ps - panicps) + 1; 181791Speter #endif 182791Speter ps = panicps - 1; 183791Speter } 184791Speter while (ps >= yys) { 1853086Smckusic for (p = &yyact[ yypact[*ps+1] ] ; *p <= 0; p += 2) 186791Speter if (*p == -256) { 187791Speter panicps = ps; 188791Speter yystate= p[1] & 07777; 189791Speter yyOshifts = yyshifts; 190791Speter yyshifts = 0; 191791Speter paniced = 1; 192791Speter goto stack; 193791Speter } 194791Speter --ps; 195791Speter --yypv; 196791Speter #ifdef PXP 197791Speter --yypw; 198791Speter #endif 199791Speter #ifdef PI 200791Speter if (OY.Yychar != YID) 2013086Smckusic syneflg = TRUE; 202791Speter #endif 203791Speter OY.Yychar = -1; 204791Speter } 205791Speter if (yychar == YEOF) 206791Speter yyunexeof(); 207791Speter if (yystate == 1) 208791Speter yyexeof(); 209791Speter yerror("Unrecoverable syntax error - QUIT"); 210791Speter return; 211791Speter } 212791Speter panic("yyparse"); 213791Speter } 214