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