xref: /csrg-svn/usr.bin/pascal/src/yyparse.c (revision 14748)
1791Speter /* Copyright (c) 1979 Regents of the University of California */
2791Speter 
3*14748Sthien #ifndef lint
4*14748Sthien static char sccsid[] = "@(#)yyparse.c 1.3 08/19/83";
5*14748Sthien #endif
6791Speter 
7791Speter #include "whoami.h"
8791Speter #include "0.h"
9*14748Sthien #include "tree_ty.h"	/* must be included for yy.h */
10791Speter #include "yy.h"
11791Speter 
12791Speter /*
13791Speter  * Parser for 'yacc' output.
14791Speter  * Specifially Modified for Berkeley Pascal
15791Speter  */
16791Speter 
17791Speter int	yystate;	/* Current parser state */
18*14748Sthien union semstack *yypv;
193086Smckusic unsigned yytshifts = 1;	/* Number of "true" shifts */
20791Speter 
21791Speter /*
22791Speter  * Parse Tables
23791Speter  */
24791Speter int	yygo[];
25791Speter int	yypgo[];
26791Speter int	yyr1[];
27791Speter int	yyr2[];
28791Speter int	yyact[];
29791Speter int	yypact[];
30791Speter 
31791Speter /*
32791Speter  * Parse and parallel semantic stack
33791Speter  */
34*14748Sthien union semstack	yyv[MAXDEPTH];
35791Speter int	yys[MAXDEPTH];
36791Speter 
37791Speter /*
38791Speter  * This routine parses the input stream, and
39791Speter  * returns if it accepts, or if an unrecoverable syntax
40791Speter  * error is encountered.
41791Speter  */
42791Speter yyparse()
43791Speter {
44791Speter 	register int *ps, n, *p;
45791Speter 	int paniced, *panicps, idfail;
46791Speter 
47*14748Sthien #ifdef lint
48*14748Sthien 	panicps = (int *) 0;
49*14748Sthien #endif
50791Speter 	yystate = 0;
51791Speter 	yychar = yylex();
52791Speter 	OY.Yychar = -1;
53791Speter 	yyshifts = 3;
54791Speter 	paniced = 0;
55791Speter 	ps = &yys[0]-1;
56791Speter 	yypv = &yyv[0]-1;
57791Speter #ifdef PXP
58791Speter 	yypw = &yyw[0]-1;
59791Speter #endif
60791Speter 
61791Speter stack:
62791Speter 	/*
63791Speter 	 * Push new state and value.
64791Speter 	 */
65791Speter 	if (yypv >= &yyv[MAXDEPTH-1]) {
66791Speter 		yerror("Parse stack overflow");
67791Speter 		pexit(DIED);
68791Speter 	}
69791Speter 	*++ps = yystate;
70791Speter 	*++yypv = yyval;
71791Speter #ifdef PXP
72791Speter 	yypw++;
73791Speter #endif
74791Speter newstate:
75791Speter 	/*
76791Speter 	 * Locate parsing actions for the
77791Speter 	 * new parser state.
78791Speter 	 */
79791Speter 	p = &yyact[ yypact[yystate+1] ];
80791Speter 	/*
81791Speter 	 * Search the parse actions table
82791Speter 	 * for something useful to do.
83791Speter 	 * While n is non-positive, it is the negation
84791Speter 	 * of the token we are testing for.
85791Speter 	 */
86791Speter #ifdef PI
87791Speter 	if ((n = *p++) <= 0) {
88791Speter 		if (yychar < 0)
89791Speter 			yychar = yylex();
90791Speter 		do
913086Smckusic 			if ((n += yychar) != 0)
92791Speter 				p++;
93791Speter 		while ((n = *p++) <= 0);
94791Speter 	}
95791Speter #else
96791Speter 	while ((n = *p++) <= 0)
973086Smckusic 		if ((n += yychar) != 0)
98791Speter 			p++;
99791Speter #endif
100791Speter 	switch (n >> 12) {
101791Speter 
102791Speter 		/*
103791Speter 		 * Shift.
104791Speter 		 */
105791Speter 		case 2:
106791Speter #ifdef PXP
107791Speter 			yypw[1].Wseqid = yyseqid;
108791Speter 			yypw[1].Wcol = yycol;
109791Speter #endif
110791Speter 			OYcopy();
111791Speter 			yystate = n & 07777;
112*14748Sthien 			yyval.i_entry = yylval;
113791Speter #ifdef PI
114791Speter 			yychar = -1;
115791Speter #else
116791Speter 			yychar = yylex();
117791Speter #endif
118791Speter 			yyshifts++;
119791Speter 			yytshifts++;
120791Speter 			goto stack;
121791Speter 
122791Speter 		/*
123791Speter 		 * Reduce.
124791Speter 		 */
125791Speter 		case 3:
1263086Smckusic 			n &= 07777;
127791Speter 			N = yyr2[n];
128*14748Sthien 			if (N == 1 && OY.Yychar == YID && !yyEactr(n,
129*14748Sthien 							yypv[0].cptr)) {
130791Speter 				idfail = 1;
131791Speter 				goto errin;
132791Speter 			}
133791Speter 			OY.Yychar = -1;
1343086Smckusic 			ps -= N;
1353086Smckusic 			yypv -= N;
136791Speter #ifdef PXP
1373086Smckusic 			yypw -= N;
138791Speter #endif
139791Speter 			yyval = yypv[1];
140791Speter 			yyactr(n);
141791Speter 			/*
142791Speter 			 * Use goto table to find next state.
143791Speter 			 */
144791Speter 			p = &yygo[yypgo[yyr1[n]]];
145791Speter 			while (*p != *ps && *p >= 0)
1463086Smckusic 				p += 2;
147791Speter 			yystate = p[1];
148791Speter 			goto stack;
149791Speter 
150791Speter 		/*
151791Speter 		 * Accept.
152791Speter 		 */
153791Speter 		case 4:
154791Speter 			return;
155791Speter 
156791Speter 		/*
157791Speter 		 * Error.
158791Speter 		 */
159791Speter 		case 1:
160791Speter 			idfail = 0;
161791Speter errin:
162791Speter 			if ((paniced || yyshifts != 0) && yyrecover(ps, idfail)) {
163791Speter 				paniced = 0;
164791Speter 				ps = Ps;
165791Speter 				yystate = *ps;
166791Speter 				goto newstate;
167791Speter 			}
168791Speter 			/*
169791Speter 			 * Find a state where 'error' is a
170791Speter 			 * legal shift action.
171791Speter 			 */
172791Speter 			if (paniced && yyshifts <= 0 && ps >= panicps) {
1733086Smckusic 				yypv -= (ps - panicps) + 1;
174791Speter #ifdef PXP
1753086Smckusic 				yypw -= (ps - panicps) + 1;
176791Speter #endif
177791Speter 				ps = panicps - 1;
178791Speter 			}
179791Speter 			while (ps >= yys) {
1803086Smckusic 				for (p = &yyact[ yypact[*ps+1] ] ; *p <= 0; p += 2)
181791Speter 					if (*p == -256) {
182791Speter 						panicps = ps;
183791Speter 						yystate= p[1] & 07777;
184791Speter 						yyOshifts = yyshifts;
185791Speter 						yyshifts = 0;
186791Speter 						paniced = 1;
187791Speter 						goto stack;
188791Speter 					}
189791Speter 				--ps;
190791Speter 				--yypv;
191791Speter #ifdef PXP
192791Speter 				--yypw;
193791Speter #endif
194791Speter #ifdef PI
195791Speter 				if (OY.Yychar != YID)
1963086Smckusic 					syneflg = TRUE;
197791Speter #endif
198791Speter 				OY.Yychar = -1;
199791Speter 			}
200791Speter 			if (yychar == YEOF)
201791Speter 				yyunexeof();
202791Speter 			if (yystate == 1)
203791Speter 				yyexeof();
204791Speter 			yerror("Unrecoverable syntax error - QUIT");
205791Speter 			return;
206791Speter 	}
207791Speter 	panic("yyparse");
208791Speter }
209