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