|
|
1.1 root 1: /* @(#)sno2.c 1.1 */
2: #include "sno.h"
3:
4: struct node *
5: compon()
6: {
7: register struct node *a, *b;
8: register int c;
9: static next;
10:
11: if (next == 0)
12: schar = sgetc();
13: else
14: next = 0;
15: if (schar == 0) {
16: (a=salloc())->typ = 0;
17: return (a);
18: }
19: switch (class (schar->ch)) {
20:
21: case 1:
22: schar->typ = 5;
23: return (schar);
24:
25: case 2:
26: schar->typ = 16;
27: return (schar);
28:
29: case 3:
30: a = schar;
31: for (;;) {
32: schar = sgetc();
33: if (schar == 0) {
34: a->typ = 0;
35: return (a);
36: }
37: if (class (schar->ch) != 3)
38: break;
39: sfree (schar);
40: }
41: next = 1;
42: a->typ = 7;
43: return (a);
44:
45: case 4:
46: schar->typ = 8;
47: return (schar);
48:
49: case 5:
50: schar->typ = 9;
51: return (schar);
52:
53: case 6:
54: a = schar;
55: schar = sgetc();
56: if (class (schar->ch) == 3)
57: a->typ = 10;
58: else
59: a->typ = 1;
60: next = 1;
61: return (a);
62:
63: case 7:
64: a = schar;
65: schar = sgetc();
66: if (class (schar->ch) == 3)
67: a->typ = 11;
68: else
69: a->typ = 2;
70: next = 1;
71: return (a);
72:
73: case 8:
74: schar->typ = 12;
75: return (schar);
76:
77: case 9:
78: c = schar->ch;
79: a = sgetc();
80: if (a == 0)
81: goto lerr;
82: b = schar;
83: if (a->ch == c) {
84: sfree (schar);
85: a->typ = 15;
86: a->p1 = 0;
87: return (a);
88: }
89: b->p1 = a;
90: for (;;) {
91: schar = sgetc();
92: if (schar == 0)
93: lerr:
94: writes ("illegal literal string");
95: if (schar->ch == c)
96: break;
97: a->p1 = schar;
98: a = schar;
99: }
100: b->p2 = a;
101: schar->typ = 15;
102: schar->p1 = b;
103: return (schar);
104:
105: case 10:
106: schar->typ = 3;
107: return (schar);
108:
109: case 11:
110: schar->typ = 4;
111: return (schar);
112:
113: }
114: b = salloc();
115: b->p1 = a = schar;
116: schar = sgetc();
117: while (schar!=0 && !class (schar->ch)) {
118: a->p1 = schar;
119: a = schar;
120: schar = sgetc();
121: }
122: b->p2 = a;
123: next = 1;
124: a = look (b);
125: delete (b);
126: b = salloc();
127: b->typ = 14;
128: b->p1 = a;
129: return (b);
130: }
131:
132: struct node *
133: nscomp()
134: {
135: register struct node *c;
136:
137: while ((c=compon())->typ == 7)
138: sfree (c);
139: return (c);
140: }
141:
142: struct node *
143: push (stack)
144: struct node *stack;
145: {
146: register struct node *a;
147:
148: (a=salloc())->p2 = stack;
149: return (a);
150: }
151:
152: struct node *
153: pop (stack)
154: struct node *stack;
155: {
156: register struct node *a, *s;
157:
158: s = stack;
159: if (s == 0)
160: writes ("pop");
161: a = s->p2;
162: sfree (s);
163: return (a);
164: }
165:
166: struct node *
167: expr (start, eof, e)
168: struct node *start, *e;
169: {
170: register struct node *stack, *list, *comp, *space;
171: int operand, op, op1;
172: struct node *a, *b, *c;
173: int d;
174:
175: list = salloc();
176: e->p2 = list;
177: stack = push ((struct node *) NULL);
178: stack->typ = eof;
179: operand = 0;
180: space = start;
181: l1:
182: if (space) {
183: comp = space;
184: space = 0;
185: } else
186: comp = compon();
187:
188: l3:
189: op = comp->typ;
190: switch (op) {
191:
192: case 7:
193: space = (struct node *) 1;
194: sfree (comp);
195: comp = compon();
196: goto l3;
197:
198: case 10:
199: if (space == 0) {
200: comp->typ = 1;
201: goto l3;
202: }
203:
204: case 11:
205: if (space == 0) {
206: comp->typ = 2;
207: goto l3;
208: }
209:
210: case 8:
211: case 9:
212: if (operand == 0)
213: writes ("no operand preceding operator");
214: operand = 0;
215: goto l5;
216:
217: case 14:
218: case 15:
219: if (operand == 0) {
220: operand = 1;
221: goto l5;
222: }
223: if (space == 0)
224: goto l7;
225: goto l4;
226:
227: case 12:
228: if (operand == 0)
229: goto l5;
230: if (space)
231: goto l4;
232: l7:
233: writes ("illegal juxtaposition of operands");
234:
235: case 16:
236: if (operand == 0)
237: goto l5;
238: if (space)
239: goto l4;
240: b = compon();
241: op = comp->typ = 13;
242: if (b->typ == 5) {
243: comp->p1 = 0;
244: goto l10;
245: }
246: comp->p1 = a = salloc();
247: b = expr (b, 6, a);
248: while ((d=b->typ) == 4) {
249: a->p1 = b;
250: a = b;
251: b = expr ((struct node *) NULL, 6, a);
252: }
253: if (d != 5)
254: writes ("error in function");
255: a->p1 = 0;
256: l10:
257: sfree (b);
258: goto l6;
259:
260: l4:
261: space = comp;
262: op = 7;
263: operand = 0;
264: goto l6;
265: }
266: if (operand==0)
267: writes ("no operand at end of expression");
268: l5:
269: space = 0;
270: l6:
271: op1 = stack->typ;
272: if (op > op1) {
273: stack = push (stack);
274: if (op == 16)
275: op = 6;
276: stack->typ = op;
277: stack->p1 = comp;
278: goto l1;
279: }
280: c = stack->p1;
281: stack = pop (stack);
282: if (stack == 0) {
283: list->typ = 0;
284: return (comp);
285: }
286: if (op1 == 6) {
287: if (op != 5)
288: writes ("too many ('s");
289: goto l1;
290: }
291: if (op1 == 7)
292: c = salloc();
293: list->typ = op1;
294: list->p2 = c->p1;
295: list->p1 = c;
296: list = c;
297: goto l6;
298: }
299:
300: struct node *
301: match (start, m)
302: struct node *start, *m;
303: {
304: register struct node *list, *comp, *term;
305: struct node *a;
306: int b, bal;
307:
308: term = NULL;
309: bal = 0;
310: list = salloc();
311: m->p2 = list;
312: comp = start;
313: if (!comp)
314: comp = compon();
315: goto l2;
316:
317: l3:
318: list->p1 = a = salloc();
319: list = a;
320: l2:
321: switch (comp->typ) {
322: case 7:
323: sfree (comp);
324: comp = compon();
325: goto l2;
326:
327: case 12:
328: case 14:
329: case 15:
330: case 16:
331: term = 0;
332: comp = expr (comp, 6, list);
333: list->typ = 1;
334: goto l3;
335:
336: case 1:
337: sfree (comp);
338: comp = compon();
339: bal = 0;
340: if (comp->typ == 16) {
341: bal = 1;
342: sfree (comp);
343: comp = compon();
344: }
345: a = salloc();
346: b = comp->typ;
347: if (b == 2 || b == 5 || b == 10 || b == 1)
348: a->p1 = 0;
349: else {
350: comp = expr (comp, 11, a);
351: a->p1 = a->p2;
352: }
353: if (comp->typ != 2) {
354: a->p2 = 0;
355: } else {
356: sfree (comp);
357: comp = expr ((struct node *) NULL, 6, a);
358: }
359: if (bal) {
360: if (comp->typ != 5)
361: goto merr;
362: sfree (comp);
363: comp = compon();
364: }
365: b = comp->typ;
366: if (b != 1 && b != 10)
367: goto merr;
368: list->p2 = a;
369: list->typ = 2;
370: a->typ = bal;
371: sfree (comp);
372: comp = compon();
373: if (bal)
374: term = 0; else
375: term = list;
376: goto l3;
377: }
378: if (term)
379: term->typ = 3;
380: list->typ = 0;
381: return (comp);
382:
383: merr:
384: writes ("unrecognized component in match");
385: return (NULL);
386: }
387:
388: struct node *
389: compile()
390: {
391: register struct node *b, *comp;
392: struct node *m, *r, *l, *xs, *xf, *g, *as;
393: struct node *aa;
394: register int a;
395: int t;
396:
397: as = m = l = xs = xf = 0;
398: t = 0;
399: comp = compon();
400: a = comp->typ;
401: if (a == 14) {
402: l = comp->p1;
403: sfree (comp);
404: comp = compon();
405: a = comp->typ;
406: }
407: if (a != 7)
408: writes ("no space beginning statement");
409: sfree (comp);
410: if (l == lookdef)
411: goto def;
412: comp = expr ((struct node *) NULL, 11, r=salloc());
413: a = comp->typ;
414: if (a == 0)
415: goto asmble;
416: if (a == 2)
417: goto xfer;
418: if (a == 3)
419: goto assig;
420: m = salloc();
421: comp = match (comp, m);
422: a = comp->typ;
423: if (a == 0)
424: goto asmble;
425: if (a == 2)
426: goto xfer;
427: if (a == 3)
428: goto assig;
429: writes ("unrecognized component in match");
430:
431: assig:
432: sfree (comp);
433: comp = expr ((struct node *) NULL, 6, as=salloc());
434: a = comp->typ;
435: if (a == 0)
436: goto asmble;
437: if (a == 2)
438: goto xfer;
439: writes ("unrecognized component in assignment");
440:
441: xfer:
442: sfree (comp);
443: comp = compon();
444: a = comp->typ;
445: if (a == 16)
446: goto xboth;
447: if (a == 0) {
448: if (xs!=0 || xf!=0)
449: goto asmble;
450: goto xerr;
451: }
452: if (a != 14)
453: goto xerr;
454: b = comp->p1;
455: sfree (comp);
456: if (b == looks)
457: goto xsuc;
458: if (b == lookf)
459: goto xfail;
460:
461: xerr:
462: writes ("unrecognized component in goto");
463:
464: xboth:
465: sfree (comp);
466: xs = salloc();
467: xf = salloc();
468: comp = expr ((struct node *) NULL, 6, xs);
469: if (comp->typ != 5)
470: goto xerr;
471: xf->p2 = xs->p2;
472: comp = compon();
473: if (comp->typ != 0)
474: goto xerr;
475: goto asmble;
476:
477: xsuc:
478: if (xs)
479: goto xerr;
480: comp = compon();
481: if (comp->typ != 16)
482: goto xerr;
483: comp = expr ((struct node *) NULL, 6, xs=salloc());
484: if (comp->typ != 5)
485: goto xerr;
486: goto xfer;
487:
488: xfail:
489: if (xf)
490: goto xerr;
491: comp = compon();
492: if (comp->typ != 16)
493: goto xerr;
494: comp = expr ((struct node *) NULL, 6, xf=salloc());
495: if (comp->typ != 5)
496: goto xerr;
497: goto xfer;
498:
499: asmble:
500: if (l) {
501: if (l->typ)
502: writes ("name doubly defined");
503: l->p2 = comp;
504: l->typ = 2; /* type label;*/
505: }
506: comp->p2 = r;
507: if (m) {
508: t++;
509: r->p1 = m;
510: r = m;
511: }
512: if (as) {
513: t += 2;
514: r->p1 = as;
515: r = as;
516: }
517: (g=salloc())->p1 = 0;
518: if (xs) {
519: g->p1 = xs->p2;
520: sfree (xs);
521: }
522: g->p2 = 0;
523: if (xf) {
524: g->p2 = xf->p2;
525: sfree (xf);
526: }
527: r->p1 = g;
528: comp->typ = t;
529: comp->ch = lc;
530: return (comp);
531:
532: def:
533: r = nscomp();
534: if (r->typ != 14)
535: goto derr;
536: l = r->p1;
537: if (l->typ)
538: writes ("name doubly defined");
539: l->typ = 5; /*type function;*/
540: aa = r;
541: l->p2 = aa;
542: r = nscomp();
543: l = r;
544: aa->p1 = l;
545: if (r->typ == 0)
546: goto d4;
547: if (r->typ != 16)
548: goto derr;
549:
550: d2:
551: r = nscomp();
552: if (r->typ != 14)
553: goto derr;
554: aa->p2 = r;
555: r->typ = 0;
556: aa = r;
557: r = nscomp();
558: if (r->typ == 4) {
559: sfree (r);
560: goto d2;
561: }
562: if (r->typ != 5)
563: goto derr;
564: sfree (r);
565: if ((r=compon())->typ != 0)
566: goto derr;
567: sfree (r);
568:
569: d4:
570: r = compile();
571: aa->p2 = 0;
572: l->p1 = r;
573: l->p2 = 0;
574: return (r);
575:
576: derr:
577: writes ("illegal component in define");
578: return (NULL);
579: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.