xref: /csrg-svn/usr.bin/pascal/src/yyparse.c (revision 22211)
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