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