|
|
1.1 ! root 1: /*ident "@(#)ctrans:src/norm2.c 1.1.5.6" */ ! 2: /************************************************************************ ! 3: ! 4: C++ source for cfront, the C++ compiler front-end ! 5: written in the computer science research center of Bell Labs ! 6: ! 7: Copyright (c) 1984 AT&T, Inc. All rigths Reserved ! 8: THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T, INC. ! 9: ! 10: norm2.c: ! 11: ! 12: "normalization" handles problems which could have been handled ! 13: by the syntax analyser; but has not been done. The idea is ! 14: to simplify the grammar and the actions associated with it, ! 15: and to get a more robust error handling ! 16: ! 17: ****************************************************************************/ ! 18: ! 19: #include "cfront.h" ! 20: #include "size.h" ! 21: const NBITE = (CHUNK-8)/sizeof(name)-1; ! 22: const EBITE = (CHUNK-8)/sizeof(expr)-1; ! 23: const SBITE = (CHUNK-8)/sizeof(stmt)-1; ! 24: ! 25: fct::fct(Ptype t, Pname arg, TOK known) ! 26: { ! 27: base = FCT; ! 28: nargs_known = known; ! 29: returns = t; ! 30: argtype = arg; ! 31: ! 32: if (arg==0 || arg->base==ELIST) return; ! 33: //error('d',"fct::fct %d sig %d",this,f_signature); ! 34: register Pname n; ! 35: Pname pn = 0; ! 36: for (n=arg; n; pn=n,n=n->n_list) { ! 37: switch (n->tp->base) { ! 38: case VOID: ! 39: argtype = 0; ! 40: nargs_known = 1; ! 41: if (n->string) ! 42: error("voidFA%n",n); ! 43: else if (nargs || n->n_list) { ! 44: error("voidFA"); ! 45: nargs_known = 0; ! 46: } ! 47: nargs = 0; ! 48: break; ! 49: case CLASS: ! 50: case ENUM: ! 51: error("%k defined inAL (will not be in scope at point of call)",n->tp->base); ! 52: if (n == argtype) ! 53: argtype = n->n_list; ! 54: else ! 55: pn->n_list = n->n_list; ! 56: break; ! 57: default: ! 58: nargs++; ! 59: } ! 60: } ! 61: } ! 62: ! 63: expr::expr(TOK ba, Pexpr a, Pexpr b) ! 64: { ! 65: base = ba; ! 66: e1 = a; ! 67: e2 = b; ! 68: } ! 69: ! 70: ! 71: stmt::stmt(TOK ba, loc ll, Pstmt a) ! 72: { ! 73: // Ns++; ! 74: base = ba; ! 75: where = ll; ! 76: s=a; ! 77: } ! 78: ! 79: classdef::classdef(TOK b) ! 80: { ! 81: base = CLASS; ! 82: csu = b; ! 83: memtbl = new table(CTBLSIZE,0,0); ! 84: } ! 85: ! 86: basetype::basetype(TOK b, Pname n) ! 87: { ! 88: // Nbt++; ! 89: switch (b) { ! 90: case 0: break; ! 91: case TYPEDEF: b_typedef = 1; break; ! 92: case INLINE: b_inline = 1; break; ! 93: case VIRTUAL: b_virtual = 1; break; ! 94: case CONST: b_const = 1; break; ! 95: case UNSIGNED: b_unsigned = 1; break; ! 96: case FRIEND: ! 97: case OVERLOAD: ! 98: case EXTERN: ! 99: case STATIC: ! 100: case AUTO: ! 101: case REGISTER: b_sto = b; break; ! 102: case SHORT: b_short = 1; break; ! 103: case LONG: b_long = 1; break; ! 104: case ANY: ! 105: case ZTYPE: ! 106: case VOID: ! 107: case CHAR: ! 108: case INT: ! 109: case FLOAT: ! 110: case LDOUBLE: ! 111: case DOUBLE: base = b; break; ! 112: case TYPE: ! 113: case COBJ: ! 114: case EOBJ: ! 115: case FIELD: ! 116: case ASM: ! 117: base = b; ! 118: b_name = n; ! 119: break; ! 120: case SIGNED: ! 121: case VOLATILE: ! 122: error('w',"\"%k\" not implemented (ignored)",b); ! 123: break; ! 124: default: ! 125: error('i',"badBT:%k",b); ! 126: } ! 127: } ! 128: ! 129: name::name(char* s) : (NAME,0,0) ! 130: { ! 131: string = s; ! 132: where = curloc; ! 133: lex_level = bl_level; ! 134: ! 135: } ! 136: ! 137: nlist::nlist(Pname n) ! 138: { ! 139: head = n; ! 140: for (Pname nn=n; nn->n_list; nn=nn->n_list); ! 141: tail = nn; ! 142: } ! 143: ! 144: void nlist::add_list(Pname n) ! 145: { ! 146: if (n->tp && (n->tp->defined & IN_ERROR)) return; ! 147: ! 148: tail->n_list = n; ! 149: for (Pname nn=n; nn->n_list; nn=nn->n_list); ! 150: tail = nn; ! 151: } ! 152: ! 153: Pname name_unlist(Pnlist l) ! 154: { ! 155: if (l == 0) return 0; ! 156: Pname n = l->head; ! 157: ! 158: delete l; ! 159: return n; ! 160: } ! 161: ! 162: Pstmt stmt_unlist(Pslist l) ! 163: { ! 164: if (l == 0) return 0; ! 165: Pstmt s = l->head; ! 166: // NFl++; ! 167: ! 168: delete l; ! 169: return s; ! 170: } ! 171: ! 172: Pexpr expr_unlist(Pelist l) ! 173: { ! 174: if (l == 0) return 0; ! 175: Pexpr e = l->head; ! 176: // NFl++; ! 177: ! 178: delete l; ! 179: return e; ! 180: } ! 181: ! 182: void sig_name(Pname n) ! 183: { ! 184: static char buf[256]; ! 185: buf[0] = '_'; ! 186: buf[1] = '_'; ! 187: buf[2] = 'o'; ! 188: buf[3] = 'p'; ! 189: char* p = n->tp->signature(buf+4); ! 190: if (255 < p-buf) error('i',"sig_name():N buffer overflow"); ! 191: n->string = buf; ! 192: n->tp = 0; ! 193: } ! 194: ! 195: Ptype tok_to_type(TOK b) ! 196: { ! 197: Ptype t; ! 198: switch (b) { ! 199: case CHAR: t = char_type; break; ! 200: case SHORT: t = short_type; break; ! 201: case LONG: t = long_type; break; ! 202: case UNSIGNED: t = uint_type; break; ! 203: case FLOAT: t = float_type; break; ! 204: case DOUBLE: t = double_type; break; ! 205: case LDOUBLE: t = ldouble_type; break; ! 206: case VOID: t = void_type; break; ! 207: default: error("illegalK:%k",b); ! 208: case INT: t = int_type; ! 209: } ! 210: return t; ! 211: } ! 212: ! 213: Pbase defa_type; ! 214: Pbase moe_type; ! 215: Pexpr dummy; ! 216: Pexpr zero; ! 217: ! 218: Pclass ccl; ! 219: Plist modified_tn = 0; ! 220: ! 221: // local class ! 222: Plist local_tn = 0; ! 223: Plist local_blk = 0; ! 224: Plist local_class = 0; ! 225: ! 226: static name sta_name_dummy; ! 227: Pname sta_name = &sta_name_dummy; ! 228: ! 229: TOK back; ! 230: ! 231: void memptrdcl(Pname bn, Pname tn, Ptype ft, Pname n) ! 232: { ! 233: Pptr p = new ptr(PTR,0); ! 234: p->memof = Pclass(Pbase(bn->tp)->b_name->tp); ! 235: Pbase b = new basetype(TYPE,tn); ! 236: PERM(p); ! 237: Pfct f = Pfct(ft); ! 238: Ptype t = n->tp; ! 239: if (t) { ! 240: p->typ = t; ! 241: ltlt: ! 242: switch (t->base) { ! 243: case PTR: ! 244: case RPTR: ! 245: case VEC: ! 246: if (Pptr(t)->typ == 0) { ! 247: Pptr(t)->typ = b; ! 248: break; ! 249: } ! 250: t = Pptr(t)->typ; ! 251: goto ltlt; ! 252: default: ! 253: error('s',"P toMFT too complicated"); ! 254: } ! 255: } ! 256: else ! 257: p->typ = b; ! 258: f->returns = p; ! 259: n->tp = f; ! 260: } ! 261: /* ODI notes - ! 262: ! 263: remove constructors that have been replaces by new and delete ! 264: operators ! 265: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.