|
|
1.1 root 1: /* Copyright (c) 1979 Regents of the University of California */
2:
3: /* static char sccsid[] = "@(#)0.h 1.20 2/28/83"; */
4:
5: #define DEBUG
6: #define CONSETS
7: #define CHAR
8: #define STATIC
9: #define hp21mx 0
10:
11: #include <stdio.h>
12: #include <sys/types.h>
13:
14: typedef enum {FALSE, TRUE} bool;
15:
16: /*
17: * Option flags
18: *
19: * The following options are recognized in the text of the program
20: * and also on the command line:
21: *
22: * b block buffer the file output
23: *
24: * i make a listing of the procedures and functions in
25: * the following include files
26: *
27: * l make a listing of the program
28: *
29: * n place each include file on a new page with a header
30: *
31: * p disable post mortem and statement limit counting
32: *
33: * t disable run-time tests
34: *
35: * u card image mode; only first 72 chars of input count
36: *
37: * w suppress special diagnostic warnings
38: *
39: * z generate counters for an execution profile
40: */
41: #ifdef DEBUG
42: bool fulltrace, errtrace, testtrace, yyunique;
43: #endif DEBUG
44:
45: /*
46: * Each option has a stack of 17 option values, with opts giving
47: * the current, top value, and optstk the value beneath it.
48: * One refers to option `l' as, e.g., opt('l') in the text for clarity.
49: */
50: char opts[ 'z' - 'A' + 1];
51: short optstk[ 'z' - 'A' + 1];
52:
53: #define opt(c) opts[c-'A']
54:
55: /*
56: * Monflg is set when we are generating
57: * a pxp profile. this is set by the -z command line option.
58: */
59: bool monflg;
60:
61: /*
62: * profflag is set when we are generating a prof profile.
63: * this is set by the -p command line option.
64: */
65: bool profflag;
66:
67:
68: /*
69: * NOTES ON THE DYNAMIC NATURE OF THE DATA STRUCTURES
70: *
71: * Pi uses expandable tables for
72: * its namelist (symbol table), string table
73: * hash table, and parse tree space. The following
74: * definitions specify the size of the increments
75: * for these items in fundamental units so that
76: * each uses approximately 1024 bytes.
77: */
78:
79: #define STRINC 1024 /* string space increment */
80: #define TRINC 512 /* tree space increment */
81: #define HASHINC 509 /* hash table size in words, each increment */
82: #define NLINC 56 /* namelist increment size in nl structs */
83:
84: /*
85: * The initial sizes of the structures.
86: * These should be large enough to compile
87: * an "average" sized program so as to minimize
88: * storage requests.
89: * On a small system or and 11/34 or 11/40
90: * these numbers can be trimmed to make the
91: * compiler smaller.
92: */
93: #define ITREE 2000
94: #define INL 200
95: #define IHASH 509
96:
97: /*
98: * The following limits on hash and tree tables currently
99: * allow approximately 1200 symbols and 20k words of tree
100: * space. The fundamental limit of 64k total data space
101: * should be exceeded well before these are full.
102: */
103: /*
104: * TABLE_MULTIPLIER is for uniformly increasing the sizes of the tables
105: */
106: #ifdef ADDR32
107: #define TABLE_MULTIPLIER 8
108: #endif ADDR32
109: #ifdef ADDR16
110: #define TABLE_MULTIPLIER 1
111: #endif ADDR16
112: #define MAXHASH (4 * TABLE_MULTIPLIER)
113: #define MAXNL (12 * TABLE_MULTIPLIER)
114: #define MAXTREE (30 * TABLE_MULTIPLIER)
115: /*
116: * MAXDEPTH is the depth of the parse stack.
117: * STACK_MULTIPLIER is for increasing its size.
118: */
119: #ifdef ADDR32
120: #define STACK_MULTIPLIER 8
121: #endif ADDR32
122: #ifdef ADDR16
123: #define STACK_MULTIPLIER 1
124: #endif ADDR16
125: #define MAXDEPTH ( 150 * STACK_MULTIPLIER )
126:
127: /*
128: * ERROR RELATED DEFINITIONS
129: */
130:
131: /*
132: * Exit statuses to pexit
133: *
134: * AOK
135: * ERRS Compilation errors inhibit obj productin
136: * NOSTART Errors before we ever got started
137: * DIED We ran out of memory or some such
138: */
139: #define AOK 0
140: #define ERRS 1
141: #define NOSTART 2
142: #define DIED 3
143:
144: bool Recovery;
145:
146: #define eholdnl() Eholdnl = 1
147: #define nocascade() Enocascade = 1
148:
149: bool Eholdnl, Enocascade;
150:
151:
152: /*
153: * The flag eflg is set whenever we have a hard error.
154: * The character in errpfx will precede the next error message.
155: * When cgenflg is set code generation is suppressed.
156: * This happens whenver we have an error (i.e. if eflg is set)
157: * and when we are walking the tree to determine types only.
158: */
159: bool eflg;
160: char errpfx;
161:
162: #define setpfx(x) errpfx = x
163:
164: #define standard() setpfx('s')
165: #define warning() setpfx('w')
166: #define recovered() setpfx('e')
167: #define continuation() setpfx(' ')
168:
169: int cgenflg;
170:
171:
172: /*
173: * The flag syneflg is used to suppress the diagnostics of the form
174: * E 10 a, defined in someprocedure, is neither used nor set
175: * when there were syntax errors in "someprocedure".
176: * In this case, it is likely that these warinings would be spurious.
177: */
178: bool syneflg;
179:
180: /*
181: * The compiler keeps its error messages in a file.
182: * The variable efil is the unit number on which
183: * this file is open for reading of error message text.
184: * Similarly, the file ofil is the unit of the file
185: * "obj" where we write the interpreter code.
186: */
187: short efil;
188: short ofil;
189: short obuf[518];
190:
191: bool Enoline;
192: #define elineoff() Enoline = TRUE
193: #define elineon() Enoline = FALSE
194:
195:
196: /*
197: * SYMBOL TABLE STRUCTURE DEFINITIONS
198: *
199: * The symbol table is henceforth referred to as the "namelist".
200: * It consists of a number of structures of the form "nl" below.
201: * These are contained in a number of segments of the symbol
202: * table which are dynamically allocated as needed.
203: * The major namelist manipulation routines are contained in the
204: * file "nl.c".
205: *
206: * The major components of a namelist entry are the "symbol", giving
207: * a pointer into the string table for the string associated with this
208: * entry and the "class" which tells which of the (currently 19)
209: * possible types of structure this is.
210: *
211: * Many of the classes use the "type" field for a pointer to the type
212: * which the entry has.
213: *
214: * Other pieces of information in more than one class include the block
215: * in which the symbol is defined, flags indicating whether the symbol
216: * has been used and whether it has been assigned to, etc.
217: *
218: * A more complete discussion of the features of the namelist is impossible
219: * here as it would be too voluminous. Refer to the "PI 1.0 Implementation
220: * Notes" for more details.
221: */
222:
223: /*
224: * The basic namelist structure.
225: * There is a union of data types defining the stored information
226: * as pointers, integers, longs, or a double.
227: *
228: * The array disptab defines the hash header for the symbol table.
229: * Symbols are hashed based on the low 6 bits of their pointer into
230: * the string table; see the routines in the file "lookup.c" and also "fdec.c"
231: * especially "funcend".
232: */
233: extern int pnumcnt;
234:
235: struct nl {
236: char *symbol;
237: char info[4];
238: struct nl *type;
239: struct nl *chain, *nl_next;
240: union {
241: int *un_ptr[5];
242: int un_value[5];
243: long un_range[2];
244: double un_real;
245: } nl_un;
246: # ifdef PTREE
247: pPointer inTree;
248: # endif PTREE
249: };
250:
251: #define class info[0]
252: #define nl_flags info[1]
253: #define nl_block info[1]
254: #define extra_flags info[2]
255: #define align_info info[3]
256:
257: #define range nl_un.un_range
258: #define value nl_un.un_value
259: #define ptr nl_un.un_ptr
260: #define real nl_un.un_real
261:
262: extern struct nl *nlp, *disptab[077+1], *Fp;
263: extern struct nl nl[INL];
264:
265:
266: /*
267: * NL FLAGS BITS
268: *
269: * Definitions of the usage of the bits in
270: * the nl_flags byte. Note that the low 5 bits of the
271: * byte are the "nl_block" and that some classes make use
272: * of this byte as a "width".
273: *
274: * The only non-obvious bit definition here is "NFILES"
275: * which records whether a structure contains any files.
276: * Such structures are not allowed to be dynamically allocated.
277: */
278:
279: #define BLOCKNO( flag ) ( flag & 037 )
280: #define NLFLAGS( flag ) ( flag &~ 037 )
281:
282: #define NUSED 0100
283: #define NMOD 0040
284: #define NFORWD 0200
285: #define NFILES 0200
286: #ifdef PC
287: #define NEXTERN 0001 /* flag used to mark external funcs and procs */
288: #define NLOCAL 0002 /* variable is a local */
289: #define NPARAM 0004 /* variable is a parameter */
290: #define NGLOBAL 0010 /* variable is a global */
291: #define NREGVAR 0020 /* or'ed in if variable is in a register */
292: #define NNLOCAL 0040 /* named local variable, not used in symbol table */
293: #endif PC
294:
295: /*
296: * used to mark value[ NL_FORV ] for loop variables
297: */
298: #define FORVAR 1
299:
300: /*
301: * Definition of the commonly used "value" fields.
302: * The most important one is NL_OFFS which gives
303: * the offset of a variable in its stack mark.
304: */
305: #define NL_OFFS 0
306:
307: #define NL_CNTR 1
308: #define NL_NLSTRT 2
309: #define NL_LINENO 3
310: #define NL_FVAR 3
311: #define NL_ENTLOC 4 /* FUNC, PROC - entry point */
312: #define NL_FCHAIN 4 /* FFUNC, FPROC - ptr to formals */
313:
314: #define NL_GOLEV 2
315: #define NL_GOLINE 3
316: #define NL_FORV 1
317:
318: /*
319: * nlp -> nl_un.un_ptr[] subscripts for records
320: * NL_FIELDLIST the chain of fixed fields of a record, in order.
321: * the fields are also chained through ptr[NL_FIELDLIST].
322: * this does not include the tag, or fields of variants.
323: * NL_VARNT pointer to the variants of a record,
324: * these are then chained through the .chain field.
325: * NL_VTOREC pointer from a VARNT to the RECORD that is the variant.
326: * NL_TAG pointer from a RECORD to the tagfield
327: * if there are any variants.
328: * align_info the alignment of a RECORD is in info[3].
329: */
330: #define NL_FIELDLIST 1
331: #define NL_VARNT 2
332: #define NL_VTOREC 2
333: #define NL_TAG 3
334: /* and align_info is info[3]. #defined above */
335:
336: #define NL_ELABEL 4 /* SCAL - ptr to definition of enums */
337:
338: /*
339: * For BADUSE nl structures, NL_KINDS is a bit vector
340: * indicating the kinds of illegal usages complained about
341: * so far. For kind of bad use "kind", "1 << kind" is set.
342: * The low bit is reserved as ISUNDEF to indicate whether
343: * this identifier is totally undefined.
344: */
345: #define NL_KINDS 0
346:
347: #define ISUNDEF 1
348:
349: /*
350: * variables come in three flavors: globals, parameters, locals;
351: * they can also hide in registers, but that's a different flag
352: */
353: #define PARAMVAR 1
354: #define LOCALVAR 2
355: #define GLOBALVAR 3
356: #define NAMEDLOCALVAR 4
357:
358: /*
359: * NAMELIST CLASSES
360: *
361: * The following are the namelist classes.
362: * Different classes make use of the value fields
363: * of the namelist in different ways.
364: *
365: * The namelist should be redesigned by providing
366: * a number of structure definitions with one corresponding
367: * to each namelist class, ala a variant record in Pascal.
368: */
369: #define BADUSE 0
370: #define CONST 1
371: #define TYPE 2
372: #define VAR 3
373: #define ARRAY 4
374: #define PTRFILE 5
375: #define RECORD 6
376: #define FIELD 7
377: #define PROC 8
378: #define FUNC 9
379: #define FVAR 10
380: #define REF 11
381: #define PTR 12
382: #define FILET 13
383: #define SET 14
384: #define RANGE 15
385: #define LABEL 16
386: #define WITHPTR 17
387: #define SCAL 18
388: #define STR 19
389: #define PROG 20
390: #define IMPROPER 21
391: #define VARNT 22
392: #define FPROC 23
393: #define FFUNC 24
394:
395: /*
396: * Clnames points to an array of names for the
397: * namelist classes.
398: */
399: char **clnames;
400:
401: /*
402: * PRE-DEFINED NAMELIST OFFSETS
403: *
404: * The following are the namelist offsets for the
405: * primitive types. The ones which are negative
406: * don't actually exist, but are generated and tested
407: * internally. These definitions are sensitive to the
408: * initializations in nl.c.
409: */
410: #define TFIRST -7
411: #define TFILE -7
412: #define TREC -6
413: #define TARY -5
414: #define TSCAL -4
415: #define TPTR -3
416: #define TSET -2
417: #define TSTR -1
418: #define NIL 0
419: #define TBOOL 1
420: #define TCHAR 2
421: #define TINT 3
422: #define TDOUBLE 4
423: #define TNIL 5
424: #define T1INT 6
425: #define T2INT 7
426: #define T4INT 8
427: #define T1CHAR 9
428: #define T1BOOL 10
429: #define T8REAL 11
430: #define TLAST 11
431:
432: /*
433: * SEMANTIC DEFINITIONS
434: */
435:
436: /*
437: * NOCON and SAWCON are flags in the tree telling whether
438: * a constant set is part of an expression.
439: * these are no longer used,
440: * since we now do constant sets at compile time.
441: */
442: #define NOCON 0
443: #define SAWCON 1
444:
445: /*
446: * The variable cbn gives the current block number,
447: * the variable bn is set as a side effect of a call to
448: * lookup, and is the block number of the variable which
449: * was found.
450: */
451: short bn, cbn;
452:
453: /*
454: * The variable line is the current semantic
455: * line and is set in stat.c from the numbers
456: * embedded in statement type tree nodes.
457: */
458: short line;
459:
460: /*
461: * The size of the display
462: * which defines the maximum nesting
463: * of procedures and functions allowed.
464: * Because of the flags in the current namelist
465: * this must be no greater than 32.
466: */
467: #define DSPLYSZ 20
468:
469: /*
470: * the following structure records whether a level declares
471: * any variables which are (or contain) files.
472: * this so that the runtime routines for file cleanup can be invoked.
473: */
474: bool dfiles[ DSPLYSZ ];
475:
476: /*
477: * Structure recording information about a constant
478: * declaration. It is actually the return value from
479: * the routine "gconst", but since C doesn't support
480: * record valued functions, this is more convenient.
481: */
482: struct {
483: struct nl *ctype;
484: short cival;
485: double crval;
486: int *cpval;
487: } con;
488:
489: /*
490: * The set structure records the lower bound
491: * and upper bound with the lower bound normalized
492: * to zero when working with a set. It is set by
493: * the routine setran in var.c.
494: */
495: struct {
496: short lwrb, uprbp;
497: } set;
498:
499: /*
500: * structures of this kind are filled in by precset and used by postcset
501: * to indicate things about constant sets.
502: */
503: struct csetstr {
504: struct nl *csettype;
505: long paircnt;
506: long singcnt;
507: bool comptime;
508: };
509: /*
510: * The following flags are passed on calls to lvalue
511: * to indicate how the reference is to affect the usage
512: * information for the variable being referenced.
513: * MOD is used to set the NMOD flag in the namelist
514: * entry for the variable, ASGN permits diagnostics
515: * to be formed when a for variable is assigned to in
516: * the range of the loop.
517: */
518: #define NOFLAGS 0
519: #define MOD 01
520: #define ASGN 02
521: #define NOUSE 04
522:
523: /*
524: * the following flags are passed to lvalue and rvalue
525: * to tell them whether an lvalue or rvalue is required.
526: * the semantics checking is done according to the function called,
527: * but for pc, lvalue may put out an rvalue by indirecting afterwards,
528: * and rvalue may stop short of putting out the indirection.
529: */
530: #define LREQ 01
531: #define RREQ 02
532:
533: double MAXINT;
534: double MININT;
535:
536: /*
537: * Variables for generation of profile information.
538: * Monflg is set when we want to generate a profile.
539: * Gocnt record the total number of goto's and
540: * cnts records the current counter for generating
541: * COUNT operators.
542: */
543: short gocnt;
544: short cnts;
545:
546: /*
547: * Most routines call "incompat" rather than asking "!compat"
548: * for historical reasons.
549: */
550: #define incompat !compat
551:
552: /*
553: * Parts records which declaration parts have been seen.
554: * The grammar allows the "label" "const" "type" "var" and routine
555: * parts to be repeated and to be in any order, so that
556: * they can be detected semantically to give better
557: * error diagnostics.
558: *
559: * The flag NONLOCALVAR indicates that a non-local var has actually
560: * been used hence the display must be saved; NONLOCALGOTO indicates
561: * that a non-local goto has been done hence that a setjmp must be done.
562: */
563: int parts[ DSPLYSZ ];
564:
565: #define LPRT 0x0001
566: #define CPRT 0x0002
567: #define TPRT 0x0004
568: #define VPRT 0x0008
569: #define RPRT 0x0010
570:
571: #define NONLOCALVAR 0x0020
572: #define NONLOCALGOTO 0x0040
573:
574: /*
575: * Flags for the "you used / instead of div" diagnostic
576: */
577: bool divchk;
578: bool divflg;
579:
580: bool errcnt[DSPLYSZ];
581:
582: /*
583: * Forechain links those types which are
584: * ^ sometype
585: * so that they can be evaluated later, permitting
586: * circular, recursive list structures to be defined.
587: */
588: struct nl *forechain;
589:
590: /*
591: * Withlist links all the records which are currently
592: * opened scopes because of with statements.
593: */
594: struct nl *withlist;
595:
596: struct nl *intset;
597: struct nl *input, *output;
598: struct nl *program;
599:
600: /* progseen flag used by PC to determine if
601: * a routine segment is being compiled (and
602: * therefore no program statement seen)
603: */
604: bool progseen;
605:
606:
607: /*
608: * STRUCTURED STATEMENT GOTO CHECKING
609: *
610: * The variable level keeps track of the current
611: * "structured statement level" when processing the statement
612: * body of blocks. This is used in the detection of goto's into
613: * structured statements in a block.
614: *
615: * Each label's namelist entry contains two pieces of information
616: * related to this check. The first `NL_GOLEV' either contains
617: * the level at which the label was declared, `NOTYET' if the label
618: * has not yet been declared, or `DEAD' if the label is dead, i.e.
619: * if we have exited the level in which the label was defined.
620: *
621: * When we discover a "goto" statement, if the label has not
622: * been defined yet, then we record the current level and the current line
623: * for a later error check. If the label has been already become "DEAD"
624: * then a reference to it is an error. Now the compiler maintains,
625: * for each block, a linked list of the labels headed by "gotos[bn]".
626: * When we exit a structured level, we perform the routine
627: * ungoto in stat.c. It notices labels whose definition levels have been
628: * exited and makes them be dead. For labels which have not yet been
629: * defined, ungoto will maintain NL_GOLEV as the minimum structured level
630: * since the first usage of the label. It is not hard to see that the label
631: * must eventually be declared at this level or an outer level to this
632: * one or a goto into a structured statement will exist.
633: */
634: short level;
635: struct nl *gotos[DSPLYSZ];
636:
637: #define NOTYET 10000
638: #define DEAD 10000
639:
640: /*
641: * Noreach is true when the next statement will
642: * be unreachable unless something happens along
643: * (like exiting a looping construct) to save
644: * the day.
645: */
646: bool noreach;
647:
648: /*
649: * UNDEFINED VARIABLE REFERENCE STRUCTURES
650: */
651: struct udinfo {
652: int ud_line;
653: struct udinfo *ud_next;
654: char nullch;
655: };
656:
657: /*
658: * CODE GENERATION DEFINITIONS
659: */
660:
661: /*
662: * NSTAND is or'ed onto the abstract machine opcode
663: * for non-standard built-in procedures and functions.
664: */
665: #define NSTAND 0400
666:
667: #define codeon() cgenflg++
668: #define codeoff() --cgenflg
669: #define CGENNING ( cgenflg >= 0 )
670:
671: /*
672: * Codeline is the last lino output in the code generator.
673: * It used to be used to suppress LINO operators but no
674: * more since we now count statements.
675: * Lc is the intepreter code location counter.
676: *
677: short codeline;
678: */
679: char *lc;
680:
681:
682: /*
683: * Routines which need types
684: * other than "integer" to be
685: * assumed by the compiler.
686: */
687: double atof();
688: long lwidth();
689: long leven();
690: long aryconst();
691: long a8tol();
692: long roundup();
693: struct nl *tmpalloc();
694: struct nl *lookup();
695: double atof();
696: int *tree();
697: int *hash();
698: char *alloc();
699: int *calloc();
700: char *savestr();
701: char *parnam();
702: bool fcompat();
703: struct nl *lookup1();
704: struct nl *hdefnl();
705: struct nl *defnl();
706: struct nl *enter();
707: struct nl *nlcopy();
708: struct nl *tyrec();
709: struct nl *tyary();
710: struct nl *deffld();
711: struct nl *defvnt();
712: struct nl *tyrec1();
713: struct nl *reclook();
714: struct nl *asgnop1();
715: struct nl *gtype();
716: struct nl *call();
717: struct nl *lvalue();
718: struct nl *rvalue();
719: struct nl *cset();
720:
721: /*
722: * type cast NIL to keep lint happy (which is not so bad)
723: */
724: #define NLNIL ( (struct nl *) NIL )
725:
726: /*
727: * Funny structures to use
728: * pointers in wild and wooly ways
729: */
730: struct {
731: char pchar;
732: };
733: struct {
734: short pint;
735: short pint2;
736: };
737: struct {
738: long plong;
739: };
740: struct {
741: double pdouble;
742: };
743:
744: #define OCT 1
745: #define HEX 2
746:
747: /*
748: * MAIN PROGRAM VARIABLES, MISCELLANY
749: */
750:
751: /*
752: * Variables forming a data base referencing
753: * the command line arguments with the "i" option, e.g.
754: * in "pi -i scanner.i compiler.p".
755: */
756: char **pflist;
757: short pflstc;
758: short pfcnt;
759:
760: char *filename; /* current source file name */
761: long tvec;
762: extern char *snark; /* SNARK */
763: extern char *classes[ ]; /* maps namelist classes to string names */
764:
765: #define derror error
766:
767: #ifdef PC
768:
769: /*
770: * the current function number, for [ lines
771: */
772: int ftnno;
773:
774: /*
775: * the pc output stream
776: */
777: FILE *pcstream;
778:
779: #endif PC
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.