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