|
|
1.1 ! root 1: /* Header file for XNS Courier compiler */ ! 2: ! 3: /* $Header: compiler.h,v 2.0 85/11/21 07:21:30 jqj Exp $ */ ! 4: /* $Log: compiler.h,v $ ! 5: * Revision 2.0 85/11/21 07:21:30 jqj ! 6: * 4.3BSD standard release ! 7: * ! 8: * Revision 1.5 85/05/23 06:19:24 jqj ! 9: * *** empty log message *** ! 10: * ! 11: * Revision 1.5 85/05/23 06:19:24 jqj ! 12: * Public Beta-test version, released 24 May 1985 ! 13: * ! 14: * Revision 1.4 85/03/26 06:09:31 jqj ! 15: * Revised public alpha-test version, released 26 March 1985 ! 16: * ! 17: * Revision 1.3 85/03/11 16:38:47 jqj ! 18: * Public alpha-test version, released 11 March 1985 ! 19: * ! 20: * Revision 1.2 85/02/21 11:04:54 jqj ! 21: * alpha test version ! 22: * ! 23: * Revision 1.1 85/02/15 13:58:15 jqj ! 24: * Initial revision ! 25: * ! 26: */ ! 27: ! 28: #include <stdio.h> ! 29: ! 30: #define MAXSTR 200 ! 31: #define streq(s, t) (strcmp(s, t) == 0) ! 32: #define New(t) ((t *) calloc(1, sizeof(t))) ! 33: ! 34: /* ! 35: * error message severity types ! 36: */ ! 37: enum severity { ! 38: WARNING, ! 39: ERROR, ! 40: FATAL, ! 41: }; ! 42: ! 43: /* ! 44: * Cons cell for lisp operations. ! 45: */ ! 46: struct cons { ! 47: struct cons *c_cdr; ! 48: struct cons *c_car; ! 49: }; ! 50: typedef struct cons *list; ! 51: ! 52: #define NIL ((list) 0) ! 53: #define car(x) ((x)->c_car) ! 54: #define cdr(x) ((x)->c_cdr) ! 55: #define caar(x) ((x)->c_car->c_car) ! 56: #define cdar(x) ((x)->c_car->c_cdr) ! 57: #define cadr(x) ((x)->c_cdr->c_car) ! 58: #define cddr(x) ((x)->c_cdr->c_cdr) ! 59: ! 60: #define ONIL ((struct object *) 0) ! 61: #define ocar(x) ((x)->o_car) ! 62: #define ocdr(x) ((x)->o_cdr) ! 63: ! 64: #define TNIL ((struct type *) 0) ! 65: ! 66: /* ! 67: * Object classes. ! 68: */ ! 69: enum class { ! 70: O_UNKNOWN = 0, /* make_symbol starts with this */ ! 71: O_TYPE, /* a typename symbol */ ! 72: O_CONSTANT, /* a constantname symbol */ ! 73: O_ENUMTAG, /* an enumeration tag */ ! 74: O_SYMBOLTABLE /* a symbol table */ ! 75: }; ! 76: ! 77: /* ! 78: * Type constructors. ! 79: */ ! 80: enum constr { ! 81: C_NUMERIC = 1, ! 82: C_BOOLEAN, ! 83: C_STRING, ! 84: C_ENUMERATION, ! 85: C_ARRAY, ! 86: C_SEQUENCE, ! 87: C_RECORD, ! 88: C_CHOICE, ! 89: C_PROCEDURE, ! 90: C_ERROR ! 91: }; ! 92: ! 93: /* ! 94: * Object structure, for types, and constants. ! 95: * These are the symbol table entries! ! 96: */ ! 97: struct object { ! 98: struct object *o_cdr, *o_car; /* for a binary tree symbol table */ ! 99: enum class o_class; ! 100: char *o_name; /* Courier name of this symbol */ ! 101: char *o_module; /* name of module it appears in */ ! 102: int o_modnumber; /* number of module it appears in */ ! 103: int o_modversion; /* version of module it appears in */ ! 104: union { ! 105: struct type *u_type; ! 106: struct constant *u_constant; ! 107: struct enumtag *u_enum; ! 108: struct object *u_symboltable; ! 109: } o_union; ! 110: }; ! 111: #define o_type o_union.u_type ! 112: #define o_constant o_union.u_constant ! 113: #define o_enum o_union.u_enum ! 114: #define o_symboltable o_union.u_symboltable ! 115: ! 116: #define class_of(x) (((struct object *) x)->o_class) ! 117: #define name_of(x) (((struct object *) x)->o_name) ! 118: #define value_of(x) (((struct object *) x)->o_value->cn_value) ! 119: #define enumvalue_of(x) (((struct object *) x)->o_enum->en_value) ! 120: ! 121: ! 122: /* ! 123: * Type structure. ! 124: * ! 125: * Formats of various lists are as follows. ! 126: * a-b is an a of type b. ! 127: * . indicates a cons operation. ! 128: * ... indicates a list of elements of the preceding form. ! 129: * ! 130: * enumeration: ! 131: * ((name-objectptr . value-numericstring) ...) ! 132: * [ the value is irrelevant, since it is stored in the enumtag] ! 133: * record, error, procedure arguments, procedure results: ! 134: * (((name-string) . type-typeptr) ...) ! 135: * choice: ! 136: * ((((name-symbol . value-numericstring) ...) . type-typeptr) ...) ! 137: * [value may be nil if it is inherited from someplace] ! 138: */ ! 139: struct type { ! 140: enum constr type_constr; /* constructor */ ! 141: char *type_pfname; /* name of pack function */ ! 142: char *type_ufname; /* name of unpack function */ ! 143: char *type_name; /* name of C type */ ! 144: int type_xsize; /* size of external form in 16-bit ! 145: words, or -1 if variable */ ! 146: union { ! 147: list u_list; /* enumeration, record, error */ ! 148: struct { ! 149: int u_size; ! 150: struct type *u_basetype; ! 151: } u_array; /* array, sequence */ ! 152: struct { ! 153: struct type *u_designator; ! 154: list u_candidates; ! 155: } u_choice; /* choice */ ! 156: struct { ! 157: list u_args, u_results, u_errors; ! 158: } u_procedure; /* procedure */ ! 159: } type_u; ! 160: }; ! 161: #define typename(tp) (tp->type_name) ! 162: ! 163: #define type_list type_u.u_list ! 164: #define type_array type_u.u_array ! 165: #define type_size type_array.u_size ! 166: #define type_basetype type_array.u_basetype ! 167: #define type_choice type_u.u_choice ! 168: #define type_designator type_choice.u_designator ! 169: #define type_candidates type_choice.u_candidates ! 170: #define type_procedure type_u.u_procedure ! 171: #define type_args type_procedure.u_args ! 172: #define type_results type_procedure.u_results ! 173: #define type_errors type_procedure.u_errors ! 174: ! 175: /* ! 176: * These definitions allow access from an object pointer ! 177: * known to be a type. ! 178: */ ! 179: #define t_constr o_type->type_constr ! 180: #define t_pfname o_type->type_pfname ! 181: #define t_ufname o_type->type_ufname ! 182: #define t_name o_type->type_name ! 183: #define t_xsize o_type->type_xsize ! 184: #define t_list o_type->type_u.u_list ! 185: #define t_size o_type->type_u.u_array.u_size ! 186: #define t_basetype o_type->type_u.u_array.u_basetype ! 187: #define t_designator o_type->type_u.u_choice.u_designator ! 188: #define t_candidates o_type->type_u.u_choice.u_candidates ! 189: #define t_args o_type->type_u.u_procedure.u_args ! 190: #define t_results o_type->type_u.u_procedure.u_results ! 191: #define t_errors o_type->type_u.u_procedure.u_errors ! 192: ! 193: ! 194: /* ! 195: * constant definition structure. ! 196: * ! 197: * Formats for cn_value follow: ! 198: * numeric constants, error constants ! 199: * e.g.: 34 ! 200: * string constants ! 201: * e.g.: "abc\"def" ! 202: * enumeration constants ! 203: * e.g.: red ! 204: * ! 205: * Formats for cn_list follow: ! 206: * record ! 207: * ((name-string . constant) ...) ! 208: * choice: ! 209: * (name-symbol . constant) ! 210: * array, sequence ! 211: * (constant ...) ! 212: * error ! 213: * (errorvalue-string . argsrecord-typtr) ! 214: * note that procedure and error constants are special. ! 215: */ ! 216: struct constant { ! 217: enum constr cn_constr; ! 218: char *cn_name; /* name of the C constant */ ! 219: char *cn_seqvalname; /* only for sequence constants */ ! 220: union { ! 221: list u_list; /* ConstructedConstant */ ! 222: char *u_value; /* PredefinedConstant */ ! 223: /* EnumerationConstant */ ! 224: } cn_union; ! 225: }; ! 226: #define cn_list cn_union.u_list ! 227: #define cn_value cn_union.u_value ! 228: ! 229: /* ! 230: * enumeration definition structure. ! 231: */ ! 232: struct enumtag { ! 233: char * en_name; /* C name for this tag */ ! 234: unsigned short en_value; ! 235: }; ! 236: ! 237: /* ! 238: * Kinds of translation functions ! 239: */ ! 240: enum translation { ! 241: EXTERNALIZE, ! 242: INTERNALIZE, ! 243: }; ! 244: ! 245: /* ! 246: * Predefined types. ! 247: */ ! 248: extern struct type ! 249: *Boolean_type, ! 250: *Cardinal_type, *LongCardinal_type, ! 251: *Integer_type, *LongInteger_type, ! 252: *String_type, ! 253: *Unspecified_type, *LongUnspecified_type, ! 254: *NilRecord_type, ! 255: *StreamEnum_type; ! 256: ! 257: /* ! 258: * symbol table management routines ! 259: */ ! 260: extern struct object ! 261: *check_def(), *make_symbol(), *make_module(); ! 262: /* ! 263: * routines for entering types in the parse tree ! 264: */ ! 265: extern struct type ! 266: *make_type(), ! 267: *enumeration_type(), *array_type(), ! 268: *sequence_type(), *record_type(), *choice_type(), ! 269: *procedure_type(), *error_type(); ! 270: /* ! 271: * routines for entering constants in the parse tree ! 272: */ ! 273: extern struct constant ! 274: *Boolean_constant(), *Numeric_constant(), ! 275: *String_constant(), ! 276: *array_constant(), *choice_constant(), ! 277: *record_constant(), *enumeration_constant(); ! 278: /* ! 279: * list headers for all the procedures and errors seen in this module ! 280: */ ! 281: extern list Procedures, Errors; ! 282: /* ! 283: * basic lispish functions ! 284: */ ! 285: extern list cons(), nconc(); ! 286: /* ! 287: * files we'll be using ! 288: */ ! 289: extern FILE *header, *header1, *support1, *support2, *client, *server; ! 290: ! 291: /* ! 292: * random global variables ! 293: */ ! 294: extern char *CurrentProgram; ! 295: extern int CurrentVersion, CurrentNumber; ! 296: extern char *input_file; ! 297: extern int recursive_flag; ! 298: ! 299: /* ! 300: * more functions ! 301: */ ! 302: extern char *refstr(), *xfn(), *copy(), *gensym(), *make_full_name(); ! 303: extern char *malloc(), *calloc(), *strcpy();
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.