|
|
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: #include "whoami" ! 11: #include "0.h" ! 12: #include "tree.h" ! 13: ! 14: /* ! 15: * Type declaration part ! 16: */ ! 17: typebeg() ! 18: { ! 19: ! 20: #ifndef PI1 ! 21: if (parts & VPRT) ! 22: error("Type declarations must precede var declarations"); ! 23: if (parts & TPRT) ! 24: error("All types must be declared in one type part"); ! 25: parts |= TPRT; ! 26: #endif ! 27: /* ! 28: * Forechain is the head of a list of types that ! 29: * might be self referential. We chain them up and ! 30: * process them later. ! 31: */ ! 32: forechain = NIL; ! 33: #ifdef PI0 ! 34: send(REVTBEG); ! 35: #endif ! 36: } ! 37: ! 38: type(tline, tid, tdecl) ! 39: int tline; ! 40: char *tid; ! 41: register int *tdecl; ! 42: { ! 43: register struct nl *np; ! 44: ! 45: np = gtype(tdecl); ! 46: line = tline; ! 47: if (np != NIL && (tdecl[0] == T_ID || tdecl[0] == T_TYID)) ! 48: np = nlcopy(np); ! 49: #ifndef PI0 ! 50: enter(defnl(tid, TYPE, np, 0))->nl_flags |= NMOD; ! 51: #else ! 52: enter(defnl(tid, TYPE, np, 0)); ! 53: send(REVTYPE, tline, tid, tdecl); ! 54: #endif ! 55: # ifdef PTREE ! 56: { ! 57: pPointer Type = TypeDecl( tid , tdecl ); ! 58: pPointer *Types; ! 59: ! 60: pSeize( PorFHeader[ nesting ] ); ! 61: Types = &( pDEF( PorFHeader[ nesting ] ).PorFTypes ); ! 62: *Types = ListAppend( *Types , Type ); ! 63: pRelease( PorFHeader[ nesting ] ); ! 64: } ! 65: # endif ! 66: } ! 67: ! 68: typeend() ! 69: { ! 70: ! 71: #ifdef PI0 ! 72: send(REVTEND); ! 73: #endif ! 74: foredecl(); ! 75: } ! 76: ! 77: /* ! 78: * Return a type pointer (into the namelist) ! 79: * from a parse tree for a type, building ! 80: * namelist entries as needed. ! 81: */ ! 82: struct nl * ! 83: gtype(r) ! 84: register int *r; ! 85: { ! 86: register struct nl *np; ! 87: register char *cp; ! 88: int oline; ! 89: ! 90: if (r == NIL) ! 91: return (NIL); ! 92: oline = line; ! 93: if (r[0] != T_ID) ! 94: oline = line = r[1]; ! 95: switch (r[0]) { ! 96: default: ! 97: panic("type"); ! 98: case T_TYID: ! 99: r++; ! 100: case T_ID: ! 101: np = lookup(r[1]); ! 102: if (np == NIL) ! 103: break; ! 104: if (np->class != TYPE) { ! 105: #ifndef PI1 ! 106: error("%s is a %s, not a type as required", r[1], classes[np->class]); ! 107: #endif ! 108: np = NIL; ! 109: break; ! 110: } ! 111: np = np->type; ! 112: break; ! 113: case T_TYSCAL: ! 114: np = tyscal(r); ! 115: break; ! 116: case T_TYRANG: ! 117: np = tyrang(r); ! 118: break; ! 119: case T_TYPTR: ! 120: np = defnl(0, PTR, 0, 0 ); ! 121: np -> ptr[0] = r[2]; ! 122: np->nl_next = forechain; ! 123: forechain = np; ! 124: break; ! 125: case T_TYPACK: ! 126: np = gtype(r[2]); ! 127: break; ! 128: case T_TYARY: ! 129: np = tyary(r); ! 130: break; ! 131: case T_TYREC: ! 132: np = tyrec(r[2], 0); ! 133: # ifdef PTREE ! 134: /* ! 135: * mung T_TYREC[3] to point to the record ! 136: * for RecTCopy ! 137: */ ! 138: r[3] = np; ! 139: # endif ! 140: break; ! 141: case T_TYFILE: ! 142: np = gtype(r[2]); ! 143: if (np == NIL) ! 144: break; ! 145: #ifndef PI1 ! 146: if (np->nl_flags & NFILES) ! 147: error("Files cannot be members of files"); ! 148: #endif ! 149: np = defnl(0, FILET, np, 0); ! 150: np->nl_flags |= NFILES; ! 151: break; ! 152: case T_TYSET: ! 153: np = gtype(r[2]); ! 154: if (np == NIL) ! 155: break; ! 156: if (np->type == nl+TDOUBLE) { ! 157: #ifndef PI1 ! 158: error("Set of real is not allowed"); ! 159: #endif ! 160: np = NIL; ! 161: break; ! 162: } ! 163: if (np->class != RANGE && np->class != SCAL) { ! 164: #ifndef PI1 ! 165: error("Set type must be range or scalar, not %s", nameof(np)); ! 166: #endif ! 167: np = NIL; ! 168: break; ! 169: } ! 170: #ifndef PI1 ! 171: if (width(np) > 2) ! 172: error("Implementation restriction: sets must be indexed by 16 bit quantities"); ! 173: #endif ! 174: np = defnl(0, SET, np, 0); ! 175: break; ! 176: } ! 177: line = oline; ! 178: return (np); ! 179: } ! 180: ! 181: /* ! 182: * Scalar (enumerated) types ! 183: */ ! 184: tyscal(r) ! 185: int *r; ! 186: { ! 187: register struct nl *np, *op; ! 188: register *v; ! 189: int i; ! 190: ! 191: np = defnl(0, SCAL, 0, 0); ! 192: np->type = np; ! 193: v = r[2]; ! 194: if (v == NIL) ! 195: return (NIL); ! 196: i = -1; ! 197: for (; v != NIL; v = v[2]) { ! 198: op = enter(defnl(v[1], CONST, np, ++i)); ! 199: #ifndef PI0 ! 200: op->nl_flags |= NMOD; ! 201: #endif ! 202: op->value[1] = i; ! 203: } ! 204: np->range[1] = i; ! 205: return (np); ! 206: } ! 207: ! 208: /* ! 209: * Declare a subrange. ! 210: */ ! 211: tyrang(r) ! 212: register int *r; ! 213: { ! 214: register struct nl *lp, *hp; ! 215: double high; ! 216: int c, c1; ! 217: ! 218: gconst(r[3]); ! 219: hp = con.ctype; ! 220: high = con.crval; ! 221: gconst(r[2]); ! 222: lp = con.ctype; ! 223: if (lp == NIL || hp == NIL) ! 224: return (NIL); ! 225: if (norange(lp) || norange(hp)) ! 226: return (NIL); ! 227: c = classify(lp); ! 228: c1 = classify(hp); ! 229: if (c != c1) { ! 230: #ifndef PI1 ! 231: error("Can't mix %ss and %ss in subranges", nameof(lp), nameof(hp)); ! 232: #endif ! 233: return (NIL); ! 234: } ! 235: if (c == TSCAL && scalar(lp) != scalar(hp)) { ! 236: #ifndef PI1 ! 237: error("Scalar types must be identical in subranges"); ! 238: #endif ! 239: return (NIL); ! 240: } ! 241: if (con.crval > high) { ! 242: #ifndef PI1 ! 243: error("Range lower bound exceeds upper bound"); ! 244: #endif ! 245: return (NIL); ! 246: } ! 247: lp = defnl(0, RANGE, hp->type, 0); ! 248: lp->range[0] = con.crval; ! 249: lp->range[1] = high; ! 250: return (lp); ! 251: } ! 252: ! 253: norange(p) ! 254: register struct nl *p; ! 255: { ! 256: if (isa(p, "d")) { ! 257: #ifndef PI1 ! 258: error("Subrange of real is not allowed"); ! 259: #endif ! 260: return (1); ! 261: } ! 262: if (isnta(p, "bcsi")) { ! 263: #ifndef PI1 ! 264: error("Subrange bounds must be Boolean, character, integer or scalar, not %s", nameof(p)); ! 265: #endif ! 266: return (1); ! 267: } ! 268: return (0); ! 269: } ! 270: ! 271: /* ! 272: * Declare arrays and chain together the dimension specification ! 273: */ ! 274: struct nl * ! 275: tyary(r) ! 276: int *r; ! 277: { ! 278: struct nl *np; ! 279: register *tl; ! 280: register struct nl *tp, *ltp; ! 281: int i; ! 282: ! 283: tp = gtype(r[3]); ! 284: if (tp == NIL) ! 285: return (NIL); ! 286: np = defnl(0, ARRAY, tp, 0); ! 287: np->nl_flags |= (tp->nl_flags) & NFILES; ! 288: ltp = np; ! 289: i = 0; ! 290: for (tl = r[2]; tl != NIL; tl = tl[2]) { ! 291: tp = gtype(tl[1]); ! 292: if (tp == NIL) { ! 293: np = NIL; ! 294: continue; ! 295: } ! 296: if (tp->class == RANGE && tp->type == nl+TDOUBLE) { ! 297: #ifndef PI1 ! 298: error("Index type for arrays cannot be real"); ! 299: #endif ! 300: np = NIL; ! 301: continue; ! 302: } ! 303: if (tp->class != RANGE && tp->class != SCAL) { ! 304: #ifndef PI1 ! 305: error("Array index type is a %s, not a range or scalar as required", classes[tp->class]); ! 306: #endif ! 307: np = NIL; ! 308: continue; ! 309: } ! 310: if (tp->class == RANGE && bytes(tp->range[0], tp->range[1]) > 2) { ! 311: #ifndef PI1 ! 312: error("Value of dimension specifier too large or small for this implementation"); ! 313: #endif ! 314: continue; ! 315: } ! 316: tp = nlcopy(tp); ! 317: i++; ! 318: ltp->chain = tp; ! 319: ltp = tp; ! 320: } ! 321: if (np != NIL) ! 322: np->value[0] = i; ! 323: return (np); ! 324: } ! 325: ! 326: /* ! 327: * Delayed processing for pointers to ! 328: * allow self-referential and mutually ! 329: * recursive pointer constructs. ! 330: */ ! 331: foredecl() ! 332: { ! 333: register struct nl *p, *q; ! 334: ! 335: for (p = forechain; p != NIL; p = p->nl_next) { ! 336: if (p->class == PTR && p -> ptr[0] != 0) ! 337: { ! 338: p->type = gtype(p -> ptr[0]); ! 339: #ifndef PI1 ! 340: if (p->type != NIL && ( ( p->type )->nl_flags & NFILES)) ! 341: error("Files cannot be members of dynamic structures"); ! 342: #endif ! 343: # ifdef PTREE ! 344: { ! 345: if ( pUSE( p -> inTree ).PtrTType == pNIL ) { ! 346: pPointer PtrTo = tCopy( p -> ptr[0] ); ! 347: ! 348: pDEF( p -> inTree ).PtrTType = PtrTo; ! 349: } ! 350: } ! 351: # endif ! 352: p -> ptr[0] = 0; ! 353: } ! 354: } ! 355: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.