|
|
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.2 November 1978
8: *
9: *
10: * pxp - Pascal execution profiler
11: *
12: * Bill Joy UCB
13: * Version 1.2 November 1978
14: */
15:
16: #include "whoami"
17: #include "0.h"
18: #include "yy.h"
19:
20: /*
21: * Scanner
22: */
23: int yylacnt;
24:
25: #define YYLASIZ 10
26:
27: struct yytok Yla[YYLASIZ];
28:
29: unyylex(y)
30: struct yylex *y;
31: {
32:
33: if (yylacnt == YYLASIZ)
34: panic("unyylex");
35: copy(&Yla[yylacnt], y, sizeof Yla[0]);
36: yylacnt++;
37:
38: }
39:
40: yylex()
41: {
42: register c;
43: register **ip;
44: register char *cp;
45: int f;
46: char delim;
47:
48: if (yylacnt != 0) {
49: yylacnt--;
50: copy(&Y, &Yla[yylacnt], sizeof Y);
51: return (yychar);
52: }
53: if (c = yysavc)
54: yysavc = 0;
55: else
56: c = readch();
57: #ifdef PXP
58: yytokcnt++;
59: #endif
60:
61: next:
62: /*
63: * skip white space
64: */
65: #ifdef PXP
66: yywhcnt = 0;
67: #endif
68: while (c == ' ' || c == '\t') {
69: #ifdef PXP
70: if (c == '\t')
71: yywhcnt++;
72: yywhcnt++;
73: #endif
74: c = readch();
75: }
76: yyecol = yycol;
77: yyeline = yyline;
78: yyefile = filename;
79: yyeseqid = yyseqid;
80: yyseekp = yylinpt;
81: cp = token;
82: yylval = yyline;
83: switch (c) {
84: case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
85: case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':
86: case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u':
87: case 'v': case 'w': case 'x': case 'y': case 'z':
88: case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G':
89: case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N':
90: case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U':
91: case 'V': case 'W': case 'X': case 'Y': case 'Z':
92: do {
93: *cp++ = c;
94: c = readch();
95: } while (alph(c) || digit(c));
96: *cp = 0;
97: if (opt('s'))
98: for (cp = token; *cp; cp++)
99: if (*cp >= 'A' && *cp <= 'Z') {
100: *cp =| ' ';
101: }
102: yysavc = c;
103: ip = hash(0, 1);
104: if (*ip < yykey || *ip >= lastkey) {
105: yylval = *ip;
106: return (YID);
107: }
108: yylval = yyline;
109: /*
110: * For keywords
111: * the lexical token
112: * is magically retrieved
113: * from the keyword table.
114: */
115: return ((*ip)[1]);
116: case '0': case '1': case '2': case '3': case '4':
117: case '5': case '6': case '7': case '8': case '9':
118: f = 0;
119: do {
120: *cp++ = c;
121: c = readch();
122: } while (digit(c));
123: if (c == 'b' || c == 'B') {
124: /*
125: * nonstandard - octal constants
126: */
127: if (opt('s')) {
128: standard();
129: yerror("Octal constants are non-standard");
130: }
131: *cp = 0;
132: yylval = copystr(token);
133: return (YBINT);
134: }
135: if (c == '.') {
136: c = readch();
137: if (c == '.') {
138: *cp = 0;
139: yysavc = YDOTDOT;
140: yylval = copystr(token);
141: return (YINT);
142: }
143: infpnumb:
144: f++;
145: *cp++ = '.';
146: if (!digit(c)) {
147: yyset();
148: recovered();
149: yerror("Digits required after decimal point");
150: *cp++ = '0';
151: } else
152: while (digit(c)) {
153: *cp++ = c;
154: c = readch();
155: }
156: }
157: if (c == 'e' || c == 'E') {
158: f++;
159: *cp++ = c;
160: if ((c = yysavc) == 0)
161: c = readch();
162: if (c == '+' || c == '-') {
163: *cp++ = c;
164: c = readch();
165: }
166: if (!digit(c)) {
167: yyset();
168: yerror("Digits required in exponent");
169: *cp++ = '0';
170: } else
171: while (digit(c)) {
172: *cp++ = c;
173: c = readch();
174: }
175: }
176: *cp = 0;
177: yysavc = c;
178: yylval = copystr(token);
179: if (f)
180: return (YNUMB);
181: return (YINT);
182: case '"':
183: case '`':
184: if (!any(bufp + 1, c))
185: goto illch;
186: if (!dquote) {
187: recovered();
188: dquote++;
189: yerror("Character/string delimiter is '");
190: }
191: case '\'':
192: case '#':
193: delim = c;
194: do {
195: do {
196: c = readch();
197: if (c == '\n') {
198: yerror("Unmatched %c for string", delim);
199: if (cp == token)
200: *cp++ = ' ', cp++;
201: break;
202: }
203: *cp++ = c;
204: } while (c != delim);
205: c = readch();
206: } while (c == delim);
207: *--cp = 0;
208: if (cp == token) {
209: yerror("Null string not allowed");
210: *cp++ = ' ';
211: *cp++ = 0;
212: }
213: yysavc = c;
214: yylval = copystr(token);
215: return (YSTRING);
216: case '.':
217: c = readch();
218: if (c == '.')
219: return (YDOTDOT);
220: if (digit(c)) {
221: recovered();
222: yerror("Digits required before decimal point");
223: *cp++ = '0';
224: goto infpnumb;
225: }
226: yysavc = c;
227: return ('.');
228: case '{':
229: /*
230: * { ... } comment
231: */
232: #ifdef PXP
233: getcm(c);
234: #endif
235: #ifdef PI
236: c = options();
237: while (c != '}') {
238: if (c <= 0)
239: goto nonterm;
240: if (c == '{') {
241: warning();
242: yyset();
243: yerror("{ in a { ... } comment");
244: }
245: c = readch();
246: }
247: #endif
248: c = readch();
249: goto next;
250: case '(':
251: if ((c = readch()) == '*') {
252: /*
253: * (* ... *) comment
254: */
255: #ifdef PXP
256: getcm(c);
257: c = readch();
258: goto next;
259: #endif
260: #ifdef PI
261: c = options();
262: for (;;) {
263: if (c < 0) {
264: nonterm:
265: yerror("Comment does not terminate - QUIT");
266: pexit(ERRS);
267: }
268: if (c == '(' && (c = readch()) == '*') {
269: warning();
270: yyset();
271: yerror("(* in a (* ... *) comment");
272: }
273: if (c == '*') {
274: if ((c = readch()) != ')')
275: continue;
276: c = readch();
277: goto next;
278: }
279: c = readch();
280: }
281: #endif
282: }
283: yysavc = c;
284: c = '(';
285: case ';':
286: case ',':
287: case ':':
288: case '=':
289: case '*':
290: case '+':
291: case '/':
292: case '-':
293: case '|':
294: case '&':
295: case ')':
296: case '[':
297: case ']':
298: case '<':
299: case '>':
300: case '~':
301: case '^':
302: return (c);
303: default:
304: switch (c) {
305: case YDOTDOT:
306: return (c);
307: case '\n':
308: c = readch();
309: #ifdef PXP
310: yytokcnt++;
311: #endif
312: goto next;
313: case '\f':
314: c = readch();
315: goto next;
316: }
317: if (c <= 0)
318: return (YEOF);
319: illch:
320: do
321: yysavc = readch();
322: while (yysavc == c);
323: yylval = c;
324: return (YILLCH);
325: }
326: }
327:
328: yyset()
329: {
330:
331: yyecol = yycol;
332: yyeline = yyline;
333: yyefile = filename;
334: yyseekp = yylinpt;
335: }
336:
337: /*
338: * Setuflg trims the current
339: * input line to at most 72 chars
340: * for the u option.
341: */
342: setuflg()
343: {
344:
345: if (charbuf[71] != '\n') {
346: charbuf[72] = '\n';
347: charbuf[73] = 0;
348: }
349: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.