1*22211Sdist /* 2*22211Sdist * Copyright (c) 1980 Regents of the University of California. 3*22211Sdist * All rights reserved. The Berkeley software License Agreement 4*22211Sdist * specifies the terms and conditions for redistribution. 5*22211Sdist */ 6791Speter 714748Sthien #ifndef lint 8*22211Sdist static char sccsid[] = "@(#)yyparse.c 5.1 (Berkeley) 06/05/85"; 9*22211Sdist #endif not lint 10791Speter 11791Speter #include "whoami.h" 12791Speter #include "0.h" 1314748Sthien #include "tree_ty.h" /* must be included for yy.h */ 14791Speter #include "yy.h" 15791Speter 16791Speter /* 17791Speter * Parser for 'yacc' output. 18791Speter * Specifially Modified for Berkeley Pascal 19791Speter */ 20791Speter 21791Speter int yystate; /* Current parser state */ 2214748Sthien union semstack *yypv; 233086Smckusic unsigned yytshifts = 1; /* Number of "true" shifts */ 24791Speter 25791Speter /* 26791Speter * Parse Tables 27791Speter */ 28791Speter int yygo[]; 29791Speter int yypgo[]; 30791Speter int yyr1[]; 31791Speter int yyr2[]; 32791Speter int yyact[]; 33791Speter int yypact[]; 34791Speter 35791Speter /* 36791Speter * Parse and parallel semantic stack 37791Speter */ 3814748Sthien union semstack yyv[MAXDEPTH]; 39791Speter int yys[MAXDEPTH]; 40791Speter 41791Speter /* 42791Speter * This routine parses the input stream, and 43791Speter * returns if it accepts, or if an unrecoverable syntax 44791Speter * error is encountered. 45791Speter */ 46791Speter yyparse() 47791Speter { 48791Speter register int *ps, n, *p; 49791Speter int paniced, *panicps, idfail; 50791Speter 5114748Sthien #ifdef lint 5214748Sthien panicps = (int *) 0; 5314748Sthien #endif 54791Speter yystate = 0; 55791Speter yychar = yylex(); 56791Speter OY.Yychar = -1; 57791Speter yyshifts = 3; 58791Speter paniced = 0; 59791Speter ps = &yys[0]-1; 60791Speter yypv = &yyv[0]-1; 61791Speter #ifdef PXP 62791Speter yypw = &yyw[0]-1; 63791Speter #endif 64791Speter 65791Speter stack: 66791Speter /* 67791Speter * Push new state and value. 68791Speter */ 69791Speter if (yypv >= &yyv[MAXDEPTH-1]) { 70791Speter yerror("Parse stack overflow"); 71791Speter pexit(DIED); 72791Speter } 73791Speter *++ps = yystate; 74791Speter *++yypv = yyval; 75791Speter #ifdef PXP 76791Speter yypw++; 77791Speter #endif 78791Speter newstate: 79791Speter /* 80791Speter * Locate parsing actions for the 81791Speter * new parser state. 82791Speter */ 83791Speter p = &yyact[ yypact[yystate+1] ]; 84791Speter /* 85791Speter * Search the parse actions table 86791Speter * for something useful to do. 87791Speter * While n is non-positive, it is the negation 88791Speter * of the token we are testing for. 89791Speter */ 90791Speter #ifdef PI 91791Speter if ((n = *p++) <= 0) { 92791Speter if (yychar < 0) 93791Speter yychar = yylex(); 94791Speter do 953086Smckusic if ((n += yychar) != 0) 96791Speter p++; 97791Speter while ((n = *p++) <= 0); 98791Speter } 99791Speter #else 100791Speter while ((n = *p++) <= 0) 1013086Smckusic if ((n += yychar) != 0) 102791Speter p++; 103791Speter #endif 104791Speter switch (n >> 12) { 105791Speter 106791Speter /* 107791Speter * Shift. 108791Speter */ 109791Speter case 2: 110791Speter #ifdef PXP 111791Speter yypw[1].Wseqid = yyseqid; 112791Speter yypw[1].Wcol = yycol; 113791Speter #endif 114791Speter OYcopy(); 115791Speter yystate = n & 07777; 11614748Sthien yyval.i_entry = yylval; 117791Speter #ifdef PI 118791Speter yychar = -1; 119791Speter #else 120791Speter yychar = yylex(); 121791Speter #endif 122791Speter yyshifts++; 123791Speter yytshifts++; 124791Speter goto stack; 125791Speter 126791Speter /* 127791Speter * Reduce. 128791Speter */ 129791Speter case 3: 1303086Smckusic n &= 07777; 131791Speter N = yyr2[n]; 13214748Sthien if (N == 1 && OY.Yychar == YID && !yyEactr(n, 13314748Sthien yypv[0].cptr)) { 134791Speter idfail = 1; 135791Speter goto errin; 136791Speter } 137791Speter OY.Yychar = -1; 1383086Smckusic ps -= N; 1393086Smckusic yypv -= N; 140791Speter #ifdef PXP 1413086Smckusic yypw -= N; 142791Speter #endif 143791Speter yyval = yypv[1]; 144791Speter yyactr(n); 145791Speter /* 146791Speter * Use goto table to find next state. 147791Speter */ 148791Speter p = &yygo[yypgo[yyr1[n]]]; 149791Speter while (*p != *ps && *p >= 0) 1503086Smckusic p += 2; 151791Speter yystate = p[1]; 152791Speter goto stack; 153791Speter 154791Speter /* 155791Speter * Accept. 156791Speter */ 157791Speter case 4: 158791Speter return; 159791Speter 160791Speter /* 161791Speter * Error. 162791Speter */ 163791Speter case 1: 164791Speter idfail = 0; 165791Speter errin: 166791Speter if ((paniced || yyshifts != 0) && yyrecover(ps, idfail)) { 167791Speter paniced = 0; 168791Speter ps = Ps; 169791Speter yystate = *ps; 170791Speter goto newstate; 171791Speter } 172791Speter /* 173791Speter * Find a state where 'error' is a 174791Speter * legal shift action. 175791Speter */ 176791Speter if (paniced && yyshifts <= 0 && ps >= panicps) { 1773086Smckusic yypv -= (ps - panicps) + 1; 178791Speter #ifdef PXP 1793086Smckusic yypw -= (ps - panicps) + 1; 180791Speter #endif 181791Speter ps = panicps - 1; 182791Speter } 183791Speter while (ps >= yys) { 1843086Smckusic for (p = &yyact[ yypact[*ps+1] ] ; *p <= 0; p += 2) 185791Speter if (*p == -256) { 186791Speter panicps = ps; 187791Speter yystate= p[1] & 07777; 188791Speter yyOshifts = yyshifts; 189791Speter yyshifts = 0; 190791Speter paniced = 1; 191791Speter goto stack; 192791Speter } 193791Speter --ps; 194791Speter --yypv; 195791Speter #ifdef PXP 196791Speter --yypw; 197791Speter #endif 198791Speter #ifdef PI 199791Speter if (OY.Yychar != YID) 2003086Smckusic syneflg = TRUE; 201791Speter #endif 202791Speter OY.Yychar = -1; 203791Speter } 204791Speter if (yychar == YEOF) 205791Speter yyunexeof(); 206791Speter if (yystate == 1) 207791Speter yyexeof(); 208791Speter yerror("Unrecoverable syntax error - QUIT"); 209791Speter return; 210791Speter } 211791Speter panic("yyparse"); 212791Speter } 213