|
|
1.1 root 1: /*ident "@(#)ctrans:src/norm2.c 1.4" */
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 Rights 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:
22: #ifdef DBG
23: long node_id = 0;
24: #define DBCHECK() if(node::allocated) error('i',"allocated node (id %d, base%k) on free list! (src: \"%s\", %d",node::id,node::base,__FILE__,__LINE__);
25: #else
26: #define DBCHECK() /**/
27: #endif
28:
29: fct::fct(Ptype t, Pname arg, TOK known)
30: {
31: base = FCT;
32: nargs_known = known;
33: returns = t;
34: argtype = arg;
35: DBID();
36:
37: if (arg==0 || arg->base==ELIST) return;
38: //error('d',"fct::fct %d sig %d",this,f_signature);
39: register Pname n;
40: Pname pn = 0;
41: for (n=arg; n; pn=n,n=n->n_list) {
42: if( n->n_sto==EXTERN ) error("externA");
43: if( n->n_sto==STATIC ) error("static used forA%n",arg);
44:
45: switch (n->tp->base) {
46: case VOID:
47: argtype = 0;
48: nargs_known = 1;
49: if(n->n_initializer)
50: error("voidFA");
51: else if (n->string)
52: error("voidFA%n",n);
53: else if (nargs || n->n_list) {
54: error("voidFA");
55: nargs_known = 0;
56: }
57: nargs = 0;
58: break;
59: case CLASS:
60: case ENUM:
61: error("%k defined inAL (will not be in scope at point of call)",n->tp->base);
62: if (n == argtype)
63: argtype = n->n_list;
64: else
65: pn->n_list = n->n_list;
66: break;
67: default:
68: nargs++;
69: }
70: }
71: }
72:
73: expr::expr(TOK ba, Pexpr a, Pexpr b)
74: {
75: DBCHECK();
76:
77: base = ba;
78: e1 = a;
79: e2 = b;
80: DBID();
81: }
82:
83: stmt::stmt(TOK ba, loc ll, Pstmt a)
84: {
85: DBCHECK();
86:
87: base = ba;
88: where = ll;
89: s=a;
90: DBID();
91: }
92:
93: classdef::classdef(TOK b)
94: {
95: base = CLASS;
96: csu = b;
97: memtbl = new table(CTBLSIZE,0,0);
98: DBID();
99: }
100:
101: classdef::~classdef()
102: {
103: delete memtbl;
104: }
105:
106: basetype::basetype(TOK b, Pname n)
107: {
108: switch (b) {
109: case 0: break;
110: case TYPEDEF: b_typedef = 1; break;
111: case INLINE: b_inline = 1; break;
112: case VIRTUAL: b_virtual = 1; break;
113: case CONST: b_const = 1; break;
114: case UNSIGNED: b_unsigned = 1; break;
115: case FRIEND:
116: case OVERLOAD:
117: case EXTERN:
118: case STATIC:
119: case AUTO:
120: case REGISTER: b_sto = b; break;
121: case SHORT: b_short = 1; break;
122: case LONG: b_long = 1; break;
123: case ANY:
124: case ZTYPE:
125: case VOID:
126: case CHAR:
127: case INT:
128: case FLOAT:
129: case LDOUBLE:
130: case DOUBLE: base = b; break;
131: case TYPE:
132: case COBJ:
133: case EOBJ:
134: case FIELD:
135: case ASM:
136: base = b;
137: b_name = n;
138: break;
139: case SIGNED:
140: case VOLATILE:
141: error('w',"\"%k\" not implemented (ignored)",b);
142: break;
143: default:
144: error('i',"badBT:%k",b);
145: }
146: DBID();
147: }
148:
149: name::name(char* s) : expr(NAME,0,0)
150: {
151: // DBCHECK() called in expr::expr()
152: string = s;
153: where = curloc;
154: lex_level = bl_level;
155: }
156:
157: nlist::nlist(Pname n)
158: {
159: head = n;
160: for (Pname nn=n; nn->n_list; nn=nn->n_list);
161: tail = nn;
162: }
163:
164: void nlist::add_list(Pname n)
165: {
166: if (n->tp && (n->tp->defined & IN_ERROR)) return;
167:
168: tail->n_list = n;
169: for (Pname nn=n; nn->n_list; nn=nn->n_list);
170: tail = nn;
171: }
172:
173: Pname name_unlist(Pnlist l)
174: {
175: if (l == 0) return 0;
176: Pname n = l->head;
177:
178: delete l;
179: return n;
180: }
181:
182: Pstmt stmt_unlist(Pslist l)
183: {
184: if (l == 0) return 0;
185: Pstmt s = l->head;
186: // NFl++;
187:
188: delete l;
189: return s;
190: }
191:
192: Pexpr expr_unlist(Pelist l)
193: {
194: if (l == 0) return 0;
195: Pexpr e = l->head;
196: // NFl++;
197:
198: delete l;
199: return e;
200: }
201:
202: void sig_name(Pname n)
203: {
204: static char buf[256];
205: buf[0] = '_';
206: buf[1] = '_';
207: buf[2] = 'o';
208: buf[3] = 'p';
209: char* p = n->tp->signature(buf+4);
210: if (255 < p-buf) error('i',"sig_name():N buffer overflow");
211: char *s = new char [ p - buf + 1 ];
212: strcpy(s,buf);
213: n->string = s;
214: n->tp = 0;
215: }
216:
217: Ptype tok_to_type(TOK b)
218: {
219: Ptype t;
220: switch (b) {
221: case CHAR: t = char_type; break;
222: case SHORT: t = short_type; break;
223: case LONG: t = long_type; break;
224: case UNSIGNED: t = uint_type; break;
225: case FLOAT: t = float_type; break;
226: case DOUBLE: t = double_type; break;
227: case LDOUBLE: t = ldouble_type; break;
228: case VOID: t = void_type; break;
229: default: error("illegalK:%k",b);
230: case INT: t = int_type;
231: }
232: return t;
233: }
234:
235: Pbase defa_type;
236: Pbase moe_type;
237: Pexpr dummy;
238: Pexpr zero;
239:
240: Pclass ccl;
241: Plist modified_tn = 0;
242:
243: Plist local_tn = 0;
244: Plist local_blk = 0;
245: Plist local_class = 0;
246:
247: Plist nested_tn = 0;
248: Plist nested_type = 0;
249:
250: void memptrdcl(Pname bn, Pname tn, Ptype ft, Pname n)
251: {
252: Pptr p = new ptr(PTR,0);
253: p->memof = Pclass(Pbase(bn->tp)->b_name->tp);
254: Pbase b = new basetype(TYPE,tn);
255: PERM(p);
256: Pfct f = Pfct(ft);
257: Ptype t = n->tp;
258: if (t) {
259: p->typ = t;
260: ltlt:
261: switch (t->base) {
262: case PTR:
263: case RPTR:
264: case VEC:
265: if (Pptr(t)->typ == 0) {
266: Pptr(t)->typ = b;
267: break;
268: }
269: t = Pptr(t)->typ;
270: goto ltlt;
271: default:
272: error('s',"P toMFT too complicated");
273: }
274: }
275: else
276: p->typ = b;
277: f->returns = p;
278: n->tp = f;
279: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.