xref: /csrg-svn/usr.bin/pascal/src/yyparse.c (revision 62227)
148116Sbostic /*-
2*62227Sbostic  * Copyright (c) 1980, 1993
3*62227Sbostic  *	The Regents of the University of California.  All rights reserved.
448116Sbostic  *
548116Sbostic  * %sccs.include.redist.c%
622211Sdist  */
7791Speter 
814748Sthien #ifndef lint
9*62227Sbostic static char sccsid[] = "@(#)yyparse.c	8.1 (Berkeley) 06/06/93";
1048116Sbostic #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  */
yyparse()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