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