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