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