|
|
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.