|
|
1.1 root 1: /* Copyright (c) 1979 Regents of the University of California */
2: #
3: /*
4: * pi - Pascal interpreter code translator
5: *
6: * Charles Haley, Bill Joy UCB
7: * Version 1.1 February 1978
8: *
9: *
10: * pxp - Pascal execution profiler
11: *
12: * Bill Joy UCB
13: * Version 1.1 February 1978
14: */
15:
16: #include "whoami"
17: #include "0.h"
18: #include "yy.h"
19:
20: /*
21: * Parser for 'yacc' output.
22: * Specifially Modified for Berkeley Pascal
23: */
24:
25: int yystate; /* Current parser state */
26: int *yypv;
27: unsigned yytshifts 1; /* Number of "true" shifts */
28:
29: /*
30: * Parse Tables
31: */
32: int yygo[];
33: int yypgo[];
34: int yyr1[];
35: int yyr2[];
36: int yyact[];
37: int yypact[];
38:
39: /*
40: * Parse and parallel semantic stack
41: */
42: int yyv[MAXDEPTH];
43: int yys[MAXDEPTH];
44:
45: /*
46: * This routine parses the input stream, and
47: * returns if it accepts, or if an unrecoverable syntax
48: * error is encountered.
49: */
50: yyparse()
51: {
52: register int *ps, n, *p;
53: int paniced, *panicps, idfail;
54:
55: yystate = 0;
56: yychar = yylex();
57: OY.Yychar = -1;
58: yyshifts = 3;
59: paniced = 0;
60: ps = &yys[0]-1;
61: yypv = &yyv[0]-1;
62: #ifdef PXP
63: yypw = &yyw[0]-1;
64: #endif
65:
66: stack:
67: /*
68: * Push new state and value.
69: */
70: if (yypv >= &yyv[MAXDEPTH-1]) {
71: yerror("Parse stack overflow");
72: pexit(DIED);
73: }
74: *++ps = yystate;
75: *++yypv = yyval;
76: #ifdef PXP
77: yypw++;
78: #endif
79: newstate:
80: /*
81: * Locate parsing actions for the
82: * new parser state.
83: */
84: p = &yyact[ yypact[yystate+1] ];
85: actn:
86: /*
87: * Search the parse actions table
88: * for something useful to do.
89: * While n is non-positive, it is the negation
90: * of the token we are testing for.
91: */
92: #ifdef PI
93: if ((n = *p++) <= 0) {
94: if (yychar < 0)
95: yychar = yylex();
96: do
97: if ((n =+ yychar) != 0)
98: p++;
99: while ((n = *p++) <= 0);
100: }
101: #else
102: while ((n = *p++) <= 0)
103: if ((n =+ yychar) != 0)
104: p++;
105: #endif
106: switch (n >> 12) {
107:
108: /*
109: * Shift.
110: */
111: case 2:
112: #ifdef PXP
113: yypw[1].Wseqid = yyseqid;
114: yypw[1].Wcol = yycol;
115: #endif
116: OYcopy();
117: yystate = n & 07777;
118: yyval = yylval;
119: #ifdef PI
120: yychar = -1;
121: #else
122: yychar = yylex();
123: #endif
124: yyshifts++;
125: yytshifts++;
126: goto stack;
127:
128: /*
129: * Reduce.
130: */
131: case 3:
132: n =& 07777;
133: N = yyr2[n];
134: if (N == 1 && OY.Yychar == YID && !yyEactr(n, yypv[0])) {
135: idfail = 1;
136: goto errin;
137: }
138: OY.Yychar = -1;
139: ps =- N;
140: yypv =- N;
141: #ifdef PXP
142: yypw =- N;
143: #endif
144: yyval = yypv[1];
145: yyactr(n);
146: /*
147: * Use goto table to find next state.
148: */
149: p = &yygo[yypgo[yyr1[n]]];
150: while (*p != *ps && *p >= 0)
151: p =+ 2;
152: yystate = p[1];
153: goto stack;
154:
155: /*
156: * Accept.
157: */
158: case 4:
159: return;
160:
161: /*
162: * Error.
163: */
164: case 1:
165: idfail = 0;
166: errin:
167: if ((paniced || yyshifts != 0) && yyrecover(ps, idfail)) {
168: paniced = 0;
169: ps = Ps;
170: yystate = *ps;
171: goto newstate;
172: }
173: /*
174: * Find a state where 'error' is a
175: * legal shift action.
176: */
177: if (paniced && yyshifts <= 0 && ps >= panicps) {
178: yypv =- (ps - panicps) + 1;
179: #ifdef PXP
180: yypw =- (ps - panicps) + 1;
181: #endif
182: ps = panicps - 1;
183: }
184: while (ps >= yys) {
185: for (p = &yyact[ yypact[*ps+1] ] ; *p <= 0; p=+ 2)
186: if (*p == -256) {
187: panicps = ps;
188: yystate= p[1] & 07777;
189: yyOshifts = yyshifts;
190: yyshifts = 0;
191: paniced = 1;
192: goto stack;
193: }
194: --ps;
195: --yypv;
196: #ifdef PXP
197: --yypw;
198: #endif
199: #ifdef PI
200: if (OY.Yychar != YID)
201: syneflg++;
202: #endif
203: OY.Yychar = -1;
204: }
205: if (yychar == YEOF)
206: yyunexeof();
207: if (yystate == 1)
208: yyexeof();
209: yerror("Unrecoverable syntax error - QUIT");
210: return;
211: }
212: panic("yyparse");
213: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.