|
|
1.1 root 1: /*ident "@(#)ctrans:src/cfront.h 1.12" */
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: When reading cfront code please remember that C++ was not available
11: when it was originally written. Out of necessity cfront is written
12: in a style that takes advantage of only few of C++'s features.
13:
14: WARNING: This program relies on non-initialized class members being ZERO.
15: This will be true as long as they are allocated using the "new" operator
16: from alloc.c
17:
18: cfront.h:
19:
20: Here is all the class definitions for cfront, and most of the externs
21:
22: ***********************************************************************/
23:
24: #ifndef _CFRONT_H
25: #define _CFRONT_H
26:
27: #include "token.h"
28: #include "typedef.h"
29:
30: #ifndef GRAM
31: extern char* prog_name; // compiler name and version
32: extern int inline_restr; // inline expansion restrictions
33: #endif
34:
35: extern TOK tlex();
36: extern Pname syn();
37:
38: extern void ext(int);
39:
40: extern char* make_name(TOK);
41: extern void make_dummy();
42: extern Pname dummy_fct;
43: extern Pname really_dominate(Pname, Pname, bit);
44: extern int exact1(Pname, Ptype);
45:
46: extern int friend_check(Pclass start,Pclass stop, Pfct f);
47:
48: struct loc // a source file location
49: {
50: short file; // index into file_name[], or zero
51: short line;
52: #ifndef GRAM
53: void put(FILE*);
54: void putline();
55: #endif
56: };
57:
58: extern Loc curloc;
59: extern int curr_file;
60: extern char* src_file_name;
61: extern loc noloc; // dummy null location
62: extern bit binary_val;
63: extern bit stmtno;
64:
65: struct ea { // fudge portable printf-like formatting for error()
66: union {
67: void* p;
68: long i;
69: };
70:
71: ea(const void* pp) { p = pp; }
72: ea(long ii) { i = ii; }
73: ea() {}
74: };
75:
76: extern ea* ea0;
77:
78: overload error;
79: int error(const char*);
80: int error(const char*, const ea&, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0);
81: int error(int, const char*);
82: int error(int, const char*, const ea&, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0);
83: int error(loc*, const char*, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0);
84: int error(int, loc*, const char*, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0, const ea& = *ea0);
85: extern char emode;
86:
87: extern int error_count;
88: extern int vtbl_opt;
89: extern int debug_opt;
90: extern int warning_opt;
91: extern int ansi_opt;
92: extern int strict_opt;
93: extern FILE* out_file;
94: extern FILE* in_file;
95: extern char scan_started;
96:
97: extern int bl_level;
98: extern Ptable ktbl; // keywords and typedef names
99: extern Ptable gtbl; // global names
100: extern Ptable ptbl;
101: extern Ptable lcl_tbl;
102: extern char* oper_name(TOK);
103: extern Pname def_name;
104: extern Pname pdef_name;
105: extern Pclass ccl;
106: extern Pbase defa_type;
107: extern Pbase moe_type;
108: extern Pbase mptr_type;
109:
110: #ifndef GRAM
111: extern Pstmt Cstmt; // current statement, or 0
112: extern Pname Cdcl; // name currently being declared, or 0
113:
114: extern Pbase any_type;
115: extern int largest_int;
116: #endif
117:
118: extern Pbase int_type;
119: extern Pbase char_type;
120: extern Pbase short_type;
121: extern Pbase long_type;
122: extern Pbase uint_type;
123: extern Pbase float_type;
124: extern Pbase double_type;
125: extern Pbase ldouble_type;
126: extern Pbase void_type;
127:
128: #ifndef GRAM
129: extern Pbase uchar_type;
130: extern Pbase ushort_type;
131: extern Pbase ulong_type;
132: extern Ptype Pchar_type;
133: extern Ptype Pint_type;
134: extern Ptype Pvptr_type;
135: extern Ptype Pfctvec_type;
136: extern Ptype Pvoid_type;
137: extern Pbase zero_type;
138: extern Ptype size_t_type;
139:
140: extern int byte_offset;
141: extern int bit_offset;
142: extern int max_align;
143: extern int const_save;
144: extern int const_ptr;
145: extern int cm_const_save;
146: extern bit const_problem;
147: #endif
148:
149: extern Pexpr dummy; /* the empty expression */
150: extern Pexpr zero;
151: extern Pexpr one;
152: extern Pname sta_name; /* qualifier for unary :: */
153:
154: #define DEL(p) if (p && (p->permanent==0)) p->del()
155: #define PERM(p) p->permanent=1
156: #define UNPERM(p) p->permanent=0
157:
158: struct node {
159: TOK base;
160: bit permanent;
161: bit baseclass; // base classes have NAME in their base ...
162: #ifdef DBG
163: bit displayed; // avoid infinite recursion in display functions
164: bit allocated; // set when not on free list
165: long id;
166: #endif
167: };
168: #ifdef DBG
169: extern long node_id;
170: extern int Adebug;
171: #define DBID() { node::id = ++::node_id; node::allocated=1; displayed=0; \
172: if(Adebug>=1)fprintf(stderr,"\n*** allocated %d base %d\n",id,base); }
173: #else
174: #define DBID() /**/
175: #endif
176:
177: struct table : node {
178: /* a table is a node only to give it a "base" for debugging */
179: bit init_stat; /* ==0 if block(s) of table not simplified,
180: ==1 if simplified but had no initializers,
181: ==2 if simplified and had initializers.
182: */
183: short size;
184: short hashsize;
185: short free_slot; /* next free slot in entries */
186: Pname* entries;
187: short* hashtbl;
188: Pstmt real_block; /* the last block the user wrote,
189: not one of the ones cfront created
190: */
191: Ptable next; /* table for enclosing scope */
192: Pname t_name; /* name of the table */
193:
194: static Ptable table_free;
195: void* operator new(size_t);
196: void operator delete(void*,size_t);
197:
198: table(short, Ptable, Pname);
199: ~table();
200:
201: Pname look(char*, TOK);
202: Pname insert(Pname, TOK);
203: #ifndef GRAM
204: void grow(int);
205: void set_name(Pname n) { t_name = n; };
206: Pname get_mem(int);
207: int max() { return free_slot-1; };
208: void dcl_print(TOK,TOK);
209: #endif
210: void del();
211: };
212:
213: #ifndef GRAM
214: extern bit Nold;
215: extern bit vec_const, fct_const;
216: #endif
217:
218: extern void restore();
219: extern void set_scope(Pname);
220: extern Plist modified_tn;
221:
222: // local class
223: extern Plist local_tn;
224: extern Plist local_blk;
225: extern Plist local_class;
226: extern void local_hide( Pname );
227: extern char *make_local_name(Pclass, int=0);
228:
229: // nested type
230: extern Plist nested_tn;
231: extern Plist nested_type;
232: extern Pname curr_scope;
233: extern Pname curr_fct;
234: extern void nested_hide(Pname);
235: extern int is_empty(Pclass,bit=0);
236:
237: extern Pbase start_cl(TOK, Pname, Pbcl);
238: extern void end_cl();
239: extern Pbase end_enum(Pname, nlist*);
240:
241: /************ types : basic types, aggregates, declarators ************/
242:
243: #ifndef GRAM
244: extern bit new_type;
245: extern Pname cl_obj_vec;
246: extern Pname eobj;
247: #endif
248:
249:
250: #define DEFINED 01 /* definition fed through ?::dcl() */
251: #define SIMPLIFIED 02 /* in ?::simpl() */
252: #define DEF_SEEN 04 /* definition seen, but not processed */
253: #define REF_SEEN 010 /* reference seen (classdef) */
254: /* used for class members in norm.c */
255: #define IN_ERROR 010
256:
257: struct type : node {
258: bit defined; /* flags DEF_SEEN, DEFINED, SIMPLIFIED, IN_ERROR
259: not used systematically yet
260: */
261: bit lex_level;
262: Pclass in_class; // nested type
263: Pname in_fct; // local type
264: char *lcl;
265: char *nested_sig;
266: char *signature(char*);
267: Ptype tlist;
268: bit check(Ptype, TOK);
269: #ifndef GRAM
270: void print();
271: void dcl_print(Pname);
272: void base_print();
273:
274: Pname is_cl_obj(); /* sets cl_obj_vec */
275: Pptr is_ref();
276: Pptr is_ptr();
277: Pptr is_ptr_or_ref();
278: bit is_unsigned();
279: void dcl(Ptable);
280: int tsizeof(int = 0);
281: bit tconst();
282: TOK set_const(bit);
283: int align();
284: TOK kind(TOK,TOK);
285: TOK integral(TOK oo) { return kind(oo,'I'); };
286: TOK numeric(TOK oo) { return kind(oo,'N'); };
287: TOK num_ptr(TOK oo) { return kind(oo,'P'); };
288: bit vec_type();
289: Ptype deref();
290: inline Pptr addrof();
291: Pfct memptr();
292: #endif
293: void del();
294: };
295:
296: struct enumdef : type { /* ENUM */
297: bit e_body;
298: short no_of_enumerators;
299: unsigned char strlen; // strlen(string)
300: char* string; // name of enum
301: Pname mem;
302: Pbase e_type; // type representing the enum
303: enumdef(Pname n) { base=ENUM; mem=n; };
304: #ifndef GRAM
305: void print();
306: void dcl_print(Pname);
307: void dcl(Pname, Ptable);
308: void simpl();
309: #endif
310: };
311:
312: struct velem {
313: Pname n;
314: int offset;
315: };
316:
317: struct virt : node {
318: Pvirt next;
319: int n_init;
320: velem* virt_init; // vector of vtbl initializers (zero-terminated)
321: Pclass vclass; // for class vclass
322: char* string;
323: bit is_vbase; // vtable for virtual base
324: bit printed;
325: virt(Pclass cl, velem* v, char* s, bit flag, int ni) {base = XVIRT; vclass=cl; virt_init=v; string=s; is_vbase=flag; next=0; n_init = ni;}
326: };
327:
328: enum { C_VPTR=1, C_XREF=2, C_ASS=4, C_VBASE=8 };
329:
330: // An enumeration of the types of classes for Objectstore
331: enum class_type_enum { vanilla_class, // A regular class
332: template_class,
333: instantiated_template_class,
334: uninstantiated_template_class,
335: relationship_class,
336: defining_class
337: };
338: class type_extension;
339:
340: struct classdef : type { /* CLASS */
341: class_type_enum class_base; // An extension of "base" to further define
342: // the real subtype of the class
343: bit c_body; /* print definition only once */
344: TOK csu; /* CLASS, STRUCT, UNION, or ANON */
345: bit obj_align;
346: bit c_xref;
347: // 1 set: has vptr(s)
348: // 2 set: X(X&) exists
349: // 4 set: operator=(X&) exists
350: // 8 set: has vbaseptr(s)
351:
352: bit virt_count; // number of virtual functions
353: // starting at max base class virt_count in
354: bit virt_merge; // set when no virtual functions, but
355: // need to merge virtual base classes
356: bit c_abstract; // abstract class: don't instantiate
357: bit has_vvtab; // set if class has vtable from virtual base
358: unsigned char strlen; // strlen(string)
359: Pbcl baselist; // list of base classes
360: char* string; /* name of class */
361: Pname mem_list;
362: Ptable memtbl;
363: int obj_size;
364: int real_size; /* obj_size - alignment waste */
365: Plist friend_list;
366: Pname pubdef;
367: Plist tn_list; // list of member names hiding type names
368: Plist nest_list; // list of nested types
369: Ptype this_type;
370: Pvirt virt_list; // vtbl initializers
371: Pname c_ctor; // constuctor:
372: // possibly overloaded, possibly inherited
373: Pname c_dtor; // destructor
374: Pname c_itor; /* constructor X(X&) */
375: Pname conv; /* operator T() chain */
376: struct toknode *c_funqf, *c_funqr; // token Q for parsing function defs after class def
377:
378: classdef(TOK);
379: ~classdef();
380: TOK is_simple() { return (csu==CLASS)?0:csu; };
381: #ifndef GRAM
382: void print();
383: void dcl_print(Pname);
384: void simpl();
385:
386: void print_members();
387: void dcl(Pname, Ptable);
388:
389: // bit has_friend(Pname);
390: bit has_friend(Pclass);
391: bit has_friend(Pfct);
392:
393: bit has_base(Pclass cl);
394: bit baseof(Pname);
395: bit baseof(Pclass);
396: Pclass is_base(char*);
397:
398: Pname has_oper(TOK);
399: Pname has_ctor() { return c_ctor; }
400: Pname has_dtor() { return c_dtor; }
401: Pname has_itor() { return c_itor; }
402: Pname has_ictor();
403: Pname make_itor(int);
404: Pexpr find_name(char*, Pclass, int=0);
405: int do_virtuals(Pvirt, char*, int, bit);
406: int all_virt(Pclass, char*, int, bit);
407: void add_vtbl(velem*, char*, bit, int);
408: void print_all_vtbls(Pclass);
409: void print_vtbl(Pvirt);
410: void really_print(Pvirt);
411: int check_dup(Pclass, TOK);
412: int has_allocated_base(Pclass);
413: char *has_allocated_base(char*);
414: int get_offset(char*);
415: Pbcl get_base(char*);
416: Pexpr get_vptr_exp(char*);
417: Pexpr find_in_base(char*, Pclass);
418: void modify_inst_names(char *s); // Adjust ctor names for instantiation
419: bit parametrized_class();
420: bit same_class(Pclass p);
421: #endif
422: };
423:
424: #ifndef GRAM
425:
426: class clist {
427: Pclass cl;
428: clist* next;
429: public:
430: clist(Pclass c, clist* n) { cl=c; next=n; }
431: int onlist(Pclass);
432: void clear();
433: };
434:
435: extern clist * vcllist;
436:
437: struct vl {
438: struct vl* next;
439: Pvirt vt;
440: classdef* cl;
441:
442: vl(classdef* c, Pvirt v, struct vl* n)
443: { cl = c; vt = v; next = n; }
444: };
445:
446: extern vl* vlist;
447:
448: extern int nin;
449: extern int Nvis;
450: extern int Noffset;
451: extern TOK Nvirt;
452: extern Pexpr Nptr;
453: extern Pbcl Nvbc_alloc;
454: extern char *Nalloc_base;
455: extern Pexpr rptr(Ptype,Pexpr,int);
456: extern Pexpr vbase_args(Pfct, Pname);
457: extern Pexpr cdvec(Pname,Pexpr,Pclass,Pname,int,Pexpr,Pexpr=0);
458:
459: extern Pexpr find(char*, Pclass, int);
460: extern Pexpr find_name(Pname, Pclass, Ptable, int, Pname);
461: extern Pname find_virtual(Pclass,Pname);
462: extern Pname vfct(Pclass, char*);
463: extern int Vcheckerror;
464: extern int ignore_const;
465:
466: extern int mex;
467: extern Pclass mec;
468: extern Pclass tcl;
469: #endif
470:
471: struct basetype : type
472: /* ZTYPE CHAR SHORT INT LONG FLOAT DOUBLE
473: FIELD EOBJ COBJ TYPE ANY
474: */
475: /* used for gathering all the attributes
476: for a list of declarators
477:
478: ZTYPE is the (generic) type of ZERO
479: ANY is the generic type of an undeclared name
480: */
481: {
482: bit b_unsigned;
483: bit b_signed;
484: bit b_volatile;
485: bit b_const;
486: bit b_typedef;
487: bit b_inline;
488: bit b_virtual;
489: bit b_short;
490: bit b_long;
491: bit b_bits; /* number of bits in field */
492: bit b_offset; // bit offset of field
493: TOK b_sto; /* AUTO STATIC EXTERN REGISTER 0 */
494: Pname b_name; /* name of non-basic type */
495: Ptable b_table; /* memtbl for b_name, or 0 */
496: Pname b_xname; /* extra name */
497: union {
498: Ptype b_fieldtype;
499: char* b_linkage;
500: };
501:
502: basetype(TOK, Pname);
503:
504: Pbase type_adj(TOK);
505: Pbase base_adj(Pbase);
506: Pbase name_adj(Pname);
507: Pname aggr();
508: Pbase check(Pname);
509: #ifndef GRAM
510: void dcl_print();
511: Pbase arit_conv(Pbase);
512: bit parametrized_class();
513: #endif
514: int discriminator(int); // union discriminator fcn
515: };
516:
517: enum Linkage { linkage_default, linkage_C, linkage_Cplusplus };
518: extern Linkage linkage;
519: void set_linkage(char*);
520:
521: struct fct : type // FCT
522: {
523: TOK nargs;
524: TOK nargs_known; // 0 if unknown, 1 if known, or ELLIPSIS
525: bit last_stmt;
526: bit f_vdef; // 1 if this is the first virtual definition
527: // of this function
528: bit f_inline; // 1 if inline, 2 if being expanded, else 0
529: bit f_const; // one if member function that may be called for
530: // a const object, else 0
531: bit f_static; // 1 if static member function, else 0
532: short f_virtual; // index in virtual table, or 0 meaning non-virtual
533: short f_imeasure; // some measure of the size of an inline function
534: Ptype returns;
535: Pname argtype;
536: Ptype s_returns;
537: Pname f_this;
538: Pclass memof; // member of class memof
539: Pblock body;
540: Pname f_init; // base and member initializers
541: Pexpr f_expr; // body expanded into an expression
542: Pexpr last_expanded;
543: Pname f_result; // extra second argument of type X&
544: Pname f_args; // argument list including args added by cfront
545: Linkage f_linkage;
546: char* f_signature; // character encoding of function type
547: Plist local_class; // list of local classes
548: static Pfct fct_free;
549: void* operator new(size_t);
550: void operator delete(void*,size_t);
551:
552: fct(Ptype, Pname, TOK);
553: void argdcl(Pname,Pname);
554: #ifndef GRAM
555: Ptype normalize(Ptype);
556: void dcl_print();
557: void dcl(Pname);
558: Pexpr base_init(Pclass, Pexpr, Ptable, int);
559: Pexpr mem_init(Pname, Pexpr, Ptable);
560: void init_bases(Pclass, Pexpr);
561: bit declared() { return nargs_known; };
562: void simpl();
563: int ctor_simpl(Pclass, Pexpr);
564: Pstmt dtor_simpl(Pclass, Pexpr);
565: Pexpr expand(Pname,Ptable,Pexpr);
566: void sign();
567: #endif
568: int discriminator(int); // union discriminator fcn
569: };
570:
571: struct name_list : node {
572: Pname f;
573: Plist l;
574: name_list(Pname ff, Plist ll) { base = XNLIST; f=ff; l=ll; };
575: };
576:
577: #ifndef GRAM
578: struct gen : type { // OVERLOAD
579: Plist fct_list;
580:
581: gen() { base = OVERLOAD; }
582: Pname add(Pname);
583: Pname find(Pfct, bit);
584: Pname match(Pname, Pfct, bit);
585: };
586: #endif
587:
588: struct pvtyp : type {
589: Ptype typ;
590: };
591:
592: struct vec : pvtyp // VEC
593: // typ [ dim ]
594: {
595: Pexpr dim;
596: int size;
597:
598: static Pvec vec_free;
599: void* operator new(size_t);
600: void operator delete(void*,size_t);
601:
602: vec(Ptype t, Pexpr e) { base=VEC; typ=t; dim=e; DBID(); }
603: #ifndef GRAM
604: Ptype normalize(Ptype);
605: #endif
606: };
607:
608: struct ptr : pvtyp // PTR, RPTR i.e. reference
609: {
610: Pclass memof; // pointer to member of memof: memof::*
611: bit rdo; // "*const"
612:
613: static Pptr ptr_free;
614: void* operator new(size_t);
615: void operator delete(void*,size_t);
616:
617: ptr(TOK b, Ptype t) { base=b; typ=t; DBID(); }
618: #ifndef GRAM
619: Ptype normalize(Ptype);
620: #endif
621: };
622:
623: #ifndef GRAM
624: inline Pptr type::addrof() { return new ptr(PTR,this); }
625:
626: extern bit vrp_equiv;
627: #endif
628:
629:
630: /****************************** constants ********************************/
631:
632: /* STRING ZERO ICON FCON CCON ID */
633: /* IVAL FVAL LVAL */
634:
635: /***************************** expressions ********************************/
636:
637: #ifndef GRAM
638: extern Pexpr next_elem();
639: extern void new_list(Pexpr);
640: extern void list_check(Pname, Ptype, Pexpr, Ptable=0);
641: extern Pexpr ref_init(Pptr,Pexpr,Ptable);
642: extern Pexpr class_init(Pexpr,Ptype,Pexpr,Ptable);
643: extern Pexpr check_cond(Pexpr, TOK, Ptable);
644: extern Pexpr ptof(Pfct,Pexpr,Ptable);
645: extern void dosimpl(Pexpr, Pname);
646: extern int ref_initializer;
647: extern int ntok;
648:
649: extern void ptbl_init(int);
650: extern void ptbl_add_pair(char*,char*);
651: extern char *ptbl_lookup(char*);
652: extern char *st_name(char*);
653: #endif
654:
655: struct expr : node /* PLUS, MINUS, etc. */
656: /* IMPORTANT: all expressions are of sizeof(expr) */
657: /* DEREF => *e1 (e2==0) OR e1[e2]
658: UMINUS => -e2
659: INCR (e1==0) => ++e2
660: INCR (e2==0) => e1++
661: CM => e1 , e2
662: ILIST => LC e1 RC (an initializer list)
663: a Pexpr may denote a name
664: */
665: {
666: union {
667: Ptype tp;
668: char *string4;
669: };
670: union {
671: Pexpr e1;
672: long i1;
673: char* string;
674: };
675: union {
676: Pexpr e2;
677: int i2;
678: char* string2;
679: Pexpr n_initializer;
680: Ptype tpdef; // local and nested typedef info
681: };
682: union { /* used by the derived classes */
683: Ptype tp2;
684: Pname fct_name;
685: Pexpr cond;
686: Pexpr mem;
687: Ptype as_type;
688: Ptable n_table;
689: Pin il;
690: Pname query_this;
691: };
692:
693: static Pexpr expr_free;
694: void* operator new(size_t);
695: void operator delete(void*,size_t);
696: expr(TOK, Pexpr, Pexpr);
697: void del();
698: #ifndef GRAM
699: void print();
700: Pexpr typ0(Ptable);
701: Pexpr typ(Ptable);
702: long eval();
703: unsigned long ueval(long,long);
704: int lval(TOK);
705: Ptype call_fct(Ptable);
706: Pexpr address();
707: Pexpr contents();
708: void simpl();
709: Pexpr expand();
710: bit not_simple();
711: Pexpr try_to_overload(Ptable);
712: Pexpr docast(Ptable);
713: Pexpr dovalue(Ptable);
714: Pexpr donew(Ptable);
715: void simpl_new();
716: void simpl_delete();
717: #endif
718: int discriminator(int); // union discriminator fcn
719: };
720:
721: struct texpr : expr { // CAST NEW VALUE (also ICALL)
722: texpr(TOK bb, Ptype tt, Pexpr ee) : expr (bb,ee,0) { tp2=tt; }
723: };
724:
725: struct cast : expr { // CAST
726: cast(Ptype tt, Pexpr ee) : expr (CAST,ee,0) { tp=tp2=tt; }
727: };
728:
729: struct ival : expr { // IVAL
730: ival(long ii) : expr (IVAL,0,0) { i1 = ii;}
731: };
732:
733: struct call : expr { // CALL
734: call(Pexpr aa, Pexpr bb) : expr (CALL,aa,bb) { }
735: #ifndef GRAM
736: void simpl();
737: Pexpr expand(Ptable);
738: #endif
739: };
740:
741: struct qexpr : expr { // QUEST cond ? e1 : e2
742: qexpr(Pexpr ee, Pexpr ee1, Pexpr ee2) : expr (QUEST,ee1,ee2) { cond=ee; }
743: };
744:
745: struct ref : expr { // REF DOT e1->mem OR e1.mem
746: ref(TOK ba, Pexpr a, Pexpr b) : expr (ba,a,0) { mem=b; }
747: };
748:
749: struct mdot : expr { // MDOT a.b
750: mdot(char* a, Pexpr b) : expr (MDOT,0,0) { string2=a; mem=b; }
751: };
752:
753: struct text_expr : expr { // TEXT (vtbl_name)
754: text_expr(char* a, char* b) : expr (TEXT,0,0)
755: { string=a; string2=b; }
756: };
757: char* vtbl_name(char*,char*);
758: /************************* names (are expressions) ****************************/
759:
760: struct basecl : node { // NAME => base class
761: // VIRTUAL => virtual base class
762: TOK ppp; // private / public / protected
763: bit allocated; // allocated virtual base
764: bit promoted; // non-explicit, promoted virtual base
765: Pclass bclass;
766: Pexpr init; // base class initializers for ctors
767: int ptr_offset; // pointer's relative position in derived class
768: int obj_offset; // object's relative position in derived class
769: Pname* virt_init; // vector of vtbl table initializers
770: basecl* next;
771:
772: basecl(Pclass cl, basecl* n) { baseclass=1; bclass=cl; next=n; promoted=0; init=0;}
773: };
774:
775: enum template_formal_types {
776: template_type_formal =1 , template_expr_formal,
777: template_stmt_tree_formal, template_expr_tree_formal,
778: template_actual_arg_dummy // used during the parse
779: };
780: extern TOK ppbase;
781:
782: struct name : expr { // NAME TNAME and the keywords in the ktbl
783: TOK n_oper; // name of operator or 0
784: TOK n_sto; // EXTERN STATIC AUTO REGISTER ENUM 0
785: TOK n_stclass; // STATIC AUTO REGISTER 0
786: TOK n_scope; // EXTERN STATIC FCT ARG PUBLIC 0
787: TOK n_key; /* for names in table: class */
788: bit n_evaluated; // 0 or n_val holds the value
789: bit n_xref; // argument of type X(X&)
790: unsigned char lex_level;
791: TOK n_protect; // PROTECTED (<=>n_scope==0) or 0
792: bit n_dcl_printed; // 1: declaration printed
793: // 2: definition printed
794: // 0: declaration not printed
795:
796: // if this is set it implies that n_template_arg == template_type_formal
797: char n_template_arg; // One of template_formal_types for template arguments
798: bit n_template_formal_must_be_class ;
799: bit n_redefined ; // set only for PT function names where an explict
800: // definition was provided.
801: char *n_anon; // nested anonymous unions
802: short n_union; // 0, or union index
803: short n_addr_taken;
804: short n_used;
805: short n_assigned_to;
806: Loc where;
807: int n_offset; // byte offset in frame or struct
808: Pname n_list;
809: Pname n_tbl_list;
810: char *n_gen_fct_name; // used to be punned with n_tbl_list.
811: char *n_template_arg_string ; // the mangled string name
812: union {
813: /*
814: * n_qualifier: name of containing class
815: * n_realscope: for labels (always entered in function table)
816: * the table for the actual scope in which label occurred.
817: * syn_class: lex table only
818: */
819: Pname n_qualifier;
820: Ptable n_realscope;
821: int syn_class;
822: };
823:
824: /* n_val: the value of n_initializer; also the argument
825: * number for inline arguments (when base == ANAME) */
826: long n_val;
827: static Pname name_free;
828: void* operator new(size_t);
829: void operator delete(void*,size_t);
830: name(char* =0);
831:
832:
833: Pname normalize(Pbase, Pblock, bit);
834: Pname tdef();
835: Pname tname(TOK);
836: void hide();
837: void unhide() { n_key=0; n_list=0; };
838: #ifndef GRAM
839: Pname dcl(Ptable,TOK);
840: int no_of_names();
841: void use() { n_used++; };
842: void assign();
843: void take_addr();
844: void check_oper(Pname);
845: void simpl();
846: void print();
847: void dcl_print(TOK);
848: void field_align();
849: Pname dofct(Ptable,TOK);
850: #endif
851: void del();
852: int discriminator(int); // union discriminator fcn
853: };
854:
855: extern int friend_in_class;
856: extern int in_class_dcl;
857:
858: // from parser
859: extern int in_class_decl;
860: extern int parsing_class_members;
861: extern int in_mem_fct;
862: extern int in_arg_list;
863: extern Ptype in_typedef;
864: extern int defer_check; // redefinition typedef check delay
865: extern int declTag; // !1: inline, virtual mod permitted
866: extern Pname in_tag;
867: extern Pname statStat;
868: extern int DECL_TYPE;
869:
870: /******************** statements *********************************/
871:
872: struct stmt : node { /* BREAK CONTINUE DEFAULT */
873: /* IMPORTANT: all statement nodes have sizeof(stmt) */
874: Pstmt s;
875: Pstmt s_list;
876: Loc where;
877: union {
878: Pname d; // goto/block -- destination
879: Pexpr e2; // for iteration
880: Pstmt has_default; // switch statement default
881: int case_value;
882: Ptype ret_tp; // pair
883: };
884: union {
885: Pexpr e;
886: bit own_tbl;
887: Pstmt s2;
888: };
889: Ptable memtbl;
890: union {
891: Pstmt for_init;
892: Pstmt else_stmt;
893: Pstmt case_list;
894: Loc where2; // location of } at end of block
895: };
896:
897: static Pstmt stmt_free;
898: void* operator new(size_t);
899: void operator delete(void*,size_t);
900: stmt(TOK, loc, Pstmt);
901: void del();
902: #ifndef GRAM
903: void print();
904: void dcl();
905: void dcl1(Pstmt&);
906: void reached();
907: Pstmt simpl();
908: Pstmt expand();
909: Pstmt copy();
910: #endif
911: int discriminator(int); // union discriminator fcn
912: };
913:
914: #ifndef GRAM
915: extern char* Neval;
916: extern Ptable scope;
917: extern Ptable expand_tbl;
918: extern Pname expand_fn;
919: #endif
920:
921: struct estmt : stmt /* SM WHILE DO SWITCH RETURN CASE */
922: /* SM (e!=0) => e;
923: in particular assignments and function calls
924: SM (e==0) => ; (the null statement)
925: CASE => case e : s ;
926: SM_PARAM => e is the template_statement_tree_formal name
927: */
928: {
929: estmt(TOK t, loc ll, Pexpr ee, Pstmt ss) : stmt (t,ll,ss) { e=ee; }
930: };
931:
932: struct ifstmt : stmt /* IF */
933: // else_stme==0 => if (e) s
934: // else_stmt!=0 => if (e) s else else_stmt
935: {
936: ifstmt(loc ll, Pexpr ee, Pstmt ss1, Pstmt ss2)
937: : stmt (IF,ll,ss1) { e=ee; else_stmt=ss2; };
938: };
939:
940: struct lstmt : stmt /* LABEL GOTO */
941: /*
942: d : s
943: goto d
944: */
945: {
946: lstmt(TOK bb, loc ll, Pname nn, Pstmt ss) : stmt (bb,ll,ss) { d=nn; }
947: };
948:
949: struct forstmt : stmt { // FOR
950: forstmt(loc ll, Pstmt fss, Pexpr ee1, Pexpr ee2, Pstmt ss)
951: : stmt (FOR,ll,ss) { for_init=fss; e=ee1; e2=ee2; }
952: };
953:
954: struct block : stmt { // BLOCK { d s }
955: block(loc ll, Pname nn, Pstmt ss, loc rr = noloc ) : stmt (BLOCK,ll,ss)
956: { d=nn; where2=rr; }
957: #ifndef GRAM
958: void dcl(Ptable);
959: Pstmt simpl();
960: #endif
961: };
962:
963: #ifndef GRAM
964: struct pair : public stmt { // PAIR
965: pair(loc ll, Pstmt a, Pstmt b) : stmt (PAIR,ll,a) { s2 = b; }
966: };
967: #endif
968:
969: struct nlist {
970: Pname head;
971: Pname tail;
972: nlist(Pname);
973: void add(Pname n) { tail->n_list = n; tail = n; };
974: void add_list(Pname);
975: };
976:
977: extern Pname name_unlist(nlist*);
978:
979: struct slist {
980: Pstmt head;
981: Pstmt tail;
982: slist(Pstmt s) { /*Nl++;*/ head = tail = s; };
983: void add(Pstmt s) { tail->s_list = s; tail = s; };
984: };
985:
986: extern Pstmt stmt_unlist(slist*);
987:
988: struct elist {
989: Pexpr head;
990: Pexpr tail;
991: elist(Pexpr e) { /*Nl++;*/ head = tail = e; };
992: void add(Pexpr e) { tail->e2 = e; tail = e; };
993: };
994:
995: extern Pexpr expr_unlist(elist*);
996:
997: #ifndef GRAM
998: extern class dcl_context * cc;
999:
1000: struct dcl_context {
1001: Pname c_this; /* current fct's "this" */
1002: Ptype tot; /* type of "this" or 0 */
1003: Pname not; /* name of "this"'s class or 0 */
1004: Pclass cot; /* the definition of "this"'s class */
1005: Ptable ftbl; /* current fct's symbol table */
1006: Pname nof; /* current fct's name */
1007:
1008: void stack() { cc++; *cc = *(cc-1); };
1009: void unstack() { cc--; };
1010: };
1011:
1012: #define MAXCONT 20
1013: extern dcl_context ccvec[MAXCONT];
1014: #endif
1015:
1016: extern void yyerror(char*);
1017:
1018:
1019: #ifndef GRAM
1020: extern char* line_format;
1021:
1022: extern Plist stat_mem_list;
1023: extern Plist isf_list;
1024: extern Pstmt st_ilist;
1025: extern Pstmt st_dlist;
1026: extern Ptable sti_tbl;
1027: extern Ptable std_tbl;
1028: extern int need_sti( Pexpr e, Ptable tbl = 0, bit is_static_ok = 0 );
1029: Pexpr try_to_coerce(Ptype, Pexpr, char*, Ptable);
1030: extern bit can_coerce(Ptype, Ptype);
1031: extern Ptype np_promote(TOK, TOK, TOK, Ptype, Ptype, TOK);
1032: extern bit enum_promote;
1033: extern int suppress_error;
1034: extern void delete_local();
1035:
1036: extern int over_call(Pname, Pexpr);
1037: extern Pname overFound;
1038: extern Pname Nover;
1039: extern Pname Ncoerce;
1040: extern Nover_coerce;
1041: struct ia : node {
1042: Pname local; // local variable for argument
1043: Pexpr arg; // actual arguments for call
1044: Ptype tp; // type of formal argument
1045: ia() { base = XIA; };
1046: };
1047:
1048: struct iline : node {
1049: Pname fct_name; /* fct called */
1050: Pin i_next;
1051: Ptable i_table;
1052: int i_slots; // no of arg slots pointer to by i_args
1053: ia* i_args;
1054: iline() { base = XILINE; };
1055: };
1056:
1057: extern Pexpr curr_expr;
1058: extern Pin curr_icall;
1059: #define FUDGE111 11111
1060: #define VTOK 22222
1061: #define ITOR 77
1062:
1063: extern Pstmt curr_loop;
1064: extern Pblock curr_block;
1065: extern Pstmt curr_switch;
1066: extern loc last_line; // last #line + number of '\n's output since
1067: extern int last_ll; // 0 or line of current stmt/dcl being printed
1068: extern FILE* out_file; // output file descriptor
1069: extern bit Cast;
1070: extern loc no_where;
1071:
1072: extern no_of_undcl;
1073: extern no_of_badcall;
1074: extern Pname undcl, badcall;
1075:
1076: extern long str_to_long(const char*);
1077: extern int c_strlen(const char* s);
1078: #endif
1079:
1080: #ifndef GRAM
1081: extern Pname vec_new_fct;
1082: extern Pname new_fct;
1083: extern Pname del_fct;
1084: extern Pname vec_del_fct;
1085:
1086: extern int Nstd; // standard coercion used (derived* =>base* or int=>long or ...)
1087:
1088: extern int stcount; // number of names generated using make_name()
1089:
1090: Pexpr replace_temp(Pexpr,Pexpr);
1091: void make_res(Pfct);
1092:
1093: extern int Pchecked;
1094: Pexpr ptr_init(Pptr,Pexpr,Ptable);
1095: Pexpr call_ctor(Ptable, Pexpr p, Pexpr ctor, Pexpr args, int d = REF, Pexpr vb_args = 0);
1096: Pexpr call_dtor(Pexpr p, Pexpr dtor, Pexpr arg = 0, int d = DOT, Pexpr vb_args = 0);
1097: void check_visibility(Pname, Pname, Pclass, Ptable, Pname);
1098:
1099: int make_assignment(Pname);
1100:
1101: extern Pname make_tmp(char, Ptype, Ptable);
1102: Pexpr init_tmp(Pname, Pexpr, Ptable);
1103:
1104: extern int is_unique_base(Pclass, char*, int, int = 0);
1105: extern Pexpr rptr(Ptype, Pexpr, int);
1106:
1107: extern int read_align(char*);
1108: extern void new_init();
1109:
1110: extern void Eprint(Pexpr);
1111: extern Pexpr cast_cptr(Pclass ccl, Pexpr ee, Ptable tbl, int real_cast);
1112: extern Pexpr mptr_assign(Pexpr,Pexpr);
1113: extern Pclass Mptr;
1114:
1115: #endif
1116:
1117: extern bit fake_sizeof; // suppress error message for ``int v[];''
1118:
1119: extern TOK lalex();
1120:
1121:
1122: #ifdef DBG
1123: extern void display_expr( Pexpr, char* = 0, int = 0 );
1124: extern void display_stmt( Pstmt, char* = 0, int = 0 );
1125: extern void display_type( Ptype );
1126: extern void display_namelist( Plist, char* = 0, int = 0 );
1127:
1128: extern fprintf(const FILE*, const char* ...);
1129: extern void process_debug_flags( char* );
1130: #define DB(a) if(scan_started){a;}
1131: extern int Adebug; // allocation (ctor/del) debugging
1132: extern int Ddebug; // dcl debugging
1133: extern int Edebug; // expr debugging
1134: extern int Ldebug; // lex/lalex debugging
1135: extern int Mdebug; // trace function matching
1136: extern int Ndebug; // norm debugging
1137: extern int Pdebug; // print debugging
1138: extern int Rdebug; // run() debugging
1139: extern int Sdebug; // simpl debugging
1140: extern int Tdebug; // typ debugging
1141: #define Ydebug yydebug
1142: extern int Ydebug; // yacc debugging
1143:
1144: #else
1145:
1146: #define DB(a) /**/
1147:
1148: #endif
1149:
1150: #endif
1151: /* end */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.